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

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
6月20日立即下載>> 【白皮書】精準(zhǔn)測量 安全高效——福祿克光伏行業(yè)解決方案
-
7月3日立即報名>> 【在線會議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報名>> 【線下論壇】第三屆安富利汽車生態(tài)圈峰會
-
7.30-8.1火熱報名中>> 全數(shù)會2025(第六屆)機(jī)器人及智能工廠展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身機(jī)器人動力電池技術(shù)應(yīng)用大會
-
免費(fèi)參會立即報名>> 7月30日- 8月1日 2025全數(shù)會工業(yè)芯片與傳感儀表展
推薦專題
- 1 AI 眼鏡讓百萬 APP「集體失業(yè)」?
- 2 大廠紛紛入局,百度、阿里、字節(jié)搶奪Agent話語權(quán)
- 3 深度報告|中國AI產(chǎn)業(yè)正在崛起成全球力量,市場潛力和關(guān)鍵挑戰(zhàn)有哪些?
- 4 上海跑出80億超級獨(dú)角獸:獲上市公司戰(zhàn)投,干人形機(jī)器人
- 5 國家數(shù)據(jù)局局長劉烈宏調(diào)研格創(chuàng)東智
- 6 一文看懂視覺語言動作模型(VLA)及其應(yīng)用
- 7 下一代入口之戰(zhàn):大廠為何紛紛押注智能體?
- 8 百億AI芯片訂單,瘋狂傾銷中東?
- 9 Robotaxi新消息密集釋放,量產(chǎn)元年誰在領(lǐng)跑?
- 10 格斗大賽出圈!人形機(jī)器人致命短板曝光:頭腦過于簡單