内功心法秘籍之函数栈帧(附图详解)

前言

在我们学习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)

寄存器

在了解函数的栈帧问题,我们必然不能不先了解一下寄存器到底是个啥和寄存器有哪些?

  1. 寄存器 中央处理器内的组成部份。它跟CPU有关。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。** ,(其实这些也不是重点,看不懂也没关系,说实话我作为一名IT小白的我也看不懂,我们只需要知道寄存器是独立于内存之外,集成到CPU上的就行)

__tmainCRTStartup()函数

看到这个函数我们肯定想这是个啥??? 不用担心这只是一个小小的用来调用主函数main()的一个奇葩函数而已,如图: 看得到这里通过函数的栈区,我们可以发现原来__tmainCRTStartup()函数原来也是别人来调用的呀!果然计算机也会套娃!但是看到这里我只发现我知道原来main函数也是被这个_tmainCRTStartup()所调用,它自己又是被别人调用,那这些又是如何实现的呢?别急往下看!下面两幅图将带你真正理解main()的创建历程!!!

main()函数建立

Add()函数建立

建立过程:

Add函数的销毁过程

销毁过程:

main()函数的销毁过程

跟着小编学习了Add函数的销毁过程你是否也能自己做出main()函数的创建过程呢? 赶紧动动自己的小脑筋思考一下吧!!!

全图预览

结语言

经验分享 程序员 微信小程序 职场和发展