浅析函数栈帧、变量的创建与销毁
2017-11-04 23:39
106 查看
函数调用过程
每一个函数调用都有一个过程,在此期间,为函数开辟栈空间、用于本次函数调用临时变量的保存、现场保护。
函数栈帧
函数调用过程中为函数开辟的栈空间称为函数栈帧。
通过一个例子来分析函数栈帧:
分析过程(下面配图):
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函数出栈规则相同,在这里不在画图
注:图是从下往上画的,阅读时不要看错,不足之处,请提出宝贵建议
附上全过程图,看不清的步骤请看上面分过程图
每一个函数调用都有一个过程,在此期间,为函数开辟栈空间、用于本次函数调用临时变量的保存、现场保护。
函数栈帧
函数调用过程中为函数开辟的栈空间称为函数栈帧。
通过一个例子来分析函数栈帧:
#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函数出栈规则相同,在这里不在画图
注:图是从下往上画的,阅读时不要看错,不足之处,请提出宝贵建议
附上全过程图,看不清的步骤请看上面分过程图
相关文章推荐
- .NET框架-内存管理-变量创建与销毁
- Office 2010 word无法创建工作文件 请检查临时环境变量 的解决办法
- 非模式窗体从创建到销毁都需要代码来维护,防止内存未安全释放
- Effective Java 2nd 阅读 第二章 创建和销毁对象
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的赋值和销毁
- ServletContextListener,ServletRequestListener,HttpSessionListener监听对象的创建与销毁
- VC非模态对话框创建和销毁
- MATLAB-字符串连接(以循环变量为名创建文本)
- Activity的创建与销毁、数据的保存和启动模式分析
- 详解Objective-C的meta-class ,runtime创建类,添加实例变量
- 构造,析构,复制构造,重载=,和自动创建无名变量的问题(习题)
- Android 编程下 Activity 的创建和应用退出时的销毁
- 深度学习(四)-Tensor Flow的变量创建、初始化、保存和加载
- linux 学习 : 创建linux 环境变量
- 30.变量的赋值和销毁
- PHP-变量的销毁
- 队列的链式存储结构的实现1 —— 创建销毁判断满空入队
- 【unity3d学习笔记】unity中创建全局变量
- jQuery的ready函数不执行,报错:Unexpected end of input "",原因是js有语法错误,js文件中的所有东西即变量,一点也没有创建到内存中
- tensorflow 变量创建,初始化,共享