我已經解析了十六進制文件以用於引導加載之前。這是我第一次使用Microchip的XC32工具鏈生成一個十六進制文件。馬上我注意到了十六進制文件和反彙編之間的差異。十六進制文件和反彙編差異
第3行hex文件:
: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看起來像它應該包含在列表文件0×06。但是,十六進制文件似乎在此位置表示0x40。以下3個字節也未按預期順序排列。
:10 0000 00 03 00 00 10 00 00 00 00 40 F3 06 00 00 00 00 00 A4
當我看到,雖然該文件的其他記錄都如預期,但字節屬於這個jalx
指示詞似乎失靈。有人能讓我挺身而出嗎?
謝謝!
更新: 另一個令人困惑的數據點。如果我使用調試器(不使用我的bootloader)將十六進制文件閃存到部件中。然後,如果我查看執行內存和反彙編列表,我看到以下內容:
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工具會像我那樣解釋十六進制文件,但這與列表文件不匹配。
hex文件是Intel格式。如果:之後的第8個字節只有0或1,則它是I8 = 16位。如果是0到3,那麼I16 = 20位。如果它只有0,1,4,5,則它是I32 = 32位。 Microchip通常使用I8。 – cup
@cup。感謝您的輸入。我見過的所有Microchip生成的十六進制文件都是I32。在我發佈的前兩個記錄的片段中,類型4允許32位尋址。 – user3692971
@ donjuedo,謝謝你的迴應。我絕對不是專家,但我只見過數據記錄中按字節順序連續排列的字節。如果這可以改變口譯員會怎麼知道?根據我發佈的最新信息,我不認爲這種情況正在發生。 – user3692971