函数调用栈帧

函数调用栈帧

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

===================分割线2019年8月14日 =======================
这儿关于栈帧的部分的理解是错误的。建以大家看《深入理解计算机系统第三版》3.7节,讲的很清楚,把整个函数的调用过程都讲的很清楚。有时间我再把这段补上。。。。。。。

函数的调用过程

下面通过一个例子来看一下函数调用过程中堆栈的变化:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
函数的调用过程总结如下图所示:
在这里插入图片描述
函数的调用主要是通过操作ebp(栈基址指针寄存器) 和 esp(栈顶指针寄存器)两个寄存器来进行的;
ps 1:图中的空递减栈应该修改为 空递增栈
ps 2:大多数计算机系统采用满递减栈的形式组织堆栈。对于arm处理器而言,虽然arm的堆栈管理完全由软件人员完成,但是ATPCS规定arm编译器按照满递减的方式组织堆栈。因此,在arm处理器中通常采用LDMFD和STMFD指令来进行堆栈操作。
ps 3:mov指令和movl指令的源操作数和目的操作数的位置刚好是相反的(来自:汇编中movl,movw,movb的作用
ps 4:这篇博客好多错误啊。。。emmm,但是对于ebp和esp的讲解还是很清楚的。
参考:
[1] 详细解析ESP寄存器与EBP寄存器
[2] 实例讲解linux c中函数的栈结构(x86)
[3] X86-64和ARM64用户栈的结构 (1) —背景介绍

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值