直接進入正題:
adr:
adr r1, var
var: .word 0x0000 0008
ldr:
ldr r1, = var
var: .word 0x0000 0008
上面兩條指令都是取标号var 的位址
分别反彙編上面的代碼:
假設它們的連結位址都是-Text=0x0000 0000
0: sub pc, pc, #4 //pc = 4
4: var.word 0x0000 0008
0: ldrpc, [pc, #0]//pc = 4
4: var:.word 0x0000 0008
8: .word4//緩沖池
由上面的代碼可知:兩條指令都是基于目前PC值的,把程式放在正确的連結位址它們都是可以正确執行的。
但是把它們放在任意位址的話,adr的會正确執行,ldr的會出現錯誤,為什麼呢?
假設我們把上面的代碼放到0x3000 0000 處:
0x3000 0000: add subpc, pc, #4//它取到的是0x3000 0004
0x3000 0004: var.word0x0000 0008
0x3000 0000: ldrpc, [pc, #0]//重點:這條指令還是取到的是0x0000 0004
0x3000 0004: var:.word 0x0000 0008
0x3000 0008:.word 0x0000 0004//緩沖池
是以不難看出:出錯的本質原因是在連結的時候配置設定緩沖池已經将标号var的位址已經定死,我們再怎麼移動代碼它都是固定值。
總結:要産生的代碼與位置無關,用adr!
本人是菜鳥,剛剛學習arm彙編。如有錯誤謝謝指出。