Intel HEX - Intel HEX

Intel hex
Extensão de nome de arquivo
.hex , .h86 , .hxl , .hxh , .obl , .obh , .mcs , .ihex , .ihe , .ihx , .a43

Formato de arquivo de objeto hexadecimal Intel , formato hexadecimal Intel ou Intellec Hex é um formato de arquivo que transmite informações binárias na forma de texto ASCII . É comumente usado para programar microcontroladores , EPROMs e outros tipos de dispositivos lógicos programáveis. Em um aplicativo típico, um compilador ou montador converte o código-fonte de um programa (como em C ou linguagem assembly ) em código de máquina e o produz em um arquivo HEX. As extensões de arquivo comuns usadas para os arquivos resultantes são .HEX ou .H86. O arquivo HEX é então lido por um programador para escrever o código de máquina em um PROM ou é transferido para o sistema de destino para carregamento e execução.

História

O formato hexadecimal Intel foi originalmente projetado para os Sistemas de Desenvolvimento de Microcomputadores (MDS) da Intel em 1973 para carregar e executar programas a partir de fita de papel para substituir o formato BNPF / BPNF com "uso intensivo de papel" . Além disso, serviu para facilitar a transmissão de dados dos clientes para a Intel para a produção de ROM. O formato foi usado para programar (E) PROMs por meio de fitas de papel (em Intellec Hex Paper Tape Format ) ou para controlar programadores EPROM controlados por cartões perfurados (por meio do Intellec Hex Computer Punched Card Format ).

Desde 1975, ele também foi utilizado pelos sistemas ISIS-II baseados em disquete MCS Series II , usando a extensão de arquivo HEX.

Formato

Intel HEX consiste em linhas de texto ASCII separadas por caracteres de alimentação de linha ou retorno de carro , ou ambos. Cada linha de texto contém caracteres hexadecimais que codificam vários números binários. Os números binários podem representar dados, endereços de memória ou outros valores, dependendo de sua posição na linha e do tipo e comprimento da linha. Cada linha de texto é chamada de registro .

Estrutura de registro

Um registro (linha de texto) consiste em seis campos (partes) que aparecem em ordem da esquerda para a direita:

  1. Código de início , um caractere, dois pontos ASCII ':'.
  2. Contagem de bytes , dois dígitos hexadecimais (um par de dígitos hexadecimais), indicando o número de bytes (pares de dígitos hexadecimais) no campo de dados. A contagem máxima de bytes é 255 (0xFF). 16 (0x10) e 32 (0x20) são contagens de bytes comumente usadas.
  3. Endereço , quatro dígitos hexadecimais, representando o deslocamento de endereço de memória inicial de 16 bits dos dados. O endereço físico dos dados é calculado adicionando-se esse deslocamento a um endereço base previamente estabelecido, permitindo assim o endereçamento de memória além do limite de 64 kilobytes de endereços de 16 bits. O endereço base, cujo padrão é zero, pode ser alterado por vários tipos de registros. Os endereços de base e os deslocamentos de endereço são sempre expressos como valores big endian .
  4. Tipo de registro (ver tipos de registro abaixo), dois dígitos hexadecimais, 00 a 05 , definindo o significado do campo de dados.
  5. Dados , uma sequência de n bytes de dados, representada por 2 n dígitos hexadecimais. Alguns registros omitem este campo ( n é igual a zero). O significado e a interpretação dos bytes de dados dependem do aplicativo.
  6. Soma de verificação , dois dígitos hexadecimais, um valor calculado que pode ser usado para verificar se o registro não tem erros.

Legenda de cor

Como auxílio visual, os campos dos registros Intel HEX são coloridos ao longo deste artigo da seguinte maneira:

  Código inicial   Contagem de bytes   Endereço   Tipo de registro   Dados   Checksum

Cálculo da soma de verificação

O byte de soma de verificação de um registro é o complemento de dois do byte menos significativo (LSB) da soma de todos os valores de byte decodificados no registro que precede a soma de verificação. É calculado somando os valores de byte decodificados e extraindo o LSB da soma (ou seja, a soma de verificação dos dados) e, em seguida, calculando o complemento de dois do LSB (por exemplo, invertendo seus bits e adicionando um).

Por exemplo, no caso do registro : 03 0030 00 02337A 1E , a soma dos valores de byte decodificados é 03 + 00 + 30 + 00 + 02 + 33 + 7A= E2, que tem valor LSB E2. O complemento de dois E2é1E , que é o byte de soma de verificação que aparece no final do registro.

A validade de um registro pode ser verificada calculando sua soma de verificação e verificando se a soma de verificação calculada é igual à soma de verificação que aparece no registro; um erro é indicado se as somas de verificação forem diferentes. Uma vez que o byte de soma de verificação do registro é o complemento de dois - e, portanto, o inverso aditivo - da soma de verificação de dados, este processo pode ser reduzido para somar todos os valores de byte decodificados, incluindo a soma de verificação do registro, e verificar se o LSB da soma é zero. Quando aplicado ao exemplo anterior, este método produz o seguinte resultado: 03 + 00 + 30 + 00 + 02 + 33 + 7A + 1E = 100, que possui valor LSB 00.

Terminadores de linha de texto

Os registros Intel HEX são separados por um ou mais caracteres de terminação de linha ASCII para que cada registro apareça sozinho em uma linha de texto. Isso aumenta a legibilidade ao delimitar visualmente os registros e também fornece preenchimento entre os registros que podem ser usados ​​para melhorar a eficiência da análise da máquina .

Os programas que criam registros HEX normalmente usam caracteres de terminação de linha que estão em conformidade com as convenções de seus sistemas operacionais . Por exemplo, os programas Linux usam um único caractere LF ( alimentação de linha , valor hexadecimal 0A) para encerrar as linhas, enquanto os programas do Windows usam um CR ( retorno de carro , valor hexadecimal 0D) seguido por um LF.

