ARM跳轉指令B的反彙編分析

2021-07-25 08:48:14 字數 875 閱讀 3114

為說明跳轉指令b的反彙編分析方法,這裡以一段**為例:

.text

.global _start

_start:

b step1

step1:

b step1

反彙編**如下:

00000000 <_start>:

0: eaffffff b 4

4: e59ff000 ldr pc, [pc, #0] ; c 8: eafffffe b 8 c: 00000008 andeq r0, r0, r8

先看 源**中第一條指令「b step1」。b跳轉指令是個相對跳轉指令,其機器碼格式如下:

[31:28]位是條件碼。

[27:24]位為「1010」表示b跳轉指令,為「1011」表示bl跳轉指令。

[23:0]表示偏移位址。

使用b或bl跳轉時,下一條指令的位址是這樣計算的,將指令中24位帶符號的補碼擴充套件為32位(擴充套件其符號位);然後將此32位數左移2位;最後將得到的值加到pc暫存器中,即得到跳轉的目標位址。

比如第一條指令「b step1」的機器碼為eaffffff。

24位帶符號的補碼為0xffffff,將其擴充套件為32位得到0xffffffff。

將此32位左移2位得到0xfffffffc,其原碼就是-4。

pc的值是當前指令的下兩條指令的位址,加上上面得到的-4,這恰好是step1的位址。

從上面的分析發現,b跳轉指令依賴於當前pc暫存器的值,不依賴於**儲存的位置。需要注意的是:「b 4」指令不是跳到絕對位址0x4處執行,而是通過上面的3個步驟來計算出來的。

注:以上內容摘抄自《嵌入式linux應用開發》

ARM的B,BL跳轉指令

b跳轉指令 它是個相對跳轉指令,其機器碼格式如下 31 28 位是條件碼 27 24 位為 1010 0xeaffffff 時 表示b 跳轉指令 為 1011 時,表示 bl跳轉指令 23 0 表示偏移位址。使用b 或bl跳轉時,下一條指令的位址是這樣計算的 將指令中 24位帶符號的補碼立即數擴充套...

ARM中的跳轉指令

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

ARM的BIN檔案反彙編方法

最近在除錯uboot的 時,用的新版本的uboot,lowlevel init函式裡是空的,而且在鏈結檔案中也沒有發現對lowlevel init.o的鏈結。在bl lowlevel init 之前和之中加了兩個電燈,發現在bl之後的部分並沒有被執行,所以想看看具體程式有沒有執行這個函式。在網上找反...