![]() |
Das Intel-HexformatProf. Jürgen Plate |
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. |
:10010000214601360121470136007EFE09D2190140Es 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
| 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. |
:10C00000576F77212044696420796F7520726561CC
:10C010006C6C7920676F207468726F756768206137
:10C020006C6C20746869732074726F75626C652023
:10C03000746F207265616420746869732073747210
:04C040007696E67397
:00000001FF