汇编-ENTER和LEAVE指令:创建和结束堆栈帧

请先看堆栈帧的作用:https://www.cnblogs.com/liming19680104/p/17940395
ENTER创建堆栈帧
ENTER 有两个操作数:第一个是常数,定义为局部变量保存的堆栈空间字节数;第二个定义了过程的词法嵌套级
ENTER numbytes, nestinglevel
这两个操作数都是立即数。Numbytes 总是向上舍入为 4 的倍数,以便 ESP 对齐双字边界
Nestinglevel 确定了从主调过程堆栈帧复制到当前帧的堆栈帧指针的个数。在示例程序中,nestinglevel 总是为 0。Intel手册解释了ENTER指令如何在模块结构化语言中支持多级嵌套。
ENTER 指令具体来说,它执行三个操作:
- 把 EBP 入栈 (push ebp)
- 把 EBP 设置为堆栈帧的基址 (mov ebp, esp)
- 为局部变量保留空间 (sub esp, numbytes)
LEAVE结束堆栈帧
LEAVE 指令结束一个过程的堆栈帧。它反转了之前的 ENTER 指令操作:恢复了过程被调用时 ESP 和 EBP 的值
执行两步操作:
mov esp,ebp
pop ebp
示例 1:没有局部变量的过程
.386 .model flat,stdcall option casemap:none .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data .code func Proc enter 0,0 ;创建堆栈帧 ;没有局部变量,所以第一个参数0 ;push ebp ;mov ebp, esp ;=========================== ;============================= leave ;结束堆栈帧 ;执行两步操作: ;mov esp,ebp ;pop ebp ret func endp main PROC invoke func INVOKE ExitProcess,0 main ENDP END main
示例2:ENTER为局部变量保留了 8 个字节的堆栈空间
.386 .model flat,stdcall option casemap:none .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data .code func Proc local local[2]:DWORD enter 8,0 ;创建堆栈帧 ;有8个字节的局部变量,所以第一个参数是8 ;push ebp ;mov ebp, esp ;sub esp,8 ;=========================== ;============================= leave ;结束堆栈帧 ;执行两步操作: ;mov esp,ebp ;pop ebp ret func endp main PROC invoke func INVOKE ExitProcess,0 main ENDP END main
注意:
VS编译器会自动添加enter和leave的功能,无需程序员添加


浙公网安备 33010602011771号