新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM 位置無關代碼PIC的分析理解

        ARM 位置無關代碼PIC的分析理解

        作者: 時間:2016-11-09 來源:網絡 收藏
        PIC的特點是:

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

        本文引用地址:http://www.104case.com/article/201611/317892.htm

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

        運行域:是代碼運行時的地址

        鏈接地址:運行時,程序應該位于的地址

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

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

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

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

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 含山县| 台山市| 安多县| 鲜城| 汉阴县| 牟定县| 莲花县| 盐山县| 法库县| 布拖县| 冕宁县| 揭西县| 郴州市| 安福县| 鹤壁市| 靖安县| 大石桥市| 海宁市| 九台市| 湾仔区| 都江堰市| 吉木萨尔县| 临城县| 贵德县| 安陆市| 塔河县| 黔西| 西丰县| 壤塘县| 乌兰察布市| 左云县| 区。| 陵川县| 苍梧县| 华亭县| 滨海县| 广丰县| 开远市| 神木县| 大庆市| 嘉鱼县|