1.1 MASM32のインストール

まず、hutch's home pageからmasm32v8.zipをダウンロードして解凍して下さい。 すると、INSTALL.EXEが出てくるので、INSTALL.EXEを実行してインストールして下さい。

 インストールが終わったら、「スタート」→「ファイル名を指定して実行」をクリックし、「sysedit」と入力して「OK」をクリックして下さい。 システムエディタが起動したら、AUTOEXEC.BATの最終行に「path %path%;C:\MASM32\BIN」を加えて下さい。 (masm32をインストールしたドライブがCドライブでない場合は、それに合わせて読み替えて下さい。) 加えたら、「ファイル(F)」→「上書き保存(S)」をクリックし、システムエディタを閉じて下さい。

1.2 サンプル

 さて、MASM32の用意ができたところで、早速HSP用のプラグインを作ってみましょう。 ASMHSP.ASMとMAKE.BATをメモ帳などで打ち込んで、適当なフォルダに保存して下さい。

ASMHSP.ASM
.486
.model		flat,stdcall
.code

DLLMain		proc	p1,p2,p3
		mov	eax,1
		ret
DLLMain		endp

asmhsp		proc	export p1:ptr,p2,p3,p4
		push	esi
		mov	esi,p1
		mov	eax,p2
		add	eax,p3
		add	eax,p4
		mov	[esi],eax
		mov	eax,0
		pop	esi
		ret
asmhsp		endp

end		DLLMain
MAKE.BAT
ml /c /coff asmhsp.asm
link asmhsp.obj /dll

 打ち込んだら、MAKE.BATをダブルクリックして下さい。 うまくいけばASMHSP.DLLができるので、HSPがインストールされたフォルダにASMHSP.DLLをコピーして下さい。 次に、HSPスクリプトエディタを起動し、ASMHSP.ASを打ち込んで実行してみて下さい。 うまくいけば123と表示されるはずです。 うまくいかない場合は、どこがいけないのかよく見直してみて下さい。 ちなみに、このASMHSP.ASMは何をするプラグインかというと、p2+p3+p4を計算してp1に代入するという、極めて単純なものです。

ASMHSP.AS
#uselib "asmhsp.dll"
#func asmhsp asmhsp 1

asmhsp p1,3,20,100
print p1
stop

1.3 サンプルの解説

 さて、サンプルがうまく動作したところで、サンプルのプログラムについて解説します。 まず.486ですが、これは80486までの命令を使えるようにするということです。 .486の代わりに.586を指定する事で、Pentium以降の命令を使うことも出来ます。 ただし、HSPが動作する環境全てにおいて汎用的に動作するプラグインにしたい場合は、.486にしておきましょう。 (Windows95は80486でも動作するので。)

 2行目のflatですが、Windows95以降で動作する32ビットのプログラムを作る場合に指定します。 その後ろのstdcallは、プログラムを簡単にするためのおまじないだと思ってください。 このおまじないを使わずに全く同じプラグインを作ろうとすると、ASMHSP2.ASMのようなプログラムになります。 先程のソースと比べてみて下さい。

ASMHSP2.ASM
.486
.model		flat
.code

_DLLMain@12	proc	public
		push	ebp
		mov	ebp,esp
		mov	eax,1
		leave
		ret	12
_DLLMain@12	endp

_asmhsp@16	proc	export
		push	ebp
		mov	ebp,esp
		push	esi
		mov	esi,[ebp+ 8]
		mov	eax,[ebp+12]
		add	eax,[ebp+16]
		add	eax,[ebp+20]
		mov	[esi],eax
		mov	eax,0
		pop	esi
		leave
		ret	16
_asmhsp@16	endp

end		_DLLMain@12
ASMHSP.ASM
.486
.model		flat,stdcall
.code

DLLMain		proc	p1,p2,p3
		mov	eax,1
		ret
DLLMain		endp

asmhsp		proc	export p1:ptr,p2,p3,p4
		push	esi
		mov	esi,p1
		mov	eax,p2
		add	eax,p3
		add	eax,p4
		mov	[esi],eax
		mov	eax,0
		pop	esi
		ret
asmhsp		endp

end		DLLMain

 次のDLLMainというプロシージャは、HSPのプラグインを作る場合に限らず、DLLを作る場合に必要なプロシージャです。 あまり深く考えず、このサンプルの通りに打ち込めばOKです。 (DLLMainについて詳しく知りたい方は、参考文献1をご覧下さい。)

 さて、次のasmhspが、実際にHSPから呼び出して使うプロシージャです。 上記のサンプルのように、

名前	proc	export 引数1の名前:引数1の型,・・・,引数4の名前:引数4の型

	具体的な処理

	ret
名前	endp

の形で記述します。 HSPのプラグインでは引数の数が4つに決まっているので、引数は必ず4つ分記述して下さい。 引数の型は、変数や文字列などのポインタの場合はPTRを、int型の数値の場合はDWORDを指定します。 ただし、省略した場合はDWORDとみなされます。 このようにprocの後ろに引数を列挙する事により、自動的にスタックフレームが生成されます。 従って、ASMHSP2.ASMのようにスタックフレームを生成するための命令を記述する必要はありません。 また、ret命令の前にleave命令が埋め込まれ、ret命令がret 16になります。 スタックフレームについては第4章で詳しく解説していますので、ここでは解説しません。 今は、面倒な処理を自動的にやってくれているんだと覚えておけばOKです。

 最後の行のend DLLMainは、先程のDLLMainと同じくDLLを作る場合に必要になります。

 この章では、プログラム全体の大まかな構成を解説するだけにとどめておきます。 具体的な処理の部分については、次の章から解説していきます。