2013-08-20 48 views
2

如何計算將值裝入r1寄存器的地址?ARM程序集中的程序計數器

_start: 
    ldrh r1, [pc, #6] 

PC = 8054(該LDRH指令的地址)

根據我的地址的值應的值:PC + 6 = 805A

所以它應該加載從地址805A到寄存器r1的值。

回答

5

這取決於您處於ARM還是Thumb模式。

對於ARM模式:

當使用R15作爲基寄存器時,必須記住它包含一個地址上 8個字節從當前指令的地址。

對於Thumb模式:

PC的值將比該指令的地址大4個字節,但PC的 1比特被強制爲0,以確保它是字對齊。

+0

我處於ARM模式。 R15(或PC)是ARM模式下的4字節寄存器,因此它包含一個4字節(32位地址)。你能告訴具體到我上面提到的彙編語言指令和PC的價值嗎? PC應該以4的倍數遞增,我不確定爲什麼要添加6。 –

+1

由於處理器執行預取操作,「PC」比當前指令提前兩個指令。在ARM模式下,意味着8個字節,並且在拇指模式下4個字節。如果'LDRH'指令位於地址0x8054,並且使用6字節的立即偏移量,則它將從地址0x8054 + 8 + 6 == 0x8062加載。 – Michael

+0

謝謝。當我調試這個二進制文件,並且在ldrh指令中檢查寄存器內容時,它將PC寄存器的值顯示爲0x8054。爲什麼?就在執行當前指令之前,PC的值應該是=(當前指令地址+8)的值? –