<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      痞子衡嵌入式:ARM Cortex-M文件那些事(7)- 反匯編文件(.s/.lst/.dump)


        大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家講的是嵌入式開發里的反匯編文件(.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文件放進工程里,功能是一樣的。

              SECTION `.text`:CODE:NOROOT(1)
                CFI Block cfiBlock0 Using cfiCommon0
                CFI Function normal_task
                CFI NoCalls
              THUMB
      //   17 void normal_task(void)
      //   18 {
      //   19     s_variable0 *= 2;
      normal_task:
              LDR      R0,??DataTable1
              LDR      R0,[R0, #+0]
              MOVS     R1,#+2
              MULS     R0,R1,R0
              LDR      R1,??DataTable1
              STR      R0,[R1, #+0]
      //   20 }
              BX       LR               ;; return
                CFI EndBlock cfiBlock0
      //   21 
      

        task.s文件最后還會給出文件里的object在各section中的總size情況。

      // 20 bytes in section .bss
      //  4 bytes in section .data
      //  4 bytes in section .noinit
      // 86 bytes in section .text
      // 16 bytes in section .textrw
      //
      // 102 bytes of CODE memory
      //  28 bytes of DATA memory
      

      二、中間匯編list文件

        使用IAR進行編譯的時候會在D:\myProject\bsp\builds\demo\Release\List目錄下生成.lst文件,每一個relocatable文件都對應著一個.lst文件,這是編譯器對C源文件進行匯編后得到的匯編文件的補充信息文件。繼續以task.c匯編生成的task.lst為例:

        task.lst文件在task.s的基礎上還加入了對匯編指令的機器碼翻譯信息,其中有0x....表明該文件沒有經過全局的鏈接,所以還無法確定機器碼。

         \                                 In section .text, align 2, keep-with-next
           17          void normal_task(void)
           18          {
           19              s_variable0 *= 2;
         \                     normal_task: (+1)
         \   00000000   0x....             LDR      R0,??DataTable1
         \   00000002   0x6800             LDR      R0,[R0, #+0]
         \   00000004   0x2102             MOVS     R1,#+2
         \   00000006   0x4348             MULS     R0,R1,R0
         \   00000008   0x....             LDR      R1,??DataTable1
         \   0000000A   0x6008             STR      R0,[R1, #+0]
           20          }
         \   0000000C   0x4770             BX       LR               ;; return
           21   
      

        task.lst文件最后還給出最大棧使用的分析以及各object具體size情況。

         Maximum stack usage in bytes:
      
         .cstack Function
         ------- --------
            24   heap_task
              24   -> __aeabi_memcpy
              24   -> __aeabi_memset
              24   -> free
              24   -> malloc
             0   normal_task
             0   ram_task
      
      
         Section sizes:
      
         Bytes  Function/Label
         -----  --------------
             4  ??DataTable1
             4  ??DataTable1_1
             4  ??DataTable1_2
            60  heap_task
             4  n_variable1
            14  normal_task
            16  ram_task
            16  s_array
             4  s_variable0
             4  s_variable2
      

      三、完整匯編dump文件

        dump文件是所有list文件的集合,也是整個image文件的機器碼數據的逐句匯編式翻譯,還是以task.c里的normal_task()為例,在list文件中我們會看到部分未知機器碼0x....,而在dump文件里這部分位置機器碼被填充成真實的機器碼。有了dump文件,我們就可以從匯編角度對整個工程進行解讀分析。

        //     s_variable0 *= 2;
                  $t:
                  `.text12`:
                  normal_task:
          0xcc: 0x4812         LDR.N R0, `.text_8`          ; `.data$$Limit`
          0xce: 0x6800         LDR   R0, [R0]
          0xd0: 0x2102         MOVS  R1, #2
          0xd2: 0x4348         MULS  R0, R1, R0
          0xd4: 0x4910         LDR.N R1, `.text_8`          ; `.data$$Limit`
          0xd6: 0x6008         STR   R0, [R1]
        // }
          0xd8: 0x4770         BX    LR
      

      四、使用ielfdumparm.exe生成dump文件

        dump文件默認是不生成的,但是IAR里提供了工具可以幫我們生成dump文件,這個工具叫ielfdumparm.exe。

      位置:\IAR Systems\Embedded Workbench xxx\arm\bin\ielfdumparm.exe
      用法:ielfdumparm.exe --source --code demo.elf -o demo.dump
      

        至此,嵌入式開發里的反匯編文件(.s, .lst, .dump)文件痞子衡便介紹完畢了,掌聲在哪里~~~

      歡迎訂閱

      文章會同時發布到我的 博客園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

      微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

      posted @ 2018-01-21 21:21  痞子衡  閱讀(3328)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 国产日韩av免费无码一区二区三区| 高中生粉嫩无套第一次| 亚洲人成亚洲人成在线观看| 国产欧美日韩综合精品二区| 91色老久久精品偷偷性色| 国产精品中文字幕观看| 国产性色的免费视频网站| 国产91精品调教在线播放| 粗大挺进朋友人妻淑娟| 囯产精品一区二区三区线| 日日碰狠狠添天天爽超碰97| 熟女一区二区中文在线| 欧美性受xxxx黑人猛交| 日韩av在线一卡二卡三卡| jizz视频在线观看| 中文字幕久久精品波多野结| 无码A级毛片免费视频下载| 免费无码AV一区二区波多野结衣| 国产永久免费高清在线观看| 久久久精品2019中文字幕之3| 嵊州市| 2019亚洲午夜无码天堂| 免费无码又爽又刺激网站直播| 国产成人午夜福利在线小电影| 虎白女粉嫩尤物福利视频| 亚洲gv猛男gv无码男同| 熟女国产精品一区二区三| 亚洲色婷婷综合开心网| 精品人妻日韩中文字幕| 亚洲一区二区三区蜜桃臀| 国产精品亚洲а∨天堂2021| 国产成人无码A区在线观看视频| 先锋影音av最新资源| 国产成人啪精品视频免费网 | 国产高清亚洲一区亚洲二区| 鄂温| 久久久久久综合网天天| 福利一区二区不卡国产| 精品国产福利久久久| 好紧好爽好湿别拔出来视频男男 | 国产自拍一区二区三区在线|