1

我之前已经解析了十六进制文件以进行引导加载。这是我第一次使用 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。但是,十六进制文件似乎在此位置指示 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 工具会像我一样解释十六进制文件,但这与列表文件不匹配。

4

2 回答 2

1

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

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

有关更多信息,请参阅我收到的出色回复:

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

于 2017-04-19T19:29:45.850 回答
0

看起来该清单对这些 16 位值使用了 Little Endian。如果这意味着是一个 32 位值,那么 0x06 将首先出现。

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

于 2017-04-10T17:49:50.837 回答