发新帖我要提问
12
返回列表
打印
[开发工具]

C语言在ARM中函数调用时,栈是如何变化的?

[复制链接]
楼主: kmzuaz
手机看帖
扫描二维码
随时随地手机跟帖
21
updownq| | 2025-3-20 14:22 | 只看该作者 回帖奖励 |倒序浏览
在函数返回之前,需要恢复调用前的栈状态。

使用特权

评论回复
22
EmmaTT| | 2025-3-20 14:41 | 只看该作者
百度现在全是广告,一不小心就点进去

使用特权

评论回复
23
febgxu| | 2025-3-20 14:49 | 只看该作者
编译器可能将局部变量分配到寄存器,减少栈使用。

使用特权

评论回复
24
adolphcocker| | 2025-3-20 14:59 | 只看该作者
将函数调用后的下一条指令的地址(即返回地址)推入栈中。这通常是通过一条BL(Branch with Link)指令完成的,该指令自动将当前的程序计数器(PC)减去8(为了调整Thumb模式的指令边界)后压入栈中。

使用特权

评论回复
25
ingramward| | 2025-3-20 15:18 | 只看该作者
限制递归深度,或改为迭代算法。              

使用特权

评论回复
26
yorkbarney| | 2025-3-20 15:39 | 只看该作者
当函数执行完恢复寄存器和释放栈空间的操作后,程序会跳转到之前保存的返回地址处,继续执行调用函数的后续代码。

使用特权

评论回复
27
janewood| | 2025-3-20 15:55 | 只看该作者
限制递归深度、增大栈空间。              

使用特权

评论回复
28
updownq| | 2025-3-20 16:25 | 只看该作者
函数执行完毕后,会清理栈上的局部变量和参数,恢复原来的栈状态。

使用特权

评论回复
29
modesty3jonah| | 2025-3-20 16:38 | 只看该作者
在函数执行之前,会保存当前的栈帧指针(fp)和链接寄存器(lr)的值到栈中。这是为了在函数执行完毕后能够恢复之前的执行环境。

使用特权

评论回复
30
hilahope| | 2025-3-20 16:56 | 只看该作者
通过寄存器传递,减少栈占用。              

使用特权

评论回复
31
jimmhu| | 2025-3-20 17:33 | 只看该作者
函数开始执行,使用栈上的参数,并可能使用栈上的局部变量。

使用特权

评论回复
32
lzbf| | 2025-3-21 13:56 | 只看该作者
减少局部变量大小、利用寄存器传递参数。

使用特权

评论回复
33
abotomson| | 2025-3-21 14:10 | 只看该作者
如果函数中有几个局部变量,编译器会计算这些局部变量所需的总空间大小,并将栈指针减去这个大小。

使用特权

评论回复
34
jackcat| | 2025-3-21 14:22 | 只看该作者
局部变量过大(如大数组)、递归深度过深。

使用特权

评论回复
35
uiint| | 2025-3-21 14:39 | 只看该作者
被调用函数通常会将一些寄存器的值保存到栈中,以防止这些寄存器的值在函数执行过程中被破坏。

使用特权

评论回复
36
pl202| | 2025-3-21 14:53 | 只看该作者
调用函数前,需保存返回地址到链接寄存器(lr),以便函数执行完毕后能正确返回。

使用特权

评论回复
37
mikewalpole| | 2025-3-21 15:03 | 只看该作者
当调用一个函数时,首先会将函数的参数按照逆序(从最后一个参数开始)压入栈中。这是因为在ARM架构中,参数是通过栈传递的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则