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 - 某个数 表示的是局部变量

相关推荐
二级小助手7 天前
四级 Linux 应用与开发工程师笔记:8086 汇编、存储器、接口芯片和操作系统计算题整理
汇编语言·操作系统原理·计算机等级考试·计算机四级·四级linux应用与开发工程师·计算机组成与接口
波儿菜8 天前
Xcode MCP 助力运行时二进制分析
人工智能·程序员·汇编语言
doujiaozh1 个月前
我在 Win7 老电脑上从零手搓了一个操作系统内核:32位分页、中断接管与 Shell 终端
操作系统·汇编语言
挖掘狂人2 个月前
ObjectSense:一门千行内核、把可靠性写进骨子里的面向对象脚本语言
程序员·编程语言·汇编语言
sunoo-2292 个月前
【ARM嵌入式学习笔记Day6】一文打通i.MX6ULL时钟体系:PLL/PFD/预分频+滞回比较器全解析
arm开发·笔记·vscode·单片机·imx6ull·汇编语言
_瑞3 个月前
APM_符号化原理
ios·汇编语言
_瑞3 个月前
APM_寄存器
ios·汇编语言
_瑞3 个月前
读懂 iOS 的线程调用栈
ios·编译原理·汇编语言
Lihua奏5 个月前
汇编语言:看懂高级代码背后发生了什么
汇编语言
小宇子2B5 个月前
一个 7 行的 C 函数,是怎么一路变成 CPU 上的电信号
c·汇编语言