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

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

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

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

这里写图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值