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
完結。