文章分享

開放、平等、協(xié)作、快速、分享

當前位置:首頁>文章分享

Intel HEX文件格式規(guī)范

摘錄:HCTech 無錫和控電子   時間:2021-03-18   訪問量:3729

對Intel HEX目標文件規(guī)范做了翻譯。能力有限,僅供參考,翻譯不當之處歡迎留言指正。

1、介紹

本文檔介紹了Intel 8位,16位和32位的微處理器使用的HEX文件格式。 該HEX格式文件可用于PROM編程器或硬件模擬器。

HEX文件格式是一種使用ASCII編碼表示二進制文件的一種方式。使用ASCII編碼代替二進制存儲,可以存儲在非二進制存儲介質上,如紙帶、打孔卡等;并且這個文件能夠顯示在CRT終端,行式打印機等。8-bit的HEX格式文件可以使用16-bit的線性地址空間存放Intel 8-bit處理器的代碼數(shù)據(jù)。16-bit的HEX格式文件可以使用20-bit的段地址空間存放Intel16-bit處理器的代碼數(shù)據(jù)。32-bit HEX格式文件允許使用32-bit的線性地址空間存放Intel 32-bit處理器的代碼數(shù)據(jù)。

二進制的十六進制表示形式以ASCII字母數(shù)字字符編碼。例如,8-bit的二進制數(shù)據(jù)0011-1111在16進制中表示為3F。 要用ASCII編碼,一個8-bit包含字符’3’的ASCII碼(0011-0011或033H)和一個包含8位字節(jié)的8位字節(jié)字符“ F”(0100-0110或046H)的ASCII碼是必需的。 對于每個字節(jié)值,高階十六進制數(shù)字始終是十六進制數(shù)字對中的第一位。 此表示形式(ASCII十六進制)需要的字節(jié)數(shù)是二進制表示形式的兩倍。

HEX文件由記錄組成,每個記錄都包含記錄類型,長度,存儲器加載地址和數(shù)據(jù)的校驗和。 當前有6種不同類型的記錄格式被定義。但是,這些記錄的組合并不是都有意義的。 記錄類型如下:

2、一般記錄格式

image.png

每個記錄都以一個包含03AH的RECORD MARK字段開始,ASCII表示為‘:’字符。

每個記錄都有一個RECLEN字段,用來表示指定信號或RECTYP字段后數(shù)據(jù)的字節(jié)數(shù)。注意,一個數(shù)據(jù)字節(jié)使用兩個ASCII字符表示。這個RECLEN字段能夠表示的最大值為FFH或255。

每個記錄都有一個LOAD OFFSET字段,用來描述數(shù)據(jù)字節(jié)16-bit起始地址的偏移量,因此這個字段只在數(shù)據(jù)記錄中使用。不使用該字段的其他記錄,應該被編碼為4個ASCII零字段(‘0000’或030303030H)。

每個記錄有一個RECTYP字段,用來指定該記錄的記錄類型。這個RECTYP字段用來解釋記錄中的其他信息。當前編碼的記錄類型有:

每個記錄都有一個有效長度字段INFO/DATA,它由0個或多個16進制編碼的字節(jié)組成。這個字段的信息根據(jù)RECTYP字段解釋。

每個記錄都以CHKSUM字段結束,這個字段使用從RECLEN字段(包括RECLEN字段)到INFO/DATA最后一個字節(jié)的數(shù)據(jù)累加和補碼的ASCII字符的16進制編碼表示。因此,從RECLEN字段(包括)到CHKSUM字段(包括)的ASCII編碼轉換為二進制后,數(shù)據(jù)累加和為0。

3、擴展線性地址記錄(32-bit format only)

image.png

32-bit擴展線性地址記錄被用于指定線性基址(LBA)的16-31位,其中LBA的0-15位為0。LBA的16-31位被稱為上線性地址(ULBA)。后續(xù)數(shù)據(jù)記錄中的內容字節(jié)的絕對存儲地址為LBA加上數(shù)據(jù)記錄中的LOAD OFFSET字段的偏移量及數(shù)據(jù)記錄中字節(jié)數(shù)據(jù)的索引(0,1,2,…n)。這個偏移計算是做模4G(即32bit),忽略任何進位,從而實現(xiàn)偏移回繞加載(從0FFFFFFFFH到000000000H),這個4G從開始到結尾的偏移回繞范圍由LBA決定。加載特定字節(jié)的線性地址計算公式為:
(LBA + DRLO + DRI)MOD 4G
其中:
DRLO是數(shù)據(jù)記錄中的LOAD OFFSET字段。
DRI是數(shù)據(jù)記錄中數(shù)據(jù)字節(jié)的索引。

