Hex 文件和反汇编差异

Hex file and disassembly discrepancy

我之前为了bootloading的目的解析过hex文件。这是我第一次使用 Microchip 的 XC32 工具链生成十六进制文件。我马上注意到 hex 文件和反汇编文件之间似乎存在差异。

hex文件的前3行:

:020000040000fa
:020000041d00dd
:10000000030000100000000040f3060000000000a4

来自列表文件:

9d000000 <_reset>:
9d000000: 10000003 b 9d000010 <__reset_switch_isa>
9d000004: 00000000 nop

9d000008 <__reset_micromips_isa>:
9d000008: f340 0006 jalx 9d000018 <_startup>
9d00000c: 0000 0000 nop

注意地址 9d000008 在列表文件中看起来应该包含 0x06。但是,hex 文件似乎在此位置指示 0x40。以下 3 个字节也不符合预期的顺序。

:10 0000 00 03 00 00 10 00 00 00 00 40 f3 06 00 00 00 00 00 a4

当我查看文件时,虽然其他记录符合预期,但与此 jalx 指令字相关的字节似乎乱序了。谁能帮我弄清楚?

谢谢!

更新: 另一个令人费解的数据点。如果我使用调试器(不使用我的引导加载程序)将十六进制文件闪存到部件中。然后,如果我查看执行内存和反汇编列表,我会看到以下内容:

Address     Instruction     Disassembly
1D00_0000   10000003        BEQ ZERO, ZERO, 0x1D000010
1D00_0004   00000000        NOP
1D00_0008   0006F340        SLL S8, A2, 13
1D00_000C   00000000        NOP

当 IDE 重新解释它编写的代码时,它现在显示 SLL 指令而不是 JALX。这是编译器生成的启动代码,所以我不能确定它应该是什么。字节顺序匹配十六进制文件而不是列表文件,因此 Microchip 工具会像我一样解释十六进制文件,但这与列表文件不匹配。

看起来清单对这些 16 位值使用了 Little Endian。如果这是一个 32 位值,则 0x06 将排在第一位。

只要是这样就没有什么问题

我在 microchip.com 论坛上发布了这个问题,那里的几个用户提供了答案。

基本上,列表文件摘录中的 JALX 指令采用 microMIPS 而非 MIPS32 格式。所以列表文件和十六进制文件之间实际上没有差异。十六进制文件被解释为每个字节写入升序地址位置,就像我试图做的那样。但是,像我在更新中所做的那样查看反汇编不会将指令解释为 microMIPS,因此当通过 IDE 查看时,该指令的反汇编是不正确的。 JALX 执行时,CPU 中的标志通知处理器将此指令视为 mircoMIPS。

有关更多信息,请参阅我在以下位置收到的出色回复:

http://www.microchip.com/forums/FindPost/986740