内功心法秘籍之函数栈帧(附图详解)
前言
在我们学习C语言的时候我们是否对自己进行过以下灵魂拷问 1.局部变量到底是如何建立的呢? 2.函数内存又是如何开辟的? 3.函数传参的过程又是怎样完成的呢? … 如果你不太了解,那么我只能说:咦咦咦~~~,还不赶快随我修习这篇心法口诀,带你学习C语言的内功秘籍!!!
准备工作
#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 ", c); return 0; }
简易图解了解让你不会一脸懵逼 本文汇编基本语句
push:入栈操作 pop:出栈操作 call:call指令 mov:赋值操作 sub:减法操作 lea:下载有效地址(load effective adress)
寄存器
在了解函数的栈帧问题,我们必然不能不先了解一下寄存器到底是个啥和寄存器有哪些?
- 寄存器 中央处理器内的组成部份。它跟CPU有关。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。** ,(其实这些也不是重点,看不懂也没关系,说实话我作为一名IT小白的我也看不懂,我们只需要知道寄存器是独立于内存之外,集成到CPU上的就行)
__tmainCRTStartup()函数
看到这个函数我们肯定想这是个啥??? 不用担心这只是一个小小的用来调用主函数main()的一个奇葩函数而已,如图: 看得到这里通过函数的栈区,我们可以发现原来__tmainCRTStartup()函数原来也是别人来调用的呀!果然计算机也会套娃!但是看到这里我只发现我知道原来main函数也是被这个_tmainCRTStartup()所调用,它自己又是被别人调用,那这些又是如何实现的呢?别急往下看!下面两幅图将带你真正理解main()的创建历程!!!
main()函数建立
Add()函数建立
建立过程:
Add函数的销毁过程
销毁过程:
main()函数的销毁过程
跟着小编学习了Add函数的销毁过程你是否也能自己做出main()函数的创建过程呢? 赶紧动动自己的小脑筋思考一下吧!!!