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位數左移兩位 將得到...