對Intel HEX目標(biāo)文件規(guī)范做了翻譯。能力有限,僅供參考,翻譯不當(dāng)之處歡迎留言指正。
1、介紹
本文檔介紹了Intel 8位,16位和32位的微處理器使用的HEX文件格式。 該HEX格式文件可用于PROM編程器或硬件模擬器。
HEX文件格式是一種使用ASCII編碼表示二進(jìn)制文件的一種方式。使用ASCII編碼代替二進(jìn)制存儲,可以存儲在非二進(jìn)制存儲介質(zhì)上,如紙帶、打孔卡等;并且這個(gè)文件能夠顯示在CRT終端,行式打印機(jī)等。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ù)。
二進(jìn)制的十六進(jìn)制表示形式以ASCII字母數(shù)字字符編碼。例如,8-bit的二進(jìn)制數(shù)據(jù)0011-1111在16進(jìn)制中表示為3F。 要用ASCII編碼,一個(gè)8-bit包含字符’3’的ASCII碼(0011-0011或033H)和一個(gè)包含8位字節(jié)的8位字節(jié)字符“ F”(0100-0110或046H)的ASCII碼是必需的。 對于每個(gè)字節(jié)值,高階十六進(jìn)制數(shù)字始終是十六進(jìn)制數(shù)字對中的第一位。 此表示形式(ASCII十六進(jìn)制)需要的字節(jié)數(shù)是二進(jìn)制表示形式的兩倍。
HEX文件由記錄組成,每個(gè)記錄都包含記錄類型,長度,存儲器加載地址和數(shù)據(jù)的校驗(yàn)和。 當(dāng)前有6種不同類型的記錄格式被定義。但是,這些記錄的組合并不是都有意義的。 記錄類型如下:
數(shù)據(jù)記錄(Data Record)(8-,16-,32-bit格式)
文件結(jié)束記錄(End of File Record)(8-,16-,32-bit格式)
擴(kuò)展段地址記錄(Extended Segment Address Record)(16-,32-bit格式)
開始段地址記錄(Start Segment Address Record)(16-,32-bit格式)
擴(kuò)展線性地址記錄(Extended Linear Address Record)(32-bit格式)
開始線性地址記錄(Start Linear Address Record)(32-bit格式)
2、一般記錄格式
每個(gè)記錄都以一個(gè)包含03AH的RECORD MARK字段開始,ASCII表示為‘:’字符。
每個(gè)記錄都有一個(gè)RECLEN字段,用來表示指定信號或RECTYP字段后數(shù)據(jù)的字節(jié)數(shù)。注意,一個(gè)數(shù)據(jù)字節(jié)使用兩個(gè)ASCII字符表示。這個(gè)RECLEN字段能夠表示的最大值為FFH或255。
每個(gè)記錄都有一個(gè)LOAD OFFSET字段,用來描述數(shù)據(jù)字節(jié)16-bit起始地址的偏移量,因此這個(gè)字段只在數(shù)據(jù)記錄中使用。不使用該字段的其他記錄,應(yīng)該被編碼為4個(gè)ASCII零字段(‘0000’或030303030H)。
每個(gè)記錄有一個(gè)RECTYP字段,用來指定該記錄的記錄類型。這個(gè)RECTYP字段用來解釋記錄中的其他信息。當(dāng)前編碼的記錄類型有:
‘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
每個(gè)記錄都有一個(gè)有效長度字段INFO/DATA,它由0個(gè)或多個(gè)16進(jìn)制編碼的字節(jié)組成。這個(gè)字段的信息根據(jù)RECTYP字段解釋。
每個(gè)記錄都以CHKSUM字段結(jié)束,這個(gè)字段使用從RECLEN字段(包括RECLEN字段)到INFO/DATA最后一個(gè)字節(jié)的數(shù)據(jù)累加和補(bǔ)碼的ASCII字符的16進(jìn)制編碼表示。因此,從RECLEN字段(包括)到CHKSUM字段(包括)的ASCII編碼轉(zhuǎn)換為二進(jìn)制后,數(shù)據(jù)累加和為0。
3、擴(kuò)展線性地址記錄(32-bit format only)
32-bit擴(kuò)展線性地址記錄被用于指定線性基址(LBA)的16-31位,其中LBA的0-15位為0。LBA的16-31位被稱為上線性地址(ULBA)。后續(xù)數(shù)據(jù)記錄中的內(nèi)容字節(jié)的絕對存儲地址為LBA加上數(shù)據(jù)記錄中的LOAD OFFSET字段的偏移量及數(shù)據(jù)記錄中字節(jié)數(shù)據(jù)的索引(0,1,2,…n)。這個(gè)偏移計(jì)算是做模4G(即32bit),忽略任何進(jìn)位,從而實(shí)現(xiàn)偏移回繞加載(從0FFFFFFFFH到000000000H),這個(gè)4G從開始到結(jié)尾的偏移回繞范圍由LBA決定。加載特定字節(jié)的線性地址計(jì)算公式為:
(LBA + DRLO + DRI)MOD 4G
其中:
DRLO是數(shù)據(jù)記錄中的LOAD OFFSET字段。
DRI是數(shù)據(jù)記錄中數(shù)據(jù)字節(jié)的索引。
當(dāng)擴(kuò)展線性地址LBA被定義時(shí),它將會被應(yīng)用在32-bit HEX文件的任何地方。這個(gè)值將保持有效,直到遇到下個(gè)擴(kuò)展線性地址記錄。這個(gè)LBA默認(rèn)為0,直到遇到擴(kuò)展線性地址記錄。
這個(gè)記錄中各字段的內(nèi)容是:
RECORD MARK:
這個(gè)字段包含03AH,是ASCII編碼的字符‘:’的16進(jìn)制編碼。
RECLEN:
該字段包含03032H,ASCII字符“ 02”的十六進(jìn)制編碼,即該記錄內(nèi)ULBA數(shù)據(jù)信息的長度(以字節(jié)為單位)。
LOAD OFFSET:
此字段包含030303030H,ASCII字符“ 0000”的十六進(jìn)制編碼,此字段未用于該記錄。
RECTYP:
此字段包含03034H,ASCII字符“ 04”的十六進(jìn)制編碼,表明該記錄類型為擴(kuò)展線性地址記錄。
ULBA:
該字段包含四個(gè)ASCII十六進(jìn)制數(shù)字,它們指定高16位線性地址。 高位字節(jié)是記錄的第10個(gè)/第11個(gè)字符對。 低階字節(jié)是記錄的第12/13個(gè)字符對。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET,RECTYP和ULBA的數(shù)據(jù)校驗(yàn)和。
4、擴(kuò)展段地址記錄(16- or 32-bit formats)
16-bit擴(kuò)展段地址記錄用于指定段基地址的4-19位(SBA),其中SBA的0-3位為0。SBA的4-19位稱為上段基址(USBA)。后續(xù)數(shù)據(jù)記錄中內(nèi)容字節(jié)的絕對地址為SBA加上數(shù)據(jù)記錄中的LOAD OFFSET,及數(shù)據(jù)記錄中數(shù)據(jù)的索引(0,1,2,…n)。這個(gè)偏移計(jì)算做模64K(即16位),忽略進(jìn)位,從而實(shí)現(xiàn)偏移回繞加載(從0FFFFH到00000H),這個(gè)64K從開始到結(jié)尾的偏移回繞范圍由SBA決定。加載特定字節(jié)的地址計(jì)算公式為:
SBA + ([DRLO + DRI] MOD 64K)
其中:
DRLO為數(shù)據(jù)記錄中的LOAD OFFSET字段。
DRI為數(shù)據(jù)記錄中數(shù)據(jù)的索引。
當(dāng)擴(kuò)展段地址通過SBA被定義,它將會被應(yīng)用在16-bit HEX文件的任何地方。這個(gè)值將保持有效直到遇到下一個(gè)擴(kuò)展段地址記錄。這個(gè)段擴(kuò)展地址默認(rèn)為0,直到遇到擴(kuò)展段地址記錄。
這個(gè)記錄中個(gè)字段的內(nèi)容為:
RECORD MARK:
這個(gè)字段包含03AH,是ASCII編碼的字符‘:’的16進(jìn)制編碼。
RECLEN:
該字段包含03032H,ASCII字符“ 02”的十六進(jìn)制編碼,即該記錄內(nèi)ULBA數(shù)據(jù)信息的長度(以字節(jié)為單位)。
LOAD OFFSET:
此字段包含030303030H,ASCII字符“ 0000”的十六進(jìn)制編碼,此字段未用于該記錄。
RECTYP:
此字段包含03032H,ASCII字符“ 02”的十六進(jìn)制編碼,表明該記錄類型為擴(kuò)展段地址記錄。
USBA:
該字段包含四個(gè)ASCII十六進(jìn)制數(shù)字,它們指定高16位段基地址的值。 高位字節(jié)是記錄的第10個(gè)/第11個(gè)字符對。 低階字節(jié)是記錄的第12/13個(gè)字符對。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET,RECTYP和USBA的數(shù)據(jù)校驗(yàn)和。
5、數(shù)據(jù)記錄(8-, 16-, or 32-bit formats)
數(shù)據(jù)記錄使用16進(jìn)制數(shù)字的ASCII編碼表示數(shù)據(jù)內(nèi)容,組成存儲鏡像的一部分。計(jì)算數(shù)據(jù)內(nèi)容絕對地址(8-bit和32-bit線性,16-bit分段)的方法可以參考擴(kuò)展線性地址記錄和擴(kuò)展段地址記錄。
這個(gè)記錄中個(gè)字段的內(nèi)容為:
RECORD MARK:
這個(gè)字段包含03AH,是ASCII編碼的字符‘:’的16進(jìn)制編碼。
RECLEN:
這個(gè)字段包含兩個(gè)ASCII編碼的16進(jìn)制數(shù)字,說明數(shù)據(jù)字節(jié)在記錄中的長度。這個(gè)字段的最大值為‘FF’或04646H(十進(jìn)制255)。
LOAD OFFSET:
該字段包含四個(gè)ASCII編碼的16進(jìn)制數(shù)字,說明相對LBA(請參見擴(kuò)展線性地址記錄)或SBA(請參見擴(kuò)展段地址記錄)后放置數(shù)據(jù)第一個(gè)字節(jié)的地址。
RECTYP:
此字段包含03030H,ASCII字符“ 00”的十六進(jìn)制編碼,表明該記錄類型為數(shù)據(jù)記錄。
DATA:
該字段包含成對的ASCII編碼的16進(jìn)制數(shù)字,每個(gè)數(shù)據(jù)字節(jié)由一對ASCII字符標(biāo)表示。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET,RECTYP和DATA的數(shù)據(jù)校驗(yàn)和。
6、開始線性地址記錄(32-bit format only)
開始線性記錄用來記錄指定目標(biāo)文件的執(zhí)行起始地址。這個(gè)值是EIP寄存器中的32-bit的線性地址記錄。注意,這個(gè)記錄僅指定代碼地址在80386的32-bit線性地址空間中。如果代碼要在實(shí)數(shù)中開始執(zhí)行80386模式,則應(yīng)改用“起始段地址記錄”,因?yàn)樵撚涗浿付▽?shí)模式所需的CS和IP寄存器內(nèi)容。
起始線性地址記錄可以出現(xiàn)在32位十六進(jìn)制目標(biāo)文件中的任何位置。 如果在十六進(jìn)制目標(biāo)文件中不存在記錄的情況下,加載程序可以自由分配默認(rèn)的起始地址。
這個(gè)記錄中個(gè)字段的內(nèi)容為:
RECORD MARK:
這個(gè)字段包含03AH,是ASCII編碼的字符‘:’的16進(jìn)制編碼。
RECLEN:
該字段包含03034H,ASCII字符’04’的十六進(jìn)制編碼,表示記錄中EIP寄存器數(shù)據(jù)的長度。
LOAD OFFSET:
該字段包含030303030H,ASCII字符’0000’的十六進(jìn)制編碼,此字段未用于該記錄。
RECTYP:
該字段包含03035H,ASCII字符‘05’的十六進(jìn)制編碼,表明該記錄為開始線性地址記錄。
EIP:
此字段包含8個(gè)ASCII的十六進(jìn)制編碼,用于指定32位EIP寄存器的內(nèi)容。高位字節(jié)是第10 / 1l個(gè)字符對。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET,RECTYP和EIP的數(shù)據(jù)校驗(yàn)和。
7、開始段地址記錄(16- or 32-bit formats)
起始段地址記錄用于指定目標(biāo)文件的執(zhí)行起始地址。這個(gè)起始地址由是CS和IP寄存器的20位段地址給定。 注意,此記錄僅指定8086/80186的20位分段地址空間內(nèi)的代碼地址。
起始段地址記錄可以出現(xiàn)在16位十六進(jìn)制目標(biāo)文件中的任何位置。 如果在十六進(jìn)制目標(biāo)文件中不存在記錄的情況下,加載程序可以自由分配默認(rèn)的起始地址。
記錄中各個(gè)字段的內(nèi)容為:
RECORD MARK:
這個(gè)字段包含03AH,是ASCII編碼的字符‘:’的16進(jìn)制編碼。
RECLEN:
該字段包含03034H,ASCII字符’04’的十六進(jìn)制編碼,表示記錄中CS/IP寄存器數(shù)據(jù)的長度。
LOAD OFFSET:
該字段包含030303030H,ASCII字符’0000’的十六進(jìn)制編碼,此字段未用于該記錄。
RECTYP:
該字段包含03033H,ASCII字符‘03’的十六進(jìn)制編碼,表明該記錄為開始段地址記錄。
CS/IP:
該字段包含8個(gè)ASCII字符的十六進(jìn)制編碼,分別指定16位CS寄存器和16位IP寄存器內(nèi)容。 CS寄存器內(nèi)容的高位字節(jié)為記錄的第10 / ll個(gè)字符對,低位字節(jié)為記錄的第12/13個(gè)字符對。 IP寄存器內(nèi)容的高位字節(jié)為記錄的第14/15個(gè)字符對,低位字節(jié)為記錄的第16/17個(gè)字符對。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET,RECTYP和CS/IP的數(shù)據(jù)校驗(yàn)和。
8、文件結(jié)束記錄(8-, 16-, or 32-bit formats
該記錄表示HEX目標(biāo)文件的結(jié)束。
這個(gè)記錄中個(gè)字段的內(nèi)容為:
RECORD MARK:
這個(gè)字段包含03AH,是ASCII編碼的字符‘:’的16進(jìn)制編碼。
RECLEN:
該字段包含03030H,ASCII字符’00’的十六進(jìn)制編碼。因此該記錄并沒有包含內(nèi)容INFO/DATA數(shù)據(jù)字節(jié),這個(gè)長度為0。
LOAD OFFSET:
該字段包含030303030H,ASCII字符’0000’的十六進(jìn)制編碼,此字段未用于該記錄。
RECTYP:
該字段包含03031H,ASCII字符‘01’的十六進(jìn)制編碼,表明該記錄為文件結(jié)束記錄。
CHKSUM:
該字段包含RECLEN,LOAD OFFSET和RECTYP數(shù)據(jù)校驗(yàn)和。因?yàn)樗械淖侄问枪潭ǖ?,所以校?yàn)和也是固定的,校驗(yàn)和為04646H,即ASCII字符‘FF’的十六進(jìn)制編碼。
https://blog.csdn.net/ftswsfb/article/details/102617078