|
最近工作中遇到了几块芯片数据需要分析,由于原芯片文件为HEX文件,这是一个无头绪的工作,没有数据含义的资料,需要这些数据按地址解码后重组,然后面对的将是无数次未知的猜测、组合。于是在查阅了大量的HEX文件的资料,现将Hex文件的格式整理如下:
Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。
:llaaaatt[dd...]cc 如下图所示:
| :
| <0x
3a
>
| | ll
| [数据长度1Byte]
| | aaaa
| [数据地址2Byte]
| | tt
| [数据类型1Byte]
| | [dd...]
| [数据nByte]
| | cc
| [校验1Byte]
| | 回车
| <0x0d>
| | 换行
| <0x
0a
>
|
例如::
1000000018F
09FE
518F
09FE
518F
09FE
518F
09FE
5C
0按照上面的数据行格式分析如下:
| <0x
3a
>
|
| | [数据长度1Byte]
| 10
| | [数据地址2Byte]
| 00 00
| | [数据类型1Byte]
| 00
| | [数据nByte]
|
18F
09FE
518F
09FE
518F
09FE
518F
09FE5
| | [校验1Byte]
| C0
| | <0x0d>
|
| | <0x
0a
>
|
|
每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每行中的数据并不是一定有的,第二个字节数据长度为0,那么这行就没有数据。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样: : 每个Intel HEX记录都由冒号(0x
3a
)开头。
回车换行符0x0d, 0x
0a
每行Intel HEX记录为结束。每行开始和结束之间的所有内容,都是以字符形式表现的。 ll 是数据长度域,它代表记录当中数据字节(dd)的数量. aaaa 是地址域,它代表记录当中数据的起始地址,地址都是先显示高位,后显示 低位. tt 是代表HEX记录类型的域,它可能是以下数据当中的一个: 00 – 数据记录 01 – 文件结束记录 02 – 扩展段地址记录 04 – 扩展线性地址记录 dd 是数据域,它代表一个字节的数据.一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符. cc 是校验和域,它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足.
数据记录 Intel HEX文件由任意数量以回车换行符结束的数据记录组成.数据记录外观如下: :
10246200464C
5549442050524F
46494C
4500464C
33 其中: 10 是这个记录当中数据字节的数量. 2462 是数据将被下载到存储器当中的地址. 00 是记录类型(数据记录)
464C
…
464C
是数据. 33 是这个记录的校验和.
扩展线性地址记录(HEX386) 扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录包含数据地址的高16位.扩展线性地址记录总是有两个数据字节,外观如下: :02000004FFFFFC 其中: 02 是这个记录当中数据字节的数量. 0000 是地址域,对于扩展线性地址记录,这个域总是0000. 04 是记录类型 04(扩展线性地址记录) FFFF 是地址的高16位. FC 是这个记录的校验和,计算方法如下: 01h + NOT(02h + 00h + 00h + 04h + FFh + FFh). 当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.线性地址保持有效,直到它被另外一个扩展地址记录所改变. 通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址. 以下的例子演示了这个过程.. 来自数据记录地址域的地址 2462 扩展线性地址记录的数据域 + FFFF ------------ 绝对存储器地址 FFFF2462
扩展段地址记录(HEX86) 扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段.扩展段地址记录总是有两个数据字节,外观如下: :020000021200EA 其中: 02 是记录当中数据字节的数量. 0000 是地址域.对于扩展段地址记录,这个域总是0000. 02 是记录类型 02(扩展段地址记录) 1200 是地址段. EA 是这个记录的校验和,计算方法如下: 01h + NOT(02h + 00h + 00h + 02h + 12h + 00h). 当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.段地址保持有效,直到它被另外一个扩展地址记录所改变. 通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址. 以下的例子演示了这个过程.. 来自数据记录地址域的地址 2462 扩展段地址记录数据域 + 1200 --------- 绝对存储器地址 00014462
校验和的算法:计算从0x
3A
以后(不包括0x
3A
)的所有各字节的和是取记录中从数据字节计数域(ll)到数据域(...)最后一个字节的所有字节总和的2的补码。
文件结束(EOF)记录 Intel HEX文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下: :00000001FF 其中: 00 是记录当中数据字节的数量. 0000 是数据被下载到存储器当中的地址.在文件结束记录当中地址是没有意义被忽略的.0000h是典型的地址. 01 是记录类型 01(文件结束记录) FF 是这个记录的校验和,计算方法如下: 01h + NOT(00h + 00h + 00h + 01h).
Intel HEX文件例子: 下面是一个完整的Intel HEX文件的例子: :
10001300AC
12AD13AE10AF
1112002F
8E0E
8F
0F
2244 :10000300E50B250DF509E
50A
350CF5081200132259 :03000000020023D8 :
0C
002300787FE
4F
6D8FD7581130200031D :
10002F
00EFF88DF
0A
4FFEDC
5F
0CEA42EFEEC
88F
016 :
04003F
00A
42EFE22CB :00000001FF
|