Das Intel-Hexformat

Prof. Jürgen Plate

Das Intel-Hexformat

Allgemeines

Das Intel Hexformat ist ein auf dem ASCII-Zeichensatz basierendes Datenformat zur Speicherung und Übertragung von binären Daten. Es wird heute hauptsächlich verwendet, um Programmdaten für Mikrocontroller, Flash-Speicher, ROMs und ähnliche Bausteine zu speichern. Das Hexformat ist das älteste Datenformat seiner Art und wurde von Intel in den 1970er Jahren für den Mikroprozessor 4004 entwickelt. Spätere Erweiterungen unterstützen speziell die segmentierte Adressierung der Intel-80x86-Prozessoren. Die Daten werden dabei, wie schon erwähnt, ASCII-codiert, so dass die Übertragung nur aus druckbaren Zeichen besteht. Die Bytes der kodierten Binärdaten werden jeweils als Sedezimalzahl aus zwei ASCII-Zeichen ('0' ... '9' und 'A' ... 'F') dargestellt. Solche Dateien können ggf. auch mit einem Texteditor bearbeitet werden. Die Datensätze sind mit einer Prüfsumme versehen, so dass Übertragungsfehler erkannt werden können.

Die Daten werden in Blöcke aufgeteilt und nacheinander übertragen. Ein Block hat folgenden Aufbau, wobei in der folgenden Grafik jedes Kästchen für ein Byte steht:

Vor der ersten Startmarkierung (ASCII ':', 0x3A) dürfen beliebig viele Zeichen stehen. Zwischen der Prüfsumme und der nächsten Startmarkierung können ebenfalls beliebig viele (Füll-)Zeichen stehen; in der Regel sind dies Carriage Return(CR, 0x0D) und Line Feed (LF, 0x0A). "n" bedeutet in der obigen Grafik eine ASCII-codierte Hexziffer enthält.

Die einzelnen Teile des Records haben folgenden Bedeutung:

Datenlänge Gibt die Anzahl der Datenbytes in Form von zwei Hexziffern an.
Adresse Adresse (16 Bit, Big Endian), an die die Daten dieses Records geschrieben werden sollen. Ist dem Datensatz ein erweiterter Address-Record (Typ 04, siehe unten) vorausgegangen, ist die dort angegebene Basis-Adresse zu dieser Adresse zu addieren.
Record-Typ Typ des datensatzes - siehe Tabelle weiter unten.
Daten Die Datenbytes (immer zwei übertragene Bytes ergeben ein Datenbyte).
Prüfsumme Das Zweierkomplement der Modulo-256-Summe über alle vorangegangenen Bytes mit Ausnahme der Startmarkierung.

Ermittlung der Prüfsumme

Bildet man also die Modulo-256-Summe (also mit nur 8 Bit Wortbreite) über alle Bytes eines Blocks mit Ausnahme der Startmarkierung, muss sich bei korrekter Übertragung 0 ergeben (Empfangsprüfung). Das Zweierkomplement dient im Binärsystem zur Darstellung einer negativen Zahl. Da die Prüfsumme damit die negierte Summe der restlichen Bytes darstellt, gestaltet sich die Überprüfung eines Datensatzes auf Fehler sehr einfach. Man summiert einfach die einzelnen Bytes eines Datensatzes inklusive der Prüfsumme und erhält als Ergebnis 0, falls der Datensatz korrekt ist. Dazu ein Beispiel mit folgendem Datenblock:
:10010000214601360121470136007EFE09D2190140
Es wird nun berechnet (Sedezimaldarstellung):
   10+01+00+00+21+46+01+36+01+21+47+01+36+00+7E+FE+09+D2+19+01 = 3C0
   Als Ergebnis modulo 256 ergibt sich:                        =  C0
   Die Berechnung des Komplements ergibt:                      =  40
   C0            1100 0000
   invertiert    0011 1111
               + 0000 0001 
   2-Komplement  0100 0000

Record-Typen

00 Der Datensatz enthält die 16-Bit-Adresse und die Nutzdaten, die ab dieser Adresse abgelegt werden sollen.
01 Der letzte Record der Übertragung sowie Startadresse des Programms bei 8-Bit-Daten. Bei den 16- und 32-Bit-Formaten ist die Adresse 0000.
02 Erweiterter Segment-Address-Record. Das Adressfeld enthält 0 und die Daten geben eine Segment-Adresse an, wie sie z. B. bei Intel-x86-Prozessoren verwendet wird. Die nachfolgenden Daten-Records sind in dieses Segment zu laden. Die im Datensatz enthaltene Adresse wird mit 16 multipliziert und bei den folgenden Datenblocks (Typ 00) zu der dort enthaltenen 16-Bit-Adresse addiert. Die niederwertigsten vier Bits sind immer Null. Das Adressfeld des Datensatzes vom Typ 02 ist immer 0000.
03 Start-Segment-Address-Record bei Programmcode. Das Adressfeld enthält 0000 und die Daten geben den Einsprungpunkt für die Programmausführung als CS:IP an (Intel-x86).
04 Erweiterter Linear-Address-Record einer 32-Bit-Adresse (LBA Linear Base Address). Das Adressfeld enthält 0000 und die Daten geben die oberen 16 Bit einer linearen 32-Bit-Adresse an (ULBA Upper Linear Base Address) an, ab der die folgenden Daten-Records zu laden sind. Mit anderen Worten: Die in den Daten angegebene Adresse wird um 16 Positionen nach links geschoben und zur Adresse im Datenrecord addiert.
05 Start-Linear-Address-Record, d.h. das Adressfeld enthält 0000 und die Daten geben den Einsprungpunkt für die Programmausführung an. Bei x86 Prozessoren ist dies der Inhalt des EIP-Registers.

Beispiel:

:10C00000576F77212044696420796F7520726561CC
:10C010006C6C7920676F207468726F756768206137
:10C020006C6C20746869732074726F75626C652023
:10C03000746F207265616420746869732073747210
:04C040007696E67397
:00000001FF

Links


Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
Letzte Aktualisierung: