Intel hexagonal

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar

Formato de archivo de objetos Intel hexadecimal, formato Intel hexadecimal o Intellec Hex es un formato de archivo que transmite información binaria en forma de texto ASCII, lo que hace Es posible almacenarlo en medios no binarios, como cintas de papel, tarjetas perforadas, etc., para mostrarlos en terminales de texto o imprimirlos en impresoras orientadas a líneas. El formato se usa comúnmente para programar microcontroladores, EPROM y otros tipos de dispositivos lógicos programables y emuladores de hardware. En una aplicación típica, un compilador o ensamblador convierte el código fuente de un programa (como en C o lenguaje ensamblador) en código de máquina y lo genera en un objeto o archivo ejecutable en formato hexadecimal (o binario). En algunas aplicaciones, el formato hexadecimal de Intel también se utiliza como formato de contenedor que contiene paquetes de flujo de datos. Las extensiones de archivo comunes utilizadas para los archivos resultantes son.HEX o.H86. Luego, un programador lee el archivo HEX para escribir el código de máquina en una PROM o lo transfiere al sistema de destino para su carga y ejecución. Existen varias herramientas para convertir archivos entre formato hexadecimal y binario (es decir, HEX2BIN) y viceversa (es decir, OBJHEX, OH, OHX, BIN2HEX).

Historia

El formato hexadecimal de Intel se diseñó originalmente para los sistemas de desarrollo de microcomputadoras (MDS) Intellec de Intel en 1973 para cargar y ejecutar programas desde cintas de papel. También se utilizó para especificar el contenido de la memoria de Intel para la producción de ROM, que anteriormente tenía que codificarse en el formato BNPF (Begin-Negative-Positive-Finish), mucho menos eficiente. En 1973, el "grupo de software" estaba formado únicamente por Bill Byerly y Kenneth Burgett, y Gary Kildall como consultor externo que operaba como Microcomputer Applications Associates (MAA) y fundó Digital Research en 1974. A partir de 1975, el formato fue utilizado por los sistemas Intellec Serie II ISIS-II que admitían disquetes. unidades, con archivos que utilizan la extensión de archivo HEX. Muchos dispositivos de programación PROM y EPROM aceptan este formato.

Formato

Intel HEX consta de líneas de texto ASCII separadas por caracteres de avance de línea o de retorno de carro, o ambos. Cada línea de texto contiene caracteres hexadecimales en mayúsculas que codifican varios números binarios. Los números binarios pueden representar datos, direcciones de memoria u otros valores, dependiendo de su posición en la línea y del tipo y longitud de la línea. Cada línea de texto se denomina 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 personaje, un colon ASCII:'. Todos los caracteres que preceden a este símbolo en un registro deben ser ignorados. De hecho, versiones muy tempranas de la especificación incluso pidió un mínimo de 25 caracteres NUL para preceder al primer registro y seguir el último, debido a los orígenes del formato como un formato de cinta de papel que requería un poco de cinta de plomo y de plomo para el manejo. Sin embargo, como esta era una parte poco conocida de la especificación, no todo el software escrito hace frente a esto correctamente. Permite almacenar otra información relacionada en el mismo archivo (y incluso la misma línea), una instalación utilizada por varias utilidades de desarrollo de software para almacenar tablas de símbolos o comentarios adicionales, y extensiones de terceros utilizando otros caracteres como código de inicio como los dígitos '0'. '9por Intel y Keil, '$Por Mostek, o!', '@', '#', '\', '"'y';'por TDL. Por convención, '//' se utiliza a menudo para comentarios. Ninguna de estas extensiones puede contener caracteres ':' como parte de la carga útil.
  2. Cuenta Byte, dos dígitos de hex (un par de dígitos de hex), indicando el número de bytes ( pares de dígitos de hex) en el campo de datos. El recuento máximo de byte es 255 (0xFF). 8 (0x08), 16 (0x10) y 32 (0x20) se utilizan comúnmente conteos de byte. No todo el software se enfrenta a conteos mayores de 16.
  3. Dirección, cuatro dígitos hex, representando el offset de 16 bits de memoria inicial de los datos. La dirección física de los datos se calcula añadiendo esta compensación a una dirección base establecida anteriormente, permitiendo así abordar la memoria más allá del límite de 64 kilobytes de direcciones de 16 bits. La dirección base, que predetermina a cero, puede cambiarse por varios tipos de registros. Las direcciones de base y los offsets de direcciones se expresan siempre como grandes valores endianos.
  4. Tipo de registro (ver tipos de registro abajo), dos dígitos de hex, 00 a 05, definir el significado del campo de datos.
  5. Datos, una secuencia de n bytes of data, represented by 2n Hex digits. Algunos registros omiten este campo (n equivale a cero). El significado e interpretación de los bytes de datos depende de la aplicación. Los datos de 4 bits tendrán que ser almacenados en la mitad inferior o superior de los bytes, es decir, un byte solo contiene un elemento de datos identificable.)
  6. Checksum, dos dígitos hex, un valor calculado que se puede utilizar para verificar el registro no tiene errores.

Leyenda de colores

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 la suma de comprobación

El byte de suma de verificació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 que precede a la suma de verificación. Se calcula sumando los valores de bytes decodificados y extrayendo el LSB de la suma (es decir, la suma de verificación de datos) y luego calculando el complemento a dos del LSB (por ejemplo, invirtiendo sus bits y sumando uno).

