ARM處理器的位置無(wú)關(guān)程序設計
上述匯編代碼段經(jīng)編譯后的結果為:
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
可見(jiàn),LDR偽指令實(shí)際上使用基于PC的偏移量來(lái)對符號常量GPIO_BASE和init_GPDR0進(jìn)行引用,因而是位置無(wú)關(guān)的。由此可以得出如下結論:使用LDR偽指令將一個(gè)常量讀取到非PC的其他通用寄存器中可實(shí)現位置無(wú)關(guān)的常量訪(fǎng)問(wèn);但將一個(gè)地址值讀取到PC中進(jìn)行程序跳轉時(shí),跳轉目標則是位置相關(guān)的。
?。?) 程序設計規范2
其他被ROPI段中的代碼引用的必須是絕對地址,或者是基于可讀寫(xiě)位置無(wú)關(guān)(RWPI)段的靜態(tài)基址寄存器的可寫(xiě)數據。
使用絕對地址只能引用被重定位到特定位置的代碼段中的符號,通過(guò)在位置無(wú)關(guān)代碼中引入絕對地址,可以讓程序跳轉到指定位置。例如,假設Bootloader的階段1將其自身代碼拷貝到鏈接時(shí)所指定的SDRAM地址空間后,當要跳轉到階段2的C程序入口時(shí),可以使用指令“LDR PC, =main”跳轉到程序在SDRAM中的main函數入口地址開(kāi)始執行。這是因為程序在編譯鏈接時(shí)給main函數分派絕對地址,系統通過(guò)將main函數的絕對地址直接賦給PC實(shí)現程序跳轉。如果使用相對跳轉指令“B main”,那么只會(huì )跳轉到啟動(dòng)ROM內部的main函數入口。
評論