2017-04-10 198 views
1

我已經解析了十六進制文件以用於引導加載之前。這是我第一次使用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工具會像我那樣解釋十六進制文件,但這與列表文件不匹配。

回答

1

我在microchip.com論壇發佈了這個問題,並且那裏的幾個用戶提供了答案。

基本上,清單文件摘錄中的JALX指令在microMIPS而不是MIPS32中格式化。因此,列表文件和十六進制文件之間實際上沒有差異。正如我試圖做的那樣,十六進制文件被解釋爲每個字節寫入上升的地址位置。但是,像我在更新中一樣查看反彙編沒有將這些指令解釋爲microMIPS,因此在通過IDE查看時該指令的反彙編不正確。當執行JALX時,CPU中的一個標誌通知處理器將此指令視爲mircoMIPS。

欲瞭解更多信息,請參閱我在的出色的響應:

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

0

它看起來像列表是使用Little Endian這些16位值。如果這意味着是一個32位的值,那麼0x06將首先出現。

只要是這種情況,那就沒有問題了。

+0

hex文件是Intel格式。如果:之後的第8個字節只有0或1,則它是I8 = 16位。如果是0到3,那麼I16 = 20位。如果它只有0,1,4,5,則它是I32 = 32位。 Microchip通常使用I8。 – cup

+0

@cup。感謝您的輸入。我見過的所有Microchip生成的十六進制文件都是I32。在我發佈的前兩個記錄的片段中,類型4允許32位尋址。 – user3692971

+0

@ donjuedo,謝謝你的迴應。我絕對不是專家,但我只見過數據記錄中按字節順序連續排列的字節。如果這可以改變口譯員會怎麼知道?根據我發佈的最新信息,我不認爲這種情況正在發生。 – user3692971