HEXフォーマットとは、バイナリー情報をASCIIテキスト形式で運ぶためのファイル形式です。マイコンなどのデバイスにプログラム書き込みのために用いられています。これを覚えておけば、USBメモリーや通信経由でマイコンのプログラムを書き換えることができるようになります。
ここでは代表的な2大フォーマットである、Intel HEXとMotorola S-recordを紹介します。
注意
HEXフォーマットはテキストファイルであり、チェックサムも特に凝ったものではありません。このため改ざんは容易に行えます。HEXファイルを自身でしか使用しないなら何も考える必要はありませんが、配布する場合は下記のようなことを考えると良いでしょう。
- HEXファイルを暗号化する。
- HEXファイル全体のMD5やSHA、CRCなどを計算し、異常がないことを確認してから使用する。
Intel HEXフォーマット
フォーマット
Intel HEXフォーマットのレコードは、下記に示す6つのフィールドで構成されています。
RECORD MARK | RECLEN | LOAD OFFSET | RECTYP | INFO or DATA | CHKSUM |
---|---|---|---|---|---|
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つのフィールドで構成されています。
TYPE | RECORD LENGTH | ADDRESS | CODE/DATA | CHECKSUM |
---|---|---|---|---|
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ごとのフォーマットは下図のようになります。空白枠の値は不定で、対象の内容によって変わります。