1. 程式人生 > >反匯編Dis解析

反匯編Dis解析

text str 包含 不為 都是 字符 關於 另一個 src


title: 反匯編Dis解析
tags: ARM
date: 2018-10-21 18:02:58
---

反匯編dis解析

關於段,反匯編文件中包含了代碼段,數據段,bss段,comm段和註釋段.

COMM段BSS段

對於全局變量來說,如果初始化了不為0的值,那麽該全局變量則被保存在data段,如果初始化的值為0,那麽將其保存在bss段,如果沒有初始化,則將其保存在common段,等到鏈接時再將其放入到BSS段。關於第三點不同編譯器行為會不同,有的編譯器會把沒有初始化的全局變量直接放到BSS段。

參考 鏈接腳本.md

Disassembly of section .text:
Disassembly of section .data:
Disassembly of section .rodata:  // 只讀數據段(const全局變量)
Disassembly of section .bss:     //(初始值為0,無初始值的全局變量)
Disassembly of section .comment:

COMM段BSS段

這兩個段並不在bin文件中保存,可以查看反匯編的代碼前面的標號與bin的大小對比.所以實際上bss段代碼的實現要自己寫的.

註釋段

這個在反匯編文件的最下方,類似如下,其實他是字符串的asc編碼,復制到winhex中查看一下即可

00000000 <.comment>:
   0:   43434700    cmpmi   r3, #0  ; 0x0
   4:   4728203a    undefined
   8:   2029554e    eorcs   r5, r9, lr, asr #10
   c:   2e342e33    mrccs   14, 1, r2, cr4, cr3, {1}
  10:   47000035    smladxmi    r0, r5, r0, r0
  14:   203a4343    eorcss  r4, sl, r3, asr #6
  18:   554e4728    strplb  r4, [lr, #-1832]
  1c:   2e332029    cdpcs   0, 3, cr2, cr3, cr9, {1}
  20:   00352e34    eoreqs  r2, r5, r4, lsr lr
  24:   43434700    cmpmi   r3, #0  ; 0x0
  28:   4728203a    undefined
  2c:   2029554e    eorcs   r5, r9, lr, asr #10
  30:   2e342e33    mrccs   14, 1, r2, cr4, cr3, {1}
  34:   47000035    smladxmi    r0, r5, r0, r0
  38:   203a4343    eorcss  r4, sl, r3, asr #6
  3c:   554e4728    strplb  r4, [lr, #-1832]
  40:   2e332029    cdpcs   0, 3, cr2, cr3, cr9, {1}
  44:   00352e34    eoreqs  r2, r5, r4, lsr lr

註意使用hex格式復制,顯示的是gcc的版本,這裏是直接列復制的,實際的需要按地址排序,小端模式

技術分享圖片

技術分享圖片

Bl指令

反匯編的Bl指令中的地址,並不是實際的跳轉地址,他只是起到方便查看的作用,實際跳轉的地址是pc指針的偏移量

3000005c:   eb000106    bl  30000478 <sdram_init> 

30000060:   e3a01000    mov r1, #0  ; 0x0
30000064:   e59f204c    ldr r2, [pc, #76]   ; 300000b8 <.text+0xb8>
30000068:   e59f304c    ldr r3, [pc, #76]   ; 300000bc <.text+0xbc>

 
這裏的bl   30000478不是跳轉到30000478,這個時候sdram並未初始化;
為了驗證,我們做另一個實驗,修改連接腳本sdram.lds, 鏈接地址改為0x32000478,編譯,查看反匯編:

 
3000005c:   eb000106    bl  30000478 <sdram_init> 

30000060:   e3a01000    mov r1, #0  ; 0x0
30000064:   e59f204c    ldr r2, [pc, #76]   ; 300000b8 <.text+0xb8>
30000068:   e59f304c    ldr r3, [pc, #76]   ; 300000bc <.text+0xbc>

可以看到現在變成了bl 30000478,但兩個的機器碼eb000106都是一樣的,機器碼一樣,執行的內容肯定都是一樣的。 因此這裏並不是跳轉到顯示的地址,而是跳轉到: pc + offset,這個由鏈接器決定。

假設程序從0x30000000執行,當前指令地址:0x3000005c ,那麽就是跳到0x30000478;如果程序從0運行,當前指令地址:0x5c 調到:0x00000478

跳轉到某個地址並不是由bl指令所決定,而是由當前pc值決定。反匯編顯示這個值只是為了方便讀代碼。

重點: 反匯編文件裏, B或BL 某個值,只是起到方便查看的作用,並不是真的跳轉。

反匯編Dis解析