adr 與 ldr 的區別

直接進入正題:

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彙編。如有錯誤謝謝指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章