新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM處理器的位置無關程序設計

        ARM處理器的位置無關程序設計

        作者: 時間:2011-09-26 來源:網絡 收藏

          上述匯編代碼段經編譯后的結果為:

          LDR R1, [PC, OFFSET_TO_GPIO_BASE]

          LDR R0, [PC, OFFSET_TO_init_GPDR0]

          STR R0, [R1, #0xc]?

          GPIO_BASE

          DCD 0x40e00000

          GPDR0

          DCD 0x00c

          init_GPDR0

          DCD 0xfffbfe00

          可見,LDR偽指令實際上使用基于PC的偏移量來對符號常量GPIO_BASE和init_GPDR0進行引用,因而是的。由此可以得出如下結論:使用LDR偽指令將一個常量讀取到非PC的其他通用寄存器中可實現的常量訪問;但將一個地址值讀取到PC中進行程序跳轉時,跳轉目標則是相關的。

          (2) 規范2

          其他被ROPI段中的代碼引用的必須是絕對地址,或者是基于可讀寫位置(RWPI)段的靜態基址寄存器的可寫數據。

          使用絕對地址只能引用被重定位到特定位置的代碼段中的符號,通過在位置無關代碼中引入絕對地址,可以讓程序跳轉到指定位置。例如,假設Bootloader的階段1將其自身代碼拷貝到鏈接時所指定的SDRAM地址空間后,當要跳轉到階段2的C程序入口時,可以使用指令“LDR PC, =main”跳轉到程序在SDRAM中的main函數入口地址開始執行。這是因為程序在編譯鏈接時給main函數分派絕對地址,系統通過將main函數的絕對地址直接賦給PC實現程序跳轉。如果使用相對跳轉指令“B main”,那么只會跳轉到啟動ROM內部的main函數入口。



        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 吉安县| 太白县| 石屏县| 绵竹市| 金溪县| 凌海市| 白山市| 闽清县| 三门峡市| 大埔县| 民丰县| 深州市| 陇西县| 英超| 星子县| 清丰县| 岢岚县| 武山县| 留坝县| 沙洋县| 新巴尔虎左旗| 清丰县| 亚东县| 龙口市| 阿克陶县| 梁平县| 乌海市| 邵阳市| 囊谦县| 榆树市| 西平县| 武清区| 霞浦县| 桂东县| 甘洛县| 高雄市| 新和县| 黄大仙区| 凤山市| 青龙| 仲巴县|