ページへ戻る
印刷
GUIGUI01/memo15
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:GUIGUI01/memo15 をテンプレートにして作成
開始行:
TITLE:x
* ぐいぐい01に関するメモ-15
-(by [[K]], 2008.12.23)
-メモのうち重要な部分をそのうちまとめてまともなページを作る
*** (30) helloの改良の歴史 (118→16)
-(参考として)''DOS''の.COM形式:
--22バイトが限界
--ヘッダとかはない。AHとDXに代入してINT21H。終了はRETでい...
[レジスタ代入 INT21H RET で計8バイト] ["hello, wolrd\n$"...
-''旧OSASK初期風'':
--118バイトくらいが限界(非圧縮時)
[計18バイトのシグネチャやワークエリア設定など] [API-call...
[FS:EBXの設定に最低5バイト] [APIパケットは全部32bit固定...
ofs-表示func-opt-dev-len-(13文字)-終了func-opt-パケット...
-''旧OSASK中後期風'':
--optの指定でキャラクタコードは8bitでも記述できるようにな...
--82バイトくらいが限界(非圧縮時)
[計18バイトのシグネチャやワークエリア設定など] [API-call...
[FS:EBXの設定に最低5バイト] [初期化func-ofs-表示func-opt...
終了func-opt-パケット終了func で52バイト]
--当時は(といっても結構長い期間)この程度の仕様で喜んで...
-(参考として)''「はりぼてOS」'':
--読者への説明のしやすさを重視し、DOS風のAPIを採用(INT40...
--52バイトが限界
[ヘッダ27バイト] [EBX=ESP PUSH(2) POP(EDX) INT40H DL=4 I...
["hello, world\n\0"で14バイト]
--OSASKと比べて30バイトものアドバンテージ!こんなことでい...
--しかしAPI-callをタスクローカルにできないINTにはしたくな...
-''27バイトのhello'':
--DOS版が22バイトなのは16bitだからしょうがないと思えたが...
--適当な標準値を設けてそれを必要に応じて変更する方式で、...
--またパケット要素を32bit固定長から、eh4という4bit単位可...
--またレジスタ初期値を工夫したので、EBPの値を破壊しない限...
--旧OSASKでは8バイトもあったシグネチャを2バイトに。
--これで27バイト
['G' 01 で2バイト] [セクション記述用4バイト] [CALL(EBP)...
[5 0 13 "hello, world\n" 4 0 3 の内容で16.5バイト、パケ...
--5は表示func(次の0はdev、フォーマット制御をfuncレベルで...
--「はりぼてOS」版よりもはるかに小さくなったこともあり、...
-''22バイトのhello'':
--そしてneriさんのCOM64plusが登場。シグネチャを小さくして...
--まず.g01アプリには.textセクションしかない上にリロケーシ...
---こういう特別モードについては当初心理的な抵抗があった。...
---しかし将来他のOSとのアプリサイズ競争になったときに、こ...
--アプリ終了時に最後に表示した文字が'\n'ではない場合に'\n...
--.textセクションは多くの場合最後がRETになっているという...
--これで22バイト
['G' 01 で2バイト] [セクション記述子1バイト] [CALL(EBP)...
[5 0 12 "hello, world" 3 の内容で14.5バイト、フォーマッ...
--しかしCOM64plusのhelloは21バイトなので結局1バイト負けて...
-''20バイトのhello'':
--どうにかしてあと1バイト減らしたい。そうすればCOM64plus...
--シグネチャは削りたくないし(それは同じ2バイトでがんばっ...
--それでうさんくさいと思ったのは、パケットのフォーマット...
---APIパケットは次のようなフォーマットだった。
---長さ(0.5B) 内容[5 0] モード変更(1.5B) 長さ[12] 内容[he...
--この長さ指定がうっとうしい。長さが尽きたときにモード変...
---内容[5 0] モード変更("6"+1.5B=2.0B) 長さ[12] 内容[hell...
--しかしこれでは16.5バイトだ。COM64plusに追いつくにはもっ...
--さらにモード変更について考察した結果、モード変更をした...
--そういうことなら、こんな分かりきったことのために毎回2.0...
---内容[5 0] モード変更(0.5B) 長さ[12] 内容[hello, world]...
--これで15バイトだ。モード変更を完全になくさなかったのは...
--これでアプリ全体は20バイト
['G' 01 で2バイト] [セクション記述用1バイト] [CALL(EBP)...
[5 0 12 "hello, world" 3 の内容で14.5バイト、フォーマッ...
--なんとCOM64plusを追い抜いたことになる。しかしCOM64plus...
-''18バイトのhello'':
--neriさんが、この手の小規模プログラムでは.textの末尾にCA...
--しかし僕も考えてみたところ、.g01では逆に.textの先頭にCA...
['G' 01 で2バイト] [セクション記述子1バイト]
[5 0 12 "hello, world" 3 の内容で14.5バイト、フォーマッ...
--COM64plusではまだ末尾CALL(EBP)の自動挿入は導入していな...
-''17バイトのhello'':
--2009.01.02に思いついた。APIパケットが1つしかないときは3...
['G' 01 で2バイト] [セクション記述子1バイト]
[5 12 "hello, world" の内容で13.5バイト、フォーマット制...
-''16バイトのhello'':
--2009.01.10に思いついた。コンソールへの文字列出力のとき...
['G' 01 で2バイト] [セクション記述子1バイト]
[5 12 "hello, world" の内容で12.5バイト、フォーマット制...
--最近ではすっかりこの内部形式に慣れてしまい、27バイト程...
* こめんと欄
#comment
終了行:
TITLE:x
* ぐいぐい01に関するメモ-15
-(by [[K]], 2008.12.23)
-メモのうち重要な部分をそのうちまとめてまともなページを作る
*** (30) helloの改良の歴史 (118→16)
-(参考として)''DOS''の.COM形式:
--22バイトが限界
--ヘッダとかはない。AHとDXに代入してINT21H。終了はRETでい...
[レジスタ代入 INT21H RET で計8バイト] ["hello, wolrd\n$"...
-''旧OSASK初期風'':
--118バイトくらいが限界(非圧縮時)
[計18バイトのシグネチャやワークエリア設定など] [API-call...
[FS:EBXの設定に最低5バイト] [APIパケットは全部32bit固定...
ofs-表示func-opt-dev-len-(13文字)-終了func-opt-パケット...
-''旧OSASK中後期風'':
--optの指定でキャラクタコードは8bitでも記述できるようにな...
--82バイトくらいが限界(非圧縮時)
[計18バイトのシグネチャやワークエリア設定など] [API-call...
[FS:EBXの設定に最低5バイト] [初期化func-ofs-表示func-opt...
終了func-opt-パケット終了func で52バイト]
--当時は(といっても結構長い期間)この程度の仕様で喜んで...
-(参考として)''「はりぼてOS」'':
--読者への説明のしやすさを重視し、DOS風のAPIを採用(INT40...
--52バイトが限界
[ヘッダ27バイト] [EBX=ESP PUSH(2) POP(EDX) INT40H DL=4 I...
["hello, world\n\0"で14バイト]
--OSASKと比べて30バイトものアドバンテージ!こんなことでい...
--しかしAPI-callをタスクローカルにできないINTにはしたくな...
-''27バイトのhello'':
--DOS版が22バイトなのは16bitだからしょうがないと思えたが...
--適当な標準値を設けてそれを必要に応じて変更する方式で、...
--またパケット要素を32bit固定長から、eh4という4bit単位可...
--またレジスタ初期値を工夫したので、EBPの値を破壊しない限...
--旧OSASKでは8バイトもあったシグネチャを2バイトに。
--これで27バイト
['G' 01 で2バイト] [セクション記述用4バイト] [CALL(EBP)...
[5 0 13 "hello, world\n" 4 0 3 の内容で16.5バイト、パケ...
--5は表示func(次の0はdev、フォーマット制御をfuncレベルで...
--「はりぼてOS」版よりもはるかに小さくなったこともあり、...
-''22バイトのhello'':
--そしてneriさんのCOM64plusが登場。シグネチャを小さくして...
--まず.g01アプリには.textセクションしかない上にリロケーシ...
---こういう特別モードについては当初心理的な抵抗があった。...
---しかし将来他のOSとのアプリサイズ競争になったときに、こ...
--アプリ終了時に最後に表示した文字が'\n'ではない場合に'\n...
--.textセクションは多くの場合最後がRETになっているという...
--これで22バイト
['G' 01 で2バイト] [セクション記述子1バイト] [CALL(EBP)...
[5 0 12 "hello, world" 3 の内容で14.5バイト、フォーマッ...
--しかしCOM64plusのhelloは21バイトなので結局1バイト負けて...
-''20バイトのhello'':
--どうにかしてあと1バイト減らしたい。そうすればCOM64plus...
--シグネチャは削りたくないし(それは同じ2バイトでがんばっ...
--それでうさんくさいと思ったのは、パケットのフォーマット...
---APIパケットは次のようなフォーマットだった。
---長さ(0.5B) 内容[5 0] モード変更(1.5B) 長さ[12] 内容[he...
--この長さ指定がうっとうしい。長さが尽きたときにモード変...
---内容[5 0] モード変更("6"+1.5B=2.0B) 長さ[12] 内容[hell...
--しかしこれでは16.5バイトだ。COM64plusに追いつくにはもっ...
--さらにモード変更について考察した結果、モード変更をした...
--そういうことなら、こんな分かりきったことのために毎回2.0...
---内容[5 0] モード変更(0.5B) 長さ[12] 内容[hello, world]...
--これで15バイトだ。モード変更を完全になくさなかったのは...
--これでアプリ全体は20バイト
['G' 01 で2バイト] [セクション記述用1バイト] [CALL(EBP)...
[5 0 12 "hello, world" 3 の内容で14.5バイト、フォーマッ...
--なんとCOM64plusを追い抜いたことになる。しかしCOM64plus...
-''18バイトのhello'':
--neriさんが、この手の小規模プログラムでは.textの末尾にCA...
--しかし僕も考えてみたところ、.g01では逆に.textの先頭にCA...
['G' 01 で2バイト] [セクション記述子1バイト]
[5 0 12 "hello, world" 3 の内容で14.5バイト、フォーマッ...
--COM64plusではまだ末尾CALL(EBP)の自動挿入は導入していな...
-''17バイトのhello'':
--2009.01.02に思いついた。APIパケットが1つしかないときは3...
['G' 01 で2バイト] [セクション記述子1バイト]
[5 12 "hello, world" の内容で13.5バイト、フォーマット制...
-''16バイトのhello'':
--2009.01.10に思いついた。コンソールへの文字列出力のとき...
['G' 01 で2バイト] [セクション記述子1バイト]
[5 12 "hello, world" の内容で12.5バイト、フォーマット制...
--最近ではすっかりこの内部形式に慣れてしまい、27バイト程...
* こめんと欄
#comment
ページ名: