栈帧



内平栈和外平栈
栈平衡:函数调用前后的栈顶指针要一致,栈如果不平衡的结果,栈空间迟早被用完
-
外平栈是通过调用的地方操作sp去达到平衡
-
内平栈是函数调用内部通过 ret 某个数值去平衡
调用约定
- __cdecl:外平栈,参数从右至左入栈
- __stdcall:内平栈,参数从右边至左边入栈
- __fastcall:内平栈,ecx,edx分别传参前面2个参数,其他参数从右至左如栈
寄存器和局部变量保护
函数的调用流程(内存)
- push 参数
- push 函数的返回地址
- push bp (保留bp之前的值,方便以后恢复)
- mov bp,sp(保留sp之前的值,方便以后恢复)
- sub sp,空间大小 (分配空间给局部变量)
- 保护可能要用到的寄存器了
- 执行业务逻辑
- 恢复寄存器之前的值(恢复sp之前的值)
- mov sp, bp
- pop bp (恢复bp之前的值)
- ret(将函数的返回地址出栈,执行下一条指令
- 恢复栈平衡 (add sp,参数所占的空间)
参数和返回值
一般用 bp + 某个数 表示的是参数 一般用 bp - 某个数 表示的是局部变量
