关于弹出返回地址时ESP/RSP作用及LEAVE指令执行逻辑的咨询
LEAVE 指令执行逻辑准确性验证
首先给出明确结论:你查询到的手册描述完全准确,你对指令流程的理解也完全正确。
LEAVE 指令本身没有复杂逻辑,本质是两条栈操作指令的原子组合,等效于以下汇编代码:
mov esp, ebp pop ebp
两段操作对应手册描述的两个步骤:
- 第一步
mov esp, ebp:将当前栈帧的基址赋值给栈指针,直接清空当前函数栈帧中从栈顶到帧基址之间的所有局部变量、临时存储占用的栈空间,此时 ESP 刚好指向 enter 指令执行时压入的调用方旧 EBP 地址 - 第二步
pop ebp:将 ESP 指向的旧 EBP 值弹出到 EBP 寄存器,同时 ESP 自动按地址宽度偏移(32位模式下+4,64位模式下+8),此时 ESP 刚好指向栈上存储的函数返回地址,后续执行 RET 指令就可以直接弹出返回地址到指令指针寄存器,完成控制权返回。
你引用的手册描述和实际执行逻辑完全对应:
释放之前由ENTER指令设置的栈帧。LEAVE指令将EBP寄存器中的帧指针复制到栈指针寄存器ESP,释放当前栈帧分配的栈空间。随后由ENTER指令保存的调用方旧帧指针会从栈中弹出到EBP寄存器,恢复调用方的栈帧。通常LEAVE指令执行后会跟随RET指令,将程序控制权返回给调用方。
部分网络教程讲解出现偏差,多是因为混淆了栈的向下增长逻辑,或是搞反了 ENTER 和 LEAVE 的操作顺序,以官方架构手册的描述为准即可。
内容的提问来源于stack exchange,提问作者Thomas Cosenza
相关产品推荐
相关产品推荐

