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
Delphi中的参数传递与优化
本文详细介绍了在Delphi编程环境中如何进行参数传递及优化技巧。解释了EAX、EDX、ECX寄存器在类方法调用中如何存放Self指针及参数,并给出了汇编语言下调用类方法的具体示例。
235

被折叠的 条评论
为什么被折叠?



