如何编写将标签所引用的地址放入寄存器的指令?
答案 0 :(得分:5)
有四种方式,其中三种方式记录在Sourceware's Gnu Assembler manual。我想这个标签是这样的,
target:
.long 0xfeadbeef
adr r0,target
adrl r0,target
ldr r0,=target
sub r0,pc,#(.+8-target)
前两个非常相似并生成sub r0,pc,#offset
。 3 rd 在文字池中放置一个long并通过ldr r0,[pc,#offset2]
加载它,或者如果汇编器发现它可以使用mov
(通常是对齐的标签,例如 0x8000 )。最后一个版本是手动计算它。
adr
和adrl
之间的差异来自即时操作数。它们 8bits 旋转了两倍的倍数。因此,如果地址很远,您可能需要执行两条指令,这通常比通过数据获得完整32位的3 rd ldr
变体更快。缓存或内存。