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

185 阅读1分钟

栈帧

image.png

image.png

image.png

内平栈和外平栈

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

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

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

调用约定

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

image.png