汇编-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的功能,无需程序员添加
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
2020-01-08 PyQt5--QTDesigner--UI资源
2020-01-08 PyQt5--QTDesigner--UI样式表