當擴展線性地址LBA被定義時,它將會被應用在32-bit HEX文件的任何地方。這個值將保持有效,直到遇到下個擴展線性地址記錄。這個LBA默認為0,直到遇到擴展線性地址記錄。

這個記錄中各字段的內容是:
RECORD MARK:
這個字段包含03AH,是ASCII編碼的字符‘:’的16進制編碼。
RECLEN:
該字段包含03032H,ASCII字符“ 02”的十六進制編碼,即該記錄內ULBA數(shù)據(jù)信息的長度(以字節(jié)為單位)。
LOAD OFFSET:
此字段包含030303030H,ASCII字符“ 0000”的十六進制編碼,此字段未用于該記錄。
RECTYP:
此字段包含03034H,ASCII字符“ 04”的十六進制編碼,表明該記錄類型為擴展線性地址記錄。
ULBA:
該字段包含四個ASCII十六進制數(shù)字,它們指定高16位線性地址。 高位字節(jié)是記錄的第10個/第11個字符對。 低階字節(jié)是記錄的第12/13個字符對。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET,RECTYP和ULBA的數(shù)據(jù)校驗和。

4、擴展段地址記錄(16- or 32-bit formats)

image.png

16-bit擴展段地址記錄用于指定段基地址的4-19位(SBA),其中SBA的0-3位為0。SBA的4-19位稱為上段基址(USBA)。后續(xù)數(shù)據(jù)記錄中內容字節(jié)的絕對地址為SBA加上數(shù)據(jù)記錄中的LOAD OFFSET,及數(shù)據(jù)記錄中數(shù)據(jù)的索引(0,1,2,…n)。這個偏移計算做模64K(即16位),忽略進位,從而實現(xiàn)偏移回繞加載(從0FFFFH到00000H),這個64K從開始到結尾的偏移回繞范圍由SBA決定。加載特定字節(jié)的地址計算公式為:
SBA + ([DRLO + DRI] MOD 64K)
其中:
DRLO為數(shù)據(jù)記錄中的LOAD OFFSET字段。
DRI為數(shù)據(jù)記錄中數(shù)據(jù)的索引。
當擴展段地址通過SBA被定義,它將會被應用在16-bit HEX文件的任何地方。這個值將保持有效直到遇到下一個擴展段地址記錄。這個段擴展地址默認為0,直到遇到擴展段地址記錄。

這個記錄中個字段的內容為:
RECORD MARK:
這個字段包含03AH,是ASCII編碼的字符‘:’的16進制編碼。
RECLEN:
該字段包含03032H,ASCII字符“ 02”的十六進制編碼,即該記錄內ULBA數(shù)據(jù)信息的長度(以字節(jié)為單位)。
LOAD OFFSET:
此字段包含030303030H,ASCII字符“ 0000”的十六進制編碼,此字段未用于該記錄。
RECTYP:
此字段包含03032H,ASCII字符“ 02”的十六進制編碼,表明該記錄類型為擴展段地址記錄。
USBA:
該字段包含四個ASCII十六進制數(shù)字,它們指定高16位段基地址的值。 高位字節(jié)是記錄的第10個/第11個字符對。 低階字節(jié)是記錄的第12/13個字符對。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET,RECTYP和USBA的數(shù)據(jù)校驗和。

5、數(shù)據(jù)記錄(8-, 16-, or 32-bit formats)

image.png

數(shù)據(jù)記錄使用16進制數(shù)字的ASCII編碼表示數(shù)據(jù)內容,組成存儲鏡像的一部分。計算數(shù)據(jù)內容絕對地址(8-bit和32-bit線性,16-bit分段)的方法可以參考擴展線性地址記錄和擴展段地址記錄。

這個記錄中個字段的內容為:
RECORD MARK:
這個字段包含03AH,是ASCII編碼的字符‘:’的16進制編碼。
RECLEN:
這個字段包含兩個ASCII編碼的16進制數(shù)字,說明數(shù)據(jù)字節(jié)在記錄中的長度。這個字段的最大值為‘FF’或04646H(十進制255)。
LOAD OFFSET:
該字段包含四個ASCII編碼的16進制數(shù)字,說明相對LBA(請參見擴展線性地址記錄)或SBA(請參見擴展段地址記錄)后放置數(shù)據(jù)第一個字節(jié)的地址。
RECTYP:
此字段包含03030H,ASCII字符“ 00”的十六進制編碼,表明該記錄類型為數(shù)據(jù)記錄。
DATA:
該字段包含成對的ASCII編碼的16進制數(shù)字,每個數(shù)據(jù)字節(jié)由一對ASCII字符標表示。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET,RECTYP和DATA的數(shù)據(jù)校驗和。

