国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯(cuò)
        加入自媒體

        從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


        <上一頁(yè)  1  2  3  
        聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

        發(fā)表評(píng)論

        0條評(píng)論,0人參與

        請(qǐng)輸入評(píng)論內(nèi)容...

        請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

        您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

        • 看不清,點(diǎn)擊換一張  刷新

        暫無評(píng)論

        暫無評(píng)論

          人工智能 獵頭職位 更多
          掃碼關(guān)注公眾號(hào)
          OFweek人工智能網(wǎng)
          獲取更多精彩內(nèi)容
          文章糾錯(cuò)
          x
          *文字標(biāo)題:
          *糾錯(cuò)內(nèi)容:
          聯(lián)系郵箱:
          *驗(yàn) 證 碼:

          粵公網(wǎng)安備 44030502002758號(hào)

          主站蜘蛛池模板: 国产V片免费A片视频| 韩国精品一区二区| 久久在线看| 国产亚洲av| 宝应县| 99精品久久久久久无码| 麻豆AV电影| 999白浆| 亚洲A片V一区二区三区| 浪卡子县| jizz18| 人妖网址| 苍井空大战黑人| 91超碰人人在线| 色啪视频| jizz麻豆| 亚洲欧洲自拍| 巴青县| 色偷偷综合网,欧美日韩| 岛国无码AV| 亚洲天堂av在线免费| 桃花岛av| 亚洲一区二区三区在线| 国产制服丝袜在线视频观看| 和政县| 久久精品99久久久久久久久| 又粗又大AV| 高陵县| 午夜无码福利视频| 国产精品久久| 福鼎市| 桃花岛av| 3p在线视频| 日韩精品人妻中文字幕有码| 超碰91在线| 在线天堂中文字幕| 亚洲AV电影网| xxxx欧美| 第一福利导航视频| 乱伦日屄| 天海翼无码在线|