汇编-子程序利用堆栈传递参数

 

基本过程

复制代码
 
.386  
.model flat,stdcall 
option casemap:none
.stack 4096
 
.data   
 
ExitProcess PROTO,dwExitCode:DWORD      
 
.code  
 
AddTwo Proc 
        
        push ebp      ;保存当前值;便于结束前恢复
        mov ebp,esp    ;EBP的值被设置为等于ESP,这样EBP就成为AddTwo堆栈的基址指针
        ;AddTwo 有其他数据入栈时,不用通过 EBP 来修改堆栈参数的偏移量。数值会改变的是 ESP,而 EBP 则不会变
        ;看图1
        mov eax,[ebp+12]    ;第二个参数
        add eax, [ebp+8]    ;第一个参数


        pop ebp              ;结束前恢复ebp的值
        ret   8               ;从堆栈中清理参数---方法二【个人推荐】
        ;8   就是在执行ret指令前  先执行add esp, 8
AddTwo endp
 
  
 
main PROC   
    
    push 6  ;把两个参数压入堆栈
    push 5
    invoke AddTwo  ;返回地址压入堆栈
    ;add esp, 8      ;从堆栈中清理参数---方法一
    ;两个参数,每个参数4字节,总共8字节

        
 
 
    INVOKE ExitProcess,0  
main ENDP   
END main  
复制代码

 

 

 

 

局部变量压栈

局部变量会被压入EBP-4    EBP-8 ...空间中

 

复制代码
 
.386  
.model flat,stdcall 
option casemap:none
.stack 4096

ExitProcess PROTO,dwExitCode:DWORD  
 
.data   
    
 
.code  
 
func Proc 
        
        local  loc1[2]:DWORD    ;定义局部变量
        push ebp      
        mov ebp,esp 
        ;=============处理局部变量值==============
        
        mov DWORD PTR [EBP+4],1      ;给局部变量赋值
        ;局部变量会被压入EBP-4    EBP-8 ...空间中,如图2
        
        mov DWORD PTR [EBP+8],2
        ;sub esp,8                
        ;局部变量的长度是8字节,所以堆栈指针减小8字节,以便于后面的push和pop操作

        mov eax,[EBP+4]  
        mov ebx,[EBP+8]

        mov esp,ebp       ;清除局部变量
        ;让esp堆栈指针指向EBP基址

        ;=============================
        pop ebp              
        ret         
        
func endp
 
  
 
main PROC   
    
    
    invoke func
        
 
 
    INVOKE ExitProcess,0  
main ENDP   
END main  
复制代码

 

 

 

 

posted @   天子骄龙  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2023-01-02 MFC-单文档必须有的类
点击右上角即可分享
微信分享提示

目录导航