在第四、五、六節課分别介紹了編譯器/連結器生成的3種output檔案(relocatable、map、exectuable檔案),這3種檔案都是側重的代碼經過彙編/鍊連結後的二進制資料在存儲中分布情況。如果想知道二進制資料對應的機器碼具體是什麼意思應該怎麼辦?今天要介紹的反彙編檔案會給你答案。
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家講的是嵌入式開發裡的反彙編檔案(.s, .lst, .dump)。
痞子衡在第四、五、六節課分别介紹了編譯器/連結器生成的3種output檔案(relocatable、map、exectuable檔案),這3種檔案都是側重的代碼經過彙編/鍊連結後的二進制資料在存儲中分布情況。如果想知道二進制資料對應的機器碼具體是什麼意思應該怎麼辦?痞子衡今天要介紹的反彙編檔案會給你答案。
使用IAR進行編譯的時候會在D:\myProject\bsp\builds\demo\Release\List目錄下生成.s檔案,每一個relocatable檔案都對應着一個.s檔案,這是編譯器對C源檔案進行彙編後得到的彙編檔案。以task.c彙編生成的task.s為例:
task.s檔案就是用彙編語言對task.c檔案的逐句彙編式翻譯,下面僅列出normal_task()函數的彙編代碼,如果你願意的話,你可以直接用這個task.s檔案替代task.c檔案放進工程裡,功能是一樣的。
task.s檔案最後還會給出檔案裡的object在各section中的總size情況。
使用IAR進行編譯的時候會在D:\myProject\bsp\builds\demo\Release\List目錄下生成.lst檔案,每一個relocatable檔案都對應着一個.lst檔案,這是編譯器對C源檔案進行彙編後得到的彙編檔案的補充資訊檔案。繼續以task.c彙編生成的task.lst為例:
task.lst檔案在task.s的基礎上還加入了對彙編指令的機器碼翻譯資訊,其中有0x....表明該檔案沒有經過全局的連結,是以還無法确定機器碼。
task.lst檔案最後還給出最大棧使用的分析以及各object具體size情況。
dump檔案是所有list檔案的集合,也是整個image檔案的機器碼資料的逐句彙編式翻譯,還是以task.c裡的normal_task()為例,在list檔案中我們會看到部分未知機器碼0x....,而在dump檔案裡這部分位置機器碼被填充成真實的機器碼。有了dump檔案,我們就可以從彙編角度對整個工程進行解讀分析。
dump檔案預設是不生成的,但是IAR裡提供了工具可以幫我們生成dump檔案,這個工具叫ielfdumparm.exe。
至此,嵌入式開發裡的反彙編檔案(.s, .lst, .dump)檔案痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。