ARM的B,BL跳轉指令

2021-07-07 01:45:27 字數 2257 閱讀 3974

b跳轉指令:它是個相對跳轉指令,其機器碼格式如下:

[31:28]

位是條件碼

;[27:24]

位為「1010」

(0xeaffffff)時

,表示b

跳轉指令

,為「1011」

時,表示

bl跳轉指令;

[23:0]

表示偏移位址。使用b

或bl跳轉時,下一條指令的位址是這樣計算的:

將指令中

24位帶符號的補碼立即數擴充套件為

32(擴充套件其符號位

);將此

32位數左移兩位;將得到的值加到

pc暫存器中,即得到跳轉的目標位址。

例程:1.text

2.global

_start

3_start: 4 

b step1

5 step1: 6

ldr pc,

=step2

7 step2: 8 

b step2

反彙編**: 0:

eaffffff 

b0x4

4: e59ff000

ldr pc, [pc, #0] ; 0xc 8:

eafffffe

b0x8 c:

30000008

tsteq r0, #8

; 0x8

b跳轉指令:它是個相對跳轉指令,其機器碼格式如下:

[31:28]

位是條件碼

;[27:24]

位為「1010」

(0xeaffffff

為一條指令的二進位制

機器碼)

時,表示

b跳轉指令

,為「1011」

時,表示

bl跳轉指令;

[23:0]

表示乙個相對於

pc的偏移位址。

將指令中

24位帶符號的補碼立即數擴充套件為

32(擴充套件其符號位

);將此

32位數左移兩位;將得到的值加到

pc暫存器中,即得到跳轉的目標位址。

我們看看第一條指令

「b step1」

的機器碼

0xeaffffff:

1.24位帶符號的補碼為

0xffffff

,將它擴充套件為

32得到:

0xffffffff 2

.將此32

位數左移兩位得到:

0xfffffffc

,其值就是-4(

0xfffffffc

符號位不變,其餘位取反再加1得到

-4); 3

.pc的值是當前指令的

下兩條(

下一條的下一條

)指令的位址,加上步驟

2得到的-4(

pc-4

,即pc回退4

個位元組,剛好指向當前指令的下一條指令上)

,這恰好是第二條指令

step1

的位址。

不要被被反彙編**中的

「b 0x4」

給迷惑了,它可不是說跳到絕對位址

0x4處執行,絕對位址得像上述

3個步驟那樣計算。

假設跳轉指令處的位址是a,跳轉目標處的位址是b.

b,bl指令儲存的是偏移位址,這個位址的計算方法是:

1.b-(a+8).a+8是因為arm的

流水線使得指令執行到a處時,pc實際的值是a+8.

2.第一步得到的值是4的倍數,因為arm的指令是4對齊的,即最低兩位為00.於是將這個值右移兩位.

3.得到最終偏移

執行時:

1.取出偏移

2.左移兩位

3.加入pc,這時pc的值剛好為目標處的位址值,即目標位址指令進入取指,流水線前兩級被清空

歸納如下:

(1) 

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

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

(2) 

ldr pc, =step1 :該指令是從記憶體中的某個位置(step1)讀出資料並賦給pc,同樣依

賴當前pc的值,但是偏移量是那個位置(step1)的連線位址(執行時的位址),所以可

以用它實現從flash到ram的程式跳轉。

ARM中的跳轉指令

arm中的跳轉指令 arm中b bl bx blx指令的區別 用於實現程式流程的跳轉,在arm程式中有兩種方法可以實現程式流程的跳 使用專門的跳轉指令 直接向程式計數器pc寫入跳轉位址值 通過向程式計數器pc寫入跳轉位址值,可以實現在4gb的位址空間中的任意跳轉,在跳轉之前結合使用 mov lr,p...

ARM指令集中的跳轉指令

arm程式中如何實現跳轉 1.使用專門的跳轉指令 2.直接向pc寫人要跳轉的位址 向pc寫人位址在可以任意可以定址的範圍內任意跳轉,然而跳轉指令只能在當前指令向前或向後的32m的位址空間跳轉 跳轉指令包括 1.b b指令是最簡單的跳轉,跳到給定的目標位址,從那裡繼續執行 2.bl bl跳轉之前會在暫...

ARM中跳轉指令的範圍

今天老師講了arm中跳轉指令的範圍,通過查資料和大神的部落格有了自己的見解 首先要知道 b跳轉指令 它是個相對跳轉指令 b指令的編碼是這樣的 31.28 條件碼 27.25 101 24 是否鏈結標誌 將指令中使用24位帶符號的補碼立即數擴充套件為32 擴充套件其符號位 將此32位數左移兩位 將得到...