.MASM32を使用します。インストールした後こちらのように環境を設定してください。
リンカは16ビット用のものを使用します。ここかここから入手して、アーカイブの中に含まれる、LINK.EXEをLINK16.EXEに名前変更してからML.EXEと同じフォルダに置いてください。(MASM32なら通常はC:\MASM32\BIN)
マシン語ファイルを作成する上で注意すべき点は、変数は全てスタック変数を使用し、静的なデータは使用しないことです。
静的なデータやAPIはHSP側で用意して、そのアドレスを引数として渡すようにします。
どうしても静的なデータを使用したい場合やリロケート(再配置)を行いたい場合は、プログラム中で実際のアドレスを取得して、仮アドレスとの差を求めてから正しいアドレスにアクセスするようにします。
ただし、コードとデータのアドレスが近いと、データがCPUのコードキャッシュにのってしまいます。コードキャッシュ上のデータにアクセスしてキャッシュが破棄されてしまうと、実行速度が極端に落ちてしまいます。
MASMで.com形式のファイルを作成するのは簡単で、メモリモデルをタイニーモデルにするだけです。
関数の言語型はCとSTDCALLのどちらでもOKです。(ll_callfuncはどちらの呼び出し型にも対応しています)
サンプルとして、渡された数値の絶対値を記憶しておき、その合計を返すマシン語ファイルを作成します
ファイル名:ABSADD.ASM
.386
.MODEL TINY,STDCALL
OPTION SEGMENT:USE32
.CODE
;いままでに渡された絶対値の合計を返す
;i 加算する値
;all HSP側で用意した変数のアドレス
;返値 合計値
absadd PROC ,i ,all:ptr DWORD
mov eax,i
mov ecx,all
cdq
xor eax,edx
sub eax,edx
add eax,[ecx]
mov [ecx],eax
ret
absadd ENDP
END absadd
実際の.comと違って開始アドレスを100hにする必要はありません。
前述の通り静的変数は使用できないので、HSP側で用意した変数を使用するようにします。
プロシージャを複数使う場合はHSPから直接呼び出されるプロシージャを1番上に持ってきてください。
ML.EXEに/ATオプションをつけることで.com形式の実行ファイルを作成できます。
具体的には以下のコマンドを実行することで、マシン語ファイル(ABSADD.BIN)が作成されます。
ml /AT /Bllink16 /FeABSADD.BIN ABSADD.ASM
マシン語ファイルの使用例
#include "llmod.as" #module #deffunc init ;マシン語ファイルを読み込む filename="absadd.bin" exist filename if strsize==-1:dialog filename+"がみつかりません。":end sdim func,strsize bload filename,func getptr pfunc,func ;HSP側で用意する変数 getptr pAll,all return #deffunc absadd int mref p1,0 para=p1,pAll ll_callfunc para,2,pfunc return #global init absadd -100 absadd 256 absadd -5000 mes "|-100|+|256|+|-5000|="+dllret stop