ARM汇编分支,用于寻址寄存器或内存

时间:2015-08-31 05:43:32

标签: assembly arm

我想知道ARM程序集中哪些指令可用于分支存储在某个内存地址中的地址或标签。

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

谢谢!

2 个答案:

答案 0 :(得分:5)

  

是否有类似B [地址]的内容?

没有。首先将地址加载到寄存器中,然后使用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]

答案 1 :(得分:1)

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

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

  • ARMv7 A4.3“分支指令”

    https://stackoverflow.com/a/32305904/9160762所述,在ARMv7中,您可以使用BX register,还有一个BLX register可以设置函数调用的返回地址。

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

    Minimal runnable example

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

    ldr pc, [r0]
    

    但是,在PC具有专用寄存器的ARMv8中,这不再可行。 B1.2.1“处于AArch64状态的寄存器”说:

      

    软件无法直接写入PC。它   只能在分支,异常条目或   异常返回。

  • ARMv8 C3.1“分支,异常产生和系统指令”

    在该部分中,我们了解BLRBRRET

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

    Minimal runnable example

    然后文档说RETBR类似,除了它:

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