函数栈帧定义
在函数调用过程中,要为函数开辟空间,这个空间用来此次函数调用中临时变量的保存和保护,将这个栈空间称为函数栈帧。
如何调用
例如这段代码:
#include <stdio.h>
//函数栈帧
int Add(int left, int right)
{
int z = 0;
z = left + right;
return z;
}
int main()
{
int a = 10;
int b = 20;
int ret = 0;
ret = Add(a, b);
printf("ret=%d\n", ret);
return 0;
}
进行调试,对准主函数main,转到反汇编,如图:
可以观察到先移动ebp、esp这两个寄存器,其中,ebp保存堆栈底部的地址,esp保存堆栈顶部的地址,即如图:
- main函数栈帧的创建
在反汇编中往下走,堆栈是自下往上由高地址到低地址,函数一步步往后走,堆栈逐步往上压栈
1、在_tmainCRTStartup()上压一个栈,移动esp、ebp
2、为main函数预开辟一个E4h的空间
3、在预开辟空间上压三个栈ebx、esi、edi(这三个栈最后会原封弹出栈空间)
4、将为main开辟的空间初始化为CCCCCCCC - Add函数的调用(Add函数会在栈内开辟一部分空间)
1、参数的传递
如图:
即:
- Add函数的执行
如图:
- 返回部分