反彙編Dis解析
阿新 • • 發佈:2018-11-26
目錄
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
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 某個值,只是起到方便檢視的作用,並不是真的跳轉。