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