HEXフォーマット

HEXフォーマットとは、バイナリー情報をASCIIテキスト形式で運ぶためのファイル形式です。マイコンなどのデバイスにプログラム書き込みのために用いられています。これを覚えておけば、USBメモリーや通信経由でマイコンのプログラムを書き換えることができるようになります。

ここでは代表的な2大フォーマットである、Intel HEXとMotorola S-recordを紹介します。

目次

注意

HEXフォーマットはテキストファイルであり、チェックサムも特に凝ったものではありません。このため改ざんは容易に行えます。HEXファイルを自身でしか使用しないなら何も考える必要はありませんが、配布する場合は下記のようなことを考えると良いでしょう。

  • HEXファイルを暗号化する。
  • HEXファイル全体のMD5やSHA、CRCなどを計算し、異常がないことを確認してから使用する。

Intel HEXフォーマット

フォーマット

Intel HEXフォーマットのレコードは、下記に示す6つのフィールドで構成されています。

スクロールできます
RECORD MARKRECLENLOAD OFFSETRECTYPINFO or DATACHKSUM
1バイト1バイト2バイト1バイトnバイト(※1)1バイト

※1:RECLENで指定したバイト数になります。

表の下段は各フィールドのバイト数になります。ただしRECORD MARKを除く残りのフィールドは16進数のASCII形式のため、2文字で1バイトという扱いになります。なお各アドレスデータはビッグエンディアンで記述します。

RECTYPを除くフィールドについて

RECORD MARKフィールド

Intel HEXフォーマットは、ASCIIのコロン「:」から始まります。

RECLENフィールド

情報またはデータフィールドに格納されているバイト数を表します。「0」の場合は、情報またはデータフィールドがないことを表します。

LOAD OFFSETフィールド

データのアドレスオフセットを表します。基準となる絶対アドレスの初期値は0ですが、各種レコードタイプにて変更することができます。なおデータレコード以外では「0000」となります。

INFO or DATAフィールド

レコードの内容に合わせたデータが入っています。

CHKSUMフィールド

レコードにエラーがないかを検証するための値です。RECLENフィールドからINFO or DATAフィールドまでの、各バイト値の合計の2の補数となります。
例) 「:0300300002337A1E」⇒「03+00+30+00+02+33+7A = E2」 「E2」の2の補数で「1E」となります。

RECTYPフィールドについて

RECTYP = 00

データレコード(Data Record)。
データフィールドには、書き込むデータ(メモリーイメージの一部)が入っています。

RECTYP = 01

エンドレコード(End of File Record)。
オブジェクトファイルの終了を表します。データフィールドは空です。

RECTYP = 02

拡張セグメントアドレスレコード(Extended Segment Address Record)。
16bitアドレスであるIntel HEXファイルを20bitアドレスにまで拡張するためのものです。データフィールドにはセグメントアドレスが入ります。セグメントアドレスを4bit左にシフトした値に、アドレスオフセットを加算した値が絶対アドレスになります。
例) セグメントアドレス = 1234h、アドレスオフセット = 3456h 絶対アドレス = (1234h << 4) + 3456h = 15796h

RECTYP = 03

スタートセグメントアドレスレコード(Start Segment Address Record)。
オブジェクトファイルの、実行開始アドレスを指定するために使用します。このレコードは、8086/80186の20ビットセグメントアドレス空間内のコードアドレスのみを指定することに注意してください。データフィールドでは16ビットのCSレジスターと、16ビットのIPレジスターを指定します。
例) 「:04000003FF000123D6」⇒ CS = FF00h、IP = 0123h 絶対アドレス = (FF00h << 4) + 0123h = FF123h

RECTYP = 04

拡張リニアアドレスレコード(Extended Linear Address Record)。
20bitアドレスまでしか指定できないセグメントアドレスレコードに代わり、32bitアドレスまで指定可能にするためのものです。32bitアドレスのうち、本レコードのデータフィールドでは上位16bitを指定し、データレコードのアドレスオフセットで下位16bitを指定します。
例) 拡張リニアアドレスレコード = 1234h、アドレスオフセット = 5678h 絶対アドレス = (1234h << 16) + 5678h = 12345678h

