之前我已经解析了十六进制文件以进行引导加载。这是我第一次使用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文件,但这与列表文件不匹配。
答案 0 :(得分:1)
我在microchip.com论坛上发布了这个问题,有几个用户提供了答案。
基本上,列表文件摘录中的JALX
指令的格式为microMIPS而非MIPS32。因此列表文件和hex文件之间实际上没有差异。十六进制文件被解释为每个字节写入升序地址位置,正如我试图做的那样。但是,正如我在更新中所做的那样查看反汇编并没有将指令解释为microMIPS,因此当通过IDE查看时,该指令的反汇编是不正确的。执行JALX
时,CPU中的标志通知处理器将此指令视为mircoMIPS。
有关详情,请参阅我收到的优秀回复:
答案 1 :(得分:0)
看起来该列表使用Little Endian来表示这些16位值。如果这是一个32位的值,那么0x06将首先出现。
只要是这样,就没有问题。