我在x86程序集中编写一个函数,应该可以从c代码中调用,我想知道在返回调用者之前我必须恢复哪些寄存器。 目前我只恢复esp和ebp,而返回值是eax。 还有其他我应该关注的寄存器,还是我可以留下任何令我高兴的东西?
我在x86程序集中编写一个函数,应该可以从c代码中调用,我想知道在返回调用者之前我必须恢复哪些寄存器。 目前我只恢复esp和ebp,而返回值是eax。 还有其他我应该关注的寄存器,还是我可以留下任何令我高兴的东西?
运用 微软的32位ABI, EAX
, EDX
和 ECX
是临时寄存器,其他一切都必须保留。
对于Windows下的x64, 微软说 你只需要恢复 RBX
, RBP
, RDI
, RSI
, R12
, R13
, R14
,和 R15
。
对于x64下面的任何内容 System V和AMD64(见图3.4), 它的 RBP
, RBX
, RSP
, R12
, R13
, R14
,和 R15
(它们看起来很奇怪,因为内核使用一组寄存器而userland代码使用另一组,这在ABI文档的附录A中列出)。
32-bit: EBX, ESI, EDI, EBP
64-bit Windows: RBX, RSI, RDI, RBP, R12-R15, XMM6-XMM15
64-bit Linux,BSD,Mac: RBX, RBP, R12-R15
如果您不确定寄存器的情况,下面的这些说明可以轻松地节省一天。
PUSHA / PUSHAD - 推送所有通用寄存器
POPA / POPAD - 弹出所有一般登记册
这些指令按一定顺序推送和弹出通用和SI / ESI,DI / EDI寄存器。
PUSHA / PUSHAD指令的顺序如下。
Opcode Instruction Clocks Description
60 PUSHA 18 Push AX, CX, DX, BX, original SP, BP, SI, and DI
60 PUSHAD 18 Push EAX, ECX, EDX, EBX, original ESP, EBP ESI, and EDI
POPA / POPAD指令的顺序如下。 (按相反顺序)
Opcode Instruction Clocks Description
61 POPA 24 Pop DI, SI, BP, SP, BX, DX, CX, and AX
61 POPAD 24 Pop EDI, ESI, EBP, ESP(***),EBX, EDX, ECX, and EAX
*** ESP值被丢弃而不是加载到ESP中。