今天老師講了arm中跳轉指令的範圍,通過查資料和大神的部落格有了自己的見解
首先要知道 b跳轉指令:它是個相對跳轉指令
b指令的編碼是這樣的
31..28:條件碼
27..25:101
24:是否鏈結標誌
將指令中使用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 b 0x4
4: e59ff000 ldr pc, [pc, #0] ; 0xc
8: eafffffe b 0x8
c: 30000008 tsteq r0, #8 ; 0x8
>24位帶符號為0xffffff,將它擴充套件為32得到:0xffffffff
2>將此32位數左移兩位得到:0xfffffffc,其值就是-4(0xfffffffc符號位不變,其餘位取反再加1得到-4);
3>pc的值是當前指令的下兩條(下一條的下一條)指令的位址,加上步驟2得到的-4(pc-4,即pc回退4個位元組,剛好指向當前指令的下一條指令上),這恰好是第二條指令step1的位址。
b,bl指令儲存的是偏移位址,這個位址的計算方法是:
假設跳轉指令處的位址是a,跳轉目標處的位址是b.
1.b-(a+8).a+8是因為arm的流水線使得指令執行到a處時,pc實際的值是a+8.
2.第一步得到的值是4的倍數,因為arm的指令是4對齊的,即最低兩位為00.於是將這個值右移兩位.
3.得到最終偏移
所以跳轉的範圍為正負32m(-2^25~2^25有一位符號位)
ARM中的跳轉指令
arm中的跳轉指令 arm中b bl bx blx指令的區別 用於實現程式流程的跳轉,在arm程式中有兩種方法可以實現程式流程的跳 使用專門的跳轉指令 直接向程式計數器pc寫入跳轉位址值 通過向程式計數器pc寫入跳轉位址值,可以實現在4gb的位址空間中的任意跳轉,在跳轉之前結合使用 mov lr,p...
ARM的B,BL跳轉指令
b跳轉指令 它是個相對跳轉指令,其機器碼格式如下 31 28 位是條件碼 27 24 位為 1010 0xeaffffff 時 表示b 跳轉指令 為 1011 時,表示 bl跳轉指令 23 0 表示偏移位址。使用b 或bl跳轉時,下一條指令的位址是這樣計算的 將指令中 24位帶符號的補碼立即數擴充套...
ARM指令集中的跳轉指令
arm程式中如何實現跳轉 1.使用專門的跳轉指令 2.直接向pc寫人要跳轉的位址 向pc寫人位址在可以任意可以定址的範圍內任意跳轉,然而跳轉指令只能在當前指令向前或向後的32m的位址空間跳轉 跳轉指令包括 1.b b指令是最簡單的跳轉,跳到給定的目標位址,從那裡繼續執行 2.bl bl跳轉之前會在暫...