汇编ARM中堆栈指针和帧指针有什么区别

时间:2021-06-17 16:29:26

标签: assembly arm stack-frame stack-pointer

我想知道是否有人可以向我解释汇编 ARM 中堆栈指针和帧指针之间的区别

2 个答案:

答案 0 :(得分:5)

按照我的理解,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 时为您做这件事)。

答案 1 :(得分:1)

ARM 有通用寄存器——它们都是一样的——所以为特定目的(例如堆栈指针和帧指针)指定特定寄存器只是一种约定。

ARM64 上的约定是使用 x31 作为堆栈指针,使用 x29 作为帧指针

ARM32 上的约定是使用 r13 作为堆栈指针。

相关问题