天天看點

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

繼續閱讀