1. 程式人生 > >Hex格式和Mot格式簡介

Hex格式和Mot格式簡介

一、Hex格式介紹  1.1 什麼是 Intel HEX 檔案格式?  Intel HEX檔案 是由一行行符合 Intel HEX檔案格式的文字所構成的ASCII文字檔案。 在Intel HEX檔案中,每一行包含一個HEX記錄。 這些記錄由對應機器語言碼和/或常量資料的十六進位制編碼數字組成。 Intel HEX檔案通常用於傳輸將被存於ROM或者EPROM中的程式和資料。 大多數EPROM程式設計器或模擬器使用Intel HEX檔案。  1.2 記錄格式  Intel HEX由任意數量的十六進位制記錄組成。 每個記錄包含5個域,它們按以下格式排列:  :llaaaatt[dd...]cc  每一組字母對應一個不同的域,每一個字母對應一個十六進位制編碼的數字。 每一個域由至少兩個十六進位制編碼數字組成,它們構成一個位元組,就像以下描述的那樣:  : 每個Intel HEX記錄都由冒號開頭.  ll 是資料長度域,它代表記錄當中資料位元組(dd)的數量.  aaaa 是地址域,它代表記錄當中資料的起始地址.  tt 是代表HEX記錄型別的域,它可能是以下資料當中的一個:  00 – 資料記錄  01 – 檔案結束記錄  02 – 擴充套件段地址記錄  04 – 擴充套件線性地址記錄  dd 是資料域,它代表一個位元組的資料. 一個記錄可以有許多資料位元組.記錄當中資料位元組的數量必須和資料長度域(ll)中指定的數字相符.  cc 是校驗和域,它表示這個記錄的校驗和. 校驗和的計算是通過將記錄當中所有十六進位制編碼數字對的值相加,以256為模進行以下補足.  1.3.1 資料記錄  Intel HEX檔案由任意數量以回車換行符結束的資料記錄組成. 資料記錄外觀如下:  :10246200464C5549442050524F46494C4500464C33  其中:  10 是這個記錄當中資料位元組的數量.  2462 是資料將被下載到儲存器當中的地址.  00 是記錄型別(資料記錄)  464C…464C是資料.  33 是這個記錄的校驗和.  1.3.2 擴充套件線性地址記錄(HEX386)  擴充套件線性地址記錄也叫作32位地址記錄或HEX386記錄. 這些記錄包含資料地址的高16位. 擴充套件線性地址記錄總是有兩個資料位元組,外觀如下:  :02000004FFFFFC  其中:  02 是這個記錄當中資料位元組的數量.  0000 是地址域,對於擴充套件線性地址記錄,這個域總是0000.  04 是記錄型別 04(擴充套件線性地址記錄)  FFFF 是地址的高16位.  FC 是這個記錄的校驗和,計算方法如下: 01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).  當一個擴充套件線性地址記錄被讀取,儲存於資料域的擴充套件線性地址被儲存,它被應用於從Intel HEX檔案讀取來的隨後的記錄. 線性地址保持有效,直到它被另外一個擴充套件地址記錄所改變.  通過把記錄當中的地址域與被移位的來自擴充套件線性地址記錄的地址資料相加獲得資料記錄的絕對儲存器地址.  以下的例子演示了這個過程..  來自資料記錄地址域的地址(2462)+ 擴充套件線性地址記錄的資料域(FFFF) = 絕對儲存器地址(FFFF2462)。   1.3.3 擴充套件段地址記錄(HEX86) 擴充套件段地址記錄也叫HEX86記錄,它包括4-19位資料地址段. 擴充套件段地址記錄總是有兩個資料位元組,外觀如下:  :020000021200EA  其中:  02 是記錄當中資料位元組的數量.  0000 是地址域.對於擴充套件段地址記錄,這個域總是0000.  02 是記錄型別 02(擴充套件段地址記錄)  1200 是地址段.  EA 是這個記錄的校驗和,計算方法如下: 01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).  當一個擴充套件段地址記錄被讀取,儲存於資料域的擴充套件段地址被儲存,它被應用於從Intel HEX檔案讀取來的隨後的記錄. 段地址保持有效,直到它被另外一個擴充套件地址記錄所改變.  通過把記錄當中的地址域與被移位的來自擴充套件段地址記錄的地址資料相加獲得資料記錄的絕對儲存器地址.  以下的例子演示了這個過程..  來自資料記錄地址域的地址(2462)+ 擴充套件段地址記錄資料域(1200)= 絕對儲存器地址(00014462)。 1.3.4 檔案結束(EOF)記錄  Intel HEX檔案必須以檔案結束(EOF)記錄結束. 這個記錄的記錄型別域的值必須是01. EOF記錄外觀總是如下:  :00000001FF  其中:  00 是記錄當中資料位元組的數量.  0000 是資料被下載到儲存器當中的地址. 在檔案結束記錄當中地址是沒有意義被忽略的.0000h是典型的地址.  01   是記錄型別 01(檔案結束記錄)  FF   是這個記錄的校驗和,計算方法如下: 01h + NOT(00h + 00h + 00h + 01h).  1.4 Intel HEX檔案例子:  下面是一個完整的Intel HEX檔案的例子:  :10001300AC12AD13AE10AF1112002F8E0E8F0F2244  :10000300E50B250DF509E50A350CF5081200132259  :03000000020023D8  :0C002300787FE4F6D8FD7581130200031D  :10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016  :04003F00A42EFE22CB  :00000001FF    二、Mot格式介紹    Motorola S-records 16進位制檔案格式是嵌入式中除intel hex之外很常見的格式,下面是它的格式: +-------------------//------------------//-----------------------+  | type(hex1) | count(hex 1) | address | data | checksum(從count累加到checksum,總和為0xFF) |  +-------------------//------------------//-----------------------+  S0 :標識記錄,地址域長度為2個位元組,並用0000填充,資料區記錄了一些模組名稱和版本之類的資訊  S1 :資料記錄,地址域長度為2個位元組,資料區域為資料內容。  S2 :資料記錄,地址域長度為3個位元組,資料區域為資料內容。  S3 :資料記錄,地址域長度為4個位元組,資料區域為資料內容。  S5 :統計記錄,地址域長度為2個位元組,內容是之前資料記錄(S1,S2,S3)的個數,資料區域空。  S7 :執行記錄,地址域長度為4個位元組,內容是程式啟動的地址,資料域空。  S8 :執行記錄,地址域長度為3個位元組,內容是程式啟動的地址,資料域空。  S9 :執行記錄,地址域長度為2個位元組,內容是程式啟動的地址,資料域空。  下面是一個例子,大家看看:  S02B0000433A5C446F63756D656E747320616E642053657474696E67735C7A6F75642E4143434F554E54535C7D  S208010000FFFFFFFFFA  S30800020000000000F5  S5030002FA  S9030000FC  第一行:沒什麼,開個頭而已。  第二行:地址0x10000有4個0xFF  第三行:地址0x20000有3個0x00  第四行:標明之前有兩條資料記錄  第五行:程式從0x0000地址開始執行  關於checksum的演算法  checksum = 0xFF - (從count段開始所有位元組的總和)。  轉自:http://www.cnblogs.com/guoyiqi/archive/2013/06/12/3203859.html