|
1: 2008-12-23 (火) 21:40:20 |
| + | * ぐいぐい01に関するメモ-16 |
| + | -(by [[K]], 2008.12.23) |
| + | -メモのうち重要な部分をそのうちまとめてまともなページを作る |
| + | *** (31) abcdw007のAPIパケットの特徴 |
| + | -マニュアル風に書いたらきっとmanの方になるような内容だけど、どちらかというと面白おかしく書くので、memoに書くことにしました。 |
| + | -アセンブラレベルでこそabcdw007の仕様のよさがはっきりするので、それを書きたいと思います。 |
| + | -abcdw007以降の仕様では、APIを呼び出すには、ESIをアプリ起動時の値に戻して(変更していないのならそのままで) |
| + | EDI = 0; CALL([ESI+20]); DB ... |
| + | -とするのが一般的です。EDIをゼロにするとCALLの直後がパケット開始アドレスだと見なされて、パケットの実行が終わるとDBのあとのところへちゃんと戻ってきてくれます。EDIに適当なアドレスを入れた場合は、そこがパケット開始アドレスになります。旧OSASKのEBXみたいなものだと思えば分かりやすいでしょう(旧OSASKとは違い、EDIはパケット終端の次のアドレスまで進んでくれます・・・まだ未実装ですが)。 |
| + | --なお上記の EDI = 0; はASKAでは XOR(EDI, EDI); という意味になります。もちろんMOVで0にしたければそれでもいいですが。 |
| + | --なおアプリ起動時はEDI=0, EBP=[ESI+20]になっていますので、何も設定せずにCALL(EBP); DB ...だけでいけます。 |
| + | -まあなにはともあれ、一つ例を出しましょう。 |
| + | EDI = 0; CALL([ESI+20]); DB(0x40); |
| + | -これは正常終了です。パケットの中身は、gh4でエンコードされているので[4 0]です。 |
| + | --gh4については[[GUIGU01/man004]]を参照。 |
| | | |
| + | * こめんと欄 |
| + | #comment |