MASMでマシン語ファイルを作成

その1:準備と作成方法 (その2)

必要な準備

.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

次へ