HEX文件解析

0034.jpg


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:校验和


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://evelee.net/blog/?id=27