Confira neste artigo como interpretar as informações armazenadas em um arquivo no formato Intel Hex. Nesse tipo de arquivo são definidos o programa e valores constantes que serão gravados na memória, sendo utilizado em diversos programadores e emuladores.
Padrão Intel Hex
Um arquivo com extensão .hex contém uma sequência de caracteres ASCII que é armazenada seguindo o padrão Intel HEX. De modo geral, cada linha de texto presente no arquivo contém informações representadas utilizando o sistema de numeração hexadecimal. Tais parâmetros são indicados seguindo um formato padrão de linha que é iniciado com o símbolo ‘:’.
:LLAAAATT[DD…]CC
Os parâmetros são apresentados a seguir:
- LL: Quantidade de bytes na linha;
- AAAA: Endereço inicial em que as informações serão armazenadas;
- TT: Campo de extensão;
- DD: Informações da linha;
- CC: Código para verificação de erros.
É importante ressaltar que duas letras representam um valor hexadecimal. Assim sendo, verifica-se que cada campo possui, respectivamente: um byte; dois bytes; LL bytes; um byte. Lembre-se que o tamanho do campo DD depende da informação presente em LL.
Campo de Extensão
O campo de extensão é usado para indicar o tipo de informação definida na linha, isto é, no campo DD. Pode ser a definição dos valores armazenados na memória ou algum mecanismo de controle:
- 00: Determinação do conjunto de dados;
- 01: Fim de linha;
- 02: Extensão de endereço de segmento;
- 04: Extensão linear de endereço.
Determinação do conjunto de bytes: A informação contida a partir de um endereço de memória. No exemplo, 12 bytes gravados a partir do endereço 50H.
:0C005000456D6261726361646F730000B3
Fim de linha: Indica o final do arquivo HEX.
:00000001FF
Extensão de endereço de segmento: Utilizado no padrão HEX86, este campo define os bits 4-19 de um segmento de endereço de 20 bits. Para este campo são utilizados 2 bytes. Nesse caso, a função do campo é definir um endereço base que será somado aos endereços subsequentes (próximas linhas). Assim sendo, o endereço absoluto é obtido somando o endereço atual com o valor de extensão deslocado de 4 bits.
Endereço absoluto = (Endereço_Segmento << 4) + Endereço_Linha
Extensão linear de endereço: Utilizado no padrão HEX386, este campo define os bits 16-31 de um de endereço de 32 bits. Para este campo são utilizados 2 bytes para definir a parte alta (16 bits) das próximas linhas. Portanto, o endereço absoluto é obitdo somando o endereço atual com o valor de extensão deslocado de 16 bits.
Endereço absoluto = (Endereço_Segmento << 16) + Endereço_Linha
Código para verificação de erros
O código de verificação de erros é obtido da seguinte maneira: Todos os campos são somados, exceto o checksum. Em seguida, toma-se o complemento desse valor. Por fim, é somado o valor 1 para obter o checksum. Essas operações são mostradas no exemplo a seguir:
:0C005000456D6261726361646F730000B3
Soma: 0C + 00 + 50 + 00 + 45 + 6D + 62 + 61 + 72 + 63 + 61 + 64 + 6F+ 73 + 00 + 00 = 44D = 4D.
Complemento = NOT(4D) = B2.
Checksum = B2 + 01 = B3.
Exemplo
Considere o código abaixo compilado para arquitetura AVR de 8 bits.
#include <avr/io.h>
const char teste[] = "Embarcados";
int main(void)
{
/* Replace with your application code */
while (1)
{
}
}
O arquivo Hex gerado é mostrado na Figura 1. As cinco primeiras linhas são usadas para gravar o programa que é composto pelo código de inicialização e a função main. A penúltima linha é usada para gravar o dado constante na memória. Por fim, a ultima linha apresenta o comando de finalização.
Saiba mais
“Disassemblando” código Intel Hex com o simulador Kit SENAI PIC16
Conjunto de Instruções do Intel 8051
Compilando C para 8051 com SDCC
Referências










Interessante!
Estou buscando entender esse formato.