直接進入正題:
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彙編。如有錯誤謝謝指出。