汇编-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的功能,无需程序员添加 

 

 

 

 

 

posted @   天子骄龙  阅读(584)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!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样式表
点击右上角即可分享
微信分享提示

目录导航