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

 

基本过程

 
.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 @ 2024-01-02 14:21  天子骄龙  阅读(80)  评论(0)    收藏  举报