使用keil-MDK生成bin文件以及反汇编文件

在keil-MDK工程中,通过勾选Run#1和Run#2,配置fromelf命令生成bin和反汇编文件。Run#1用于生成bin文件,指定--bin格式和--output参数;Run#2生成反汇编文件,使用--text和--output参数。完成设置后,进行编译将在Objects目录下得到Bootloader.bin和Bootloader.dis文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用keil-MDK生成bin文件以及反汇编文件

工程设置如下:
工程设置

勾选Run#1,输入以下指令:

fromelf --bin --output=Objects\Bootloader.bin Objects\Bootloader.axf

其中–bin是指定输出文件格式是bin格式,
–output=xxxx\xxxx.bin指定目录以及输出文件名,
xxxx\xxxx.axf 是指定目录下的指定axf文件,此文件作为输入文件,是keil编译后产生的。


勾选Run#2,输入以下指令:

fromelf --text -a -c --output=Objects\Bootloader.dis Objects\Bootloader.axf

其中–text是指定输出文件格式为text格式,
–output=xxxx\xxxx.dis 指定目录以及输出文件名,
xxxx\xxxx.axf 是指定目录下的指定axf文件,此文件作为输入文件,是keil编译后产生的。

设置完成后,点击工程选项build,就能在工程目录下的object下找到生成的bin文件以及反汇编dis文件。


在这里插入图片描述

<think>好的,用户已经询问了如何在Keil中导出反汇编代码,我之前已经给出过详细的步骤。现在用户再次提问,可能是在实际操作中遇到了问题,或者需要更清晰的解释。让我先回顾之前的回答,确保没有遗漏。 用户提供的引用[1]和[2]提到了反汇编窗口的用途和调试优势,比如设置断点、单步执行汇编指令等。用户现在明确想知道导出方法,可能需要分步骤的指导。 首先,用户可能对Keil界面不熟悉,所以需要明确每一步的操作位置。比如,调试模式如何进入,魔术棒图标在哪里。另外,用户可能遇到导出后文件内容不符预期,比如是否包含地址和机器码,或者如何生成带源码对照的列表文件。 接下来,我需要考虑用户可能的实际需求。导出反汇编代码通常用于离线分析、调试优化问题或故障排查,比如HardFault错误。用户可能需要这些信息来理解程序运行细节,尤其是在优化等级较高时C代码与汇编不对应的情况,如引用中提到的。 需要确保回答覆盖两种主要方法:调试模式导出和编译生成.lst文件,以及命令行工具fromelf的使用。同时,注意用户可能没有安装Pack或者环境变量未配置,导致fromelf不可用,需要提醒这些注意事项。 另外,用户可能对生成文件格式有疑问,比如.txt和.lst的区别,需要说明前者是调试时实时反汇编的结果,后者是编译生成的带源码的汇编列表。 最后,检查是否需要补充常见问题,比如如何验证反汇编地址是否正确,或者如何处理无源码的情况。引用中提到可以通过Memory Window验证地址,这点很重要,应该包含在注意事项中。 总结回答结构:分点说明两种主要方法,附加命令行方式,注意事项,操作示例,以及相关问题。确保语言简洁,步骤清晰,避免技术术语过多,方便用户跟随操作。</think>在Keil MDK生成并导出反汇编代码的详细方法如下,涵盖调试模式和编译配置两种核心场景: --- ### **方法1:通过调试模式实时导出(适合动态分析)** 1. **启动调试会话** - 点击工具栏的 **Start Debug Session**(或按`Ctrl+F5`)进入调试模式[^1][^2]。 2. **打开反汇编窗口** - 通过菜单 **View → Disassembly Window**(或快捷键`Alt+7`)调出反汇编界面[^1][^2]。 - *此时显示的是当前程序计数器(PC)对应的二进制文件反汇编结果*。 3. **导出反汇编代码** - 右键点击反汇编窗口 → 选择 **Save As...** → 输入文件名(如`disasm.txt`)。 - *导出内容格式*: ```plaintext 0x08000100: 4A01 LDR R2,[PC,#4] ; 机器码+地址+汇编指令 0x08000102: 4770 BX LR ``` --- ### **方法2:通过编译生成汇编列表文件(适合静态分析)** 1. **配置编译选项** - 点击魔术棒图标 **Options for Target** → 进入 **Listing** 选项卡: - 勾选 **Assembly Code**(生成汇编指令) - 勾选 **C Preprocessor Listing**(保留C源码与汇编的对照)[^1]。 2. **编译生成`.lst`文件** - 点击 **Rebuild** 编译工程 → 在工程目录的`\Listings\`文件夹中找到`.lst`文件- *文件内容示例*: ```plaintext 123: void delay_ms(uint32_t ms) { 124: while(ms--) { 0x08000100 sub sp, #8 ; 对应的汇编代码 0x08000102 str r0, [sp, #4] ``` --- ### **方法3:命令行工具`fromelf`(适合批量处理)** 1. **手动执行命令** ```bash fromelf --text -c -d -z <工程名.axf> --output=disasm.txt ``` - 需将`<工程名.axf>`替换为实际文件路径(默认在`\Objects\`目录下)。 2. **集成到Keil编译流程** - 进入 **Options for Target → User** 选项卡 → 勾选 **Run #1** → 输入: ```bash fromelf --text -c -d -z "#L" --output=disasm.txt ``` - 每次编译后自动生成反汇编文件[^1]。 --- ### **关键注意事项** 1. **调试模式依赖项** - 需确保芯片Pack包已正确安装(否则反汇编窗口可能无内容)[^1]。 2. **代码对齐验证** - 通过 **Memory Window** 查看`0x08000000`等地址的机器码,与反汇编文件对比确认一致性[^1]。 3. **优化等级的影响** - 高优化等级(如-O3)会导致C源码与汇编指令不对应,此时需依赖反汇编窗口调试关键逻辑[^2]。 --- ### **操作示例:导出含C源码的混合反汇编** 1. 在 **Listing** 选项卡中同时勾选 **C Code** 和 **Assembly Code** 2. 编译后查看`.lst`文件,格式如下: ```plaintext 32: GPIO_InitStruct.Pin = GPIO_PIN_5; 0x08000234 movs r3, #0x20 0x08000236 str r3, [sp, #0] ``` --- ### 相关问题 1. 如何通过反汇编代码分析Keil工程的内存占用? 2. 反汇编中的机器码如何与Hex/Bin文件中的二进制对应? 3. 调试时如何利用反汇编窗口定位栈溢出问题?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值