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

函数调用过程
每一个函数调用都有一个过程,在此期间,为函数开辟栈空间、用于本次函数调用临时变量的保存、现场保护。
函数栈帧
函数调用过程中为函数开辟的栈空间称为函数栈帧。
通过一个例子来分析函数栈帧:

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

注:图是从下往上画的,阅读时不要看错,不足之处,请提出宝贵建议
附上全过程图,看不清的步骤请看上面分过程图

这里写图片描述

猜你喜欢

转载自blog.csdn.net/zhangye3017/article/details/78447089
今日推荐