Hex文件和反汇编差异

时间:2017-04-10 17:45:18

标签: pic microchip hex-file

之前我已经解析了十六进制文件以进行引导加载。这是我第一次使用Microchip的XC32工具链生成hex文件。我立刻注意到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指令字相关的字节似乎无序。有人可以让我直截了当吗?

谢谢!

更新 另一个令人困惑的数据点。如果我使用调试器(不使用我的引导程序)将hex文件刷入部件。然后,如果我查看执行内存和反汇编列表,我会看到以下内容:

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。这是编译器生成的启动代码,所以我不能确定它应该是什么。字节顺序匹配hex文件而不是列表文件,因此Microchip工具会像我一样解释hex文件,但这与列表文件不匹配。

2 个答案:

答案 0 :(得分:1)

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

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

有关详情,请参阅我收到的优秀回复:

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

答案 1 :(得分:0)

看起来该列表使用Little Endian来表示这些16位值。如果这是一个32位的值,那么0x06将首先出现。

只要是这样,就没有问题。