希望是美好的,也许是人间至善,而美好的事物永不消逝。——《肖申克的救赎》
目录
前言:
大家好,我是拳击哥。我们在编写程序时,会自定义一些函数,我们会用它来进行一些功能实现,那它在内存中的样子是什么呢,实参是如何传参给形参的呢?实际上自定义的函数是在栈区创建的一片空间,我们通过一些汇编指令来实现传参回参。今天我给大家带来的博文内容是什么是函数的栈帧,理解函数的栈帧能解决什么问题。并且理解函数栈帧的创建与销毁的过程。下面我就来详细解析。
1、什么是函数栈帧?
我们在编写程序的时候会自定义函数,自定义函数在调用时。会在内存中开辟一道空间那么这个空间就是该函数的栈帧(stack frame)。那么这些空间里面存放函数参数以及函数返回值,临时变量,保存上下文信息。我们来看一个图大致理解一下:
2、理解函数栈帧能解决什么问题
我们在理解函数栈帧后,以下几个问题就理解了:
- 局部变量的创建过程
- 为什么局部变量不初始化内容就是随机值
- 函数调用的时候是如何传参的,顺序是怎样的
- 函数的形参和实参是怎样实例化的
- 函数的返回值能带回什么
3、函数栈帧是什么
3.1什么是栈?
栈(stack)是计算语言中最重要的概念之一,我们运行的每一个程序都是用了栈。如果没有栈就没有函数、局部变量、所有的C语言。
栈被定义为一种特殊的容器,用户可以将数据压入栈中(入栈,push),也可以将已经压入栈中的数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈的数据后出栈(First In Last Out, FIFO)。就像叠成一叠的书,先叠上去的书在最下面,因此要最后才能取出。
push:压栈,pop:出栈:
那么如果一块函数的栈帧经过push指令后 ,这块函数的栈帧会延申值最后一个push的指令上方。
3.2认识寄存器和汇编指令
1、寄存器
- eax:通用寄存器,保留临时数据,常用于返回值
- ebx:通用寄存器,保留临