HEX文件格式详解
文章目录
- 介绍
- Record格式
- 数据Record
- 扩展线性地址Record
- 扩展段地址Record
- 起始线性地址Record
- 文件结尾Record
介绍
HEX文件是一个ASCLL文本文件,其中的每一行都包含一条HEX记录(record),这些记录由表示机器码或常量数据的十六进制数字组成。
Record格式
HEX文件由任意条的记录(record)组成,而每条记录由5个字段组成,并按下方格式排列:
:llaaaatt[dd...]cc
:
是起始字段,代表每条record的开始ll
是长度字段,代表数据字段[dd...]
中数据的长度aaaa
是地址字段,代表后方数据域中数据的存放地址,一般是偏移地址tt
是类型字段,代表record的类型,可能是下方中的一种- 00 - 数据record
- 01 - 文件结尾record
- 02 - 扩展段地址record(extended segment address record)
- 04 - 扩展线性地址record(extended linear address record)
- 05 - 起始线性地址record(start linear address record)
[dd...]
是数据字段,一个dd
的长度为1个字节,一条record中包含0个或多个dd,具体长度由ll
长度字段指定cc
是校验字段,计算方式为除去record中的:
和cc
的所有字节相加的结果对256取模得到sum,然后将sum按位取反再加1后得到cc,即cc
是sum的补码,这样验证一条record是否正确时,只需要检查record中除:
所以字节相加的结果是否为0即可
数据Record
:10246200464C5549442050524F46494C4500464C33
对应格式如下:
扩展线性地址Record
Extended linear address record
也被叫做32-bit address record
, record中包含32bits地址的高16位,如下所示:
:02000004FFFFFC
其中:
- 02代表数据的长度
- 0000是地址字段,对于扩展线性地址Record来说,这个字段总是0000
- 04代表类型
- FFFF是32bits地址的高16位
- FC是校验码,NOT((0x02+0x00+0x00+0x04+0xFF+0xFF) mod 256) + 1 = 0xFC
当读取扩展线性地址Record时,存储在数据字段中的扩展线性地址
被保存,并应用于从HEX文件中读取的后续Record,扩展线性地址在被另一个扩展线性地址Record更改之前保持有效。
数据Record
的绝对内存地址是通过将记录中的地址字段(低16bits)添加到扩展线性地址Record
数据字段(高16bits)中来获得的,下面的例子说明了这个过程:
数据Record的地址字段 2462
扩展线性地址Record的数据字段 FFFF
--------
数据Record中数据存放的绝对地址 FFFF2462
扩展段地址Record
用法与扩展线性地址Record一致,只不过是偏移位置不一样,例如:
:020000021200EA
计算绝对地址:
Address from the data record's address field 2462
Extended segment address record data field 1200
--------
Absolute memory address 00014462
起始线性地址Record
在GCC编译器中,这条Record的数据用于指定Reset_Handler
的地址,而在MDK编译器中,用于指定__main
的地址,这条Record在用于使用HEX下载Flash时用处不大,例如:
:04000005000000CD2A
分析可知,地址0x000000CD为程序中Reset_Handler
或__main
的地址
文件结尾Record
:00000001FF
用于HEX文件的结束,固定就是这一行