【发布时间】:2014-06-13 03:51:48
【问题描述】:
x86 汇编程序例程通常以以下序言开始:
push ebp ; Save ebp
mov ebp, esp ; Set stack frame pointer
sub esp, localbytes ; Allocate space for locals
push <registers> ; Save registers
我见过函数 push 有 1 到 4 个寄存器。
除了推送ebp(这是必需的)之外,是什么决定了你是否推送edi、esi和/或ebx?
你应该总是推动他们吗?我找不到为我解决此问题的参考。
【问题讨论】:
-
虽然有一个 x86 ABI 和一个 64 位 ABI,(使用你最喜欢的搜索引擎)它讲述了易失性和非易失性寄存器和调用约定;您没有义务保存任何寄存器。虽然,如果您要与操作系统或其他库进行交互,那么您必须遵守该操作系统的 ABI。您正在使用 Assembly,您拥有完全的控制权!
-
一些编译器(例如 Microsoft)有一个无帧指针选项,它可以释放 EBP 以用于其他目的。不过,它仍然需要保存(如果使用)。
-
"什么决定了你是否推送.." 你的使用决定了你想要或需要推送哪些。你推送你修改的那些,并在你完成它们之后想要它们的原始值。
-
@Gunner:同意 - ABI 在这里很重要,它会告诉您可以更改的内容。但是“你没有义务保存任何寄存器”我认为你的意思是“除非你和他们一起玩”:-)