源代码与可执行代码
首先我们的源代码会被编译链接成机器指令,存放在内存的“代码区”。然后在代码执行过程中,会在另外开辟内存空间来协助程序的执行。如在函数调用时会在“栈内存”中开辟空间来存放局部变量等;在new对象或malloc空间时,会在“堆空间”中开辟空间来存放数据。
函数调用与栈帧
在程序语言中,假设“函数A”调用“函数B”,“函数B”调用“函数C”,“函数C”调用“函数D”,那么在程序的栈内存中结构如下:
每个函数的栈帧存放的内容大概是一样的,主要有:
调用该函数的函数栈帧的栈底地址ebp
各种局部变量
下一个被调用函数的参数变量
调完被调函数后的返回地址
在函数调用过程中,有两个寄存器非常重要,即esp和ebp。寄存器ebp中存放的是当前执行函数栈帧的栈底地址,寄存器esp中存放的是当前执行函数栈帧的栈顶地址。