[MASM32]について

機械語Subroutineの作成は[MACHINEWORD] 参照や
、機械語サブルーチンの作成の詳細については、
[機械語サブルーチンの作成の詳細] を参照してください。

機械語Subroutineの作成に、MASM32(MicroSoftAssembler32Bit)を使用すると
コンパクトなEXEファイルを作成できます。MS_DOSの時代のMASMのWindows版です。
作成したEXEファイルはすべてのWindowsで実行できます。
MASM32のInstallはインターネット上に多くのマニアのかたが書いておられます。
Yahoo、GoogleでMASM32で検索すれば分かります。ここでは、Installについては
[MASM32_INSTALL] を参照してください。

下記のコードはSAMPLE42で使用するSORT_INSERT.EXEのSourceFileです。
これを、BatchファイルでAssembleおよびLinkageすればEXEファイルが出来ます。
サイズは約3Kです。
[実行開始位置] を確認すればHeader部やTail部をCutする必要もありません。

SORT_INSERT.ASMからSORT_INSERT.EXEの作成までの手順は以下のとおりです。
(1)C:\masm32\testinstをコピーし、c:\masm32\SORT_INSERTとします。
 さらに、C:\masm32\exsample10\pathinfoよりバッチファイルmakeit.batを
 c:\masm32\SORT_INSERTにコピーします。
MBASIC86のフォルダー内のMASM32_SORT_INSERTフォルダーのSORT_INSERT.asmを
c:\masm32\SORT_INSERTにCopyします。
(2)makeit.batをメモ帳で開きます。
8行目ぐらいのpathinfo.objをSORT_INSERT.objに書き換え、
if exist "pathinfo.obj" del "pathinfo.obj"

9行目ぐらいのpathinfo.exeをSORT_INSERT.exeに書き換え、
if exist "pathinfo.exe" del "pathinfo.exe"

11行目ぐらいのpathinfo.asmをSORT_INSERT.asmに書き換え、
\MASM32\BIN\Ml.exe /c /coff SORT_INSERT.asm

16行目ぐらいのpathinfo.objをSORT_INSERT.objに書き換え、
\masm32\bin\Link /SUBSYSTEM:CONSOLE " SORT_INSERT.obj" rsrc.res
19行目ぐらいのpathinfo.*をSORT_INSERT.* に書き換え、
dir SORT_INSERT.*

などとします。

上書き保存します。

(3)makeit.batを実行します。
c:\masm32\SORT_INSERT内にSORT_INSERT.objとSORT_INSERT.exeが作成されます。
.objはLinkする前のObjectModule(BinaryFile)で、Linkしたものが.exeで実行形式のFileです。
同封のHexaDump.EXEで開けば分かりますが、実行開始位置は 200Hです。
[実行開始位置] を確認すれば、絶対位置オフセットC8の内容が80です。
絶対位置オフセット80からの相対オフセットF8がコードセクションHeaderの開始位置です。
このHeaderからの相対オフセットF4からの4バイトが実行開始位置です。
このHeaderからの相対オフセットF0からの4バイトがコードセクションのサイズです。
これによれば、ファイル内の絶対オフセット200Hが開始位置で、サイズはここから200Hです。

尚、SORT_INSERT.asmは次のとおりです。

.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive

.code

start:

; **********************************************************

mov ebx, 4[esp];//Argument pointer begin.
mov esi,[ebx];//1st. offset 0
mov cx,[esi];
mov esi,4[ebx];//2nd. offset 4
mov ebp,esi;
mov dx,[esi];
cmp dx,0
jl delope;

mov bx,0;
repins:
inc bx;
inc esi;
inc esi;
cmp bx,cx;
jg tail;
mov ax,[esi];
cmp ax,dx;
je retloc;
jl repins;
mov eax,0;
mov ax,cx;
shl eax,1;
xchg esi,ebp;
add esi,eax;
mov edi,esi;
inc edi;
inc edi;
down:
mov ax,[esi];
mov [edi],ax;
cmp ebp,esi;
je tail;
mov edi,esi;
dec esi;
dec esi;
jmp down;
tail:
mov [esi],dx;
;//pop ebx;
mov ebx,4[esp]; ;//Argument pointer begin.
;//mov ebx,memedx;
mov ebx,[ebx];
inc cx;
mov [ebx],cx;
jmp retloc;





delope:
neg dx;
mov bx,0;
delins:
inc bx;
inc esi;
inc esi;
cmp bx,cx;
jg retloc;
mov ax,[esi];
cmp ax,dx;
jl delins;
jg retloc;
mov eax,0;
mov ax,cx;
shl eax,1;
xchg esi,ebp;
add esi,eax;





up:
mov ax,2[ebp];
mov [ebp],ax;

cmp ebp,esi;
je tail2;
inc ebp;
inc ebp;
jmp up;
tail2:
;//pop ebx;
mov ebx,4[esp]; ;//Argument pointer begin.
;//mov ebx,memedx;
mov ebx,[ebx];
dec cx;
mov [ebx],cx;
jmp retloc;




retloc:


ret

end start

以上がSORT_INSERT.asmです。


尚、Argumentの取り出しを注目してください。
MASM32で作成したEXEファイルの場合、呼び出しに対し、帰り番地だけをStackにPushして(押し込んで)
Subroutineに入ります。Argumentは SP(ESP)のoffset4より順に4バイトずつで番地(Address)
を取り出します。