Delphi里做了魔法变化,每个变量名称本身就是指针,因为不怎么需要指针语法.我也不知道是不是因为这个原因引起的Delphi与VC对句柄的不同处理. 这是Delphi的强行关机函数,好用,调用方式:WindowsExit(EWX_POWEROFF or EWX_FORCE) function WindowsExit(RebootParam: Longword): Boolean; var TTokenHd: THandle; TTokenPvg: TTokenPrivileges; cbtpPr…
函数重载重载的思想很简单:编译器允许你用同一名字定义多个函数或过程,只要它们所带的参数不同.实际上,编译器是通过检测参数来确定需要调用的例程.下面是从VCL 的数学单元(Math Unit)中摘录的一系列函数: function Min (A,B: Integer): Integer; overload; function Min (A,B: Int64): Int64; overload; function Min (A,B: Single): Single; overload; functi…
--功能:  用于将小写的数值翻译成大写的字符串(支持到分,即小数点后两位)       --入口参数:@decNum------数字型变量    --返回:字符串    --举例:select dbo.fn_ChnMoney(623.88)    --    结果为“陆佰贰拾叁元捌角捌分”     --如果小数点毒打两位结果是四舍五入的--select dbo.[fn_ChnMoney_New](623.88666666) -- Drop FUNCTION [dbo].[fn_ChnMoney…
上一篇 我们讨论了跳转指令,并实现「正跳转」的翻译,但最终困在「负跳转」上.而且,由于线程模型的差异,我们不能 1:1 的翻译,必须对流程进行一些改造. 当初之所以选择翻译,而不是模拟,就是出于性能考虑.但是,这并不意味绝对不能用模拟 -- 如果能用少量模拟,解决一些技术障碍,那也是值得的. 现在,我们尝试用模拟的方式,来控制流程. 流程模拟 JS 的流程控制,就好比排队:如果你不想排了,可以随时退出,大家都不介意:但是之后又想回来插队,这就不行了,你必须从头排起.所以,只能退出,不能插入. 插…
上一篇,我们通过内置解释器的方案,解决任意跳转的问题.同时,也提到另一个问题:如果指令发生变化,又该如何应对. 指令自改 如果指令加载到 RAM 中,那就和普通数据一样,也是可以随意修改的.然而,对应的 JS 是事先翻译好的,已经不能改了.如果运行时突然变卦,那相应的 JS 就作废了 -- 如果修改的是跳转指令,甚至会影响已划分的流程.所以为了保守起见,指令被改后进入模拟状态. 因此,我们得监控指令区的修改: function store(addr, val) { // 修改指令区 if (0x…
上一篇,我们决定使用 LLVM 来优化程序,并打算用 C 作为输入语言.现在我们来研究一下,将 6502 指令转换成 C 的可行性. 跳转支持 翻译成 C 语言,可比 JS 容易多了.因为 C 支持 goto,跳转可轻松实现.例如: $0600 LDA #$01 $0602 STA $02 $0604 JMP $0600 就能翻译成如下 C 代码: L_0600: A = 0x01; ... L_0602: write(A, 0x02); L_0604: goto L_0600; 我们把指令所在…
上一篇,我们顺利将 6502 指令翻译成 C 代码,并演示了一个案例. 现在,我们来完成最后的目标 -- 转换成 JavaScript. 中间码输出 我们之所以选择 C,就是为了使用 LLVM.现在来看看,生成的 LLVM 中间表示: 不难看出,顺序执行的逻辑都在一个 label 中,跳转则用 br 符号. 这种风格,和我们之前讨论的指令切割非常相似.一个 label 块,正好翻译成一个 block_xxx 的 JS 函数. 所以,理论上翻译成 JS 并不困难,写一个 LLVM backend…
去年折腾的一个东西,之前 blog 里也写过,不过那时边琢磨边写,所以比较杂乱,现在简单完整地讲解一下. 前言 当时看到一本虚拟机相关的书,正好又在想 JS 混淆相关的事,无意中冒出个问题:能不能把某种 CPU 指令翻译成等价的 JS 逻辑?这样就能在浏览器里直接运行. 注意,这里说的是「翻译」,而不是模拟.模拟简单多了,网上甚至连 JS 版的 x86 模拟器都有很多. 翻译原则上应该在运行之前完成的,并且逻辑上也尽可能做到一一对应. 为了尝试这个想法,于是选择了古董级 CPU 6502 摸索.…
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻译成"b",……,11翻译成"l",……,25翻译成"z".一个数字可能有多个翻译.例如12258有5种不同的翻译,它们分别"bccfi", "bwfi", "bczi"…
// 面试题46:把数字翻译成字符串 // 题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻 // 译成"b",……,11翻译成"l",……,25翻译成"z".一个数字可能有多个翻译.例 // 如12258有5种不同的翻译,它们分别是"bccfi"."bwfi"."bczi"."mcfi"和 // "mzi&qu…