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