Intel HEX 文件

本文是对维基百科英文条目 Intel HEX 翻译整理而成。

Intel HEX 文件是一种使用 ASCII 文本形式表述二进制信息的一种文件格式,通常用于对微控制器、EEPROM 及其它类型的可编程逻辑器件的编程时使用。在一个典型的应用中,编译器或汇编程序将源代码(如 C 语言或汇编语言)转换成机器码并输出 HEX 文件,烧录器再使用此 HEX 文件将机器码「烧录」到 ROM 中,或传送到目标系统中用于加载和执行。

格式

Intel HEX 文件由 ASCII 文本行组成,各行之间由换行符(line feed,LF)和/或回车符(carriage return,CR)分隔。每个文本行包含十六进制字符,其对应的二进制数值依其在行中的位置、类型及行的长度,可能表示数据、内存地址或其它数值。每个文本行称为一条「记录(record)」。

记录结构

一条记录按从左到右的顺序包含以下 6 个字段:

  • 起始符:1 个字符,即 ASCII 冒号「:」。
  • 字节数:2 个十六进制数,表示下述的「数据」字段的字节数。字节数最大值是 255(0xFF),但广泛使用的是 16(0x10)或 32(0x20)。
  • 地址:4 个十六进制数,表示下述的「数据」字段的起始内存偏移地址(16bit)。数据的物理地址通过将此偏移地址加上之前指定的基地址得到,因此可寻址的内存空间可超过 16 位地址所表示的 64KB。基地址(默认为 0)可通过不同类型的记录指定(见下文)。基地址和地址偏移总是以大端形式(big endian)表示。
  • 记录类型:2 个十六进制数,取值范围 0x00 到 0x05,定义了下述的「数据」字段的含义。
  • 数据:n 字节的数据序列,包含 2n 个十六进制数。有些记录没有数据字段(n 等于 0)。数据字段的含义及解析由应用程序确定。
  • 校验和:2 个十六进制数,用于确保记录没有错误。

图例

为了便于阅读,本文中 Intel HEX 记录的字段以如下颜色表示:

  起始符   字节数   地址   记录类型   数据   校验和

校验和的计算

一条记录的校验和字段,是校验和之前(起始符之后)的所有字节的数值之和取最低有效字节(LSB)做「2 的补码」运算得到。「2 的补码」运算就是将 LSB 按位取反再加 1。

例如,一条记录为 :0300300002337A1E,起始符之后、校验和之前的所有字节的数值之和是 03 + 00 + 30 + 00 + 02 + 33 + 7A = E2,而对 E2 做「2 的补码」运算的结果是 1E,正是此条记录最后的校验和字段。

一条记录的合法性可通过计算其校验和并与记录中的校验和字段比较来实现,若二者不相同表示有错误。由于校验和字段是记录的数值累加之和的负值(补码运算的特点),因此上述合法性检查过程可以简化为计算一条记录的所有字节的累加和(包括校验和字段),并检查最终结果的最低有效字节是否为 0 即可(非 0 表示有错误)。

文本行结束符

Intel HEX 文件的每条记录之间通过一个或多个 ASCII 行结束符分隔,以使每条记录都独占一个文本行。这种分隔记录的方式不仅增强了文件的易认性(legibility),同时,记录之间的特殊填充符也提高了机器解析的效率。

生成 HEX 记录的程序通常使用对应操作系统的行结束符。例如,Linux 程序使用一个换行符(line feed,十六进制值 0x0A)结束一行,而 Windows 程序使用一个回车符(carriage return,十六进制值 0x0D)加一个换行符作为一行的结束。

记录类型

Intel HEX 文件包含 6 种标准的记录类型:

十六进制码 记录类型 描述 示例
00 数据 包含数据及其 16bit 起始地址。
字节数字段:标识了数据的字节数。
右侧示例的记录中,共有 0B(十进制的 11)字节的
数据(61, 64, 64, 72, 65, 73, 73, 20, 67, 61, 70),
这些数据位于起始地址为 0010 的连续地址空间中。
:0B0010006164647265737320676170A7
01 文件结束 必须是文件的最后一行且只能有一行。
数据字段:空(没有数据字段)。
字节数字段00
地址字段0000
:00000001FF
02 扩展段地址 数据字段:某个段的 16bit 基地址,与 80×86 实模式寻址方式兼容。
字节数字段02
地址字段:通常为 0000,可忽略。
02 记录的段地址乘以 16 后加上随后的数据记录的
地址字段的值,得到此数据记录的物理起始地址。
通过这种方式可以寻址 1MB 的地址空间。
:020000021200EA
03 起始段地址 用于指定 80×86 处理器 CS:IP 寄存器的初始值。
地址字段0000
字节数字段04
数据字段:前两个字节为 CS 的值,后两个字节为 IP 的值。
:0400000300003800C1
04 扩展线性地址 用于 32bit 寻址(4GB 寻址空间)。
地址字段:通常为 0000,可忽略。
字节数字段02
数据字段:以大端方式表示,指定了接下来的 00 类型记录
32bit 绝对地址的高 16bit,直到出现另一个 04 类型的记录。
如果 00 类型记录之前没有 04 类型记录,
则地址的高 16bit 为 0x0000。
00 类型记录的绝对地址由最近的 04 类型记录
表示的高 16bit 地址和 00 类型记录自身表示的
低 16bit 地址组合而成。
:02000004FFFFFC
05 起始线性地址 地址字段0000(未使用)。
字节数字段04
数据字段:表示 80386 及以上 CPU 的 EIP 寄存器的 32bit 值。
:04000005000000CD2A

命名格式

有些 HEX 文件只使用了上述记录类型的特定子集,为了表述这些文件格式,可使用特殊的名称,例如:

  • I8HEX: 只使用记录类型 0001(16bit 地址)。
  • I16HEX: 只使用记录类型 00010203(20bit 地址)。
  • I32HEX: 只使用记录类型 00010405(32bit 地址)。

文件示例

此示例包含 4 条数据记录和 1 条文件结束记录,如下所示:

:10010000214601360121470136007EFE09D2190140
:100110002146017E17C20001FF5F16002148011928
:10012000194E79234623965778239EDA3F01B2CAA7
:100130003F0156702B5E712B722B732146013421C7
:00000001FF

其它

另有 SRECTekHex 等其它的文件格式以及用于 HEX 文件与二进制文件相互转换的工具等,详见维基百科原始链接

以上。

Comments are Disabled