サイトトップへ
OSASK.NET
  サイトトップへ       新掲示板(閉鎖済)   Wiki(凍結済)   旧掲示板(廃止済)   ニュース(廃止済)  
3: 2009-07-16 (木) 11:42:03 ソース 現: 2024-01-08 (月) 12:58:49 k-tan ソース
Line 1: Line 1:
-* 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」よりも単純な構造といっていいだろう。
-こういう仕様にしたのは理由がある。こうすればページ例外がおきるたびにそのページをロードすればいい。もしこれが何らかの構造を持つファイルで、その内容もメモリに展開するには多少の加工が必要、なんてものだったら、起動時に一度全部加工して、その後ページングによってスワップアウトされなければいけない(メモリが足りない場合)。 -こういう仕様にしたのは理由がある。こうすればページ例外がおきるたびにそのページをロードすればいい。もしこれが何らかの構造を持つファイルで、その内容もメモリに展開するには多少の加工が必要、なんてものだったら、起動時に一度全部加工して、その後ページングによってスワップアウトされなければいけない(メモリが足りない場合)。
Line 10: Line 11:
-シグネチャは8バイトあった(オフセット+8~+15:GUIGUI00)。 -シグネチャは8バイトあった(オフセット+8~+15:GUIGUI00)。
-*** (2)+*** (2) [#x074330e]
-これに対し第二世代OSASKアプリのフォーマットは複雑である。COFFやELFほどではないが、しかしこれらと同じように複数のセクションを持ち、リロケーションのための情報を持ち、ファイル内のセクションイメージはメモリイメージとは必ずしも一致しない(一致しないのはもちろんリロケーション加工の差異のため)。 -これに対し第二世代OSASKアプリのフォーマットは複雑である。COFFやELFほどではないが、しかしこれらと同じように複数のセクションを持ち、リロケーションのための情報を持ち、ファイル内のセクションイメージはメモリイメージとは必ずしも一致しない(一致しないのはもちろんリロケーション加工の差異のため)。
-ヘッダやシグネチャもあるが、これらは.textセクションの一部ではない。というのは、ファイル全体が単純なコードセグメントのイメージではなくなった以上、よけいなヘッダやシグネチャをコードセグメントに含めておく意味が無くなったためである。 -ヘッダやシグネチャもあるが、これらは.textセクションの一部ではない。というのは、ファイル全体が単純なコードセグメントのイメージではなくなった以上、よけいなヘッダやシグネチャをコードセグメントに含めておく意味が無くなったためである。
-*** (3)+*** (3) [#f1a53d03]
-さらに第二世代OSASKアプリのフォーマットには、ファイルサイズを小さく保つ工夫がある。 -さらに第二世代OSASKアプリのフォーマットには、ファイルサイズを小さく保つ工夫がある。
-簡易モード。 -簡易モード。
Line 35: Line 36:
--ほぼ同等の仕様は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 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は次のようになる。 --最初の 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;  do { CALL([ESI]); DB(0x55, 0x16, 0x00); EAX++; } while ((unsigned) AL < 0x7f); return;
 +--APIの引数については、[[OT/0004]]の例を参照のこと。
-* こめんと欄+* こめんと欄 [#r46afe8b]
#comment #comment

トップ   差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ
新着

目次
メンバー一覧


最新の20件
2016-10-01 2016-09-08
  • @MenuBar.
2016-09-07 2016-09-04 2016-08-15 2015-09-23 2014-07-30 2014-07-04 2014-02-04 2013-10-26 2013-06-21 2013-06-17 2013-06-15 2013-04-02 2013-02-09 2013-02-04 2012-12-25 2012-12-01 2012-05-28 2012-03-31

トピック一覧
一般用コメント最新
新掲示板lina
2016/9/5 20:58
SandBoxゲスト
2016/9/4 12:01
RecentDeletedlina
2015/6/2 19:29
Old-OSASK-MLlina
2014/6/29 9:14
hideyosi/メールhideyosi
2014/1/6 20:17
hideyosi/募集中lina
2013/11/8 19:56

このサイトは川合秀実から委託を受けて、OSASKコミュニティによって管理・運営されています。