Por ejemplo, en el caso del registro :0300300002337A1E, la suma de los valores de bytes decodificados es 03 + 00 + < span style="fondo-color:#CCFFCC;font-family:monospace">30 + 00 + 02 + 33 + 7A = E2, que tiene el valor LSB E2. El complemento a dos de E2 es 1E, 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 verificació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 verificando 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 + < span style="fondo-color:#CCFFCC;font-family:monospace">33 + 7A + 1E = 100, que tiene el valor LSB 00.

Terminadores de línea de texto

Los registros Intel HEX generalmente 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 relleno entre registros que se puede utilizar para mejorar la eficiencia del análisis de la máquina. Sin embargo, los caracteres de terminación de línea son opcionales, ya que ':' se utiliza para detectar el inicio de un registro.

Los programas que crean registros HEX normalmente utilizan 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 (avance 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 registros

Intel HEX tiene seis tipos de registros estándar:

Código Hex Tipo de registro Descripción Ejemplo
00Datos El número de byte especifica el número de bytes de datos en el registro. El ejemplo tiene 0B (eleven) bytes de datos. Dirección de inicio de 16 bits para los datos (en el ejemplo en las direcciones que comienzan a 0010) y los datos (61, 64, 64, 72, 65, 73, 73, 20, 67, 61, 70). :0B001000616472657320676170A7
01Fin de archivo Debe ocurrir exactamente una vez por archivo en el último registro del archivo. La cuenta de byte es 00, el campo de dirección es típicamente 0000 y el campo de datos se omite. :00000001FF
02Extended Segment Address La cuenta de byte es siempre 02, el campo de dirección (típicamente 0000) es ignorado y el campo de datos contiene una dirección base de segmento de 16 bits. Esto se multiplica por 16 y se añade a cada dirección posterior del registro de datos para formar la dirección inicial de los datos. Esto permite abordar hasta un mebibyte (1048576 bytes) del espacio de dirección. :020000021200EA
03Dirección de Segmento de Inicio Para los procesadores 80x86, especifica la dirección de ejecución inicial. La cuenta de byte es siempre 04, el campo de dirección es 0000 y los dos primeros bytes de datos son el valor CS, estos dos últimos son el valor IP. La ejecución debe comenzar en esta dirección. :0400000300003800C1
04Dirección lineal ampliada Permite 32 bit address (hasta 4 GiB). La cuenta de byte es siempre 02 y el campo de dirección es ignorado (típicamente 0000). Los dos bytes de datos (big endian) especifican los 16 bits superiores de la 32 bit dirección absoluta para todo tipo posterior 00 registros; estos bits de dirección superior se aplican hasta el siguiente 04 registro. La dirección absoluta para un tipo 00 registro se forma mediante la combinación de los 16 bits de la dirección superior de los más recientes 04 registro con los bajos 16 bits de la dirección 00 registro. Si un tipo 00 registro no es precedido por ningún tipo 04 registros entonces su dirección superior 16 bits por defecto a 0000. :020000040800F2
05Dirección lineal de inicio La cuenta de byte es siempre 04, el campo de dirección es 0000. Los cuatro bytes de datos representan un valor de dirección de 32 bits (big-endian). En el caso de las CPU que lo apoyan, esta dirección de 32 bits es la dirección en la que debe comenzar la ejecución. :04000005000CD2A

Se han utilizado otros tipos de registros para variantes, incluyendo 06 por Wayne y Layne, 0A (block start), 0B (block end), 0C (datos pagados), 0D (Datos personales) y 0E (otros datos) de la BBC/Micro:bit Educational Foundation, y 81 (datos en segmento de código), 82 (datos en segmento de datos), 83 (datos en el segmento de la pila), 84 (datos en segmento extra) 85 (Dirección del párrafo para el segmento de código absoluto), 86 (Dirección del párrafo para el segmento de datos absolutos), 87 (Dirección del párrafo para el segmento absoluto de la pila) y 88 (Dirección del párrafo para segmento extra absoluto) por Digital Research.

Formatos con nombre

El formato Intellec Hex Paper Tape original de 4 bits/8 bits y el formato Intellec Hex Computer Punched Card de 1973/1974 solo admitían un tipo de registro 00. Esto se amplió alrededor de 1975 para admitir también el tipo de registro 01< /span>. A veces llamado formato hexadecimal simbólico, podría incluir un encabezado opcional que contenga una tabla de símbolos para la depuración simbólica; se ignoran todos los caracteres de un registro que preceden a los dos puntos.

Alrededor de 1978, Intel introdujo los nuevos tipos de discos 02 y 03 (para añadir apoyo al espacio de dirección segmentado de los procesadores 8086/8088 de entonces) en sus Formato Intellec Hex extendido.

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

  • I8HEX (aka HEX-80) los archivos utilizan sólo tipos de registro 00 y 01
  • I16HEX (aka HEX-86) los archivos utilizan sólo tipos de registro 00 a través de 03
  • I32HEX (aka HEX-386) los archivos utilizan sólo tipos de registro 00, 01, 04, y 05

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, incluido Digital Research (como en el llamado "formato hexadecimal de Digital Research") , Zilog, Mostek, TDL, Texas Instruments, Microchip, c't, Wayne and Layne y BBC/Micro:bit Educational Foundation (con su "Formato hexadecimal universal"). Estos pueden tener información sobre los puntos de entrada del programa y el contenido de los registros, un orden de bytes intercambiados en los campos de datos, valores de relleno para áreas no utilizadas, bits de fusibles y otras diferencias.

El formato hexadecimal de Digital Research para procesadores 8086 admite información de segmentos 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 utilizan el tipo de registro 01h para indicar el final de un archivo, sino que utilizan una entrada de tipo de datos de longitud cero 00h. 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 de macros 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 del formato hexadecimal de Intel.

Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save