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

相关推荐
Sss_Ass15 天前
跟着老师不迷路系列---跟着李述铜老师学习汇编语言之基本汇编程序符号绑定语句
学习·嵌入式·汇编语言·李述铜·符号绑定语句
Sss_Ass15 天前
跟着老师不迷路系列---跟着李述铜老师学习汇编语言之内核寄存器简介
学习·学习方法·汇编语言·李述铜
Sss_Ass15 天前
跟着老师不迷路系列——跟着李述铜老师学习汇编语言之基本汇编程序section指令
学习·学习方法·汇编语言·李述铜·section指令
Sss_Ass15 天前
跟着老师不迷路系列---跟着李述铜老师学习汇编语言之基本汇编程序指令集分类
开发语言·学习·学习方法·汇编语言·李述铜
alanesnape3 个月前
CPU眼中的i++ 与 ++i
cpu·汇编语言
肆忆_3 个月前
刨根问底:从反汇编看 C++ 对象的生与死
汇编语言
zhongvv4 个月前
对单片机C语言指针的一些理解
c语言·数据结构·单片机·指针·汇编语言
-曾牛4 个月前
【汇编语言入门】从第一个加法程序吃透汇编核心基础
汇编·单片机·嵌入式硬件·汇编语言·病毒分析·lcx·逆向开发
ComputerInBook4 个月前
函数调用栈帧分析(Windows平台)
c语言·windows·编译原理·汇编语言·c++语言
Logic1015 个月前
深入理解C语言if语句的汇编实现原理:从条件判断到底层跳转
c语言·汇编语言·逆向工程·底层原理·条件跳转·编译器原理·x86汇编