`
squall
  • 浏览: 45781 次
  • 性别: Icon_minigender_1
  • 来自: wuhan
社区版块
存档分类
最新评论

Delphi 内嵌汇编初探总结

阅读更多

1、在对象中 EAX 寄存器将永远存放 Self 指针,第一个参数放在 EDX,第二个参数放在 ECX,其它的参数放入栈中,如果企图使用类方法做比如系统回调函数的应用将会把 Self 破坏掉,从而产生 AV 类型的异常。

2、在 Delphi 中参数的存放是从右向左的顺序,如果函数或过程在类中 EAX 寄存器中将存放 Self 指针,EDX 存放第一个参数,ECX 存放第二个参数,其它的参数将放入栈中(EBP 中存放栈的基地址,EBP+8为栈中的第一个变量)。如果函数或过程不在类中 EAX 寄存器中将存放第一个参数,其它同上。由此可见,在 Delphi 中永远将前三个参数放入寄存器中达到优化的目的,所以在写函数和过程时参数最好不要超过三个而且最好把常用的参数放到前面。

3、用汇编调用类方法,可以通用 Self 的指针加上类方法的偏移地址来调用,如下:
   //其中 FSomething 为方法指针(相信有 Delphi 基础的人都看得懂)
   add eax, offset(TForm1.FSomething)
   call TMethod[eax].code
   还有更简单的调用方法,如下:
   //这种方法相信编译器在幕后做了不少功夫
   call TForm1.MethodName
   还有一种方法,是在 Delphi 的 CPU 窗口中学到的和第一种方法大同小异,如下
   add edx, offset(TForm1.FSomething)
   call dword ptr [eax]

 2004年7月30日 9:53

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics