首先解釋下位置無關和位置相關
位置無關代碼:即該段代碼無論放在內存的哪個地址,都能正確運行。究其原因,是因爲代碼裏沒有使用絕對地址,都是相對地址。
位置相關碼:即它的地址與代碼處於的位置相關,是絕對地址,如: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