在寄存器或内存中寻址的ARM汇编分支



我想知道在ARM汇编中,我可以使用哪个指令来分支到存储在某些内存地址中的地址或标签。

例如,我们可以使用B LABEL跳转到LABEL。但是现在目的地只能在运行时被知道,并且它被存储在一些已知的内存位置,是不是有像B[地址]这样的东西?

谢谢!

有类似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 "分支指令"

    正如在:https://stackoverflow.com/a/32305904/9160762中提到的,在ARMv7中,您可以使用BX register,也有一个BLX register,它为函数调用设置返回地址。

    从这个表中,我们知道哪些是使用寄存器的,因为只有那些可以跳转到"任意"地址:那些使用直接地址的范围有限,因为完整地址不适合每条指令固定的4字节编码。

    最小可运行示例。

    ARMv7中提到的另一个选项:https://stackoverflow.com/a/32305904/9160762是ldr到PC,因为PC只是r15:

    ldr pc, [r0]
    

    然而,这在ARMv8中是不可能的,PC有一个专用的寄存器。B1.2.1 "寄存器在AArch64状态"说:

    软件不能直接写入PC。它只能在分支、异常条目或异常回报。

  • ARMv8 C3.1 "分支、异常生成和系统指令"

    在这一节中,我们学习了BLRBRRET

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

    最小可运行示例。

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

    • 给出了一个提示,这应该代表一个函数返回
    • 寄存器在程序集中是可选的,默认为x30,这是BL放置返回地址
    • 的地方。

最新更新