天天看点

Intel Hex格式说明

1.什么是Intel Hex文件

Intel HEX文件时遵循Intel HEX文件格式的ASCII文本文件。在Intel HEX文件的每一行都包含了 一个HEX记录。这些记录是由一些代表机器语言代码和常量的16进制数据组成的。Intel HEX文件常用来传输要存储在ROM 或者 EPROM中的程序和数据。大部分的EPROM编程器能使用Intel HEX文件。

2.Intel HEX文件组成

Intel HEX由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列:

Intel Hex格式说明

Start Code 每个Intel HEX记录都由冒号开头。

Byte count 是数据长度域,它代表记录当中数据字节的数量。

Address 是地址域,它代表记录当中数据的起始地址。

Record type是代表HEX记录类型的域,它可能是以下数据当中的一个:

00-数据记录

01-文件结束记录

02-扩展段地址记录

03-开始段地址记录

04-扩展线性地址记录

05-开始线性地址记录

3.内容分析

(00)数据记录

Intel HEX文件由若干个数据记录组成,一个数据记录以一个回车和一个换行结束<回车为0x0d换行为0x0a>。

比如下面的一条数据记录

:10246200464C5549442050524F46494C4500464C3

10      是此行记录数据的字节数目

2462     是数据在内存<将要烧写的eprom地址>中的起始地址

00      是记录类型00(是一个数据记录)

46到4C    是数据

33      是此行记录的效验和

(01)文件结束记录(EOF)

一个Intel HEX文件必须有一个文件结束记录,这个记录的类型域必须是01,

一个EOF记录总是这样:

:00000001FF

00     是记录中数据字节的数目

0000    这个地址对于EOF记录来说无任何意义

01     记录类型是01(文件结束记录标示)

FF     是效验和计算如下

01h + NOT(00h + 00h + 00h + 01h).

(02)扩展段地址记录 (HEX86)

扩展段地址记录也被称为 HEX86记录, 包含 4-19位的数据地址段,这个扩展段地址记录总是有两字节数据,如下:

:020000021200EA

02       是记录中的数据字节数目

0000      是地址域(在扩展段地址记录中,这个域总是0000)

02       是记录类型02(扩展段地址的标示)

1200      是该段的地址

EA       是效验和计算如下:

01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).

当扩展段地址记录被读后,扩展段地址将被存储并应用到以后从Intel HEX文件读出的记录,这个段地址一直有效直到读到下一个扩展段地址记录

绝对内存地址 = 数据记录中的地址 + 移位后的扩展段地址(这个需要左移8位)

下面举例说明这个过程:

从数据记录的地址域得到地址 :     2 4 6 2

从扩展段地址记录的地址域得到地址:  1 2 0 0

绝对内存地址:             0 0 0 1 4 4 6 2

(03)开始段地址记录

对于80x86处理器,他指定CS:IP寄存器的初始内容,地址域为0000,数据数目为04,前2个位CS值,后面两个为IP值。

(04)扩展线性地址记录(HEX386)

扩展线性地址记录也可称为 32位地址记录 和 HEX386记录,这个纪录包含高16(16-31位)位数据地址,这种扩展的线性记录总是有两个字节数据,像下面这样:

:02000004FFFFFC

02      是记录的数据字节数目

0000     是地址域(在扩展地址记录中总是0000)

04      是记录类型04(扩展地址记录)

FFFF     是高16位地址

FC      是记录效验和,计算方法如下:

01h + NOT(02h + 00h + 00h + 04h + FFh + FFh)

当一个扩展线性地址记录被读到后,扩展线性地址记录的数据区域将被保存并应用到后面从Intel HEX文件中读出的记录,这个扩展线性记录一直有效,直到读到下一个扩展线性记录.

绝对内存地址 = 数据记录中的地址 + 移位后的扩展线性地址(这个需要左移16位)

示例如下:

从数据记录的地址域得到地址:       2462

从扩展线性地址记录的地址域得到地址:   FFFF

则绝对内存地址为:            FFFF2462

(05)开始线性地址记录

地址域为0000,数据个数为04,4位数据描述的是装载进80386或者更高cpu EIP寄存器的32bit值。

完整的hex文件一般有头行,数据行,结束行。

举个例子如下:

:020000042A00D0

:10000000D1DC4B843410D7730D000000FFFFFFFFDD

:10001000FFFFFFFF500000005000002AD8CB000077

:040000052A000000CD

:00000001FF

第一行(头行):

1) 02代表数据域长度为0x02,即2A 00两个字节都为数据域

2) 0000代表地址,对于扩展线性地址而言,这个值一直为0000

3) 04代表扩展线性地址

4) 2A 00代表基址值为0x2A 00

5) D0代表校验值

当扩展线性地址被读取时,扩展线性地址值将会被保存,并且作用于后面从intel hex文件读取的子记录,同时扩展线性地址将一直发挥作用直到下一次扩展性线性地址读取。

第二行(数据行):

1) 10代表数据域长度为0x10,即D1 DC 4B 84 34 10 D7 73 0D 00 00 00 FF FF FF FF 16个字节都为数据域

2) 0000代表地址偏移为0000

3) 00代表数据域

4) D1 DC 4B 84 34 10 D7 73 0D 00 00 00 FF FF FF FF 代表数据值

5) 77代表校验值

绝对地址记录是扩展线性基址加上地址偏移所决定的,这第二行的数据绝对地址计算如下:

0000 地址偏移

2A00 扩展线性地址

-------------------

2A00 0000 绝对地址

倒数第二行(最后的数据行):

1) 04代表数据域长度为0x04,即2A 00 00 00 4个字节都为数据域

2) 0000代表地址偏移为0000

3) 05代表开始线性地址并且后面才是真正数据记录。而真正的数据记录个人理解为后面读取的mbn数据。

4) 2A 00 00 00 代表真正数据记录的基址

5) CD代表校验值

最后行(结束行):

1) 00代表数据域长度为0

2) 0000代表地址将放入到内存的位置

3) 01代表文件结束

4) FF校验值(01h + NOT(00h + 00h + 00h +01h))