【发布时间】:2021-06-17 16:29:26
【问题描述】:
我想知道是否有人可以向我解释一下汇编 ARM 中的堆栈指针和帧指针有什么区别
【问题讨论】:
标签: assembly arm stack-frame stack-pointer
我想知道是否有人可以向我解释一下汇编 ARM 中的堆栈指针和帧指针有什么区别
【问题讨论】:
标签: assembly arm stack-frame stack-pointer
按照我的理解,SP 总是指向下一个可用堆栈 地址(可能需要先预减或预增),其中 将用于推送数据或存储返回地址。
SP 可以在被调用函数执行时更改,例如 该函数在堆栈上动态分配一个存储块。因此 堆栈帧中的数据,例如传递的参数和局部变量 不能通过来自 SP 的偏移量可靠地引用,因为 SP 不保证在整个执行过程中具有相同的值 函数。
FP,OTOH,保证在整个过程中具有相同的值 函数的执行,因此可以通过以下方式访问所有本地数据 来自 FP 的硬编码偏移量。 FP设置为固定值 堆栈帧,通常刚刚超过最后一个传递的参数。
这是我发现可能有用的图像。你可以看到偏移量 来自 FP 的偏移量总是正确的,但来自 SP 的偏移量将取决于 动态区域的大小,因此不能在堆栈帧中分配运行时可变空间量的函数中进行硬编码(如 C99 VLA / alloca)。 https://www.cs.purdue.edu/homes/hosking/502/spim/node23.html。 不的函数可以优化掉一个帧指针(优化编译器会在你从 C 等高级源语言生成 asm 时为你做到这一点)。
【讨论】:
ARM 具有通用寄存器——它们都是相同的——因此为特定目的(例如堆栈指针和帧指针)指定特定寄存器只是一种约定。
ARM64 上的约定是使用 x31 作为堆栈指针,使用 x29 作为帧指针
ARM32 的约定是使用 r13 作为堆栈指针。
【讨论】: