Intel HEX - Intel HEX

Intel hex
Extensión de nombre de archivo
.hex , .h86 , .hxl , .hxh , .obl , .obh , .mcs , .ihex , .ihe , .ihx , .a43

El formato de archivo de objeto hexadecimal de Intel , el formato hexadecimal de Intel o Intellec Hex es un formato de archivo que transmite información binaria en forma de texto ASCII . Se usa comúnmente para programar microcontroladores , EPROM y otros tipos de dispositivos lógicos programables. En una aplicación típica, un compilador o ensamblador convierte un programa 's de código fuente (como en C o lenguaje ensamblador ) a código de máquina y salidas en un archivo de HEX. Las extensiones de archivo comunes que se utilizan para los archivos resultantes son .HEX o .H86. Luego, un programador lee el archivo HEX para escribir el código de la máquina en una PROM o se transfiere al sistema de destino para su carga y ejecución.

Historia

El formato hexadecimal de Intel se diseñó originalmente para los sistemas de desarrollo de microcomputadoras (MDS) Intellec de Intel en 1973 con el fin de cargar y ejecutar programas desde cinta de papel para reemplazar el formato BNPF / BPNF de "uso intensivo de papel" . Además, sirvió para facilitar la transmisión de datos de los clientes a Intel para la producción de ROM. El formato se utilizó para programar (E) PROM mediante cintas de papel (en formato de cinta de papel Intellec Hex ) o para controlar programadores de EPROM controlados por tarjeta perforada (a través del formato de tarjeta perforada por computadora Intellec Hex ).

Desde 1975, también fue utilizado por los sistemas ISIS-II basados ​​en disquetes MCS Serie II , utilizando la extensión de archivo HEX.

Formato

Intel HEX consta de líneas de texto ASCII que están separadas por caracteres de salto de línea o retorno de carro o ambos. Cada línea de texto contiene caracteres hexadecimales que codifican varios números binarios. Los números binarios pueden representar datos, direcciones de memoria u otros valores, según su posición en la línea y el tipo y longitud de la línea. Cada línea de texto se llama registro .

Estructura de registro

Un registro (línea de texto) consta de seis campos (partes) que aparecen en orden de izquierda a derecha:

  1. Código de inicio , un carácter, dos puntos ASCII ':'.
  2. Recuento de bytes , dos dígitos hexadecimales (un par de dígitos hexadecimales), que indica el número de bytes (pares de dígitos hexadecimales) en el campo de datos. El número máximo de bytes es 255 (0xFF). 16 (0x10) y 32 (0x20) son recuentos de bytes de uso común.
  3. Dirección , cuatro dígitos hexadecimales, que representan el desplazamiento de la dirección de memoria inicial de 16 bits de los datos. La dirección física de los datos se calcula agregando este desplazamiento a una dirección base previamente establecida, lo que permite el direccionamiento de memoria más allá del límite de 64 kilobytes de direcciones de 16 bits. La dirección base, que por defecto es cero, se puede cambiar mediante varios tipos de registros. Las direcciones base y las compensaciones de direcciones siempre se expresan como valores big endian .
  4. Tipo de registro (consulte los tipos de registro a continuación), dos dígitos hexadecimales, 00 a 05 , que definen el significado del campo de datos.
  5. Datos , una secuencia de n bytes de datos, representada por 2 n dígitos hexadecimales. Algunos registros omiten este campo ( n es igual a cero). El significado y la interpretación de los bytes de datos dependen de la aplicación.
  6. Suma de comprobación , dos dígitos hexadecimales, un valor calculado que se puede utilizar para verificar que el registro no tenga errores.

Leyenda de color

Como ayuda visual, los campos de los registros Intel HEX están coloreados a lo largo de este artículo de la siguiente manera:

  Código de inicio   Recuento de bytes   Dirección   Tipo de registro   Datos   Suma de comprobación

Cálculo de suma de comprobación

Byte de suma de comprobación de un registro es el complemento a dos del byte menos significativo (LSB) de la suma de todos los valores de bytes decodificados en el registro anteriores a la suma de comprobación. Se calcula sumando los valores de bytes decodificados y extrayendo el LSB de la suma (es decir, la suma de control de datos), y luego calculando el complemento a dos del LSB (por ejemplo, invirtiendo sus bits y agregando uno).

Por ejemplo, en el caso del registro : 03 0030 00 02337A 1E , la suma de los valores de bytes decodificados es 03 + 00 + 30 + 00 + 02 + 33 + 7A= E2, que tiene valor LSB E2. El complemento a dos de E2es1E , que es el byte de suma de comprobación que aparece al final del registro.

La validez de un registro se puede verificar calculando su suma de verificación y verificando que la suma de verificación calculada sea igual a la suma de verificación que aparece en el registro; se indica un error si las sumas de comprobación difieren. Dado que el byte de suma de verificación del registro es el complemento a dos, y por lo tanto el inverso aditivo , de la suma de verificación de datos, este proceso se puede reducir a sumar todos los valores de bytes decodificados, incluida la suma de verificación del registro, y verificar que el LSB de la suma sea cero. Cuando se aplica al ejemplo anterior, este método produce el siguiente resultado: 03 + 00 + 30 + 00 + 02 + 33 + 7A + 1E = 100, que tiene valor LSB 00.

Terminadores de línea de texto

Los registros Intel HEX están separados por uno o más caracteres de terminación de línea ASCII para que cada registro aparezca solo en una línea de texto. Esto mejora la legibilidad al delimitar visualmente los registros y también proporciona un relleno entre registros que se puede utilizar para mejorar la eficiencia del análisis de la máquina .

Los programas que crean registros HEX suelen utilizar caracteres de terminación de línea que se ajustan a las convenciones de sus sistemas operativos . Por ejemplo, los programas de Linux utilizan un único carácter LF (salto de línea , valor hexadecimal 0A) para terminar las líneas, mientras que los programas de Windows utilizan un CR ( retorno de carro , valor hexadecimal 0D) seguido de un LF.

Tipos de registro

Intel HEX tiene seis tipos de registros estándar:

Código hexadecimal Tipo de registro Descripción Ejemplo
00 Datos Contiene datos y una dirección inicial de 16 bits para los datos. El recuento de bytes especifica el número de bytes de datos en el registro. El ejemplo que se muestra a la derecha tiene 0B (once) bytes de datos (61, 64, 64, 72, sesenta y cinco, 73, 73, 20, 67, 61, 70) ubicado en direcciones consecutivas que comienzan en la dirección 0010. : 0B 0010 00 6164647265737320676170 A7
01 Fin del documento Debe ocurrir exactamente una vez por archivo en la última línea del archivo. El campo de datos está vacío (por lo tanto, el recuento de bytes es 00) y el campo de dirección suele ser 0000. : 00 0000 01FF
02 Dirección de segmento extendido El campo de datos contiene una dirección base de segmento de 16 bits (por lo tanto, el recuento de bytes es siempre 02) compatible con direccionamiento en modo real 80x86. El campo de dirección (normalmente0000) se ignora. La dirección del segmento de la más reciente02El registro se multiplica por 16 y se agrega a cada dirección de registro de datos subsiguiente para formar la dirección física de inicio de los datos. Esto permite direccionar hasta un megabyte de espacio de direcciones. : 02 0000 02 1200 EA
03 Dirección de segmento inicial Para procesadores 80x86, especifica el contenido inicial de los registros CS: IP (es decir, la dirección de ejecución inicial). El campo de dirección es0000, el recuento de bytes es siempre 04, los dos primeros bytes de datos son el valor de CS , los dos últimos son el valor de IP . : 04 0000 03 00003800 C1
04 Dirección lineal extendida Permite direccionamiento de 32 bits (hasta 4GiB). El campo de dirección del registro se ignora (normalmente0000) y su recuento de bytes es siempre 02. Los dos bytes de datos (big endian) especifican los 16 bits superiores de la dirección absoluta de 32 bits para todos los tipos posteriores.00registros; estos bits de dirección superiores se aplican hasta el próximo04registro. La dirección absoluta de un tipo00 El registro se forma combinando los 16 bits de dirección superiores del más reciente 04 grabar con los 16 bits de dirección bajos del 00registro. Si un tipo00 el registro no va precedido de ningún tipo 04 registra entonces sus 16 bits de dirección superiores predeterminados a 0000. : 02 0000 04 FFFF FC
05 Iniciar dirección lineal El campo de dirección es 0000(no se usa) y el número de bytes es siempre 04. Los cuatro bytes de datos representan un valor de dirección de 32 bits (big-endian). En el caso de las CPU 80386 y superiores, esta dirección se carga en el registro EIP. : 04 0000 05 000000CD 2A

