函数栈帧
程序的虚拟地址空间
在了解函数的栈帧之前,我们先了解一下虚拟地址空间的概念。操作系统给每个c语言程序实例分配了一块虚拟地址空间,营造了一种每个程序都独占则内存的假象。这块内存地址的分布如下。
栈区
栈是一种先进后出的数据结构。在C程序的地址空间中,%esp寄存器指向栈顶,%ebp寄存器指向栈底。栈由高地址向低地址延申,入栈时esp向低地址处移动,出栈时esp向高地址处移动
函数的调用依赖于栈。调用函数,栈增加。函数返回,栈缩小。
函数调用
1 |
调用函数的过程本质上是修改PC(程序计数器)的值,PC指向了下一条执行指令的地址
在调用函数前
- 参数从右往左依次入栈,
- call指令将返回地址入栈,用于指明当函数返回时下一条执行语句
参数传递
在32位的系统中,参数的传递是靠栈来进行的。
在X86-64架构中函数的参数是存储在寄存器中的,分别存储在di,si,dx,cx,r8,r9寄存器中。如果函数的参数大于6,超过的部分需要使用栈来进行传递
局部变量
1 | long caller() |
对应汇编代码
1 | subq $16, %rsp |
创建局部变量
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 xiao's blog!