:lower16,:upper16用于aarch64;寄存器中的绝对地址;

时间:2019-03-12 01:23:25

标签: assembly arm arm64

我需要将32位绝对地址放入AArch64上的寄存器中。 (例如MMIO地址,而不是PC相对地址)。

在ARM32上,可以使用lower16upper16将地址加载到寄存器中

movw    r0, #:lower16:my_addr
movt    r0, #:upper16:my_addr

是否可以通过使用movk在AArch64上执行类似的操作?

如果代码已重定位,我仍然希望使用相同的绝对地址,因此adr不适合。

ldr可以在附近的文字池中使用,但我宁愿避免这种情况。

2 个答案:

答案 0 :(得分:1)

为什么不只是

let childObject = Child("Secret Message")
console.log(childObject.getMessage())     // logs "Message is Secret Message"
console.log(childObject.getProps())       // logs "Secret Message"

对于您要为其编程的任何微体系结构,这应该扩展为最佳代码。

答案 1 :(得分:1)

假设Peter Cordes对帖子的编辑反映了您的实际意图,则可以使用MOVL psuedo-instruction将绝对地址加载到寄存器中,而无需使用LDR指令。例如:

    MOVL x0, my_addr

MOVL指令的优点是既可以使用外部定义的符号,也可以使用局部定义的常数。伪指令将扩展为两个或四个指令,具体取决于目标是32位还是64位寄存器,通常是MOV指令,然后是一个或三个MOVK指令

但是,为什么LDR指令(特别是LDR pseudo-instruction)也无法正常工作,这并不明显。通常,这会导致文字池产生PC相对负载,汇编程序会将其放在与代码相同的部分(区域)中。

例如:

    LDR x0, =my_addr

将被组装成类似这样的东西:

    LDR x0, literal_pool   ; LDR (PC-relative literal)
    ; ...
literal_pool:
    .quad my_addr

由于literal_pool与引用它的PC相对LDR指令是同一代码节的一部分,因此该指令和符号之间的偏移量永不改变,从而使该代码可重定位。您可以将蹦床代码放在其单独的部分中,和/或使用LTORG指令来确保将文字池放置在附近且易于预测的位置。