3: 2008-04-28 (月) 08:31:02 |
4: 2008-04-28 (月) 08:31:02 |
| -(by [[K]], 2008.04.07) | | -(by [[K]], 2008.04.07) |
| -メモのうち重要な部分をそのうちまとめてまともなページを作る | | -メモのうち重要な部分をそのうちまとめてまともなページを作る |
- | *** (0) | + | *** (0) はじめに |
| -ぐいぐい01は、OSASK-HBから導入される新しいAPI規格。将来的にOSASK上でも実行できるようになるのはもちろんだが、Windows上やLinux上、MonaOSやはりぼてOSファミリーなどでも実行できるように工夫してある。 | | -ぐいぐい01は、OSASK-HBから導入される新しいAPI規格。将来的にOSASK上でも実行できるようになるのはもちろんだが、Windows上やLinux上、MonaOSやはりぼてOSファミリーなどでも実行できるように工夫してある。 |
| --ただし正規に対応していないOS上で動かす場合は専用のエグゼキュータアプリを使うことになる。これは"Executer For Guigui01"(通称efg01)と呼ばれる。 | | --ただし正規に対応していないOS上で動かす場合は専用のエグゼキュータアプリを使うことになる。これは"Executer For Guigui01"(通称efg01)と呼ばれる。 |
| -コンソールがある。 | | -コンソールがある。 |
| -ぐいぐい00で必須だったAPIの初期化はぐいぐい01では必須ではない。なぜなら起動直前にシステムが初期化処理を代行してくれているからである。適当なメモリを確保してそのポインタを起動時にアプリに伝えてくる。これが気に入らなければ、アプリが再度正式に初期化処理をすることも可能。 | | -ぐいぐい00で必須だったAPIの初期化はぐいぐい01では必須ではない。なぜなら起動直前にシステムが初期化処理を代行してくれているからである。適当なメモリを確保してそのポインタを起動時にアプリに伝えてくる。これが気に入らなければ、アプリが再度正式に初期化処理をすることも可能。 |
- | *** (2) | + | *** (2) ぐいぐい00との違いなど(1) |
| -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) ぐいぐい00との違いなど(2) |
| -どうやらコンソールに"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(CALL EBP)+4(APIパケット)+13(メッセージ)+2(APIパケット)=27 | | --6(ヘッダなど)+2(CALL EBP)+4(APIパケット)+13(メッセージ)+2(APIパケット)=27 |