在编写delphi过程或函数中,在汇编代码中,必须将哪些寄存器保存并在过程结束时恢复为原始值?

从(内联)汇编代码调用另一个Delphi过程或功能时,我期望其他功能与寄存器有什么作用?哪些寄存器将恢复到其原始值,哪些寄存器可能不会?

(显然,同样的答案将适用于两个问题)

我假设 默认调用惯例 Delphi。我知道 EAX 用于32位返回值。并查看sysutils.pas中的ASM代码,看来 EBX, ESIEDI 被推和恢复,但其他人则没有。不过,我找不到任何文档。

有帮助吗?

解决方案

函数的三个第一个论点在 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语句对该语句输入时的注册内容一无所知。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top