痞子衡在第四、五、六节课分别介绍了编译器/链接器生成的3种output文件(relocatable、map、exectuable文件),这3种文件都是侧重的代码经过汇编/链链接后的二进制数据在存储中分布情况。如果想知道二进制数据对应的机器码具体是什么意思应该怎么办?痞子衡今天要介绍的反汇编文件会给你答案。
一、标准汇编源文件
使用IAR进行编译的时候会在D:myProjectbspbuildsdemoReleaseList目录下生成.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:myProjectbspbuildsdemoReleaseList目录下生成.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 SystemsEmbedded Workbench xxxarmbinielfdumparm.exe
用法:ielfdumparm.exe --source --code demo.elf -o demo.dump
至此,嵌入式开发里的反汇编文件(.s, .lst, .dump)文件痞子衡便介绍完毕了
上一篇:痞子衡嵌入式:ARM Cortex-M文件那些事(8)- 镜像文件
下一篇:痞子衡嵌入式:ARM Cortex-M文件那些事(6)- 可执行文件(.out/.e
推荐阅读最新更新时间:2024-11-16 21:31
设计资源 培训 开发板 精华推荐
- 用于医疗的 12 位、125KSPS DAC
- LT3507 级联电源即使在高 VIN/VOUT 比的情况下也能保持高频工作
- 使用 Semtech 的 EZ1585I 的参考设计
- DC1299A-B,用于 LTC6421CUD-20 双路匹配 1.3GHz 差分放大器/ADC 驱动器的演示板
- 用于智能电表和PLC系统,使用VIPER267KDTR的双路输出隔离式PSR反激转换器
- 使用 Richtek Technology Corporation 的 RT9986 的参考设计
- SiC438 3 至 28 V 输入、8A microBUCK DC/DC 转换器的典型应用
- WCH-Link
- ESP8266 RGB Board
- 【训练营】小狗伴伴
- 大联大品佳集团推出以复旦微和ams OSRAM产品为主的汽车氛围灯方案
- 为啥车载操作系统(Vehicle OS)越来越重要了呢?
- 车载传感器 — 一文详解激光雷达
- 汽车(超声波、毫米波、激光)雷达之间的简单区别
- 汽车电路相关知识大全
- Bourns 推出两款厚膜电阻系列,具备高功率耗散能力, 采用紧凑型 TO-220 和 DPAK 封装设计
- SABIC进一步深化与博鳌亚洲论坛的战略合作伙伴关系
- 使用 3.3V CAN 收发器在工业系统中实现可靠的数据传输
- 凌华智能推出AmITX Mini-ITX 主板,助力边缘人工智能和物联网创新
- 英飞凌携手马瑞利采用AURIX™ TC4x MCU系列推动区域控制单元创新
- 微信直播慕尼黑东芝大展台,好礼多多等你来
- 读故事写评语喽~ 踩过坑的你是否期待更贴心智能的客户支持,KeysightCare邀您抢楼赢礼!
- 答题赢好礼|ADI技术直通车第1期
- 下载有礼|电路设计的参考书《ADI 参考电路合集 (第4册) 》
- 线下研讨会|MATLAB助力人工智能与电子产品的开发
- 【干货视频】走进TE智能制造工厂,追踪连接器绿色生产全过程
- 有奖直播:瑞萨电子 R-Car 先进驾驶辅助系统方案
- 高达270MHz!恩智浦LPC3000系列全套资料
- 开启Altera SoC体验之旅,玩转Altera Cyclone V系列SoC
- 下载有好礼!罗姆带您学习电源设计应用小技巧(功率器件篇)