函数调用栈帧

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/baidu_35679960/article/details/82811121

函数调用栈帧

在函数调用发生时,编译器会维护一个与该调用相关的栈结构,通常我们称这个栈结构为调用栈帧;
废话不多说,函数调用栈的栈结构如下图:
在这里插入图片描述
图中包括上下两个独立的栈帧,上面是主调函数的调用栈,下面是被调函数的调用栈,两个函数之间参数的传递都是值得拷贝(例如:通过变址寻址来进行值的拷贝,对于arm处理器来讲,如果函数的参数不超过4个,则通过寄存器r0~r3来传递参数),这也说明了为什么被调函数对形参的修改对主调函数内的局部变量无影响。

函数的调用过程

下面通过一个例子来看一下函数调用过程中堆栈的变化:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
函数的调用过程总结如下图所示:
在这里插入图片描述
函数的调用主要是通过操作ebp(栈基址指针寄存器) 和 esp(栈顶指针寄存器)两个寄存器来进行的;
图中

参考:
[1] 详细解析ESP寄存器与EBP寄存器
[2] 实例讲解linux c中函数的栈结构(x86)
[3] X86-64和ARM64用户栈的结构 (1) —背景介绍

猜你喜欢

转载自blog.csdn.net/baidu_35679960/article/details/82811121