汇编-子程序利用堆栈传递参数
基本过程
.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