函数调用过程
函数调用过程中的步骤:
- 按照调用约定传参
- 保存返回地址
- 流程转移
- 保存上一层栈帧地址
- 开辟局部变量空间
- 开始执行被调用函数的代码
详细得展示各个步骤。
栈帧的概念
我们已经知道,因为每个函数被调用过程,那个函数的参数、局部变量、返回地址, 都会放在一断特定的栈区域中,并且每个被调用的函数,都对应了一段特定的栈区 域,那一段特定的栈区域,称为那一个被调用函数的栈帧。
void Fun2(int arg)
{
int nValue = 0;
printf("fun2:%08X, %p\r\n", &arg, &nValue);
}
void Fun1(int arg)
{
int nValue = 0;
Fun2(0x22222222);
printf("fun1:%08X, %p\r\n", &arg, &nValue);
}
int main(int argc, char* argv[])
{
printf("main:%p\r\n", &argc);
Fun1(0x11111111);
return 0;
}
通过以上代码可以验证,紧挨着返回地址的“栈帧”,确实是指向了上一层调用方的栈帧,这种设计,使得当前函数结束后,程序流程都可以顺利地找到上一层栈帧。
通过以上的图和代码实验