在Delphi中的asm过程结束时要恢复哪些CPU寄存器

Ser*_*aas 13 delphi assembly cpu-registers basm

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

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

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

我假设Delphi 的默认调用约定.我知道这EAX用于32位返回值.而看着SysUtils.pas的汇编代码,似乎EBX,ESIEDI推而恢复,但有些则没有.但是,我找不到任何关于此的文档.

And*_*and 11

函数的前三个参数中给出EAX,EDXECX分别.其他参数被推入堆栈.对于对象的方法,Self指针始终是(不可见的)第一个参数.结果应该是EAX.对于返回长字符串的函数,函数的(不可见)最后一个参数是指向结果字符串的指针(它本身是指向字符串第一个字符的指针).

EBX不得改变(除非你的过程/函数结束之前恢复它),所以必须不ESP,EBP,ESI,或EDI无论是.(1)以下是对Delphi内联ASM的精彩介绍:http://www.delphi3000.com/articles/article_3766.asp

  • 这是正确的信息.如果结果是Int64,它位于EAX/EDX对. (2认同)
  • 实际上,寄存器中的内容取决于调用约定.没有什么禁止编写"stdcall"和"cdecl"汇编程序函数,它们不使用寄存器来传递参数.还有寄存器中的内容,堆栈上的内容(以及FPU寄存器中的内容)取决于参数类型.EBX,ESI,EDI可以在程序内部进行更改,只要它们得到妥善保存和恢复即可.当然触摸EBP和ESP更危险. (2认同)
  • @Idsandon:是的,但是OP确实写了"我正在假设Delphi的默认[register]调用约定." (2认同)
  • @Idsandon:我没有提供任何不正确的信息; 我只是没有写关于非简单数据类型的所有细节.我指定的寄存器是默认寄存器,与简单类型(整数和朋友)一起使用.(我在找到这些信息之前很早就找到了,所以我只是想帮忙.)但当然非简单类型稍微复杂一些.例如,任意记录不适合32位寄存器几乎是不言而喻的.但是我的信息仍然有用,因为*记录的指针*适合这样的寄存器.你是不是想在我的...中痛苦? (2认同)