1: 2008-04-07 (月) 11:52:43 |
2: 2008-04-07 (月) 12:35:26 |
| -APIの呼び出しの基本は、ぐいぐい00と同じくEBXにコマンドパケットの先頭アドレスを入れてAPIを呼び出すだけである。しかし今回はコマンドパケットの各パラメータをメモリに置くことが必須ではなく、パラメータの一部にレジスタ値を使うように指定することができる。別のメモリ域を指すことも可能。またぐいぐい00ではintの配列構造を基本としていたが、ぐいぐい01では可変長である。 | | -APIの呼び出しの基本は、ぐいぐい00と同じくEBXにコマンドパケットの先頭アドレスを入れてAPIを呼び出すだけである。しかし今回はコマンドパケットの各パラメータをメモリに置くことが必須ではなく、パラメータの一部にレジスタ値を使うように指定することができる。別のメモリ域を指すことも可能。またぐいぐい00ではintの配列構造を基本としていたが、ぐいぐい01では可変長である。 |
| -slot番号は16倍しなくてよくなった。 | | -slot番号は16倍しなくてよくなった。 |
- | -アプリが起動した直後はEBXには適当なポインタが代入されており、そのメモリには、「後続のコマンドパケットはEIP以降に書いてある」と指定してある。したがってEBXを変更しなければ、CALL命令に後続してコマンドパケットを書いておけばAPIが利用できる。さらに起動時のEBPはAPIの呼び出しアドレスが代入されているので、EBPを変更しなければCALL(EBP);でAPIが呼べる。 | + | -アプリが起動した直後はEBXには適当なポインタが代入されており、そのメモリには「後続のコマンドパケットはEIP以降に書いてある」という内容のパケットが書いてある。したがってEBXを変更しなければ、CALL命令に後続してコマンドパケットを書いておけばAPIが利用できる。さらに起動時のEBPはAPIの呼び出しアドレスが代入されているので、EBPを変更しなければCALL(EBP);でAPIが呼べる。この辺はごく小規模のアプリのためのささやかな仕組みである。 |
| | | |
| *** (3) | | *** (3) |
| -どうやらコンソールに"Hello, world\n"と表示するだけのアプリであれば、27バイトで書けそう。このうちの13バイトは表示するためのメッセージ部分で、x86のコードはAPIを呼び出すためのCALL命令(2バイト)だけである。APIパケット列からメッセージ分を差し引くと6バイト。そして実行ファイルのヘッダなどが残りの6バイトである。ぐいぐい00時代には考えられなかったサイズである。もちろん小さすぎで圧縮は効かない(笑)。 | | -どうやらコンソールに"Hello, world\n"と表示するだけのアプリであれば、27バイトで書けそう。このうちの13バイトは表示するためのメッセージ部分で、x86のコードはAPIを呼び出すためのCALL命令(2バイト)だけである。APIパケット列からメッセージ分を差し引くと6バイト。そして実行ファイルのヘッダなどが残りの6バイトである。ぐいぐい00時代には考えられなかったサイズである。もちろん小さすぎで圧縮は効かない(笑)。 |
- | --6+2+6+13=27 | + | --6(ヘッダなど)+2(CALL EBP)+4(APIパケット)+13(メッセージ)+2(APIパケット)=27 |
| + | --参考:http://osask.jp/boyaki04.html |
| + | -これが今までのノウハウとKHBIOSの開発の過程で得られた知見の集大成。[[K]]としては決定版級。 |
| + | |
| + | *** (4) 自作自演のQ&Aによる解説 |
| + | -Q:アプリが小さくなることをことさらに強調しているように見えるが、それはそれほどすごいことなのか? |
| + | -A:OSASKの目指している方向性を極限まで進めたものと考えてほしい。小さいことがすべてに優先するほど重要であるかどうかは[[K]]にも分からない。しかしアプリが小さく書けるということは間違いなくOSASKの特徴の一つであって、そしてどうせやるなら限界まで小さくしてみたい、そういう極限を一度見てみたい、と考えた。・・・小さくすることで*もしも*何かを失ったのなら(たとえば拡張性が損なわれたとか、以前よりも開発しにくくなったとか、動作が遅くなったなど)、それを克服するための方法を考えてさらに発展を目指すのみである。OSASK-HB的な発想としては何でもやってみるしかない。実験しないうちからあれこれ言っていては進歩はない。 |
| + | -Q:なんだかトリッキーな感じを受ける。これで小さくなるのはhelloくらいなのでは? |
| + | -A:確かにトリッキーというか、せこい手法かもしれない(起動時に都合の良いレジスタ初期値になっているとか)。でもこの仕様にするための代償(レジスタ初期値を準備しておくこと)はわずかなものだし、512バイトアプリコンテストのようなちょっとしたアプリを作って楽しむ際には、こういうささやかなトリックが非常にありがたく感じられる。というかさしてデメリットがあるわけじゃないんだからこれでいいのでは? |
| | | |
| * こめんと欄 | | * こめんと欄 |
| #comment | | #comment |