HEX文件解析
HEX格式文件以行為單位,每行由“:”(0x3a)開始,以回車鍵結束(0x0d,0x0a)。行內(nèi)的數(shù)據(jù)都是由兩個字符表示一個16進制字節(jié),比如”01”就表示數(shù)0x01;”0a”,就表示0x0a。對于16位的地址,則高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示為字符串”010a”。
Example.hex 行號 原始碼 1 : 10 0000 00 020003787FE4F6D8FD75812B02004A02 D6 2 :10001000008FE493A3F8E493A34003F68001F20871 3 :10002000DFF48029E493A3F85407240CC8C333C435 4 :10003000540F4420C8834004F456800146F6DFE4A0 5 :10004000800B01020408102040809000C2E47E0171 6 :100050009360BCA3FF543F30E509541FFEE493A313 7 :1000600060010ECF54C025E060A840B8E493A3FAF7 8 :10007000E493A3F8E493A3C8C582C8CAC583CAF0B1 9 :10008000A3C8C582C8CAC583CADFE9DEE780BEE432 16 :0700F0001F70F31E80F022D7 17 :00000001FF 面對這一大串的十六進制碼,有沒有頭昏眼花的感覺呢?別急別急,經(jīng)過本文的介紹,你一定會愛上這個會讓你頭昏眼花的機器碼的! 首先我們先介紹HEX文件的編碼格式,舉范例程序中第一行說明: : 10 0000 00 020003787FE4F6D8FD75812B02004A02 D6 1 2 3 4 5 6 為了方便解說,筆者將原始碼以空格區(qū)分成六個部分,在實際轉換的原始內(nèi)容應該沒有空格也沒有行號的。 第1部分是HEX文件的起始格式,文件一開始應該是一個冒號作為起點; 第2部分的兩碼(10H)所代表的是該行總共具備多少個字節(jié)的數(shù)據(jù),以本行為例,應該有16個字節(jié),因為10H換算成十進制應該是16; 第3部分的四碼所代表的是放置數(shù)據(jù)的開始位置,換句話說,本行的數(shù)據(jù)應該是放置在0000H~000FH 這段地址中; 第4部分的兩碼是檢查碼,所代表的是該行數(shù)據(jù)類型。 00 ----數(shù)據(jù)記錄 這里就是0x00即為普通數(shù)據(jù)記錄。 首先我們只處理數(shù)據(jù)類型為0x00及0x01的情況。0x02表示對應的存儲地址超過了64K,由于我的編程器只針對64K以下的單片機,因此在次不處理,0x04也是如此。 '00' Data Record '01' End of File Record '02' Extended Segment Address Record '03' Start Segment Address Record '04' Extended Linear Address Record '05' Start Linear Address Record 第5部分則為數(shù)據(jù)存放區(qū),總共32碼16個字節(jié),有興趣的可以實際算算看,這里的機器碼已經(jīng)是標準的MCS-51指令,如果查表的話可以直接知道其功能,稍后的文章會再提到; 第6部分為校驗值。 什么叫做校驗值?所謂的校驗值是一種標準的校驗碼,把它加在每一行機器碼的最后,可以使每一行所有的十六進制值(兩個為一組),加總后所得到最后兩位十六進制碼應為 00H,如果你不太會十六進制運算的話,沒關系,Windows中有一個很好用的工具叫“計算器”,你可以切換到科學型計算的十六進制模式,將數(shù)值直接輸入,它就會自動幫你算好了。以本例來說,將所有的值相加所得到的值應該是: 10H + 00H + 00H + 00H + 02H + 00H + 03H + 78H + 7FH + E4H + F6H + D8H+ FDH + 75H + 81H + 2BH + 02H + 00H + 4AH + 02H + D6H = 700H 最后兩個碼果然為00H,有興趣的人可以把范例中的每一行都算算看,結果一定都是這樣的。 每個HEX格式的最后一行都是固定為: :00000001FF
|
|
來自: 昵稱18548705 > 《待分類》