大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家讲的是嵌入式开发里的反汇编文件(.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主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:ARM Cortex-M文件那些事(7)- 反汇编文件(.s/.lst/.dump)的更多相关文章

  1. 痞子衡嵌入式:IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR内部C-SPY调试组件配套宏文件(.mac)用法. 痞子衡之前写过一篇 <JLink Script文件基础及其在IAR下调用 ...

  2. 痞子衡嵌入式:ARM Cortex-M文件那些事(0)- 文件关联

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的文件关联. 本篇是文件系列第一篇,本系列文章会逐一介绍ARM Cortex-M开发过程中(以IAR集成开发环境为例,其他开发 ...

  3. 痞子衡嵌入式:ARM Cortex-M文件那些事(1)- 源文件(.c/.h/.s)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的source文件. 众所周知,嵌入式开发属于偏底层的开发,主要编程语言是C和汇编.所以本文要讲的source文件主要指的就是 ...

  4. 痞子衡嵌入式:ARM Cortex-M文件那些事(2)- 链接文件(.icf)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的linker文件. 在前一节课源文件(.c/.h/.s)里,痞子衡给大家系统地介绍了source文件,source文件是嵌入 ...

  5. 痞子衡嵌入式:ARM Cortex-M文件那些事(3)- 工程文件(.ewp)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的project文件. 前面两节课里,痞子衡分别给大家介绍了嵌入式开发中的两种典型input文件:源文件(.c/.h/.s). ...

  6. 痞子衡嵌入式:ARM Cortex-M文件那些事(4)- 可重定向文件(.o/.a)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的relocatable文件(object, library). 前三节课里,痞子衡都是在给大家介绍嵌入式开发中的input文 ...

  7. 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的map文件. 第四节课里,痞子衡给大家介绍了第一种output文件-relocatable文件,本文继续给大家讲projec ...

  8. 痞子衡嵌入式:ARM Cortex-M文件那些事(6)- 可执行文件(.out/.elf)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的executable文件(elf). 第四.五节课里,痞子衡已经给大家介绍了2种output文件,本文继续给大家讲proje ...

  9. 痞子衡嵌入式:ARM Cortex-M文件那些事(8)- 镜像文件(.bin/.hex/.s19)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的image文件(.bin, .hex, .s19). 今天这节课是痞子衡<ARM Cortex-M文件那些事>主 ...

随机推荐

  1. Linux结束进程到底有多少种方法?

    我们经常在Linux里使用kill命令来结束某后台进程.但kill命令实际上是向进程发送信号,并且有多种信号.终止运行一个程序只是其中一个信号而已.kill是根据进程号发送信号的,而另一个工具kill ...

  2. NetToPLCSIM 连接PLCSIM 和Kepware 联合仿真

    之前只知道PLCSIM 单独仿真调试PLC的程序,后来接触KepwareOPC,想着如果能够仿真PLC和Kepware的通信,更加方便调试.于是在网上搜索了一下,发现NetToPLCSIM这个软件. ...

  3. webpack学习最基本的使用方式(一)

    网页中引入的静态资源多了以后会有什么问题.? 1.网页加载速度慢,因为我们要发起很多的二次请求 2.要处理错综复杂的依赖关系 如何解决上面的问题 1.合并,压缩图片,使用精灵图 2.可以使用之前学过的 ...

  4. 19南昌网络赛L

    校赛打杂没施展开. 题意:一开始给你一颗 (0,0)到(0,l)的树. 这棵树每一年会长出来三个幼芽(雾),长度均为l/4,方向分别是左转60,右转60,和不变. 年份<=14 考虑3^14直接 ...

  5. Web版需求征集系统所得2,servlet中request.getParameter获值乱码问题解决

    servlet获值乱码问题解决 解决办法一(最简单有效) request.setCharacterEncoding("utf-8"); 解决办法二 因为乱码问题的产生是因为默认格式 ...

  6. python处理参数的getopt的使用

    在写脚本程序的时候需要添加一些额外的参数来实现脚本的附加功能或者增强功能,通常的做法是同sys.argv[i]直接来获取参数的值,但是这个比较局限,要求参数的输入一定要按照顺序. fileName = ...

  7. 干货分享:Neutron的PPT,帮助你理解Neutron的各种细节

    深入解析Neutron http://files.cnblogs.com/popsuper1982/Neutron.pptx 经典的三节点部署 架构 怎么理解? 更加深入:Tap Interface ...

  8. 轻量级C#网络通信组件StriveEngine —— C/S通信开源demo(附源码)

    前段时间,有几个研究ESFramework网络通讯框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好 ...

  9. MongoDB 错误汇总

    错误1. ERROR: child process failed, exited with error number 100 可能原因: 1.没有正确关闭服务 2.服务已经启动 3.conf文件的参数 ...

  10. 【转载】CSS3 文字溶解效果

    代码如下: <!DOCTYPE html> <html > <head> <meta charset="UTF-8"> <ti ...