ARM下書寫位置無關(guān)的代碼
沒有使用絕對地址,都是相對地址。
位置無關(guān)的寫法:
(1) B指令
B指令接受一個相對地址,因此在匯編里用B跳轉(zhuǎn)到一個標(biāo)號時,實際編譯的結(jié)果是一個相對跳轉(zhuǎn)。相對地址有個范圍限制,即目標(biāo)不能太遠,一般目標(biāo)放在同一個文件里是肯定可以的。
_start:
_reset:
(2) BL
BL用于調(diào)用函數(shù),也是一個相對跳轉(zhuǎn)(3) ADR
獲取標(biāo)號的地址,在編譯時會使用PC+偏移的方式得到該位置的地址。例如,當(dāng)TEXT_BASE是0時SMRDATA可能被放在0x100的位置,當(dāng)TEXT_BASE為0x30000000時放在0x30000100的位置。使用ADR
總能獲取正確的位置,與程序的加載地址無關(guān)。
SMRDATA:
(相應(yīng)的, LDR Rn, =LABEL是位置相關(guān)的)
(4) LDR
當(dāng)加標(biāo)號時,LDR可以用于偽指令,也可以真指令。真指令: (標(biāo)號前不加=號,表示取標(biāo)號處的值)
實際被編譯為LDR R0, [PC, #NN],其中NN是目標(biāo)的相對距離
偽指令: (標(biāo)號前加=號,取標(biāo)號的地址)
實際編譯的時候的時候,會在某位置存處SDRDATA的值,然后用一個LDR取出來。
顯然,用LDR時,加不加=號有很大區(qū)別。
無=號:取該標(biāo)號處的值,位置無關(guān)
有=號:取該標(biāo)號的地址,位置相關(guān)
舉例分析
例1:中斷向量跳轉(zhuǎn)
_start:_undefined_instruction:
_software_interrupt:
_prefetch_abort:
_data_abort:
_not_used:
_irq:
_fiq:
其中,
ldr pc, _irq,由于沒加=號,表示取值_irq處的值放在pc里 (位置無關(guān))
_irq:
評論