新聞中心

        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 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 横峰县| 临潭县| 阳西县| 简阳市| 化德县| 娄底市| 孝感市| 石家庄市| 平南县| 黎城县| 榆树市| 东海县| 滨州市| 彭山县| 恩施市| 沁源县| 曲水县| 吴旗县| 永仁县| 永福县| 右玉县| 丹江口市| 北票市| 五华县| 阜城县| 金溪县| 渝北区| 张家口市| 横峰县| 师宗县| 克拉玛依市| 景谷| 鄂伦春自治旗| 陈巴尔虎旗| 郧西县| 祁东县| 宣汉县| 吉水县| 木兰县| 正宁县| 泸西县|