3: 2008-11-13 (木) 21:44:44 [6] | 現: 2024-01-08 (月) 12:58:41 k-tan[7] [8] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | * 「ぐいぐい01」のアプリフォーマット | + | TITLE:x |
+ | * 「ぐいぐい01」のアプリフォーマット [#a5e9975a] | ||
-(by [[K]], 2008.11.13) | -(by [[K]], 2008.11.13) | ||
- | *** 註 | + | *** 註 [#g2117a6b] |
- | -所詮はOSASK-HB向けなのでまあ暫定的なものです。とりあえず2008.11.13時点で最新のabcdw003での仕様を書きました。 | + | //-所詮はOSASK-HB向けなのでまあ暫定的なものです。とりあえず2008.11.13時点で最新のabcdw003での仕様を書きました。 -- commented_out by K, 2008.11.19 |
- | *** 基本構造 | + | -所詮はOSASK-HB向けなのでまあ暫定的なものです。とりあえず2008.11.19時点で近日リリース予定のabcdw004での仕様を書きました。 |
+ | -これはCOLOR(#ff0000){''旧仕様''}です。新仕様はこちら。→[[GUIGUI01/man0005]] | ||
+ | *** 基本構造 [#hc8ff9de] | ||
-最初の2バイトがシグネチャで、0x47 0x01。 | -最初の2バイトがシグネチャで、0x47 0x01。 | ||
+ | --小文字アルファベット+0x00~0x1fの組み合わせは他でも使うかもしれないので、誰かがもし下記に似たフォーマットを独自に設計して利用するつもりなら避けてもらえると個人的にはありがたい。 | ||
-それ以降はすべてタグ。 | -それ以降はすべてタグ。 | ||
- | -数値はたいてい[[GUIGUI01/memo01]]の(6)の方法でエンコードされている。以下これをeh4エンコードと呼ぶ。 | + | //-数値はたいてい[[GUIGUI01/memo01]]の(6)の方法でエンコードされている。以下これをeh4エンコードと呼ぶ。 -- commented_out by K, 2008.11.19 |
+ | -数値はたいてい[[GUIGUI01/man0004]]の(1)の方法でエンコードされている。以下これをgh4エンコードと呼ぶ。 | ||
---- | ---- | ||
- | -(例)hellok0.g01 (いわゆる27バイトの"hello, world\n") | + | //-(例)hellok0.g01 (いわゆる27バイトの"hello, world\n") |
- | 47 01 8D 19 4A 2A FF D5 35 01 24 8D 68 65 6C 6C | + | // 47 01 8D 19 4A 2A FF D5 35 01 24 8D 68 65 6C 6C |
+ | // 6F 2C 20 77 6F 72 6C 64 0A 44 03 | ||
+ | // | ||
+ | // 47 01 -- シグネチャ。 | ||
+ | // 8D 1_ -- [0D] セクション開始タグ, ネスト内タグ数1。 | ||
+ | // _9 4_A 2A -- [14] イメージ展開タグ, イメージ長 0x2a = 42。つまり21バイト。 | ||
+ | // FF D5 35 01 24 ... 0A 44 03 -- コードセクションの中身。 | ||
+ | // -- commented_out by K, 2008.11.19 | ||
+ | -(例)hellok1.g01 (いわゆる27バイトの"hello, world\n") | ||
+ | 47 01 8D 81 94 AA FF D5 35 01 24 8D 68 65 6C 6C | ||
6F 2C 20 77 6F 72 6C 64 0A 44 03 | 6F 2C 20 77 6F 72 6C 64 0A 44 03 | ||
47 01 -- シグネチャ。 | 47 01 -- シグネチャ。 | ||
- | 8D 1_ -- [0D] セクション開始タグ, ネスト内タグ数1。 | + | 8D 81 -- [0D] セクション開始タグ, ネスト内タグ数1。 |
- | _9 4_A 2A -- [14] イメージ展開タグ, イメージ長 0x2a = 42。つまり21バイト。 | + | 94 AA -- [14] イメージ展開タグ, イメージ長 0x2a = 42。つまり21バイト。 |
FF D5 35 01 24 ... 0A 44 03 -- コードセクションの中身。 | FF D5 35 01 24 ... 0A 44 03 -- コードセクションの中身。 | ||
- | *** タグのフォーマット | + | |
- | -タグ番号はすべてeh4でエンコード。このルールはネスト内のタグでも有効。 | + | *** タグのフォーマット [#o315fdd6] |
+ | -タグ番号はすべてgh4でエンコード。このルールはネスト内のタグでも有効。 | ||
-[00] : | -[00] : | ||
--後続パラメータなし。 | --後続パラメータなし。 | ||
-[01]~[0B] : | -[01]~[0B] : | ||
- | --何らかの数値を指定。後続パラメータは1つで、eh4でエンコード。 | + | //--何らかの数値を指定。後続パラメータは1つで、eh4でエンコード。 -- commented_out by K, 2008.11.19 |
+ | --何らかの数値を指定。後続パラメータは1つで、gh4でエンコード。 | ||
-[0C]~[0F] : | -[0C]~[0F] : | ||
- | --ネスト構造型タグ。タグの中にタグが複数含まれるタグ(0や1つの場合もあるが)。まず一つのパラメータがeh4で記述され、それがネスト内に含まれるタグの数を表す。 | + | //--ネスト構造型タグ。タグの中にタグが複数含まれるタグ(0や1つの場合もあるが)。まず一つのパラメータがeh4で記述され、それがネスト内に含まれるタグの数を表す。 -- commented_out by K, 2008.11.19 |
+ | --ネスト構造型タグ。タグの中にタグが複数含まれるタグ(0や1つの場合もあるが)。まず一つのパラメータがgh4で記述され、それがネスト内に含まれるタグの数を表す。 | ||
--ネストの中にネストのタグが含まれることも当然ありうるが、その場合はネスト全体でタグ数1と数える。上記の例を参照のこと。 | --ネストの中にネストのタグが含まれることも当然ありうるが、その場合はネスト全体でタグ数1と数える。上記の例を参照のこと。 | ||
-[10]~[17] : | -[10]~[17] : | ||
- | --バイナリ記述用タグ。eh4ではないエンコードのビット列などを格納するために使われている。まず一つのパラメータがeh4で記述され、それがこのタグ内に含まれるバイナリの長さを表す。ただしこの長さはバイト単位でもビット単位でもなく、4bit単位である。 | + | //--4bit数値による一次元配列記述用タグ。eh4ではないエンコードのビット列などを格納するために使われている。まず一つのパラメータがeh4で記述され、それがこのタグ内に含まれるバイナリの長さを表す。ただしこの長さはバイト単位でもビット単位でもなく、4bit単位である。 -- commented_out by K, 2008.11.19 |
- | -[18]~[1f] : | + | --4bit数値による一次元配列記述用タグ。gh4ではないエンコードのビット列などを格納するために使われている。まず一つのパラメータがgh4で記述され、それがこのタグ内に含まれるバイナリの長さを表す。ただしこの長さはバイト単位でもビット単位でもなく、4bit単位である。 |
- | --書きつかれたので詳細は後日。 | + | -[18]~[1F] : |
- | -[20]以降のタグ番号については、どんなフォーマットを取るかの規定はまだない。 | + | //--eh4による一次元配列記述用タグ。eh4でエンコードされた数値列を格納するために使われている。まず一つのパラメータがeh4で記述され、それがこのタグ内に含まれるeh4数値の個数を表す。 -- commented_out by K, 2008.11.19 |
- | *** タグのコード(ルート内) | + | --gh4による一次元配列記述用タグ。gh4でエンコードされた数値列を格納するために使われている。まず一つのパラメータがgh4で記述され、それがこのタグ内に含まれるgh4数値の個数を表す。 |
+ | -[20]~[27] : | ||
+ | --[10]~[17]の形式の配列記述用タグ。たとえば可変長文字列の配列などを記述するために使う。 | ||
+ | //--最初にeh4があって、これが文字列の個数に相当。そしてその個数の回数だけ「各文字列長に相当するeh4と文字列そのものに相当する4bit配列」を繰り返す。 -- commented_out by K, 2008.11.19 | ||
+ | --最初にgh4があって、これが文字列の個数に相当。そしてその個数の回数だけ「各文字列長に相当するgh4と文字列そのものに相当する4bit配列」を繰り返す。 | ||
+ | -[28]以降のタグ番号については、どんなフォーマットを取るかの規定はまだない。 | ||
+ | *** タグのコード(ルート内) [#pd157e72] | ||
-[00] 何もしない。NOPなタグ。パディングなどで使いたければ使う。 | -[00] 何もしない。NOPなタグ。パディングなどで使いたければ使う。 | ||
---- | ---- | ||
- | -[01] リザーブ。 | + | -[01] フォーマットタイプ規定。 |
+ | --以降のフォーマットを指定するタグ。しかしたいてい省略される(サイズがもったいないので)。このタグが省略されているときは、「ぐいぐい01」仕様のIA-32アプリ(=フォーマット番号1)。このタグで1以外のパラメータが来た場合は他のフォーマットを指定している可能性があるので以降のタグの解釈をやめて実行をするべきではない。 | ||
+ | --なおタグ番号[03]以上のタグが一度でも表れた後にこのタグが出てくる可能性はない。もし万一そんなことがあればそこから先は解釈する必要がない。 | ||
-[02] リザーブ。 | -[02] リザーブ。 | ||
-[03] rjcフラグとファイルアクセスレベルの指定。bit0がrjcフラグ。bit1-2がファイルアクセスレベル。 | -[03] rjcフラグとファイルアクセスレベルの指定。bit0がrjcフラグ。bit1-2がファイルアクセスレベル。 | ||
Line 43: | Line 68: | ||
-[06] リザーブ。 | -[06] リザーブ。 | ||
-[07] リザーブ。 | -[07] リザーブ。 | ||
- | -[08] malloc用領域のサイズ指定(指数部)。指定方法はスタックサイズと同じ。 | + | -[08] リザーブ(malloc領域はbss内にとればよい)。 |
- | --デフォルトは、指数部=4KB、仮数部=512。つまり2MB。 | + | -[09] リザーブ。 |
- | -[09] malloc用領域のサイズ指定(仮数部)。指定方法はスタックサイズと同じ。 | + | //-[08] malloc用領域のサイズ指定(指数部)。指定方法はスタックサイズと同じ。 |
+ | //--デフォルトは、指数部=4KB、仮数部=512。つまり2MB。 | ||
+ | //-[09] malloc用領域のサイズ指定(仮数部)。指定方法はスタックサイズと同じ。 | ||
+ | // -- commented_out by K, 2008.11.19 | ||
-[0A] メモリマップトファイル用の領域のサイズ指定(指数部)。指定方法はスタックサイズと同じ。 | -[0A] メモリマップトファイル用の領域のサイズ指定(指数部)。指定方法はスタックサイズと同じ。 | ||
--デフォルトは、指数部=4KB、仮数部=256。つまり1MB。 | --デフォルトは、指数部=4KB、仮数部=256。つまり1MB。 | ||
Line 51: | Line 79: | ||
---- | ---- | ||
-[0C] コメントタグ。このタグ内の記述はすべて無視する。 | -[0C] コメントタグ。このタグ内の記述はすべて無視する。 | ||
+ | --コメント用タグが何種類もあるのは、バイナリエディタでちょっとタグをコメントアウトしたいときのため。それぞれのフォーマットタイプにコメント形式がある。 | ||
+ | --[01]~[0B]の形式のコメントは原則として用意しない。これは [00] [00] に書き換えることでコメントアウトできるから。・・・むろん複雑な構造のタグも全部[00]で埋め尽くすことでもコメントアウトはできるが、修正箇所が多くて大変だろうと思うので、それぞれにコメント形式がある。 | ||
+ | --もちろんコメントアウトのみならず、構造を持ったコメントとして使うこともできる。いずれにせよ、「ぐいぐい01」ローダはこれらを無条件に読み飛ばす。そして[01]~[0B]の形式のコメントはこの用途でも使い道がないと考えているので用意していない(数値一つをただ置けるだけではコメントとして記述力がなさ過ぎる)。 | ||
-[0D] セクション記述タグ。下記参照。 | -[0D] セクション記述タグ。下記参照。 | ||
---- | ---- | ||
+ | -[18] コメントタグ。このタグ内の記述はすべて無視する。 | ||
-上記以外はリザーブ。 | -上記以外はリザーブ。 | ||
- | *** タグのコード(セクション記述タグ内) | + | *** タグのコード(セクション記述タグ内) [#h7398d43] |
-[00] 何もしない、NOPなタグ。パディングなどで使いたければ使う。 | -[00] 何もしない、NOPなタグ。パディングなどで使いたければ使う。 | ||
---- | ---- | ||
Line 69: | Line 101: | ||
-[14] セクションイメージタグ。バイナリデータをそのまま記述。 | -[14] セクションイメージタグ。バイナリデータをそのまま記述。 | ||
---- | ---- | ||
- | -[19] コンパクト型リロケーション情報。書きつかれたので詳細は後日。 | + | -[18] コメントタグ。このタグ内の記述はすべて無視する。 |
+ | -[19] コンパクト型リロケーション情報。これを配置するときは必ず[14]の後になる(直後である必要はない)。 | ||
+ | --このリロケーションアルゴリズムは、バイナリの指定したオフセットからの4バイトに対して、指定したセクションの開始アドレスの値をリトルエンディアンで加えるというただそれだけのことをする。 | ||
+ | //--[19]ではeh4の配列になっているわけだが、最初の要素は「*どの*セクションの開始アドレスを加算するか」である。残りの要素が、補正の必要なオフセットの羅列になっているのだが、これはコンパクト化のための細工がある。まず補正が必要なオフセットをすべて並べて、これをソートして昇順にする。そしてデータセクションへのリンク情報の場合、オフセットを全部4で割る(つまりデータセクション内のアドレス情報はすべてアラインされていると仮定している・・・これに適合しない場合は[1A]のリロケーション情報を使う)。さらにオフセット列の最初の要素以外は前の値からの増分値のみをeh4にして並べる。 -- commented_out by K, 2008.11.19 | ||
+ | --[19]ではgh4の配列になっているわけだが、最初の要素は「*どの*セクションの開始アドレスを加算するか」である。残りの要素が、補正の必要なオフセットの羅列になっているのだが、これはコンパクト化のための細工がある。まず補正が必要なオフセットをすべて並べて、これをソートして昇順にする。そしてデータセクションへのリンク情報の場合、オフセットを全部4で割る(つまりデータセクション内のアドレス情報はすべてアラインされていると仮定している・・・これに適合しない場合は[1A]のリロケーション情報を使う)。さらにオフセット列の最初の要素以外は前の値+4からの増分値のみをgh4にして並べる(データセクションの場合は前の値+1からの増分値)。 | ||
+ | --一つのセクションに対して、コードセクションとデータセクションの両方の補正が必要になることももちろんありうる。その場合は、[19]のタグが2回現れることとなる。bssセクションのアドレスも参照する場合は3回現れることもありえるだろう。 | ||
+ | -[1A] コンパクトではないリロケーション情報。フォーマットの詳細はまだ決めていない。 | ||
---- | ---- | ||
-上記以外はすべてリザーブ。 | -上記以外はすべてリザーブ。 |
(This host) = http://osask.net