您的位置:首页 > 其它

浅析函数栈帧、变量的创建与销毁

2017-11-04 23:39 106 查看
函数调用过程

每一个函数调用都有一个过程,在此期间,为函数开辟栈空间、用于本次函数调用临时变量的保存、现场保护。

函数栈帧

函数调用过程中为函数开辟的栈空间称为函数栈帧。

通过一个例子来分析函数栈帧:

#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函数出栈规则相同,在这里不在画图

注:图是从下往上画的,阅读时不要看错,不足之处,请提出宝贵建议

附上全过程图,看不清的步骤请看上面分过程图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数