Tipos de registro

Intel HEX tem seis tipos de registro padrão:

Código hexadecimal Tipo de registro Descrição Exemplo
00 Dados Contém dados e um endereço inicial de 16 bits para os dados. A contagem de bytes especifica o número de bytes de dados no registro. O exemplo mostrado à direita tem 0B (onze) bytes de dados (61, 64, 64, 72, 65, 73, 73, 20, 67, 61, 70) localizados em endereços consecutivos começando no endereço 0010. : 0B 0010 00 6164647265737320676170 A7
01 Fim do arquivo Deve ocorrer exatamente uma vez por arquivo na última linha do arquivo. O campo de dados está vazio (portanto a contagem de bytes é 00) e o campo de endereço é normalmente 0000. : 00 0000 01FF
02 Endereço de segmento estendido O campo de dados contém um endereço de base de segmento de 16 bits (assim, a contagem de bytes é sempre 02) compatível com endereçamento de modo real 80x86. O campo de endereço (normalmente0000) é ignorado. O endereço do segmento do mais recente02registro é multiplicado por 16 e adicionado a cada endereço de registro de dados subsequente para formar o endereço inicial físico para os dados. Isso permite endereçar até um megabyte de espaço de endereço. : 02 0000 02 1200 EA
03 Endereço de segmento inicial Para processadores 80x86, especifica o conteúdo inicial dos registros CS: IP (ou seja, o endereço de execução inicial). O campo de endereço é0000, a contagem de bytes é sempre 04, os primeiros dois bytes de dados são o valor CS , os dois últimos são o valor IP . : 04 0000 03 00003800 C1
04 Endereço Linear Estendido Permite endereçamento de 32 bits (até 4GiB). O campo de endereço do registro é ignorado (normalmente0000) e sua contagem de bytes é sempre 02. Os dois bytes de dados (big endian) especificam os 16 bits superiores do endereço absoluto de 32 bits para todos os tipos subsequentes00registros; esses bits de endereço superiores se aplicam até o próximo04registro. O endereço absoluto para um tipo00 registro é formado pela combinação dos 16 bits de endereço superiores dos mais recentes 04 registro com os 16 bits de endereço baixos do 00registro. Se um tipo00 registro não é precedido por qualquer tipo 04 registros, em seguida, seus 16 bits de endereço superiores assumem como padrão 0000. : 02 0000 04 FFFF FC
05 Endereço linear inicial O campo de endereço é 0000(não usado) e a contagem de bytes é sempre 04. Os quatro bytes de dados representam um valor de endereço de 32 bits (big-endian). No caso de CPUs 80386 e superiores, este endereço é carregado no registrador EIP. : 04 0000 05 000000CD 2A

Formatos nomeados

O formato de fita de papel hexadecimal Intellec original de 4/8 bits e o formato de cartão perfurado para computador Intellec Hex são compatíveis apenas com os tipos de registro00 e 01.

O Extended Intellec Hex Format também oferece suporte ao tipo de registro02.

Às vezes, nomes especiais são usados ​​para denotar os formatos de arquivos HEX que empregam subconjuntos específicos de tipos de registro. Por exemplo:

  • Os arquivos I8HEX usam apenas tipos de registro00 e 01 (Endereços de 16 bits)
  • Os arquivos I16HEX usam apenas tipos de registro00 Através dos 03 (Endereços de 20 bits)
  • Arquivos I32HEX usam apenas tipos de registro00, 01, 04, e 05 (Endereços de 32 bits)

Exemplo de arquivo

Este exemplo mostra um arquivo que possui quatro registros de dados seguidos por um registro de fim de arquivo:

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

  Código inicial   Contagem de bytes   Endereço   Tipo de registro   Dados   Checksum

Variantes

Além da própria extensão da Intel, vários terceiros também definiram variantes e extensões do formato hexadecimal Intel, incluindo Digital Research (como no chamado "formato hexadecimal Digital Research"), Zilog , Texas Instruments , Microchip e c't . Eles podem ter informações sobre os pontos de entrada do programa e o conteúdo do registro, uma ordem de bytes trocados nos campos de dados e outras diferenças.

O formato hexadecimal Digital Research para processadores 8086 oferece suporte a informações de segmento, adicionando tipos de registro para distinguir entre código, dados, pilha e segmentos extras.

A maioria dos montadores para CP / M-80 (e também XASM09 para Motorola 6809 ) não usa o tipo de registro 01h para indicar o final de um arquivo, mas usa uma entrada 00h do tipo de dados de comprimento zero. Isso facilita a concatenação de vários arquivos hexadecimais.

Texas Instruments define uma variante em que os endereços são baseados na largura de bits dos registros de um processador, não nos bytes.

A Microchip define as variantes INTHX8S (INHX8L, INHX8H), INHX8M, INHX16 (INHX16M) e INHX32 para seus microcontroladores PIC .

O cross-macro-assembler AS de Alfred Arnold, o 8051 -emulator SIM51 de Werner Hennig-Roleff e o cross-converter BINTEL de Matthias R. Paul também são conhecidos por definir extensões para o formato hexadecimal Intel.

Veja também

Referências

Leitura adicional

links externos

  • binex - um conversor entre Intel HEX e binário para Windows.
  • SRecord , um conversor entre Intel HEX e binário para Linux ( uso ), código-fonte C ++.
  • kk_ihex , biblioteca C de código aberto para leitura e gravação em Intel HEX
  • libgis , biblioteca C de código aberto que converte arquivos genéricos Intel HEX, Motorola S-Record e Atmel.
  • bincopy é um pacote Python para manipular arquivos Intel HEX.