bin、map、反匯編文件
bin文件簡介
?? .bin
文件就是二進制文件(binary file),這種文件只包含機器碼。所有的數據都是機器可以執(zhí)行的指令碼、指令參數或者常量數據,不包含其它調試信息。加載到內存或者支持XIP(就地執(zhí)行)的存儲器中規(guī)定好的加載地址之后直接從規(guī)定好的運行地址開始運行即可。
??例如單片機中燒寫的都是 .bin
文件,以STM32為例,其片內Nor FLASH的起始地址也是代碼的加載(燒寫)地址為 0x08000000 。上電復位或者手動復位之后,程序計數器PC指向單片機的復位異常的中斷向量地址 0x08000004 的位置,單片機從復位開始運行。
??上圖就是一個bin文件的內容節(jié)選,在上圖的bin文件中左側的 Address 表示的是現在地址的相對位置,一般情況下我們都是將斌文件下載到地址 0x08000000 中,所以上文提及的 0x08000004 內存中存儲的是上圖紅色框的內容 0x080001ad (這是一個小端存儲的單片機)
msp文件簡介
??在單片機開發(fā)中,.map
文件是一種編譯過程中的輸出文件,通常由編譯器在完成代碼編譯后生成。.map
文件包含了程序中函數和變量的內存布局信息,這些信息描述了程序在內存中的位置和大小。
??這是一個函數、變量在單片機中存儲的絕對文件,可以通過該文件快速定位到單片機中某一個變量的存儲地址或者某一個函數的入口地址。通過查看 .map
文件可以確定哪些變量或函數占用了大量的內存,從而進行相應的優(yōu)化。在鏈接階段,.map
文件用于確定程序中各個函數和變量的最終地址。鏈接器使用 .map
文件來確定如何將分散的代碼段和數據段整合到一起,以形成一個可執(zhí)行程序。對于逆向工程和二進制分析,.map
文件可以提供有用的信息,因為它們描述了程序如何在內存中布局,這對于理解程序的執(zhí)行流程和結構非常有幫助。
反匯編文件簡介
??單片機中的反匯編文件是一種將機器語言代碼轉換為匯編語言代碼的工具??梢酝ㄟ^反匯編文件在調試過程中定位和解決問題。通過查看反匯編文件可以了解代碼的執(zhí)行過程,并確定可能出現問題的位置。可以使用反匯編文件幫助分析單片機的性能瓶頸。通過查看反匯編文件可以了解代碼的執(zhí)行時間和執(zhí)行效率,從而確定需要優(yōu)化的部分。通過查看反匯編文件,可以幫助對bin文件中的指令代碼進行識別。
怎么分析bin文件
??要想對二進制文件進行分析,就必須接住.map
文件和反匯編文件,這兩個文件可以幫助我們快速分析和理解。
??通過結合.map
文件可以幫助我們快速定位代碼和數據的地址,這樣可以在.bin
文件中查找到對應的內容,但是.map
文件沒有幫助我們理解遇到內存中是指令的數據類型,這時就需要反匯編文件幫助我們理解了。
分析bin文件
keil生成bin、map和反匯編文件
??在keil中一般只會自動生成一個.map
文件,但是這個文件內容非常多,大部分對于我們分析.bin
文件沒有幫助,所以需要對其生成的內容進行修改。而.bin
文件和反匯編文件的生成需要使用一些命令來實現。
bin 和 反匯編文件
??在keil的 Opentions for Target ->> User ->> After Build/Rebuild 中輸入如下圖所示的內容即可生成 二進制 bin(.bin) 文件和 反匯編(.asm) 文件夾。
注意:完成編寫內容后一定要在 Run #x前面打上勾,并且編譯一次項目才會生成
??編寫完成并且編譯之后,可以在工程目錄下找到對應的bin 和 asm 文件。
map文件
??在keil的 Opentions for Target ->> Listing 中選中 Linker Listing,并且按照如下圖配置只選中:
注意:完成以上內容后一定要重新編譯一次項目才會生成,并且生成文件在工程目錄下的 Listings 文件夾中
結合程序分析bin文件
??在.bin
文件的開頭有如下內容:
??從上面對bin文件的簡介中提到單片機復位之后 PC 指針將指向 0x08000004 (這是復位中斷的地址),那么前面跳過的4個字節(jié)是什么東西呢,接著我們打開單片機的匯編代碼:
??其實在單片機中已經指定了以上中斷服務的入口地址,我們所編寫的中斷服務函數其實就是將中斷服務函數的入口地址存儲在這些已經確定的中斷服務地址中,所以前面忽略的4個字節(jié)的內容其實就是棧(SP指針)頂地址,具體可以查看啟動過程詳解。
注意:前四個字節(jié)是棧頂地址,不是函數的入口地址(不能讓PC指針指向這里),所以PC指針是在單片機復位以后自動指向 0x0800004
我這個單片機一共使用了101個中斷,所以前194字節(jié)都應該是中斷的內容,這是我們無法改變的,也就是下圖紅色框所畫出來的都是。
??0x08000004 地址下面存放的數據內容是上圖中的 0x080001ad ,這是一個地址內容,這個是一個函數入口(PC指針指向了這里)。
從map和反匯編中分析bin文件
??上面是從程序中的分析,再結合.map
文件進行分析時就會非常方便了,下圖就是我們.bin
文件中的前194字節(jié)的服務地址。
??接著看 0x08000004 地址下面存放的數據內容是上圖中的 0x080001ad ,在上圖中我們并沒有直接看到 0x080001ad 這個地址,這時我們需要對.bin
文件和反匯編文件進行結合分析。
??其實從上圖可以看出 0x080001ad 這個地址里面的內容是一個16位的指令,所以在.map
文件中就對應于地址 0x080001ac 。
??在進入服務中斷服務中,你會發(fā)現有一個在所有文檔中找不到的函數 __main 。
??這個函數可以參考文章STM32啟動詳細流程之__main,結合反匯編文件進行分析可以快速理解。
??對于.bin
而言最具有分析價值的地方就在于開頭的地方。文章來源:http://www.zghlxwxcb.cn/news/detail-777120.html
總結
??對于使用IAP而言,在做程序跳轉時 PC 的指針應該指向應用程序相對地址的 0x00000004 ,0x00000000存儲的是棧頂指針,這一點非常重要。文章來源地址http://www.zghlxwxcb.cn/news/detail-777120.html
到了這里,關于單片機二進制bin(map、反匯編)文件分析(IAP程序跳轉,PC指針指向問題分析)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!