[开发工具] C语言在ARM中函数调用时,栈是如何变化的?

[复制链接]
4966|36
updownq 发表于 2025-3-20 14:22 | 显示全部楼层
在函数返回之前,需要恢复调用前的栈状态。
EmmaTT 发表于 2025-3-20 14:41 | 显示全部楼层
百度现在全是广告,一不小心就点进去
febgxu 发表于 2025-3-20 14:49 | 显示全部楼层
编译器可能将局部变量分配到寄存器,减少栈使用。
adolphcocker 发表于 2025-3-20 14:59 | 显示全部楼层
将函数调用后的下一条指令的地址(即返回地址)推入栈中。这通常是通过一条BL(Branch with Link)指令完成的,该指令自动将当前的程序计数器(PC)减去8(为了调整Thumb模式的指令边界)后压入栈中。
ingramward 发表于 2025-3-20 15:18 | 显示全部楼层
限制递归深度,或改为迭代算法。              
yorkbarney 发表于 2025-3-20 15:39 | 显示全部楼层
当函数执行完恢复寄存器和释放栈空间的操作后,程序会跳转到之前保存的返回地址处,继续执行调用函数的后续代码。
janewood 发表于 2025-3-20 15:55 | 显示全部楼层
限制递归深度、增大栈空间。              
updownq 发表于 2025-3-20 16:25 | 显示全部楼层
函数执行完毕后,会清理栈上的局部变量和参数,恢复原来的栈状态。
modesty3jonah 发表于 2025-3-20 16:38 | 显示全部楼层
在函数执行之前,会保存当前的栈帧指针(fp)和链接寄存器(lr)的值到栈中。这是为了在函数执行完毕后能够恢复之前的执行环境。
hilahope 发表于 2025-3-20 16:56 | 显示全部楼层
通过寄存器传递,减少栈占用。              
jimmhu 发表于 2025-3-20 17:33 | 显示全部楼层
函数开始执行,使用栈上的参数,并可能使用栈上的局部变量。
lzbf 发表于 2025-3-21 13:56 | 显示全部楼层
减少局部变量大小、利用寄存器传递参数。
abotomson 发表于 2025-3-21 14:10 | 显示全部楼层
如果函数中有几个局部变量,编译器会计算这些局部变量所需的总空间大小,并将栈指针减去这个大小。
jackcat 发表于 2025-3-21 14:22 | 显示全部楼层
局部变量过大(如大数组)、递归深度过深。
uiint 发表于 2025-3-21 14:39 | 显示全部楼层
被调用函数通常会将一些寄存器的值保存到栈中,以防止这些寄存器的值在函数执行过程中被破坏。
pl202 发表于 2025-3-21 14:53 | 显示全部楼层
调用函数前,需保存返回地址到链接寄存器(lr),以便函数执行完毕后能正确返回。
mikewalpole 发表于 2025-3-21 15:03 | 显示全部楼层
当调用一个函数时,首先会将函数的参数按照逆序(从最后一个参数开始)压入栈中。这是因为在ARM架构中,参数是通过栈传递的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部