函数调用过程
每一个函数调用都有一个过程,在此期间,为函数开辟栈空间、用于本次函数调用临时变量的保存、现场保护。
函数栈帧
函数调用过程中为函数开辟的栈空间称为函数栈帧。
通过一个例子来分析函数栈帧:
#include<stdio.h>
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 1;
int b = 2;
int ret = 0;
ret = Add(a, b);
printf("%d\n", ret);
return 0;
}
分析过程(下面配图):
1)main 函数在 __tmainCRTStartup函数中调用,故而在 main 函数创建栈帧前,还有 _tmainCRTStartup 的函数栈帧(在这里不详细介绍);
2)栈帧的维护需要两个寄存器来存放栈底指针和栈顶指针,即 ebp (栈底指针)和 esp(栈顶指针);
3)出栈和入栈的规则为先进后出,后进先出;
4)main 函数创建栈帧时,主要分为几个步骤:压栈,开辟空间,空间的初始化,局部变量的创建;
5)接下来就是函数的调用过程,包括:参数的传递,进入到Add 函数内部,进行 Add 函数栈帧的创建,同时也有压栈、开辟空间、空间的初始化、创建局部变量等几个步骤;
6)函数的返回,出栈时保证后进先出的规则,故而是 Add 函数先进行出栈,通过寄存器将所求的值带回。
1. main 函数栈帧的创建以及局部变量的创建:
2. 实参传给形参:
3. Add函数内部:
4.函数返回
5.main函数内部的出栈,和Add函数出栈规则相同,在这里不在画图
注:图是从下往上画的,阅读时不要看错,不足之处,请提出宝贵建议
附上全过程图,看不清的步骤请看上面分过程图