C语言内功心法秘籍——函数栈帧
- 前言
- 准备工作
- 寄存器
- __tmainCRTStartup()函数
- main()函数建立
- Add()函数建立
- Add函数的销毁过程
- main()函数的销毁过程
- 全图预览
- 结语言
前言
在我们学习C语言的时候我们是否对自己进行过以下灵魂拷问
1.局部变量到底是如何建立的呢?
2.函数内存又是如何开辟的?
3.函数传参的过程又是怎样完成的呢?
…
如果你不太了解,那么我只能说:咦咦咦~~~,还不赶快随我修习这篇心法口诀,带你学习C语言的内功秘籍!!!
准备工作
博主:大大怪先森(记得关注哦!)
编程环境:vs2013
代码案例:
#include<stdio.h>
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 10;
int b = 20;
int c = 0;
c = Add(a, b);
printf("%d\n", c);
return 0;
}
简易图解了解让你不会一脸懵逼
本文汇编基本语句
push:入栈操作
pop:出栈操作
call:call指令
mov:赋值操作
sub:减法操作
lea:下载有效地址(load effective adress)
寄存器
在了解函数的栈帧问题,我们必然不能不先了解一下寄存器到底是个啥和寄存器有哪些?
- 寄存器
中央处理器内的组成部份。它跟CPU有关。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。** ,(其实这些也不是重点,看不懂也没关系,说实话我作为一名IT小白的我也看不懂,我们只需要知道寄存器是独立于内存之外,集成到CPU上的就行) - 寄存器的分类
一般寄存器:AX、BX、CX、DX
AX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器
索引暂存器:SI、DI
SI:来源索引暂存器,DI:目的索引暂存器
堆叠、基底暂存器:SP、BP
SP:堆叠指标暂存器,BP:基底指标暂存器
esp:寄存器存放当前线程的栈顶指针
ebp:寄存器存放当前线程的栈底指针
本篇文章所用到的全部寄存器,如果想要更加的深入了解寄存器,留下你的一键三连,后续会更新哦!你的支持就是我的动力。
__tmainCRTStartup()函数
看到这个函数我们肯定想这是个啥???
不用担心这只是一个小小的用来调用主函数main()的一个奇葩函数而已,如图:
看得到这里通过函数的栈区,我们可以发现原来__tmainCRTStartup()函数原来也是别人来调用的呀!果然计算机也会套娃!但是看到这里我只发现我知道原来main函数也是被这个_tmainCRTStartup()所调用,它自己又是被别人调用,那这些又是如何实现的呢?别急往下看!下面两幅图将带你真正理解main()的创建历程!!!
main()函数建立
Add()函数建立
建立过程:
Add函数的销毁过程
销毁过程:
main()函数的销毁过程
跟着小编学习了Add函数的销毁过程你是否也能自己做出main()函数的创建过程呢?
赶紧动动自己的小脑筋思考一下吧!!!
全图预览
结语言
希望本篇文章能给各位带来帮助,如有不足还请指正!!!
码字不易,各位大大给个收藏点赞吧!!!