5.8086 汇编中栈平衡和函数调用过程分析

栈帧

内平栈和外平栈

栈平衡:函数调用前后的栈顶指针要一致,栈如果不平衡的结果,栈空间迟早被用完

  1. 外平栈是通过调用的地方操作sp去达到平衡

  2. 内平栈是函数调用内部通过 ret 某个数值去平衡

调用约定

  • __cdecl:外平栈,参数从右至左入栈
  • __stdcall:内平栈,参数从右边至左边入栈
  • __fastcall:内平栈,ecx,edx分别传参前面2个参数,其他参数从右至左如栈

寄存器和局部变量保护

函数的调用流程(内存)

  1. push 参数
  2. push 函数的返回地址
  3. push bp (保留bp之前的值,方便以后恢复)
  4. mov bp,sp(保留sp之前的值,方便以后恢复)
  5. sub sp,空间大小 (分配空间给局部变量)
  6. 保护可能要用到的寄存器了
  7. 执行业务逻辑
  8. 恢复寄存器之前的值(恢复sp之前的值)
  9. mov sp, bp
  10. pop bp (恢复bp之前的值)
  11. ret(将函数的返回地址出栈,执行下一条指令
  12. 恢复栈平衡 (add sp,参数所占的空间)

参数和返回值

一般用 bp + 某个数 表示的是参数 一般用 bp - 某个数 表示的是局部变量

相关推荐
YangWeiminPHD15 天前
从零开始构建你的第一个8051汇编程序:掌握A51汇编语言核心知识
51单片机·汇编语言·金水32051编译器
Sss_Ass1 个月前
跟着老师不迷路系列---跟着李述铜老师学习汇编语言之基本汇编程序符号绑定语句
学习·嵌入式·汇编语言·李述铜·符号绑定语句
Sss_Ass1 个月前
跟着老师不迷路系列---跟着李述铜老师学习汇编语言之内核寄存器简介
学习·学习方法·汇编语言·李述铜
Sss_Ass1 个月前
跟着老师不迷路系列——跟着李述铜老师学习汇编语言之基本汇编程序section指令
学习·学习方法·汇编语言·李述铜·section指令
Sss_Ass1 个月前
跟着老师不迷路系列---跟着李述铜老师学习汇编语言之基本汇编程序指令集分类
开发语言·学习·学习方法·汇编语言·李述铜
alanesnape3 个月前
CPU眼中的i++ 与 ++i
cpu·汇编语言
肆忆_4 个月前
刨根问底:从反汇编看 C++ 对象的生与死
汇编语言
zhongvv5 个月前
对单片机C语言指针的一些理解
c语言·数据结构·单片机·指针·汇编语言
-曾牛5 个月前
【汇编语言入门】从第一个加法程序吃透汇编核心基础
汇编·单片机·嵌入式硬件·汇编语言·病毒分析·lcx·逆向开发
ComputerInBook5 个月前
函数调用栈帧分析(Windows平台)
c语言·windows·编译原理·汇编语言·c++语言