ARM 程序集分支到寄存器或内存中的地址

ARM assembly branch to address inside register or memory

我想知道在 ARM 汇编中我可以使用哪条指令跳转到存储在某个内存地址中的地址或标签。

比如我们可以用B LABEL跳转到LABEL。但是现在目的地只能在运行时间内被知道,并且它存储在某个已知的内存位置,有没有像B [address]这样的东西?

谢谢!

is there something like B [address]?

没有。先把地址载入一个寄存器,然后用BX跳转到:

@ In this example, R0 points to the address to jump to
LDR R1, [R0]
BX R1

您也可以直接将地址加载到PC(虽然我不确定这是否适用于所有 ARM 架构,因此请参阅相关参考文档):

@ In this example, R0 points to the address to jump to
LDR PC, [R0]

ARM 体系结构的一个重要设计范例是只有很少的指令可以对内存进行操作,这可能是一个缓慢的操作:只有 LDRSTR。所以记忆中没有B [label]

对于问题的寄存器部分,回答此类问题的一个好方法是查看指令摘要部分,这些部分按类型对指令进行分组。 ARMv7 和 ARMv8 中有一个分支指令:

  • ARMv7 A4.3 "Branch instructions"

    如在 中提到的,在 ARMv7 中您可以使用 BX register,还有一个 BLX register 设置函数调用的 return 地址。

    从 table,我们知道哪些使用寄存器,因为只有那些可以跳转到 "Any" 地址:那些使用立即数的范围有限,因为完整地址不适合固定的 4每个指令编码的字节数。

    Minimal runnable example.

    中提到的 ARMv7 中的另一个选项是 ldr 进入 PC,因为 PC 只是 r15:

    ldr pc, [r0]
    

    然而,这在 PC 具有专用寄存器的 ARMv8 中不再可能。 B1.2.1 "Registers in AArch64 state" 说:

    Software cannot write directly to the PC. It can only be updated on a branch, exception entry or exception return.

  • ARMv8 C3.1 "Branches, Exception generating, and System instructions"

    在该部分中,我们了解了 BLRBRRET

    BR 类似于 BX,但没有 X,因为没有拇指可担心。

    Minimal runnable example.

    然后文档说 RET 类似于 BR,除了它:

    • 暗示这应该代表一个函数return
    • 寄存器在程序集上是可选的,默认为 x30,这是 BL 放置 return 地址的地方