Formatos con nombre

El formato de cinta de papel Intellec Hex Hex original de 4 bits / 8 bits y el formato de tarjeta perforada por computadora Intellec Hex solo admitían tipos de registro00 y 01.

El formato Extended Intellec Hex admite además el tipo de registro02.

A veces se utilizan nombres especiales para indicar los formatos de archivos HEX que emplean subconjuntos específicos de tipos de registros. Por ejemplo:

  • Los archivos I8HEX usan solo tipos de registro00 y 01 (Direcciones de 16 bits)
  • Los archivos I16HEX usan solo tipos de registro00 mediante 03 (Direcciones de 20 bits)
  • Los archivos I32HEX usan solo tipos de registro00, 01, 04, y 05 (Direcciones de 32 bits)

Ejemplo de archivo

Este ejemplo muestra un archivo que tiene cuatro registros de datos seguidos de un registro de fin de archivo:

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

  Código de inicio   Recuento de bytes   Dirección   Tipo de registro   Datos   Suma de comprobación

Variantes

Además de la propia extensión de Intel, varios terceros también han definido variantes y extensiones del formato hexadecimal de Intel, incluyendo Digital Research (como en el llamado "formato hexadecimal de Digital Research"), Zilog , Texas Instruments , Microchip y c't . Estos pueden tener información sobre los puntos de entrada del programa y el contenido del registro, un orden de bytes intercambiados en los campos de datos y otras diferencias.

El formato hexadecimal de Digital Research para procesadores 8086 admite información de segmento agregando tipos de registro para distinguir entre código, datos, pila y segmentos adicionales.

La mayoría de los ensambladores para CP / M-80 (y también XASM09 para Motorola 6809 ) no usan el tipo de registro 01h para indicar el final de un archivo, sino que usan una entrada de tipo de datos de longitud cero 00h en su lugar. Esto facilita la concatenación de varios archivos hexadecimales.

Texas Instruments define una variante en la que las direcciones se basan en el ancho de bits de los registros de un procesador, no en bytes.

Microchip define las variantes INTHX8S (INHX8L, INHX8H), INHX8M, INHX16 (INHX16M) e INHX32 para sus microcontroladores PIC .

El ensamblador cruzado AS de Alfred Arnold, el emulador 8051 SIM51 de Werner Hennig-Roleff y el conversor cruzado BINTEL de Matthias R. Paul también son conocidos por definir extensiones al formato hexadecimal de Intel.

Ver también

Referencias

Otras lecturas

enlaces externos

  • binex : un convertidor entre Intel HEX y binario para Windows.
  • SRecord , un convertidor entre Intel HEX y binario para Linux ( uso ), código fuente C ++.
  • kk_ihex , biblioteca C de código abierto para leer y escribir Intel HEX
  • libgis , biblioteca C de código abierto que convierte archivos Intel HEX, Motorola S-Record, Atmel Generic.
  • bincopy es un paquete de Python para manipular archivos Intel HEX.