摘要: //Delphi 函数 function DelphiFun(x: Integer): Integer; begin Result := x * 2; end; //汇编函数, 和上面的函数是同样的功能 function AsmFun(x: Integer): Integer; asm add eax, eax {eax 可以获取第一个参数, 同时又是函数的返回值, 所以可以如此简... 阅读全文
posted @ 2008-01-24 23:34 万一 阅读(4394) 评论(1) 推荐(0)
摘要: 返回类型 寄存位置 Char、Byte AL 寄存器 SmallInt、Word AX 寄存器 Integer、LongWord、AnsiString、Pointer、Class EAX 寄存器 Real48 EAX 寄存器中是栈内返回值的指针 Int64 EDX、EAX 寄存器对 Single、Double、Extended、Comp 栈首寄存器 ST(0) ... 阅读全文
posted @ 2008-01-24 20:36 万一 阅读(4621) 评论(1) 推荐(0)
摘要: //可以用 asm 代替 begin function Fun(x: Integer): Integer; asm mov eax, x inc eax end; { 汇编中的 inc 指令和 Delphi 中的 inc 是一样的; 本例也同时证明 eax 寄存器确实保存着函数的返回值. } procedure TForm1.Button1Click(Sender: TObje... 阅读全文
posted @ 2008-01-24 20:04 万一 阅读(6145) 评论(5) 推荐(0)
摘要: 王爽老师书上说, CPU 内部主要就是寄存器. 现在我们在 32 位的系统下工作, 当然主要使用的是 32 位寄存器; 那它和 8 位、16 位的寄存器又有什么关系呢? 从网上找到一个简洁明了的图片: EAX 是 32 位的, 也就是 4 个字节大小; 它的低两位就是 AX; AX 是 16 位的, 又分 2 个字节; 它的高字节是 AH、低字节是 AL; AH 与 AL 是 8 位的. ... 阅读全文
posted @ 2008-01-24 17:37 万一 阅读(4917) 评论(3) 推荐(0)
摘要: //在汇编中使用常量 var a: Integer; const n = $10; begin asm mov ecx, 10 {使用十进制常数} mov a, ecx end; ShowMessage(IntToStr(a)); {10} asm mov ecx, $10 {使用十六进制常数} ... 阅读全文
posted @ 2008-01-24 16:13 万一 阅读(4179) 评论(5) 推荐(0)
摘要: //在汇编中访问 Delphi 的变量可以使用 & 操作符 procedure Proc(str1,str2: string); var s1,s2: string; begin asm mov ecx, &str1 {} mov edx, &str2 mov &s1, ecx {} mov &s2, edx end; ShowMessa... 阅读全文
posted @ 2008-01-24 16:04 万一 阅读(5077) 评论(21) 推荐(0)
摘要: //测试寄存器: 如果只有两个参数, 看看 ECX EDX 谁来接受第二个参数 procedure Proc(x,y: Integer); var a,b: Integer; begin asm MOV a,ECX MOV b,EDX end; ShowMessage(IntToStr(a) + #44 + IntToStr(b)); end; //测试 p... 阅读全文
posted @ 2008-01-24 15:38 万一 阅读(4919) 评论(14) 推荐(0)
摘要: CPU 提供了诸多寄存器, 但在 Delphi 的过程和函数中, 只有 EAX ECX EDX 三个寄存器可以自由使用; 如果改变了其他寄存器, 在过程和函数结束前要给恢复. 记得前面学习过 Delphi 的过程和函数默认的调用约定是 Register , 前三个参数通过寄存器传递, 其他参数存与栈. 它所指的三个寄存器就应该是 EAX ECX EDX 了. 看资料介绍应该是: EAX 先接受第... 阅读全文
posted @ 2008-01-24 11:50 万一 阅读(6437) 评论(25) 推荐(0)