在之前C语言学习的时候,可能我们或多或少都会有下面的困惑:
局部变量是怎么创建的?
为什么局部变量的值是随机值?
函数是怎么传参的?传参的顺序是怎样的?
形参和实参是什么关系?
函数调用是怎么做的?
函数调用时结束后时怎么返回的?
要想弄懂以上问题,那么学习函数栈帧的创建与销毁必不可少
(注:在不同的编译器下,函数调用过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现)
首先来看这样几个概念:
压栈:给栈增加一个元素(在栈顶往上放元素
出栈:从栈顶删除一个元素
寄存器:
寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。
依照《C语言深度剖析》这本书中的说法,CPU相当于皇帝,内存相当于大臣,寄存器就是皇帝身边的小太监(。・∀・)ノ(先不考虑CPU的高速缓冲区)数据从内存里拿出来先放到寄存器,然后CPU再从寄存器里读取数据来处理,处理完后同样把数据通过寄存器存放到内存里,CPU并不直接和内存打交道。
那么为什么要这么麻烦?因为速度!寄存器其实就是一块一块小的存储空间,只不过存取速度比内存快得多。它离CPU很近,CPU一伸手就拿到数据了,比在那么大一块内存里去依照地址寻找数据快多了。
寄存器种类,大家之前可能听说过eax,ebx,ecx,edx;但是今天我们的重点在ebp和esp这两种。esp ebp这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的。
每一个函数调用,都要在栈区创建一块空间,以Add函数举例
我们可以画出栈区,调用main函数我们需要为它在栈区创建一块空间,其中蓝色区域即为main函数的函数栈帧,那么这块空间是由谁来维护的呢?这时候就