这是一个技巧/捷径。比如说
ldr r0,=main
会发生的情况是汇编器会在指令附近但在指令路径之外分配一个数据字
ldr r0,main_addr
...
b somewhere
main_addr: .data main
现在将该技巧扩展到常量/立即数,特别是那些无法适合立即移动指令的内容:
top:
add r1,r2,r3
ldr r0,=0x12345678
eor r1,r2,r3
eor r1,r2,r3
b top
组装然后拆卸
00000000 <top>:
0: e0821003 add r1, r2, r3
4: e59f0008 ldr r0, [pc, #8] ; 14 <top+0x14>
8: e0221003 eor r1, r2, r3
c: e0221003 eor r1, r2, r3
10: eafffffa b 0 <top>
14: 12345678 eorsne r5, r4, #125829120 ; 0x7800000
你会看到汇编器已经为你添加了数据字,并将 ldr 更改为你的 pc 相关项。
现在,如果您使用适合 mov 指令的立即数,那么可能取决于汇编器,当然是我正在使用的 gnu,它会将其变成我的 mov
top:
add r1,r2,r3
ldr r0,=0x12345678
ldr r5,=1
mov r6,#1
eor r1,r2,r3
eor r1,r2,r3
b top
00000000 <top>:
0: e0821003 add r1, r2, r3
4: e59f0010 ldr r0, [pc, #16] ; 1c <top+0x1c>
8: e3a05001 mov r5, #1
c: e3a06001 mov r6, #1
10: e0221003 eor r1, r2, r3
14: e0221003 eor r1, r2, r3
18: eafffff8 b 0 <top>
1c: 12345678 eorsne r5, r4, #125829120 ; 0x7800000
所以它基本上是一个打字快捷方式,理解你正在赋予汇编器找到一个地方来保存常量的能力,它通常做得很好,有时会抱怨,不确定我是否看到它未能安全地做到这一点。有时您需要在代码中使用 .ltorg 或 .pool 来鼓励汇编器找到位置。