歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 關於相對跳轉與絕對跳轉指令的部分內容

關於相對跳轉與絕對跳轉指令的部分內容

日期:2017/3/1 9:19:51   编辑:Linux編程

B跳轉指令與Ldr指令幾點區別

B跳轉指令是代碼位置無關的,經過匯編後會替換為當前PC值加(減)一個修正值,不管這條指令是在哪一個地址執行,都能跳轉到指定的位置。

B只能在當前PC的32M范圍內跳轉,LDR只能在當前PC的4KB(0xfff范圍)跳轉。

LDR PC,=xxx指令將向PC直接裝載一個標號xxx的值,但標號經過編譯後將被替換為一個與RO相對應的值,這樣無論指令在何處執行都能跳轉到一個指定的位置。

歸納如下:

(1) b step1 :b跳轉指令是相對跳轉,依賴當前PC的值,偏移量是通過該指令本身的bit[2

3:0]算出來的,這使得使用b指令的程序不依賴於要跳到的代碼的位置(位置無關碼),只看指令本身。

(2) ldr pc, =step1 :該指令是從內存中的某個位置(step1)讀出數據並賦給PC,同樣依

賴當前PC的值,但是偏移量是那個位置(step1)的連接地址(運行時的地址),所以可

以用它實現從Flash到RAM的程序跳轉。

另一個人的:

今天參看鏈接方面的知識時,遇到一個編譯無關的概念,遂百度之,發現一篇文章不錯,轉載之,有些地方不懂,待之後再查看~

應用程序必須經過編譯、匯編和鏈接後才變成可執行文件,在鏈接時,要對所有目標文件進行重定位(relocation),建立符號引用規則,同時為變量、函數等分配運行地址。當程序執行時,系統必須把代碼加載到鏈接時所指定的地址空間,以保證程序在執行過程中對變量、函數等符號的正確引用,使程序正常運行。在具有操作系統的系統中,重定位過程由操作系統自動完成。

如何編寫位置無關代碼呢?

引用同一位置無關段或相對位置固定的另一位置無關段中的符號時,必須是基於PC的符號引用,即使用相對於當前PC的偏移量來實現跳轉或進行常量訪問。

1.位置無關的程序跳轉。使用相對跳轉指令實現程序跳轉。指令中所跳轉的目標地址用基於當前PC的偏移量來表示,與鏈接時分配給地址標號的絕對地址值無關,因而代碼可以在任何位置進行跳轉,實現位置無關性。

2.位置無關的常量訪問。在應用程序中,經常要讀寫相關寄存器以完成必要的硬件初始化。為增強程序的可讀性,利用EQU偽指令對一些常量進行賦值,但在訪問過程中,必須實現位置無關性。

3. 使用絕對地址進行跳轉,一般是在不同的位置無關代碼段之間跳轉。

最後,總結一下位置無關代碼段的優點:

1.簡化設計,方便實現系統的快速引導。位置無關代碼可以避免在引導時進行地址映射,並方便地跳轉到RAM中實現快速引導

2.實現復位處理智能化。位置無關的代碼可以被加載到任意地址空間運行

3.便於調試。Bootloader的調試通常也是一個繁瑣的過程,使用位置無關代碼,則可以將映像文件加載到RAM中進行調試,這既能真實地反映程序從ROM中 進行系統引導的情況,又可以避免頻繁燒寫程序存儲器。

Copyright © Linux教程網 All Rights Reserved