我需要将32位绝对地址放入AArch64上的寄存器中。 (例如MMIO地址,而不是PC相对地址)。
在ARM32上,可以使用lower16
和upper16
将地址加载到寄存器中
movw r0, #:lower16:my_addr
movt r0, #:upper16:my_addr
是否可以通过使用movk
在AArch64上执行类似的操作?
如果代码已重定位,我仍然希望使用相同的绝对地址,因此adr
不适合。
ldr
可以在附近的文字池中使用,但我宁愿避免这种情况。
答案 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指令来确保将文字池放置在附近且易于预测的位置。