HEX是一种常见的烧录文件格式,整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)。行格式如下表 ( 两个字符代表一个字节 ):
起始码 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5~n | 字节 (n+1) |
: | 本行数据长度 | 起始地址高位 | 起始地址低位 | 数据类型 | 数据 | 校验码 |
起始码: 起始码恒为一个冒号
字节1:表示本行数据的长度
字节2、3:表示本行数据的起始地址
字节4:表示数据类型,数据类型有0x00、0x01、0x02、0x03、0x04、0x05
0x00 Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
0x01 End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
0x02 Extended Segment Address Record: 用来标识扩展段地址的记录,扩展段地址记录(HEX86),它包含4~19位数据地址段。由于普通的Intel的HEX记录文件只能记录64K的地址范围,所以大于64K的地址数据要靠扩展段地址记录。
0x03 Start Segment Address Record:开始段地址记录
0x04 Extended Linear Address Record: 用来标识扩展线性地址的记录,扩展线性地址记录也叫32位地址记录或者HEX386记录,这些记录包含了数据在存储器里真实地址的高16位。 当一个扩展线性地址记录被读取后,将一直保持有效,直到它被另一个扩展地址记录改变。因为它记录的是后面数据在存储器里存放的真实起始地址,所以它的起始地址偏移量(Load offset)总是0000。
0x05 Start Linear Address Record:开始线性地址记录,32位机(80386或更高的CPU)的EIP寄存器里存放的地址(main函数的入口地址)
字节5~n:数据
字节n+1:一个字节,先将此字节前所有字节相加得到sum,校验和=(0x100-sum & 0xFF) & 0xFF
下面是一个hex文件的“完整代码”(中间省略了N行),以此为例做详细解释。
:020000040800F2 :10000000080700208D0100081D3300081F33000879 :1000100023330008273300082B33000800000000BA :100020000000000000000000000000002F33000866 :100030003133000800000000333300083533000876 //此处省略N行 :1038100000000000000000000000000000000000A8 :103820000000000000000000000000000000000098 :103830000000000000A24A04000000000000000098 :08384000010203040607080958 :04000005080000ED02 :00000001FF
第一行 :020000040800F2
02:本行有两个字节的数据
0000:本行数据的起始地址偏移量是0x0000
04:数据类型,标识扩展线性地址的记录
0800:本行的两个数据,分别是0x08和0x00。后面的数据记录都以这个地址为基地址 0x0800<<16=x0800 0000。
F2:校验和=0x100-(0x02+0x00+0x00+0x04+0x08+0x00) & 0xFF=0xF2
第二行 :10000000080700208D0100081D3300081F33000879
10:本行有16个字节的数据
0000:本行数据的起始地址偏移量是0x0000,所以这条记录的16个字节的数据的起始地址为 0x0800 0000 + 0x0000 =0x0800 0000
00:数据类型是数据
080700208D0100081D3300081F330008:数据
79:校验和
第三行 :1000100023330008273300082B33000800000000BA
10:本行有16个字节的数据
0010:本行数据的起始地址偏移量是0x0010,所以这条记录的16个字节的数据的起始地址为 0x0800 0000 + 0x0010 =0x0800 0010
00:数据类型是数据
23330008273300082B33000800000000:数据
BA:校验和
第十一行 :04000005080000ED02
04:本行有4个字节的数据
0000:本行数据的起始地址偏移量固定是0x0000
05:开始线性地址记录
080000ED:数据,即main函数的入口地址
02:校验和
第十二行 :00000001FF
00:本行有0个字节的数据
0000:本行数据的起始地址偏移量固定是0x0000
01:标识文件的结束
FF:校验和