Intel HEXはバイナリ情報をASCIIテキスト形式で記載したファイル形式である。マイクロコントローラやEPROMなどのプログラム可能なデバイスのプログラム書き込みのために広く用いられている。典型的な利用用途としてはコンパイラやアセンブラがプログラムのC言語やアセンブリ言語などのソースコードを機械語に変換し、HEXファイルとして出力する。HEXファイルはROMにマシン語のコードを「焼く」ために書き込み機によって読み込まれたり、対象のシステムで読み込んだり実行したりするために転送されたりする[1]。
形式
Intel HEXは改行コードによって区切られた複数行のASCIIテキストからなる。各行は複数の2進数値をエンコードする16進数の文字を含む。2進数の値は行の位置や形式、長さによってデータ、メモリアドレスなどに相当する。各行はレコードと呼ばれる。
レコード構造
レコード(テキストの行)は左から順に並んだ6つのフィールド(部分)を有する:
- スタートコード、1文字、ASCIIのコロン':'。
- バイトカウント、16進数2桁、データフィールドに含まれるバイト(2桁の16進数)の数を示す。最大値は255(0xFF)。16(0x10)や32(0x20)が広く用いられている。
- アドレス、16進数4桁、データの16ビットの開始メモリアドレスオフセットを表す。データの物理アドレスはこのオフセットを前もって決められたベースアドレスに加算することで計算される。これにより、16ビットアドレスの64キロバイト制限を超えてメモリアドレスを指定することができる。ベースアドレスはデフォルトが0であるが、様々なタイプのレコードによって変更することができる。ベースアドレスとアドレスオフセットは常にビッグエンディアンで表記される。
- レコードタイプ (以下のレコードタイプを参照)、16進数2桁、00から05でありデータフィールドの意味を表す。.
- データ、2n桁の16進数で表記されたnバイトのデータの並び。一部のレコードではこのフィールドは省略される(nは0)。データの意味と表現は用途による。
- チェックサム、16進数2桁、レコードにエラーがないことを検証するために計算された値。
色凡例
視覚的な補助として、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ファイルのフォーマットを示すために特別な名称が用いられることがある。以下がその例である。
- I8HEXはレコードタイプ00と01のみを用いる。(16ビットアドレッシング)
- I16HEXはレコードタイプ00から03のみを用いる。(20ビットアドレッシング)
- I32HEXはレコードタイプ00,01,04,05のみを用いる。(32ビットアドレッシング)
ファイル例
以下の例は4つのデータレコードとそれに続くEnd Of Fileレコードを含むファイルを示す。
:10010000214601360121470136007EFE09D2190140
:100110002146017E17C20001FF5F16002148011928
:10012000194E79234623965778239EDA3F01B2CAA7
:100130003F0156702B5E712B722B732146013421C7
:00000001FF
関連項目
- 記事
- S-record (SREC) - モトローラによる16進数ファイルフォーマット
- TekHex - テクトロニクスによる16進数ファイルフォーマット
- その他
参考文献
外部リンク
- ドキュメンテーション
- ソフトウェア
- intelhex2bin - C言語のソースコード付きのIntel HEXからバイナリへのコンバータ
- binex - Intel HEXとバイナリの相互コンバータ
- libgis - Intel HEXなどのフォーマットを変換するオープンソースのライブラリ