ここではサンプルに使用されているMASMのディレクティブから、特に説明が必要と思うものの説明を行っています。
ディレクティブそのものの説明はしていませんのでこちらから調べて下さい。
「プラグインの作成」のTestHpi.asmからの抜粋です。
.386
.386以上なら何でも良いです。FPUを使用したければ.387か.486というふうに使用する命令セットに合わせて選んで下さい。
MMX,SSE(2),3DNow!を使用したければ追加で.MMX .XMM .K3Dを指定して下さい。
.MODEL FLAT,STDCALLl
FLAT・・・Windowsプログラムではフラットメモリモデルを使用します。これによってセグメントを意識する必要が全くありません。
STDCALL・・・DLLの関数は通常STDCALL型です。もちろん呼び出し側との間に整合性があれば他の型でもかまいませんが、HSPプラグインでは必ずSTDCALLです。VC++ではWINAPIやCALLBACKがこれに相当します。
OPTION CASEMAP:NONE
CASEMAP:NONE・・・WINDOWS.INCが大小英文字を区別することを前提に作られているので、必須です。
TestProc2 PROC EXPORT USES ebx ,pExinfo:ptr HSPEXINFO, tmp1,tmp2,tmp3
PROC・・・使わなくても良いですが、使った方が断然楽です。
EXPORT・・・HSPプラグインはこれを指定するだけでエクスポートの準備終了です。ちなみにここにPRIVATEを指定しなければプロシ−ジャの名前が他のソースファイルから見えるようになります
USES・・・保存する必要のあるレジスタはEBX,ESI,EDI,EBP,ESPです(EBPはスタック変数へのアクセスに使用されるため、自動的に保存されます)。このほかにもストリング命令を使用する場合は方向フラグ(EFLAGSのビット10)も保存しなければなりません。逆に言えば、これらのレジスタは他の関数を呼び出しても値が変更されません。頻繁に使う値はこれらのレジスタに入れておきましょう。
pExinfo:ptr HSPEXINFO・・・ビット数さえあっていれば別に型を指定しなくても良いのですが(アセンブラが型を判断してコードを生成するケースはあまり多くない)、可読性を考えればなるべく指定する方がいいです(ちなみに型を省略した場合:DWORDになる)。
ASSUME ebx:ptr HSPEXINFO
ASSUME・・・ASSUMEはセグメントレジスタがどのセグメントを指しているのかを指定するだけではなく、汎用レジスタに型を指定することが出来ます。同じ構造体へのポインタを何度も使用する場合などにうまく利用しましょう。型をデフォルトに戻すには
ASSUME reg:NOTHING 全てのレジスタをデフォルトに戻すには ASSUME NOTHING です。