6、開始線性地址記錄(32-bit format only)

image.png

開始線性記錄用來記錄指定目標文件的執(zhí)行起始地址。這個值是EIP寄存器中的32-bit的線性地址記錄。注意,這個記錄僅指定代碼地址在80386的32-bit線性地址空間中。如果代碼要在實數(shù)中開始執(zhí)行80386模式,則應改用“起始段地址記錄”,因為該記錄指定實模式所需的CS和IP寄存器內容。

起始線性地址記錄可以出現(xiàn)在32位十六進制目標文件中的任何位置。 如果在十六進制目標文件中不存在記錄的情況下,加載程序可以自由分配默認的起始地址。

這個記錄中個字段的內容為:
RECORD MARK:
這個字段包含03AH,是ASCII編碼的字符‘:’的16進制編碼。
RECLEN:
該字段包含03034H,ASCII字符’04’的十六進制編碼,表示記錄中EIP寄存器數(shù)據(jù)的長度。
LOAD OFFSET:
該字段包含030303030H,ASCII字符’0000’的十六進制編碼,此字段未用于該記錄。
RECTYP:
該字段包含03035H,ASCII字符‘05’的十六進制編碼,表明該記錄為開始線性地址記錄。
EIP:
此字段包含8個ASCII的十六進制編碼,用于指定32位EIP寄存器的內容。高位字節(jié)是第10 / 1l個字符對。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET,RECTYP和EIP的數(shù)據(jù)校驗和。

7、開始段地址記錄(16- or 32-bit formats)

image.png

起始段地址記錄用于指定目標文件的執(zhí)行起始地址。這個起始地址由是CS和IP寄存器的20位段地址給定。 注意,此記錄僅指定8086/80186的20位分段地址空間內的代碼地址。

起始段地址記錄可以出現(xiàn)在16位十六進制目標文件中的任何位置。 如果在十六進制目標文件中不存在記錄的情況下,加載程序可以自由分配默認的起始地址。

記錄中各個字段的內容為:
RECORD MARK:
這個字段包含03AH,是ASCII編碼的字符‘:’的16進制編碼。
RECLEN:
該字段包含03034H,ASCII字符’04’的十六進制編碼,表示記錄中CS/IP寄存器數(shù)據(jù)的長度。
LOAD OFFSET:
該字段包含030303030H,ASCII字符’0000’的十六進制編碼,此字段未用于該記錄。
RECTYP:
該字段包含03033H,ASCII字符‘03’的十六進制編碼,表明該記錄為開始段地址記錄。
CS/IP:
該字段包含8個ASCII字符的十六進制編碼,分別指定16位CS寄存器和16位IP寄存器內容。 CS寄存器內容的高位字節(jié)為記錄的第10 / ll個字符對,低位字節(jié)為記錄的第12/13個字符對。 IP寄存器內容的高位字節(jié)為記錄的第14/15個字符對,低位字節(jié)為記錄的第16/17個字符對。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET,RECTYP和CS/IP的數(shù)據(jù)校驗和。

8、文件結束記錄(8-, 16-, or 32-bit formats

image.png

該記錄表示HEX目標文件的結束。

這個記錄中個字段的內容為:
RECORD MARK:
這個字段包含03AH,是ASCII編碼的字符‘:’的16進制編碼。
RECLEN:
該字段包含03030H,ASCII字符’00’的十六進制編碼。因此該記錄并沒有包含內容INFO/DATA數(shù)據(jù)字節(jié),這個長度為0。
LOAD OFFSET:
該字段包含030303030H,ASCII字符’0000’的十六進制編碼,此字段未用于該記錄。
RECTYP:
該字段包含03031H,ASCII字符‘01’的十六進制編碼,表明該記錄為文件結束記錄。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET和RECTYP數(shù)據(jù)校驗和。因為所有的字段是固定的,所以校驗和也是固定的,校驗和為04646H,即ASCII字符‘FF’的十六進制編碼。

https://blog.csdn.net/ftswsfb/article/details/102617078


上一篇:如何評價 Adele?

下一篇:兩種微型水泵介紹——微型電磁泵和微型隔膜泵

在線咨詢

點擊這里給我發(fā)消息 售前咨詢專員

點擊這里給我發(fā)消息 售后服務專員

在線咨詢

免費通話

24小時免費咨詢

請輸入您的聯(lián)系電話,座機請加區(qū)號

免費通話

微信掃一掃

微信聯(lián)系
返回頂部