Intel HEX文件格式分析

最近工作中遇到了几块芯片数据需要分析,由于原芯片文件为HEX文件,这是一个无头绪的工作,没有数据含义的资料,需要这些数据按地址解码后重组,然后面对的将是无数次未知的猜测、组合。于是在查阅了大量的HEX文件的资料,现将Hex文件的格式整理如下:

Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。

:llaaaatt[dd...]cc 如下图所示

<0x3a>

ll

[数据长度1Byte]

aaaa

[数据地址2Byte]

tt

[数据类型1Byte]

[dd...]

[数据nByte]

cc

[校验1Byte]

回车

<0x0d>

换行

<0x0a>

例如::1000000018F09FE518F09FE518F09FE518F09FE5C0按照上面的数据行格式分析如下:

<0x3a>

 

[数据长度1Byte]

10

[数据地址2Byte]

00 00

[数据类型1Byte]

00

[数据nByte]

18F09FE518F09FE518F09FE518F09FE5

[校验1Byte]

C0

<0x0d>

 

<0x0a>

 


每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每行中的数据并不是一定有的,第二个字节数据长度为0,那么这行就没有数据。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:
:
每个Intel HEX记录都由冒号(0x3a)开头。

回车换行符0x0d, 0x0aIntel HEX记录为结束。每行开始和结束之间的所有内容,都是以字符形式表现的。
ll
是数据长度域,它代表记录当中数据字节(dd)的数量.
aaaa
是地址域,它代表记录当中数据的起始地址,地址都是先显示高位,后显示                                                                                       低位
.
tt
是代表HEX记录类型的域,它可能是以下数据当中的一个
:
00 –
数据记录

01 –
文件结束记录
02 –
扩展段地址记录
04 –
扩展线性地址记录
dd
是数据域,它代表一个字节的数据.一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符.
cc
是校验和域,它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,256为模进行以下补足
.

数据记录

Intel HEX
文件由任意数量以回车换行符结束的数据记录组成.数据记录外观如下:
:10246200464C5549442050524F46494C4500464C33
其中
:
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

校验和的算法:计算从0x3A以后(不包括0x3A)的所有各字节的和是取记录中从数据字节计数域(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文件的例子
:
:10001300AC12AD13AE10AF1112002F8E0E8F0F2244
:10000300E50B250DF509E50A350CF5081200132259
:03000000020023D8
:0C002300787FE4F6D8FD7581130200031D
:10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016
:04003F00A42EFE22CB
:00000001FF

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章