ページへ戻る
印刷
GUIGUI01/memo16
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:GUIGUI01/memo16 をテンプレートにして作成
開始行:
TITLE:x
* ぐいぐい01に関するメモ-16
-(by [[K]], 2008.12.23)
-メモのうち重要な部分をそのうちまとめてまともなページを作る
*** (31) abcdw007のAPIパケットの特徴
-マニュアル風に書いたらきっとmanの方になるような内容だけ...
-アセンブラレベルでこそabcdw007の仕様のよさがはっきりする...
-abcdw007以降の仕様では、APIを呼び出すには、ESIをアプリ起...
EDI = 0; CALL([ESI]); DB ...
-とするのが一般的です。EDIをゼロにするとCALLの直後がパケ...
--なお上記の EDI = 0; はASKAでは XOR(EDI, EDI); という意...
--なおアプリ起動時はEDI=0になっていますので、何も設定せず...
-まあなにはともあれ、一つ例を出しましょう。
EDI = 0; CALL([ESI]); DB(0x40);
-これは正常終了です。パケットの中身は、gh4でエンコードさ...
--gh4については[[GUIGUI01/man0004]]を参照のこと。
-4が正常終了の機能番号で、0がオプションパラメータです。0...
-では異常終了して、数値1を返してみます。いわゆるexit(1);...
EDI = 0; CALL([ESI]); DB(0x43, 0x10);
-パケットの中身は[4 3 1]です。末尾の0はただのパディングな...
-返したい数字はもっと大きいかもしれません。たとえばexit(1...
EDI = 0; CALL([ESI]); DB(0x43, 0xc6, 0x40);
-とします。パケットは[4 3 100]です(100は0x64なのでgh4で...
-さてこれで定数を終了コードとして返すことは簡単にできまし...
PUSH(EAX); PUSH(3); PUSH(4); EBX = ESP; CALL(0xc7,0);
-などとやっていました。これはどういうことかというと、パケ...
EDI = 0; CALL([ESI]); DB(0x43, 0x60, 0x00);
-このパケットは[4 3 6 0 0]なのですが、この6が4bit形式の6...
-この!6は普通の数字の6とは解釈されません。つまりexit(6);...
EDI = 0; CALL([ESI]); DB(0x43, 0x86);
-とするわけです。ここでは8bit形式の6を使いました。・・・...
-レジスタ番号1はECX、レジタ番号2はEDX、以下、ECX、EBX、ES...
-パラメータとして使えるのは32bitレジスタだけではありませ...
EDI = 0; CALL([ESI]); DB(0x43, 0x61, 0x40);
-とすると、パケットの中身は[4 3 AH]になります。
-今までの例では変数が使えるのは、パラメータの部分だけでし...
-どうでしょう?なんだかわくわくしませんか?アセンブラ使い...
----
-さてここから第2部です。先ほどまで一番簡単な終了ファンク...
-文字列を扱うファンクションがいい例だと思うので、文字表示...
-たとえば、画面に"246"と表示させてみることにします。書き...
EDI = 0; CALL([ESI]); DB(0x50, 0x53, 0xb2, 0xb4, 0xb6, 0...
-このパケットは普通に見れば[5 0 5 3 0x32 0x34 0x36 3]とな...
-これは旧OSASKのパケットととてもよく似ていて(数値はいろ...
-これを応用すれば、まずEAX一文字を表示するputcが簡単に作...
EDI = 0; CALL([ESI]); DB(0x50, 0x51, 0x60, 0x03);
-こんなものです。パケットは[5 0 1 EAX]になります。同じよ...
-しかしこのままでは終了ファンクションと同じで大して面白く...
EDI = 0; CALL([ESI]); DB(0x50, 0x56, 0xde, 0x80, 0x51, 0...
-これは[5 0 !6 488 0 1 3 0 "246"][3]という意味になります...
-しかし実は、機能番号5のフォーマットは、[5 slot (!6 488) ...
EDI = 0; CALL([ESI]); DB(0x50, 0x03, 0x32, 0x34, 0x36, 0...
-これで十分なのです。
-また文字列といえば、C言語で見られるような、'\0'で終わる...
-mod=1のときの機能番号5のフォーマットは、[5 slot (!6 488)...
EDI = 0; CALL([ESI]); DB(0x50, 0x10, 0x32, 0x34, 0x36, 0...
-まだあります。mod=2/3にすると、strの部分が (!6 0) r に化...
-なんかもう疲れてきたので説明は適当になってきていますが(...
* こめんと欄
- 書いてて思ったけど、最後まで興味を持って読める人はまず...
- abcdw009のAPIパケットはこのページのabcdw007とは少し違い...
#comment
終了行:
TITLE:x
* ぐいぐい01に関するメモ-16
-(by [[K]], 2008.12.23)
-メモのうち重要な部分をそのうちまとめてまともなページを作る
*** (31) abcdw007のAPIパケットの特徴
-マニュアル風に書いたらきっとmanの方になるような内容だけ...
-アセンブラレベルでこそabcdw007の仕様のよさがはっきりする...
-abcdw007以降の仕様では、APIを呼び出すには、ESIをアプリ起...
EDI = 0; CALL([ESI]); DB ...
-とするのが一般的です。EDIをゼロにするとCALLの直後がパケ...
--なお上記の EDI = 0; はASKAでは XOR(EDI, EDI); という意...
--なおアプリ起動時はEDI=0になっていますので、何も設定せず...
-まあなにはともあれ、一つ例を出しましょう。
EDI = 0; CALL([ESI]); DB(0x40);
-これは正常終了です。パケットの中身は、gh4でエンコードさ...
--gh4については[[GUIGUI01/man0004]]を参照のこと。
-4が正常終了の機能番号で、0がオプションパラメータです。0...
-では異常終了して、数値1を返してみます。いわゆるexit(1);...
EDI = 0; CALL([ESI]); DB(0x43, 0x10);
-パケットの中身は[4 3 1]です。末尾の0はただのパディングな...
-返したい数字はもっと大きいかもしれません。たとえばexit(1...
EDI = 0; CALL([ESI]); DB(0x43, 0xc6, 0x40);
-とします。パケットは[4 3 100]です(100は0x64なのでgh4で...
-さてこれで定数を終了コードとして返すことは簡単にできまし...
PUSH(EAX); PUSH(3); PUSH(4); EBX = ESP; CALL(0xc7,0);
-などとやっていました。これはどういうことかというと、パケ...
EDI = 0; CALL([ESI]); DB(0x43, 0x60, 0x00);
-このパケットは[4 3 6 0 0]なのですが、この6が4bit形式の6...
-この!6は普通の数字の6とは解釈されません。つまりexit(6);...
EDI = 0; CALL([ESI]); DB(0x43, 0x86);
-とするわけです。ここでは8bit形式の6を使いました。・・・...
-レジスタ番号1はECX、レジタ番号2はEDX、以下、ECX、EBX、ES...
-パラメータとして使えるのは32bitレジスタだけではありませ...
EDI = 0; CALL([ESI]); DB(0x43, 0x61, 0x40);
-とすると、パケットの中身は[4 3 AH]になります。
-今までの例では変数が使えるのは、パラメータの部分だけでし...
-どうでしょう?なんだかわくわくしませんか?アセンブラ使い...
----
-さてここから第2部です。先ほどまで一番簡単な終了ファンク...
-文字列を扱うファンクションがいい例だと思うので、文字表示...
-たとえば、画面に"246"と表示させてみることにします。書き...
EDI = 0; CALL([ESI]); DB(0x50, 0x53, 0xb2, 0xb4, 0xb6, 0...
-このパケットは普通に見れば[5 0 5 3 0x32 0x34 0x36 3]とな...
-これは旧OSASKのパケットととてもよく似ていて(数値はいろ...
-これを応用すれば、まずEAX一文字を表示するputcが簡単に作...
EDI = 0; CALL([ESI]); DB(0x50, 0x51, 0x60, 0x03);
-こんなものです。パケットは[5 0 1 EAX]になります。同じよ...
-しかしこのままでは終了ファンクションと同じで大して面白く...
EDI = 0; CALL([ESI]); DB(0x50, 0x56, 0xde, 0x80, 0x51, 0...
-これは[5 0 !6 488 0 1 3 0 "246"][3]という意味になります...
-しかし実は、機能番号5のフォーマットは、[5 slot (!6 488) ...
EDI = 0; CALL([ESI]); DB(0x50, 0x03, 0x32, 0x34, 0x36, 0...
-これで十分なのです。
-また文字列といえば、C言語で見られるような、'\0'で終わる...
-mod=1のときの機能番号5のフォーマットは、[5 slot (!6 488)...
EDI = 0; CALL([ESI]); DB(0x50, 0x10, 0x32, 0x34, 0x36, 0...
-まだあります。mod=2/3にすると、strの部分が (!6 0) r に化...
-なんかもう疲れてきたので説明は適当になってきていますが(...
* こめんと欄
- 書いてて思ったけど、最後まで興味を持って読める人はまず...
- abcdw009のAPIパケットはこのページのabcdw007とは少し違い...
#comment
ページ名: