在Delphi的ASM程序结束时要恢复CPU寄存器
-
01-10-2019 - |
题
在编写delphi过程或函数中,在汇编代码中,必须将哪些寄存器保存并在过程结束时恢复为原始值?
从(内联)汇编代码调用另一个Delphi过程或功能时,我期望其他功能与寄存器有什么作用?哪些寄存器将恢复到其原始值,哪些寄存器可能不会?
(显然,同样的答案将适用于两个问题)
我假设 默认调用惯例 Delphi。我知道 EAX
用于32位返回值。并查看sysutils.pas中的ASM代码,看来 EBX
, ESI
和 EDI
被推和恢复,但其他人则没有。不过,我找不到任何文档。
解决方案
函数的三个第一个论点在 EAX
, EDX
, , 和 ECX
, , 分别。堆栈上推动了其他参数。对于对象的方法, Self
指针始终是(不可见的)第一个参数。结果应该在 EAX
. 。对于返回长字符串的功能,(无形) 最后的 该函数的参数是指向结果字符串的指针(本身就是指向字符串的第一个字符的指针)。
EBX
不得更改(除非您在过程/功能结束之前还原),因此不得 ESP
, EBP
, ESI
, , 或者 EDI
任何一个。(1) 曾经在此处找到Delphi内联ASM的出色介绍: http://www.delphi3000.com/articles/article_3766.asp
其他提示
我不知道文档是否是最新的,但是您应该看看 使用内联装配代码(仅Win32) 在Embarcardero Wiki:
引用:
通常,ASM语句中的寄存器使用规则与外部过程或功能的规则相同。 ASM声明必须保留EDI,ESI,ESP,EBP和EBX寄存器,但可以自由修改EAX,ECX和EDX寄存器。进入ASM语句时,EBP指向当前的堆栈框架,ESP指向堆栈的顶部。除了ESP和EBP外,ASM语句对该语句输入时的注册内容一无所知。