mov esp, ebp 真的有必要吗?
Is mov esp, ebp really necessary?
考虑到堆栈向下增长(低地址)并采用 intel 语法。
使用以下代码段:
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 个寄存器 和 然后 到 基指针不是你递增堆栈指针(更高地址)因此,同时时间,恢复堆栈指针?
在您提供的代码中,mov esp, ebp
不是必需的,因为 esp
的原始值在 pop
指令后恢复并且已经等于 ebp
.
但一般来说,如果减少 esp
为局部变量腾出空间,则可能需要此指令。例如:
some_function:
push ebp
mov ebp, esp
sub esp, 256 ; allocate 256 bytes for local variables
; ... function body
mov esp, ebp ; restore esp
pop ebp
ret
这些是 x86 代码中使用的标准 "function prologue" and "function epilogue"。
考虑到堆栈向下增长(低地址)并采用 intel 语法。
使用以下代码段:
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 个寄存器 和 然后 到 基指针不是你递增堆栈指针(更高地址)因此,同时时间,恢复堆栈指针?
在您提供的代码中,mov esp, ebp
不是必需的,因为 esp
的原始值在 pop
指令后恢复并且已经等于 ebp
.
但一般来说,如果减少 esp
为局部变量腾出空间,则可能需要此指令。例如:
some_function:
push ebp
mov ebp, esp
sub esp, 256 ; allocate 256 bytes for local variables
; ... function body
mov esp, ebp ; restore esp
pop ebp
ret
这些是 x86 代码中使用的标准 "function prologue" and "function epilogue"。