2: 2009-07-16 (木) 11:32:46 |
現: 2024-01-08 (月) 12:58:49 k-tan |
- | * OSASKアプリのフォーマット | + | TITLE:x |
| + | * OSASKアプリのフォーマット [#xe0b9702] |
| -[[OsaTech]]より | | -[[OsaTech]]より |
| -(by [[K]], 2009.07.16) | | -(by [[K]], 2009.07.16) |
| | | |
- | *** (1) | + | *** (1) [#e2b2ed9a] |
| -第一世代OSASKの実行ファイルのフォーマットは、ヘッダなどが多少あるものの、結局は.textそのものだった。ヘッダも.textの一部として扱った。エントリポイントはオフセット0からで、ファイルはそのままコードセグメントのイメージになっている。これは「はりぼてOS」よりも単純な構造といっていいだろう。 | | -第一世代OSASKの実行ファイルのフォーマットは、ヘッダなどが多少あるものの、結局は.textそのものだった。ヘッダも.textの一部として扱った。エントリポイントはオフセット0からで、ファイルはそのままコードセグメントのイメージになっている。これは「はりぼてOS」よりも単純な構造といっていいだろう。 |
| -こういう仕様にしたのは理由がある。こうすればページ例外がおきるたびにそのページをロードすればいい。もしこれが何らかの構造を持つファイルで、その内容もメモリに展開するには多少の加工が必要、なんてものだったら、起動時に一度全部加工して、その後ページングによってスワップアウトされなければいけない(メモリが足りない場合)。 | | -こういう仕様にしたのは理由がある。こうすればページ例外がおきるたびにそのページをロードすればいい。もしこれが何らかの構造を持つファイルで、その内容もメモリに展開するには多少の加工が必要、なんてものだったら、起動時に一度全部加工して、その後ページングによってスワップアウトされなければいけない(メモリが足りない場合)。 |
| -シグネチャは8バイトあった(オフセット+8~+15:GUIGUI00)。 | | -シグネチャは8バイトあった(オフセット+8~+15:GUIGUI00)。 |
| | | |
- | *** (2) | + | *** (2) [#x074330e] |
| -これに対し第二世代OSASKアプリのフォーマットは複雑である。COFFやELFほどではないが、しかしこれらと同じように複数のセクションを持ち、リロケーションのための情報を持ち、ファイル内のセクションイメージはメモリイメージとは必ずしも一致しない(一致しないのはもちろんリロケーション加工の差異のため)。 | | -これに対し第二世代OSASKアプリのフォーマットは複雑である。COFFやELFほどではないが、しかしこれらと同じように複数のセクションを持ち、リロケーションのための情報を持ち、ファイル内のセクションイメージはメモリイメージとは必ずしも一致しない(一致しないのはもちろんリロケーション加工の差異のため)。 |
| -ヘッダやシグネチャもあるが、これらは.textセクションの一部ではない。というのは、ファイル全体が単純なコードセグメントのイメージではなくなった以上、よけいなヘッダやシグネチャをコードセグメントに含めておく意味が無くなったためである。 | | -ヘッダやシグネチャもあるが、これらは.textセクションの一部ではない。というのは、ファイル全体が単純なコードセグメントのイメージではなくなった以上、よけいなヘッダやシグネチャをコードセグメントに含めておく意味が無くなったためである。 |
| | | |
- | *** (3) | + | *** (3) [#f1a53d03] |
| -さらに第二世代OSASKアプリのフォーマットには、ファイルサイズを小さく保つ工夫がある。 | | -さらに第二世代OSASKアプリのフォーマットには、ファイルサイズを小さく保つ工夫がある。 |
| -簡易モード。 | | -簡易モード。 |
| --ほぼ同等の仕様はCOM64plusにもある。 | | --ほぼ同等の仕様はCOM64plusにもある。 |
| | | |
- | *** (4) | + | *** (4) [#bbc0c160] |
| -hello1.g01 (17バイトのhello) | | -hello1.g01 (17バイトのhello) |
| 47 01 05 51 "hello, world\0" | | 47 01 05 51 "hello, world\0" |
| --最初の 47 01 はシグネチャ。次の4bitの0が「簡易モード」を意味している。次の5はフラグで、「CALL([ESI]);の付与」と、「終了時の'\n'補完出力」を要求している。またC3も末尾に自動付加される。結果として、.textは次のようになる。 | | --最初の 47 01 はシグネチャ。次の4bitの0が「簡易モード」を意味している。次の5はフラグで、「CALL([ESI]);の付与」と、「終了時の'\n'補完出力」を要求している。またC3も末尾に自動付加される。結果として、.textは次のようになる。 |
- | CALL([ESI]); DB(0x51,"hello, world\0"); return; | + | CALL([ESI]); DB(0x51, "hello, world\0"); return; |
| + | --APIの引数については、[[OT/0004]]の例を参照のこと。 |
| + | --16バイトのhelloは、この12バイトのメッセージを7bitエンコードすることで11バイトに縮めたもの。 |
| -chars.g01 (13バイト) | | -chars.g01 (13バイト) |
| + | 47 01 08 9a 00 55 16 00 40 3C 7F 72 F6 |
| + | --最初の 47 01 はシグネチャ。次の4bitの0が「簡易モード」を意味している。次は89だが、これはgh4エンコードされた9のこと。この9は、「CALL([ESI]);の付与」と、「終了時の'\n'補完出力」に加え、「EAXの初期値設定」を指定。次のa0もgh4エンコードされた0x20のこと。これがEAXの初期値となる。次の0はパディングのために入っているだけなので無視される。そして結果として、.textは次のようになる。 |
| + | do { CALL([ESI]); DB(0x55, 0x16, 0x00); EAX++; } while ((unsigned) AL < 0x7f); return; |
| + | --APIの引数については、[[OT/0004]]の例を参照のこと。 |
| | | |
- | * こめんと欄 | + | * こめんと欄 [#r46afe8b] |
| #comment | | #comment |