函数调用与栈帧空间

源代码与可执行代码

首先我们的源代码会被编译链接成机器指令,存放在内存的“代码区”。然后在代码执行过程中,会在另外开辟内存空间来协助程序的执行。如在函数调用时会在“栈内存”中开辟空间来存放局部变量等;在new对象或malloc空间时,会在“堆空间”中开辟空间来存放数据。

函数调用与栈帧

在程序语言中,假设“函数A”调用“函数B”,“函数B”调用“函数C”,“函数C”调用“函数D”,那么在程序的栈内存中结构如下:

每个函数的栈帧存放的内容大概是一样的,主要有:

调用该函数的函数栈帧的栈底地址ebp
各种局部变量
下一个被调用函数的参数变量
调完被调函数后的返回地址

在函数调用过程中,有两个寄存器非常重要,即esp和ebp。寄存器ebp中存放的是当前执行函数栈帧的栈底地址,寄存器esp中存放的是当前执行函数栈帧的栈顶地址。

学习资料参考于:
《码农翻身—CPU阿甘:函数调用的秘密》
《c函数调用过程原理及函数栈帧分析》