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