查看: 3144|回复: 1

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

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3920

    主题

    7538

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39928
    最后登录
    2025-8-20
    发表于 2020-9-8 14:37:03 | 显示全部楼层 |阅读模式
    从文件角度看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文件放进工程里,功能是一样的。

    1.    SECTION `.text`:CODE:NOROOT(1)
    2.           CFI Block cfiBlock0 Using cfiCommon0
    3.           CFI Function normal_task
    4.           CFI NoCalls
    5.         THUMB
    6. //   17 void normal_task(void)
    7. //   18 {
    8. //   19     s_variable0 *= 2;
    9. normal_task:
    10.         LDR      R0,??DataTable1
    11.         LDR      R0,[R0, #+0]
    12.         MOVS     R1,#+2
    13.         MULS     R0,R1,R0
    14.         LDR      R1,??DataTable1
    15.         STR      R0,[R1, #+0]
    16. //   20 }
    17.         BX       LR               ;; return
    18.           CFI EndBlock cfiBlock0
    19. //   21
    复制代码
    task.s文件最后还会给出文件里的object在各section中的总size情况。
    1. // 20 bytes in section .bss
    2. //  4 bytes in section .data
    3. //  4 bytes in section .noinit
    4. // 86 bytes in section .text
    5. // 16 bytes in section .textrw
    6. //
    7. // 102 bytes of CODE memory
    8. //  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....表明该文件没有经过全局的链接,所以还无法确定机器码。
    1. \                                 In section .text, align 2, keep-with-next
    2.      17          void normal_task(void)
    3.      18          {
    4.      19              s_variable0 *= 2;
    5.    \                     normal_task: (+1)
    6.    \   00000000   0x....             LDR      R0,??DataTable1
    7.    \   00000002   0x6800             LDR      R0,[R0, #+0]
    8.    \   00000004   0x2102             MOVS     R1,#+2
    9.    \   00000006   0x4348             MULS     R0,R1,R0
    10.    \   00000008   0x....             LDR      R1,??DataTable1
    11.    \   0000000A   0x6008             STR      R0,[R1, #+0]
    12.      20          }
    13.    \   0000000C   0x4770             BX       LR               ;; return
    14.      21   
    复制代码
    task.lst文件最后还给出最大栈使用的分析以及各object具体size情况。
    1. Maximum stack usage in bytes:

    2.    .cstack Function
    3.    ------- --------
    4.       24   heap_task
    5.         24   -> __aeabi_memcpy
    6.         24   -> __aeabi_memset
    7.         24   -> free
    8.         24   -> malloc
    9.        0   normal_task
    10.        0   ram_task


    11.    Section sizes:

    12.    Bytes  Function/Label
    13.    -----  --------------
    14.        4  ??DataTable1
    15.        4  ??DataTable1_1
    16.        4  ??DataTable1_2
    17.       60  heap_task
    18.        4  n_variable1
    19.       14  normal_task
    20.       16  ram_task
    21.       16  s_array
    22.        4  s_variable0
    23.        4  s_variable2
    复制代码
    三、完整汇编dump文件
    dump文件是所有list文件的集合,也是整个image文件的机器码数据的逐句汇编式翻译,还是以task.c里的normal_task()为例,在list文件中我们会看到部分未知机器码0x....,而在dump文件里这部分位置机器码被填充成真实的机器码。有了dump文件,我们就可以从汇编角度对整个工程进行解读分析。
    1. //     s_variable0 *= 2;
    2.             $t:
    3.             `.text12`:
    4.             normal_task:
    5.     0xcc: 0x4812         LDR.N R0, `.text_8`          ; `.data$Limit`
    6.     0xce: 0x6800         LDR   R0, [R0]
    7.     0xd0: 0x2102         MOVS  R1, #2
    8.     0xd2: 0x4348         MULS  R0, R1, R0
    9.     0xd4: 0x4910         LDR.N R1, `.text_8`          ; `.data$Limit`
    10.     0xd6: 0x6008         STR   R0, [R1]
    11.   // }
    12.     0xd8: 0x4770         BX    LR
    复制代码
    四、使用ielfdumparm.exe生成dump文件
    dump文件默认是不生成的,但是IAR里提供了工具可以帮我们生成dump文件,这个工具叫ielfdumparm.exe。
    1. 位置:\IAR Systems\Embedded Workbench xxx\arm\bin\ielfdumparm.exe
    2. 用法:ielfdumparm.exe --source --code demo.elf -o demo.dump
    复制代码
    至此,嵌入式开发里的反汇编文件(.s, .lst, .dump)文件痞子衡便介绍完毕了,掌声在哪里~~~



    qiandao qiandao
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3920

    主题

    7538

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39928
    最后登录
    2025-8-20
     楼主| 发表于 2020-9-9 17:57:20 | 显示全部楼层

    是我写的有问题?
    qiandao qiandao
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-21 07:35 , Processed in 0.077065 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表