從0學(xué)ARM——什么是位置無關(guān)碼?
如果我們將生成的bin文件拷貝到內(nèi)存0x40008000位置運(yùn)行必然沒有問題,
bl func 和 ldr pc,=func 都能跳轉(zhuǎn)到func函數(shù),
而19行代碼,也能訪問到全局變量aaaa。
如果我們將該程序拷貝到其他地址是否能正常運(yùn)行呢?
假定我們拷貝到0地址運(yùn)行,那么程序的執(zhí)行地址需要從0開始重新編排,即_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開始學(xué)ARM-ARM指令,移位、數(shù)據(jù)處理、BL、機(jī)器碼》講過該機(jī)器碼格式是從pc的位置向前偏移1條指令因?yàn)槿?jí)流水線,所以應(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寫入到pc,

而我們的bin文件只有44個(gè)字節(jié)大小,所以此時(shí)內(nèi)存40008010并沒有我們編寫的任何代碼。所以ldr pc,=func 無法跳轉(zhuǎn)到func。
c訪問全局變量aaaa
對(duì)應(yīng)的匯編代碼是 第19行;

c訪問全局變量aaaa
我們可以看到是從pc值+4位置取出對(duì)應(yīng)的內(nèi)存的值,pc值+4是28,該位置對(duì)應(yīng)22行,即將4000802c寫入到r3,然后20行會(huì)將r2中值寫入到0x4000802c這個(gè)地址,而此時(shí)該地址并不是全局變量aaaa,所以此指令是無法找到bss段的aaaa變量的內(nèi)存。
三、總結(jié)
1. 位置無關(guān)碼:
CPU取指時(shí)用相對(duì)地址取指令(比如pc +4),只要其相對(duì)地址沒有變,都能夠取指并運(yùn)行。即該段代碼無論放在內(nèi)存的哪個(gè)地址,都能正確運(yùn)行。究其原因,是因?yàn)榇a里沒有使用絕對(duì)地址,都是相對(duì)地址。
2. 位置相關(guān)碼:
利用絕對(duì)地址取指并運(yùn)行,這就需要你存放程序(鏈接過程中)需要按照連接腳本的要求那樣執(zhí)行(Makefile里面有 -Ttext xxx指定或連接腳本)。即它的地址與代碼處于的位置相關(guān),是絕對(duì)地址,如:mov PC ,#0xff;ldr pc,=0xffff等。
3. 位置無關(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」一般為位置無關(guān)碼。在使用「b, bl」調(diào)用C語(yǔ)言中的函數(shù)里「不要使用全局變量」,因?yàn)镃中全局變量的地址「也是根據(jù)鏈接地址生成」的。使用=和不使用=號(hào)是有很大區(qū)別的。「無=號(hào):取該標(biāo)號(hào)處的值,位置無關(guān)有=號(hào):取該標(biāo)號(hào)的地址,位置相關(guān)」
【考一考】考一考大家為什么uboot的異常向量表的reset異常,指令是b reset,而其他異常卻是我們本文所說的位置相關(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è)字
圖片新聞
-

OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
-

馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-

機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-

存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬
-

長(zhǎng)安汽車母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-

豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-

字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
-

員工持股爆雷?廣汽埃安緊急回應(yīng)
最新活動(dòng)更多
-
11月7日立即參評(píng)>> 【評(píng)選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評(píng)選
-
11月20日立即報(bào)名>> 【免費(fèi)下載】RISC-V芯片發(fā)展現(xiàn)狀與測(cè)試挑戰(zhàn)-白皮書
-
即日-11.25立即下載>>> 費(fèi)斯托白皮書《柔性:汽車生產(chǎn)未來的關(guān)鍵》
-
11月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
11月28日立即下載>> 【白皮書】精準(zhǔn)洞察 無線掌控——283FC智能自檢萬用表
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
- 1 特斯拉工人被故障機(jī)器人打成重傷,索賠3.6億
- 2 海康威視數(shù)智系統(tǒng)“上崗”,重慶垃圾中轉(zhuǎn)站煥新
- 3 AI 時(shí)代,阿里云想當(dāng)“安卓” ,那誰(shuí)是“蘋果”?
- 4 拐點(diǎn)已至!匯川領(lǐng)跑工控、埃斯頓份額第一、新時(shí)達(dá)海爾賦能扭虧為盈
- 5 L3自動(dòng)駕駛延期,逼出車企技術(shù)自我淘汰
- 6 隱退4年后,張一鳴久違現(xiàn)身!互聯(lián)網(wǎng)大佬正集體殺回
- 7 機(jī)器人9月大事件|3家國(guó)產(chǎn)機(jī)器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 8 7倍機(jī)器人大牛股:高管股東套現(xiàn)VS機(jī)構(gòu)兇猛抱團(tuán),該信誰(shuí)?
- 9 八部門聯(lián)手放行L3自動(dòng)駕駛!巨頭開始拼搶萬億市場(chǎng)?
- 10 OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市


分享





