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

rem*_*ohn 3 assembly arm

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

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

谢谢!

Mic*_*ael 5

有什么像B [地址]?

不.先将地址加载到寄存器中,然后用BX它跳转到它:

@ In this example, R0 points to the address to jump to
LDR R1, [R0]
BX R1
Run Code Online (Sandbox Code Playgroud)

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

@ In this example, R0 points to the address to jump to
LDR PC, [R0]
Run Code Online (Sandbox Code Playgroud)


Cir*_*lli 5

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

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

  • ARMv7 A4.3“分支指令”

    /sf/answers/2261413311/所述,在ARMv7中您可以使用BX register,并且还有一个BLX register设置函数调用的返回地址。

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

    最小的可运行示例

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

    ldr pc, [r0]
    
    Run Code Online (Sandbox Code Playgroud)

    然而,这在 ARMv8 中不再可能,因为 PC 有一个专用寄存器。B1.2.1“在 AArch64 状态下注册”说:

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

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

    在该部分中,我们了解BLR,BRRET

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

    最小的可运行示例

    然后文档说这RET类似于BR,但它:

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