Intel HEXはバイナリ情報をASCIIテキスト形式で記載したファイル形式である。マイクロコントローラやEPROMなどのプログラム可能なデバイスのプログラム書き込みのために広く用いられている。典型的な利用用途としてはコンパイラやアセンブラがプログラムのC言語やアセンブリ言語などのソースコードを機械語に変換し、HEXファイルとして出力する。HEXファイルはROMにマシン語のコードを「焼く」ために書き込み機によって読み込まれたり、対象のシステムで読み込んだり実行したりするために転送されたりする[1]。
Intel HEXは改行コードによって区切られた複数行のASCIIテキストからなる。各行は複数の2進数値をエンコードする16進数の文字を含む。2進数の値は行の位置や形式、長さによってデータ、メモリアドレスなどに相当する。各行はレコードと呼ばれる。
レコード(テキストの行)は左から順に並んだ6つのフィールド(部分)を有する:
視覚的な補助として、Intel HEXレコードのフィールドはこの記事において以下のように色分けされる。
スタートコード バイトカウント アドレス レコードタイプ データ チェックサム
チェックサムの値はレコード内のチェックサムの前のデコードされたバイト値全ての合計の最下位ビット(LSB)の2の補数である。
例えば、:0300300002337A1Eのようなレコードの場合、デコードされたバイト値の合計は03 + 00 + 30 + 00 + 02 + 33 + 7A = E2
である。E2
の2の補数は1Eであり、これがレコードの末尾に表れているチェックサムである。
レコードの妥当性はそのレコードのチェックサムを計算し、計算されたチェックサムがレコードに表れているチェックサムと一致するかを確認することで検証される。
Intel HEXレコードは1行に1つのレコードが表記されるように1つまたは複数の改行コードによって区切られる。このことはレコードを視覚的に区切ることによって可読性を向上し、レコード間のパディングを提供することで機械による構文解析の効率を高めることを可能にしている。
HEXレコードを作成するプログラムは典型的にはそれらの動作するオペレーティングシステムの慣例に従うような改行コードを用いる。例えばLinux上のプログラムはLF(ラインフィード,16進数で0A
)を単独で行末に用い、Windows上のプログラムはCR(キャリッジリターン,16進数で0D
)とそれに続くLFを用いる。
Intel HEXは以下の6つの標準的なレコードタイプを持つ。
16進コード | レコードタイプ | 解説 | 例 |
---|---|---|---|
00 | データ | データとその16ビットの開始アドレスを含む。バイトカウントはレコード内のデータのバイト数を示す。右に示す例は0B(10進数で11)バイトのデータ(61,64,64,72,65,73,73,20,67,61,70)が0010で始まる連続したアドレスに置かれる。 | :0B0010006164647265737320676170A7 |
01 | End Of File | ファイルの最終行に1回必ず表記される。データフィールドは空白(よってバイトカウントは00)であり、 アドレスフィールドは0000が一般的である。 | :00000001FF |
02 | 拡張セグメントアドレス | データフィールドには80x86のリアルモードアドレッシングと互換性のある16ビットのセグメントベースアドレス(よってバイトカウントは02)が格納される。アドレスフィールド(通常0000)は無視される。もっとも最近の02レコードから得られたセグメントアドレスには16が掛けられ、それに続くデータレコードのアドレスと足されることでデータの開始物理アドレスが求められる。これにより、1メガバイトまでのアドレス空間のアドレス指定が可能になる。 | :020000021200EA |
03 | 開始セグメントアドレス | 80x86プロセッサにおいてはCS:IPレジスタの初期値が示される。アドレスフィールドは0000でバイトカウントは04であり、最初の2バイトはCSの値、残りの2バイトはIPの値である。 | :0400000300003800C1 |
04 | 拡張リニアアドレス | 32ビット(4GiBまで)アドレッシングを可能にする。アドレスフィールド(通常0000)は無視され、バイトカウントは常に02である。2つのエンコードされたビッグエンディアンのデータがそれに続く全ての00タイプのレコードの32ビット絶対アドレスの上位16ビットを示す。これらの上位アドレスビットは次の04レコードまで有効である。00レコードの前に04レコードが存在しない場合、アドレスの上位16ビットはデフォルトの0000となる。00レコードの絶対アドレスはもっとも最近の04レコードによる上位16ビットと00レコードの下位16ビットを組み合わせることで求められる。 | :02000004FFFFFC |
05 | 開始リニアアドレス | アドレスフィールドは0000(未使用)であり、バイトカウントは04である。4バイトのデータが80386以降のCPUのEIPレジスタにロードされる32ビットの値を示す。 | :04000005000000CD2A |
特定のレコードタイプのサブセットを用いるHEXファイルのフォーマットを示すために特別な名称が用いられることがある。以下がその例である。
以下の例は4つのデータレコードとそれに続くEnd Of Fileレコードを含むファイルを示す。
:10010000214601360121470136007EFE09D2190140 :100110002146017E17C20001FF5F16002148011928 :10012000194E79234623965778239EDA3F01B2CAA7 :100130003F0156702B5E712B722B732146013421C7 :00000001FF