<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM 位置無關(guān)代碼PIC的分析理解

          ARM 位置無關(guān)代碼PIC的分析理解

          作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          PIC的特點(diǎn)是:

          它被加載到任意地址空間都可以正確的執(zhí)行。其原理是PIC對常量和函數(shù)入口地址的操作都是基于PC+偏移量的尋址方式。即使程序被移動,但是PC也變化了,而偏移量是不變的,所以程序仍然可以找到正確的入口地址或者常量。

          本文引用地址:http://www.ex-cimer.com/article/201611/317892.htm

          加載域:是代碼存放的地址

          運(yùn)行域:是代碼運(yùn)行時的地址

          鏈接地址:運(yùn)行時,程序應(yīng)該位于的地址

          在一些場合,一些代碼并不在儲存這部分代碼的地址上執(zhí)行,比如說,放在norflash中的代碼可能最終是放在RAM中運(yùn)行,那么在norflash中的地址就是加載域,而在RAM中的地址就是運(yùn)行域。

          在匯編代碼中我們常常會看到一些跳轉(zhuǎn)指令,比如說b、bl(是位置無關(guān)的指令)等這些指令后面是一個相對地址而不是絕對地址,比如說b main,這個指令應(yīng)該怎么理解呢?main這里究竟是一個什么東西呢?

          這時候就需要涉及到鏈接地址的概念了,鏈接地址實(shí)際上就是鏈接器對代碼中的變量名、函數(shù)名等東西進(jìn)行一個地址的編排,賦予這些抽象的東西一個地址,然后在程序中訪問這些變量名、函數(shù)名就是在訪問一些地址。一般所說的鏈接地址都是指鏈接這些代碼的起始地址,代碼必須放在這個地址開始的地方才可以正常運(yùn)行,否則的話當(dāng)代碼去訪問、執(zhí)行某個變量名、函數(shù)名對應(yīng)地址上的代碼時就會找不到,接著程序無疑就是跑飛。

          但是上面說的那個b main的情形有點(diǎn)特殊,b、bl等跳轉(zhuǎn)指令并不是一個絕對跳轉(zhuǎn)指令,而是一個相對跳轉(zhuǎn)指令,什么意思呢?就是說,這個main標(biāo)簽最后得到的只并不是main被鏈接器編排后的絕對地址,而是main的絕對地址減去當(dāng)前的這個指令的絕對地址所得到的值,也就是說b、bl訪問到的是一個相對地址,不是絕對地址,因此,包括這個語句和main在內(nèi)的代碼段無論是否放在它的運(yùn)行域它都能正常運(yùn)行。這就是所謂的位置無關(guān)代碼。

          由上面的論述可以得知,如果你的這段代碼需要實(shí)現(xiàn)位置無關(guān),那么你就不能使用絕對尋址指令,否則的話就是位置有關(guān)了。



          關(guān)鍵詞: ARM位置無關(guān)代碼PI

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();