英特尔十六进制
文件名扩展 |
一般用途:.hex , .mcs , .int , .ihex , .ihe , .ihx 特定于平台的: .h80 , .h86 , .a43 , .a90 分裂,存放或分页: .hxl - .hxh , .h00 - .h15 , .p00 - .pff 二进制或英特尔十六进制: .obj , .obl , .obh , .rom , .eep
|
---|
Intel Hexadecimal对象文件格式,Intel Hex格式或Intellec六角终端或打印在以线为导向的打印机上。该格式通常用于编程微控制器,EPROM和其他类型的可编程逻辑设备和硬件模拟器。在典型的应用程序中,编译器或汇编程序将程序的源代码(例如在C或汇编语言中)转换为机器代码,并以十六进制(或二进制)格式将其输出到对像或可执行文件中。在某些应用中,英特尔十六进制格式还用作容器格式保存流数据的包装。用于结果文件的常见文件扩展名为.hex或.h86。然后,程序员读取十六进制文件,以将机器代码写入PROM或转移到目标系统以进行加载和执行。有多种工具可以在十六进制和二进制格式(即Hex2bin)之间转换文件,反之亦然(即Objhex,Oh,Ohx,bin2hex)。
历史
Intel HEX格式最初是为1973年的Intellec Microcomputer开发系统(MDS)设计的,以便从纸带加载和执行程序。它也被用来指定内存内容到Intel的ROM生产,以前必须在效率较低的BNPF (开始性阳性 - 阳性)格式中编码。 1973年,英特尔的“软件小组”仅由Bill Byerly和Kenneth Burgett和Gary Kildall和Gary Kildall作为外部顾问作为MicroComputer Applications (MAA)并于1974年创立了数字研究。从1975年开始,该格式从Intellec使用Intellec使用。 II系列ISIS-II系统支持软盘驱动器,并使用文件扩展十六进制文件。许多PROM和EPROM编程设备接受此格式。
格式
英特尔十字架由ASCII文本线组成,这些文本由线馈电或载货返回字符或两者兼而有之。每个文本行都包含大写十六进制字符,这些字符编码多个二进制数字。二进制数字可能代表数据,内存地址或其他值,具体取决于其在行中的位置以及行的类型和长度。每个文本行称为记录。
记录结构
记录(文本行)由六个字段(零件)组成,这些字段(零件)从左到右出现:
- 启动代码,一个字符,一个ascii colon' : '。记录中此符号之前的所有字符均应忽略。实际上,规范的早期版本甚至要求至少有25个nul字符以先于第一个记录,并遵循最后一个,这是由于格式的起源为纸带格式,需要一些磁带铅蛋白和铅铅蛋白,并进行处理。但是,由于这是规范中鲜为人知的部分,因此并非所有软件都正确地编写了此内容。它允许将其他相关信息存储在同一文件(甚至是同一行)中,这是各种软件开发实用程序用来存储符号表或其他注释的设施,以及使用其他字符作为启动代码(例如Digits)的第三方扩展程序0 '..' 9 '由英特尔和凯尔(Intel and keil) ,' $ '撰写,或者' ! ', ' @ ', ' # ', ' \ ', ' & ' 和 ' ; '由TDL 。按照惯例,“ // ”通常用于评论。这些扩展都不包含任何“:”字符作为有效载荷的一部分。
- 字节计数,两个十六进制数字(一个十六进制数字对),指示数据字段中的字节数(十六进制对数)。最大字节计数为255(0xff)。 8(0x08),16(0x10)和32(0x20)通常使用字节计数。并非所有软件都具有大于16的计数。
- 地址,四个十六进制数字,代表数据的16位开始内存地址偏移。数据的物理地址是通过将此偏移添加到先前建立的基地地址来计算的,从而使内存地址超出了16位地址的64千键限量。默认为零的基础地址可以通过各种类型的记录更改。基地地址和地址偏移始终表示为大的末日价值观。
- 记录类型(请参见下面的记录类型),两个十六进制数字, 00 到 05 ,定义数据字段的含义。
- 数据,一系列n个字节的数据,由2 n个十六进制数字表示。一些记录省略了此字段( n等于零)。数据字节的含义和解释取决于应用程序。 (4位数据必须存储在字节的下半部分或上半部分,即,一个字节仅包含一个可寻址的数据项。)
- 校验和两个十六进制数字,可用于验证记录的计算值没有错误。
彩色传奇
作为视觉援助,本文在本文中为Intel Hex记录的领域进行着色,如下所示:
启动代码 字节数 地址 记录类型 数据 校验和
校验和计算
记录的校验和字节是两者在校验和之前的记录中所有解码字节值的总和的最小值字节(LSB)的补充。它是通过求和解码的字节值并提取总和的LSB(即数据检查和),然后计算LSB的补充(例如,通过反转其位并添加一个)来计算。
例如,在记录的情况下: 03 0030 00 02337a 1e ,解码字节值的总和为03 + 00 + 30 + 00 + 02 + 33 + 7a = E2
,具有LSB值E2
。两者的E2
补充是 1E ,这是出现在记录末尾的校验和字节。
可以通过计算其校验和验证计算的校验和等于记录中出现的校验和的记录的有效性。如果校验和不同,则指示错误。由于记录的校验和字节是数据检查和的添加词的补充,因此可以将此过程简化为求和所有解码字节值,包括记录的校验和验证总和的LSB是否为零。当应用于前面的示例时,此方法会产生以下结果: 03 + 00 + 30 + 00 + 02 + 33 + 7a + 1E = 100
,具有LSB值00
。
文本线终结者
英特尔十六进制记录通常由一个或多个ASCII线终止字符分开,以便每个记录单独出现在文本行上。这通过视觉划定记录来增强可读性,并且还提供可用于提高机器解析效率的记录之间的填充。但是,线终止字符是可选的,因为“ : ”用于检测记录的开始。
创建十六进制记录的程序通常使用符合其操作系统约定的线终止字符。例如,Linux程序使用单个LF(线供稿,十六进式0A
)字符终止行,而Windows程序使用CR( Carriage Reporter ,Hex值0D
),然后使用LF。
记录类型
英特尔十六进制有六种标准记录类型:
十六进制代码 | 记录类型 | 描述 | 例子 |
---|---|---|---|
00 | 数据 | 字节数指定记录中的数据字节数。该示例具有0B (11)数据字节。数据的16位起始地址(在地址的示例开始0010 )和数据( 61 ,,,, 64 ,,,, 64 ,,,, 72 ,,,, 65 ,,,, 73 ,,,, 73 ,,,, 20 ,,,, 67 ,,,, 61 ,,,, 70 )。 | : 0B 0010 00 6164647265737320676170 A7 |
01 | 文件结尾 | 在文件的最后一个记录中,必须准确地发生一次每个文件。字节数为00 ,地址字段通常是0000 并且省略了数据字段。 | : 00 0000 01 ff |
02 | 扩展段地址 | 字节数总是02 ,地址字段(通常0000 )被忽略,数据字段包含一个16位段的基础地址。这乘以16,并添加到每个后续数据记录地址中,以形成数据的起始地址。这允许地址空间最多可解决一个Mebibyte (1048576字节)。 | : 02 0000 02 1200 EA |
03 | 启动段地址 | 对于80x86处理器,指定起始执行地址。字节数总是04 ,地址字段是0000 前两个数据字节是CS值,后两个是IP值。执行应从此地址开始。 | : 04 0000 03 00003800 C1 |
04 | 扩展线性地址 | 允许32位寻址(最多4个GIB )。字节数总是02 地址字段被忽略(通常0000 )。两个数据字节(Big Endian)指定所有后续类型的32位绝对地址的上部16位 00 记录;这些高地址位适用直到下一个 04 记录。类型的绝对地址 00 记录是通过结合最新的16个地址位来形成的 04 记录以低16个地址位的记录 00 记录。如果是类型 00 记录之前没有任何类型 04 记录其上部16个地址位默认为0000。 | : 02 0000 04 0800 F2 |
05 | 启动线性地址 | 字节数总是04 ,地址字段是0000 。这四个数据字节代表一个32位地址值(大端)。在支持它的CPU的情况下,此32位地址是执行应启动的地址。 | : 04 0000 05 000000CD 2A |
其他记录类型已用于变体,包括 06 (“眨眼”消息 /传输协议容器)韦恩和莱恩, 0a (块开始), 0b (块末端), 0c (填充数据), 0d (自定义数据)和 0E (其他数据) BBC / Micro:BIT教育基金会和 81 (代码段中的数据), 82 (数据段中的数据), 83 (堆栈段中的数据), 84 (额外段中的数据), 85 (绝对代码段的段落地址), 86 (绝对数据段的段落地址), 87 (绝对堆栈段的段落地址)和 88 (绝对额外段的段落地址)数字研究。
命名格式
1973/1974年的原始4位/8位Intellec六角纸胶带格式和Intellec Hex计算机打孔卡格式仅支持一种记录类型 00 。这是在1975年左右扩展的,也支持记录类型 01 。有时称为符号十六进制格式,它可能包括一个可选的标题,该标头包含一个符号表用于符号调试,并忽略了结肠之前的所有字符。
1978年左右,英特尔介绍了新的唱片类型 02 和 03 (要增加当时新的8086 / 8088处理器的分段地址空间的支持)以其扩展的Intellec Hex格式。
特殊名称有时用于表示采用特定记录类型子集的十六进制文件的格式。例如:
- i8hex (又名十六进制80 )文件仅使用记录类型 00 和 01
- I16HEX (又名HEX-86 )文件仅使用记录类型 00 通过 03
- i32hex (又名HEX-386 )文件仅使用记录类型 00 ,,,, 01 ,,,, 04 , 和 05
文件示例
此示例显示了一个具有四个数据记录的文件,然后是文件终止记录:
:10010000214601360121470136007EFE09D2190140 :100110002146017E17C20001FF5F16002148011928 :10012000194E79234623965778239EDA3F01B2CAA7 :100130003F0156702B5E712B722B732146013421C7 :00000001FF
启动代码 字节数 地址 记录类型 数据 校验和
变体
除了英特尔自己的扩展外,几个第三方还定义了英特尔十六进制格式的变体和扩展,包括数字研究(如所谓的“数字研究六角形格式”), Zilog , Mostek , TDL , Texas Instruments ,Texas Instruments,Microchip,Microchip,Microchip,,Microchip,,,Microchip,,,Microchip, Microchip , C'T ,Wayne and Layne, BBC / Micro:Bit Educational Foundation (具有“通用HEX格式”)。这些可以具有有关程序入口点和注册内容的信息,数据字段中的交换字节订单,未使用区域的填充值,保险丝位和其他差异。
8086处理器的数字研究HEX格式通过添加记录类型来区分代码,数据,堆栈和额外细分市场,从而支持细分信息。
大多数用于CP/M-80的汇编器(以及Motorola 6809的XASM09)不使用记录类型01H指示文件的末尾,而是使用零长度的数据类型00H输入。这简化了多个十六进制文件的串联。
Texas Instruments定义了一个变体,其中地址基于处理器寄存器的位宽度,而不是字节。
Microchip在其PIC微控制器中定义了inthx8s Inthx8s(INHX8L,INHX8H),INHX8M,INHX16(INHX16M)和INHX32。
Alfred Arnold的交叉杂交器AS,Werner Hennig-Roleff的8051- emulator Sim51和Matthias R. Paul的交叉串联Bintel也可以定义对Intel Hex格式的扩展。
也可以看看
- 二进制编码,编码算法的调查和比较
- MOS技术文件格式
- 摩托罗拉S唱片十六进制格式
- Tektronix六角形格式
- Texas Instruments Ti-TXT(TI文本)
- 英特尔微型计算机集(MCS)
- 对象文件(通常是二进制文件,但有时也采用Intel Hex格式)