痞子衡
认证:普通会员
所在专题目录 查看专题
从文件角度看Cortex-M开发(3) - 工程文件
从文件角度看Cortex-M开发(4) - 可重定向文件
从文件角度看Cortex-M开发(5) - 映射文件
从文件角度看Cortex-M开发(6) - 可执行文件
从文件角度看Cortex-M开发(7) - 反汇编文件
从文件角度看Cortex-M开发(8) - 镜像文件
作者动态 更多
复合数据类型在C/C++下混合编译注意事项
5分钟前
加了ECC保护之后的运存性能有何影响?
1星期前
第一本Git命令教程(2) - 连接
3星期前
MCU里硬件CRC对数据长度对齐有要求?
11-26 11:14
为什么DCP硬件引擎做Hash校验偶尔会失败?
11-21 09:26

从文件角度看Cortex-M开发(7) - 反汇编文件

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家讲的是嵌入式开发里的反汇编文件(.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)文件痞子衡便介绍完毕了,掌声在哪里~~~

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 1
收藏 2
关注 41
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