1: 2008-12-29 (月) 06:04:00 [6] | 2: 2008-12-29 (月) 06:53:49 [7] | ||
---|---|---|---|
Line 6: | Line 6: | ||
*** 基本構造 | *** 基本構造 | ||
-最初の2バイトがシグネチャで、0x47 0x01。 | -最初の2バイトがシグネチャで、0x47 0x01。 | ||
- | --小文字アルファベット+0x00~0x1fの組み合わせは他でも使うかもしれないので、誰かがもし下記に似たフォーマットを独自に設計して利用するつもりなら避けてもらえると個人的にはありがたい。 | + | --大文字小文字アルファベット+0x00~0x1fの組み合わせは他でも使うかもしれないので、誰かがもし下記に似たフォーマットを独自に設計して利用するつもりなら避けてもらえると個人的にはありがたい。 |
-その次はトップレベルのタグ総数。 | -その次はトップレベルのタグ総数。 | ||
- | --この値が0だと小プログラム向け簡易形式になる。1以上なら通常形式。 | + | --この値が0だと小プログラム向け簡易形式になる。1以上なら通常形式。簡易形式ではgh4によるフラグが後続し(これは通常形式のトップレベルタグ[03]で記述される内容)、その後はバイト単位でのアラインの後、ファイル終端まですべてコードセクションのイメージと見なされる。簡易形式ではデータセクションやリロケーション情報、スタックサイズ指定なども一切できない。 |
-それ以降はすべてタグ。 | -それ以降はすべてタグ。 | ||
-数値はたいてい[[GUIGUI01/man0004]]の(1)の方法でエンコードされている。以下これをgh4エンコードと呼ぶ。 | -数値はたいてい[[GUIGUI01/man0004]]の(1)の方法でエンコードされている。以下これをgh4エンコードと呼ぶ。 | ||
---- | ---- | ||
-(例)helloc.g01 (いわゆるC言語で書いた69バイトの"hello, world\n") | -(例)helloc.g01 (いわゆるC言語で書いた69バイトの"hello, world\n") | ||
- | 47 01 28 D3 09 4C 54 89 35 0D 00 00 00 E9 15 00 | + | 47 01 28 D3 09 4C 54 89 35 10 00 00 00 E9 15 00 |
- | 00 00 31 FF 8B 35 0D 00 00 00 FF 26 55 BA 00 00 | + | 00 00 31 FF 8B 35 10 00 00 00 FF 26 55 BA 00 00 |
00 00 89 E5 57 56 E8 0B 00 00 00 50 32 30 5E 5F | 00 00 89 E5 57 56 E8 0B 00 00 00 50 32 30 5E 5F | ||
5D 99 41 28 94 8D 20 94 98 68 65 6C 6C 6F 2C 20 | 5D 99 41 28 94 8D 20 94 98 68 65 6C 6C 6F 2C 20 | ||
Line 20: | Line 20: | ||
47 01 -- シグネチャ。 | 47 01 -- シグネチャ。 | ||
- | 2 -- トップレベルタグ数2(この場合は[0d]が2個) | + | 2_ -- トップレベルタグ数2(この場合は[0D]が2個)。 |
- | 8 D3 -- [0D] セクション開始タグ, ネスト内タグ数3。 | + | _8 D3 -- [0D] セクション開始タグ、ネスト内タグ数3。 |
- | 0 -- NOPなタグ | + | 0_ -- [00] NOPなタグ。 |
- | 9 4C 54 -- [14] イメージ展開タグ, イメージ長 0x2a = 42。つまり21バイト。 | + | _9 4C 54 -- [14] イメージ展開タグ、イメージ長 0x54 = 84。つまり42バイト。 |
+ | 89 35 10 ... 5E 5F 5D -- コードセクションの中身。実際にはこの直後にC3の1バイトも足される。 | ||
+ | 99 4_ -- [19] コンパクト型リロケーション情報。要素数4。 | ||
+ | _1 28 94 -- リロケーション情報の中身。10進数で書けば、 { 1 2 9 4 }。 | ||
+ | これを翻訳すれば、コードセクションのオフセット 0x02, 0x0f, 0x17 バイト目 | ||
+ | からの4バイトの値に実際のデータセクションの開始アドレスを加算する。 | ||
+ | 8D 2_ -- [0D] セクション開始タグ、ネスト内タグ数2。 | ||
+ | _0 -- [00] NOPなタグ。 | ||
+ | 94 98 -- [14] イメージ展開タグ、イメージ長 0x18 = 24。つまり12バイト。 | ||
+ | 68 65 6C ... 72 6C 64 -- データセクションの中身。実際にはこの直後に00が32バイト追加される。 | ||
- | -(例)hellok1.g01 (いわゆる27バイトの"hello, world\n") | + | -(例)hello.g01 (いわゆる18バイトの"hello, world\n") |
- | 47 01 8D 81 94 AA FF D5 35 01 24 8D 68 65 6C 6C | + | 47 01 01 50 13 68 65 6C 6C 6F 2C 20 77 6F 72 6C |
- | 6F 2C 20 77 6F 72 6C 64 0A 44 03 | + | 64 00 |
47 01 -- シグネチャ。 | 47 01 -- シグネチャ。 | ||
- | 8D 81 -- [0D] セクション開始タグ, ネスト内タグ数1。 | + | 2_ -- トップレベルタグ数0。つまり簡易形式。 |
- | 94 AA -- [14] イメージ展開タグ, イメージ長 0x2a = 42。つまり21バイト。 | + | _1 -- フラグ1。つまり、CALL([ESI]);の自動挿入あり、自動改行有効、rjcあり、初期値テーブルなし。 |
- | FF D5 35 01 24 ... 0A 44 03 -- コードセクションの中身。 | + | 50 13 68 ... 6C 64 00 -- コードセクションの中身。実際にはこの前に FF 16 の2バイトが追加され、 |
+ | 末尾にC3の1バイトも足される。 | ||
*** タグのフォーマット | *** タグのフォーマット | ||
Line 40: | Line 49: | ||
--後続パラメータなし。 | --後続パラメータなし。 | ||
-[01]~[0B] : | -[01]~[0B] : | ||
- | //--何らかの数値を指定。後続パラメータは1つで、eh4でエンコード。 -- commented_out by K, 2008.11.19 | ||
--何らかの数値を指定。後続パラメータは1つで、gh4でエンコード。 | --何らかの数値を指定。後続パラメータは1つで、gh4でエンコード。 | ||
-[0C]~[0F] : | -[0C]~[0F] : | ||
- | //--ネスト構造型タグ。タグの中にタグが複数含まれるタグ(0や1つの場合もあるが)。まず一つのパラメータがeh4で記述され、それがネスト内に含まれるタグの数を表す。 -- commented_out by K, 2008.11.19 | ||
--ネスト構造型タグ。タグの中にタグが複数含まれるタグ(0や1つの場合もあるが)。まず一つのパラメータがgh4で記述され、それがネスト内に含まれるタグの数を表す。 | --ネスト構造型タグ。タグの中にタグが複数含まれるタグ(0や1つの場合もあるが)。まず一つのパラメータがgh4で記述され、それがネスト内に含まれるタグの数を表す。 | ||
--ネストの中にネストのタグが含まれることも当然ありうるが、その場合はネスト全体でタグ数1と数える。上記の例を参照のこと。 | --ネストの中にネストのタグが含まれることも当然ありうるが、その場合はネスト全体でタグ数1と数える。上記の例を参照のこと。 | ||
-[10]~[17] : | -[10]~[17] : | ||
- | //--4bit数値による一次元配列記述用タグ。eh4ではないエンコードのビット列などを格納するために使われている。まず一つのパラメータがeh4で記述され、それがこのタグ内に含まれるバイナリの長さを表す。ただしこの長さはバイト単位でもビット単位でもなく、4bit単位である。 -- commented_out by K, 2008.11.19 | ||
--4bit数値による一次元配列記述用タグ。gh4ではないエンコードのビット列などを格納するために使われている。まず一つのパラメータがgh4で記述され、それがこのタグ内に含まれるバイナリの長さを表す。ただしこの長さはバイト単位でもビット単位でもなく、4bit単位である。 | --4bit数値による一次元配列記述用タグ。gh4ではないエンコードのビット列などを格納するために使われている。まず一つのパラメータがgh4で記述され、それがこのタグ内に含まれるバイナリの長さを表す。ただしこの長さはバイト単位でもビット単位でもなく、4bit単位である。 | ||
-[18]~[1F] : | -[18]~[1F] : | ||
- | //--eh4による一次元配列記述用タグ。eh4でエンコードされた数値列を格納するために使われている。まず一つのパラメータがeh4で記述され、それがこのタグ内に含まれるeh4数値の個数を表す。 -- commented_out by K, 2008.11.19 | ||
--gh4による一次元配列記述用タグ。gh4でエンコードされた数値列を格納するために使われている。まず一つのパラメータがgh4で記述され、それがこのタグ内に含まれるgh4数値の個数を表す。 | --gh4による一次元配列記述用タグ。gh4でエンコードされた数値列を格納するために使われている。まず一つのパラメータがgh4で記述され、それがこのタグ内に含まれるgh4数値の個数を表す。 | ||
-[20]~[27] : | -[20]~[27] : | ||
--[10]~[17]の形式の配列記述用タグ。たとえば可変長文字列の配列などを記述するために使う。 | --[10]~[17]の形式の配列記述用タグ。たとえば可変長文字列の配列などを記述するために使う。 | ||
- | //--最初にeh4があって、これが文字列の個数に相当。そしてその個数の回数だけ「各文字列長に相当するeh4と文字列そのものに相当する4bit配列」を繰り返す。 -- commented_out by K, 2008.11.19 | ||
--最初にgh4があって、これが文字列の個数に相当。そしてその個数の回数だけ「各文字列長に相当するgh4と文字列そのものに相当する4bit配列」を繰り返す。 | --最初にgh4があって、これが文字列の個数に相当。そしてその個数の回数だけ「各文字列長に相当するgh4と文字列そのものに相当する4bit配列」を繰り返す。 | ||
-[28]以降のタグ番号については、どんなフォーマットを取るかの規定はまだない。 | -[28]以降のタグ番号については、どんなフォーマットを取るかの規定はまだない。 | ||
Line 64: | Line 68: | ||
--なおタグ番号[03]以上のタグが一度でも表れた後にこのタグが出てくる可能性はない。もし万一そんなことがあればそこから先は解釈する必要がない。 | --なおタグ番号[03]以上のタグが一度でも表れた後にこのタグが出てくる可能性はない。もし万一そんなことがあればそこから先は解釈する必要がない。 | ||
-[02] リザーブ。 | -[02] リザーブ。 | ||
- | -[03] rjcフラグとファイルアクセスレベルの指定。bit0がrjcフラグ。bit1-2がファイルアクセスレベル。 | + | -[03] 各種フラグ類の指定。 |
+ | --bit0がCALL([ESI]);の自動挿入フラグ(これが1だとコードセクションの最初に FF 16 の2バイトが追加される)。 | ||
+ | --bit1が自動改行禁止(これが1だとアプリ終了時にコンソール出力の最後が'\n'でなかったとしても、特に何もしない。0ならこういう場合は'\n'を追加出力してから終了する)。 | ||
+ | --bit2がrjcなし(これが1だとrjcがかかっていないことを示す)。 | ||
+ | --bit3-4が初期値テーブル。0なら初期値テーブルなし。1ならEAXの初期値テーブルあり。2ならEAXとECXの初期値テーブルあり。3ならフルセット仕様の初期値テーブルあり。 | ||
+ | --このタグを省略すると0を指定したものと見なされる。 | ||
-[04] スタックサイズの指定(指数部)。 | -[04] スタックサイズの指定(指数部)。 | ||
--このタグを見つけると自動的に仮数部のデフォルトが1に設定される。したがって仮数部も指定するときは、先にこのタグで指数部を指定してからにする。0で4KB単位(=スタックサイズ=仮数部×4KB)、1で16KB単位、2で64KB単位、3で256KB単位、以下省略。 | --このタグを見つけると自動的に仮数部のデフォルトが1に設定される。したがって仮数部も指定するときは、先にこのタグで指数部を指定してからにする。0で4KB単位(=スタックサイズ=仮数部×4KB)、1で16KB単位、2で64KB単位、3で256KB単位、以下省略。 | ||
Line 73: | Line 82: | ||
-[08] リザーブ(malloc領域はbss内にとればよい)。 | -[08] リザーブ(malloc領域はbss内にとればよい)。 | ||
-[09] リザーブ。 | -[09] リザーブ。 | ||
- | //-[08] malloc用領域のサイズ指定(指数部)。指定方法はスタックサイズと同じ。 | ||
- | //--デフォルトは、指数部=4KB、仮数部=512。つまり2MB。 | ||
- | //-[09] malloc用領域のサイズ指定(仮数部)。指定方法はスタックサイズと同じ。 | ||
- | // -- commented_out by K, 2008.11.19 | ||
-[0A] メモリマップトファイル用の領域のサイズ指定(指数部)。指定方法はスタックサイズと同じ。 | -[0A] メモリマップトファイル用の領域のサイズ指定(指数部)。指定方法はスタックサイズと同じ。 | ||
--デフォルトは、指数部=4KB、仮数部=256。つまり1MB。 | --デフォルトは、指数部=4KB、仮数部=256。つまり1MB。 | ||
Line 102: | Line 107: | ||
-[0C] コメントタグ。このタグ内の記述はすべて無視する。 | -[0C] コメントタグ。このタグ内の記述はすべて無視する。 | ||
---- | ---- | ||
- | -[14] セクションイメージタグ。バイナリデータをそのまま記述。 | + | -[14] セクションイメージタグ。バイナリデータをそのまま記述。なお、コードセクションは必ず末尾に1バイトのC3が付与されるし、データセクションには必ず末尾に32バイトの00が付与される。コードセクションは、フラグの値によっては、 FF 16 も先頭に挿入される。これらの挿入されるバイト数は、イメージのサイズには含まれない。 |
---- | ---- | ||
-[18] コメントタグ。このタグ内の記述はすべて無視する。 | -[18] コメントタグ。このタグ内の記述はすべて無視する。 |
(This host) = http://osask.net