【问题标题】:What's the Difference Between Stack Pointer and Frame Pointer in Assembly ARM汇编ARM中堆栈指针和帧指针有什么区别
【发布时间】:2021-06-17 16:29:26
【问题描述】:

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

【问题讨论】:

    标签: assembly arm stack-frame stack-pointer


    【解决方案1】:

    按照我的理解,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 时为你做到这一点)。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • ARM32 的约定是使用 r13 作为堆栈指针。 - 和 r11 作为帧指针。但正如您所提到的,这是编译器制造商使用的约定。在纯汇编中编程时,开发人员可以将任何寄存器用于他们喜欢的任何目的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2019-01-26
      • 2014-09-15
      • 1970-01-01
      • 2014-12-10
      • 2011-04-04
      相关资源
      最近更新 更多