ARM處理器的位置無關程序設計
上述匯編代碼段經編譯后的結果為:
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函數入口。
評論