為說明跳轉指令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之後的部分並沒有被執行,所以想看看具體程式有沒有執行這個函式。在網上找反...