RECTYP = 05

スタートリニアアドレスレコード(Start Linear Address Record)。
オブジェクトファイルの実行開始アドレスを指定するために使用します。このレコードは、80386の32ビットリニアアドレス空間内のコードアドレスのみを指定することに注意してください。データフィールドでは32ビットのEIPレジスターを指定します。

フォーマット例

RECTYPごとのフォーマットは下図のようになります。空白枠の値は不定で、対象の内容によって変わります。

Motorola S-recordフォーマット

フォーマット

フォーマットのレコードは、下記表に示す5つのフィールドで構成されています。

スクロールできます
TYPERECORD LENGTHADDRESSCODE/DATACHECKSUM
2バイト1バイト2~4バイトnバイト(※1)1バイト

※1:RECORD LENGTHで指定したバイト数から、ADDRESSとCHECKSUMのバイト数を引いたバイト数になります。

表の下段は各フィールドのバイト数になります。ただしTYPEを除く残りのフィールドは16進数のASCII形式のため、2文字で1バイトという扱いになります。なお各アドレスデータはビッグエンディアン記述します。

TYPEを除くフィールドについて

RECORD LENGTHフィールド

ADDRESS・CODE/DATA・CHECKSUMフィールドを合わせたバイト数を表します。

ADDRESSフィールド

データを書き込むアドレスを表します。

CODE/DATAフィールド

レコードの内容に合わせたデータが入っています。

CHECKSUMフィールド

レコードにエラーがないかを検証するための値です。RECORD LENGTHフィールドからCODE/DATAフィールドまでの、各バイト値の合計の1の補数となります。
例) 「S00600004844521B」⇒「06+00+00+48+44+52 = E4」 「E4」の1の補数で「1B」となります。

TYPEフィールドについて

TYPE = S0

ヘッダーレコード。
ADDRESSフィールドは、一般的に「0000」となります。CODE/DATAフィールドには、ファイル名やコメントなどを入れます。

TYPE = S1

16ビットアドレス指定のデータレコード。
ADDRESSフィールドは、2バイトになります。CODE/DATAフィールドには、書き込むデータ(メモリーイメージの一部)が入っています。

TYPE = S2

24ビットアドレス指定のデータレコード。
ADDRESSフィールドは、3バイトになります。CODE/DATAフィールドには、書き込むデータ(メモリーイメージの一部)が入っています。

TYPE = S3

32ビットアドレス指定のデータレコード。
ADDRESSフィールドは、4バイトになります。CODE/DATAフィールドには、書き込むデータ(メモリーイメージの一部)が入っています。

TYPE = S5

特定のブロックで送信されたレコード数を表すレコード。
ADDRESSフィールドには、S1・S2・S3レコードの数が2バイトで入っています。CODE/DATAフィールドはありません。

TYPE = S6

特定のブロックで送信されたレコード数を表すレコード。
ADDRESSフィールドには、S1・S2・S3レコードの数が3バイトで入っています。CODE/DATAフィールドはありません。

TYPE = S7

S3レコードの終わりを表すレコード。
ADDRESSフィールドには、4バイトで実行開始アドレスを示している場合があります。CODE/DATAフィールドはありません。

TYPE = S8

S2レコードの終わりを表すレコード。
ADDRESSフィールドには、3バイトで実行開始アドレスを示している場合があります。CODE/DATAフィールドはありません。

TYPE = S9

S1レコードの終わりを表すレコード。
ADDRESSフィールドには、2バイトで実行開始アドレスを示している場合があります。CODE/DATAフィールドはありません。

フォーマット例

TYPEごとのフォーマットは下図のようになります。空白枠の値は不定で、対象の内容によって変わります。

目次