ARM查閱位置相關和位置無關指令

首先解釋下位置無關和位置相關

位置無關代碼:即該段代碼無論放在內存的哪個地址,都能正確運行。究其原因,是因爲代碼裏沒有使用絕對地址,都是相對地址。
    位置相關碼:即它的地址與代碼處於的位置相關,是絕對地址,如:mov PC ,#0xff;ldr pc,=0xffff等。

(1)LDR

當加標號時,LDR可以用於僞指令,也可以真指令。

真指令: (標號前不加=號,表示取標號處的值)

    LDR R0,  SDRDATA

實際被編譯爲LDR R0, [PC, #NN],其中NN是目標的相對距離

僞指令: (標號前加=號,取標號的地址)

    LDR R0, = SDRDATA

實際編譯的時候的時候,會在某位置存儲SDRDATA的值,然後用一個LDR取出來。

顯然,用LDR時,加不加=號有很大區別。

無=號:取該標號處的值,位置無關

有=號:取該標號的地址,位置相關

 

(2)B指令
跳轉指令,B指令接受一個相對地址,因此在彙編裏用B跳轉到一個標號時,實際編譯的結果是一個相對跳轉。相對地址有個範圍限制,即目標不能太遠,一般目標放在同一個文件裏是肯定可以的。 Offset must IN 32Mbit

_start:

b   ResetReset:

_reset:

 

(3)BL指令
同樣也是跳轉指令,一般用於跳轉函數用於調用函數

 bl  disable_watch_dog

 

4)ADR指令
獲取標號的地址,在編譯時會使用PC+偏移的方式得到該位置的地址。例如,當TEXT_BASE是0時 SMRDATA可能被放在0x100的位置,當TEXT_BASE爲0x30000000時放在0x30000100的位置。使用ADR總能獲取正確的位置,與程序的加載地址無關

ADR R0, SMRDATA

SMRDATA:

    .word  0x22111120

    .word  0x00002F50

    .word  0x00000700

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