【发布时间】:2021-04-29 13:01:10
【问题描述】:
考虑到堆栈向下增长(低地址)并假设 intel 语法。
使用以下sn-p:
main:
push ebp
mov ebp, esp
push ebx
push esi
push edi
; ... do stuff
pop edi
pop esi
pop ebx
mov esp, ebp ; <- necessary? i.e. can be omitted?
pop ebp
ret
我知道在进入函数之前,当前堆栈指针被保存到基指针(=堆栈帧)中,但是从指令中我发现mov esp, ebp 是多余的;通过弹出3个寄存器和然后进入基指针不是你增加堆栈指针(更高地址),因此,同时,恢复 堆栈指针?
【问题讨论】:
-
如果值已经恢复如您的示例中,则没有必要。
-
这里似乎不需要它,但如果您减少
esp为局部变量腾出空间,则通常需要它。 -
@interjay 你能举个例子吗?我也会接受它作为答案
-
我只能想象在
push ebp之后和mov ebp, esp之前的push指令(但不确定)