從0學(xué)ARM——什么是位置無(wú)關(guān)碼?
如果我們將生成的bin文件拷貝到內(nèi)存0x40008000位置運(yùn)行必然沒(méi)有問(wèn)題,
bl func 和 ldr pc,=func 都能跳轉(zhuǎn)到func函數(shù),
而19行代碼,也能訪(fǎng)問(wèn)到全局變量aaaa。
如果我們將該程序拷貝到其他地址是否能正常運(yùn)行呢?
假定我們拷貝到0地址運(yùn)行,那么程序的執(zhí)行地址需要從0開(kāi)始重新編排,即_start對(duì)應(yīng)0地址,main對(duì)應(yīng)0x18。
拷貝到0地址后內(nèi)存布局:
拷貝到0地址運(yùn)行后,**內(nèi)存中指令(機(jī)器碼)**的內(nèi)容還和以前一樣,pc的值會(huì)根據(jù)實(shí)際運(yùn)行地址重新修正。
首先看bl func
對(duì)應(yīng)的匯編代碼是 第9行;該指令的機(jī)器碼是0xeb000001,我們?cè)凇?. 從0開(kāi)始學(xué)ARM-ARM指令,移位、數(shù)據(jù)處理、BL、機(jī)器碼》講過(guò)該機(jī)器碼格式是從pc的位置向前偏移1條指令因?yàn)槿?jí)流水線(xiàn),所以應(yīng)該往下偏移3條指令,即func的位置,所以bl仍然可以正確找到func這個(gè)函數(shù)。
bl funcldr pc,=func對(duì)應(yīng)的匯編代碼是 第10行;
我們可以看到是從pc值+4位置取出對(duì)應(yīng)的內(nèi)存的值,pc值+4是14,該位置對(duì)應(yīng)15行,即將40008010寫(xiě)入到pc,
而我們的bin文件只有44個(gè)字節(jié)大小,所以此時(shí)內(nèi)存40008010并沒(méi)有我們編寫(xiě)的任何代碼。所以ldr pc,=func 無(wú)法跳轉(zhuǎn)到func。
c訪(fǎng)問(wèn)全局變量aaaa
對(duì)應(yīng)的匯編代碼是 第19行;
c訪(fǎng)問(wèn)全局變量aaaa
我們可以看到是從pc值+4位置取出對(duì)應(yīng)的內(nèi)存的值,pc值+4是28,該位置對(duì)應(yīng)22行,即將4000802c寫(xiě)入到r3,然后20行會(huì)將r2中值寫(xiě)入到0x4000802c這個(gè)地址,而此時(shí)該地址并不是全局變量aaaa,所以此指令是無(wú)法找到bss段的aaaa變量的內(nèi)存。
三、總結(jié)
1. 位置無(wú)關(guān)碼:
CPU取指時(shí)用相對(duì)地址取指令(比如pc +4),只要其相對(duì)地址沒(méi)有變,都能夠取指并運(yùn)行。即該段代碼無(wú)論放在內(nèi)存的哪個(gè)地址,都能正確運(yùn)行。究其原因,是因?yàn)榇a里沒(méi)有使用絕對(duì)地址,都是相對(duì)地址。
2. 位置相關(guān)碼:
利用絕對(duì)地址取指并運(yùn)行,這就需要你存放程序(鏈接過(guò)程中)需要按照連接腳本的要求那樣執(zhí)行(Makefile里面有 -Ttext xxx指定或連接腳本)。即它的地址與代碼處于的位置相關(guān),是絕對(duì)地址,如:mov PC ,#0xff;ldr pc,=0xffff等。
3. 位置無(wú)關(guān)碼的應(yīng)用:
1). 程序在運(yùn)行期間動(dòng)態(tài)加載到內(nèi)存;
2). 程序在不同場(chǎng)合與不同程序組合后加載到內(nèi)存(共享的動(dòng)態(tài)鏈接庫(kù));
3). 在運(yùn)行期間不同地址相互之間的映射(如bootloader)
4. 結(jié)論使用「mov pc ,xxx ; ldr pc ,xxx」等就是位置相關(guān)碼。這些使用絕對(duì)指令尋址。而使用「bl ,b ,adr,ldr」一般為位置無(wú)關(guān)碼。在使用「b, bl」調(diào)用C語(yǔ)言中的函數(shù)里「不要使用全局變量」,因?yàn)镃中全局變量的地址「也是根據(jù)鏈接地址生成」的。使用=和不使用=號(hào)是有很大區(qū)別的!笩o(wú)=號(hào):取該標(biāo)號(hào)處的值,位置無(wú)關(guān)有=號(hào):取該標(biāo)號(hào)的地址,位置相關(guān)」
【考一考】考一考大家為什么uboot的異常向量表的reset異常,指令是b reset,而其他異常卻是我們本文所說(shuō)的位置相關(guān)碼,ldr pc,XXXXXX?
arm對(duì)應(yīng)的uboot異常向量表如下:
arch/arm/cpu/armv7/start.S

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車(chē)電子技術(shù)在線(xiàn)大會(huì)
-
4月30日立即下載>> 【村田汽車(chē)】汽車(chē)E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線(xiàn)下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線(xiàn)會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書(shū)】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專(zhuān)題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開(kāi)始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類(lèi)新物種登上歷史舞臺(tái)
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來(lái)商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽(yáng)光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開(kāi)成長(zhǎng)空間
- 8 地平線(xiàn)自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?