[SAMPLE42] SAMPLE
10 REM SAMPLE42
20 CLS:DIM A%(100)
30 DEF SEG = DEFUSER:M%=0
40 BLOAD "c:\Program Files\MBASIC86\SAMPLE\SORT_INSERT.EXE", M%
50 B%=&H1000
60 OPEN "c:\Program Files\MBASIC86\SAMPLE\DATA42.DAT" AS #2
70 FIELD #2,4 AS FI$
80 I%=0
90 IC%=0
100 PRINT "現在件数";IC%
110 INPUT "Please Input, 0=END,Minus=DELETE ";I%
120 IF I% =0 THEN 180
130 LSET FI$= MKI$(I%)
140 PUT #2,FI$
150 A%(0)=I%
160 CALL B%(IC%,A%(0))
170 GOTO 100
180 CLOSE #2
190 I%=0:PRINT:PRINT"本日の件数";IC%
200 I%=I%+1
210 IF I%>IC% THEN 240
220 PRINT "SEQ= ";I%,"KEY= ";A%(I%)
230 GOTO 200
240 END
これは、ランダムに入力された整数値をSortしながら格納しています。
−の整数値を入力すれば、格納済みのDataを削除します。0で終了です。
入力終了後、入力DataをSortしてListします。
"SORT_INSERT.EXE" の内容は次のとうりです。
これはC言語ProgramでVisualStudioで作成したWindowsProgramですが、
LoadModuleで 36KBあります。
処理実行部分だけを開始点から表示したものです。
このWindowsProgramでの実行開始点はLoadPointからOffset &H1000のPointです。
同じフォルダーにある "SORT_INSERT_ASM.EXE"は下記の部分だけを
機械語ProgramLoadModuleとして
Fileの 0番地から実行部分の長さ(&H100)だけMBASIC86でBSAVEしたものです。
Sample42_2はSample42の
40 BLOAD "c:\Program Files\MBASIC86\SAMPLE\SORT_INSERT.EXE", M% を
40 BLOAD "c:\Program Files\MBASIC86\SAMPLE\SORT_INSERT_0.EXE", M% に、
および
50 B%=&H1000 を 50 B%=&H0 と変えたもので、同じように動きます。
C:\Program Files\MBASIC86\SAMPLE\SORT_INSERT_0.EXE
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 8B 44 24 04 53 56 57 8B 70 04 8B 18 89 5C 24 10
00000010 66 8B 16 66 8B 0B 66 85 D2 7E 65 BF 01 00 00 00
00000020 66 3B CF 7C 18 0F BF C7 66 8B 04 46 66 3B C2 0F
00000030 84 8F 00 00 00 7F 16 47 66 3B F9 7E E8 0F BF C1
00000040 41 5F 66 89 54 46 02 66 89 0B 5E 5B C3 66 3B CF
00000050 7C 1F 0F BF C1 55 0F BF EF 8D 1C 46 2B C5 40 66
00000060 8B 2B 66 89 6B 02 83 EB 02 48 75 F3 8B 5C 24 14
00000070 5D 0F BF C7 41 5F 66 89 14 46 66 89 0B 5E 5B C3
00000080 B8 01 00 00 00 F7 DA 66 3B C8 7C 3B 0F BF F8 66
00000090 8B 3C 7E 66 3B FA 7F 2F 74 0A 40 66 3B C1 7E EC
000000A0 5F 5E 5B C3 40 66 3B C1 7F 19 0F BF F8 0F BF C1
000000B0 2B C7 8D 14 7E 40 66 8B 32 66 89 72 FE 83 C2 02
000000C0 48 75 F3 49 66 89 0B 5F 5E 5B C3 90 90 90 90 90
000000D0 55 8B EC 6A FF 68 A0 50 40 00 68 2C 1D 40 00 64
000000E0 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 10
000000F0 53 56 57 89 65 E8 FF 15 04 50 40 00 33 D2 8A D4
機械語の簡単な作成は、VisualStudioで、
新規作成--->プロジェクト--->Win32 Console Aplication--->次へ--->空のプロジェクト
としてCで作成します。WindowsProgramのため約 36KBあります。実行開始番地は&H1000です。
上述のように、実行部分だけはわずかですので、MBASIC86で&H1000番地から、
正味の長さだけBSAVEすれば、約 1KBになります。
終了部は、HEXのC3,90,90,90となるところです。
引数の取り出し方については、[ARGUMENT]引数の受け渡し[ARGUMENT]引数の受け渡し 参照。
Sample42の機械語Program SORT_INSERT.EXEの_ASM{ }のソースリストを次に書いておきます。
MAIN-C.C だけですが、Argumentの格納場所の取り出しと、VisualStudioでの終了方法を
見ておいて下さい。
/************************* Start of MAIN-C.C *************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
#ifdef __STDC__
#else
#endif
void main()
{
_asm{
//ASM assemble inner C, SP is incremented 4 according use these register,
//if breake using EBX,ESI,EDI and use EBP ,argument pointer is 20[ESP]
mov ebx,20[esp];
mov esi,[ebx];//This is 1st argument pointer.
mov cx,[esi];//This is A% of Sample42.BAS
mov esi,4[ebx] //This is 2nd argument pointer.
mov ebp,esi;
mov dx,[esi]; //This is C%(0) of Sample42.BAS //This is input_data.
cmp dx,0
jl delope;
//Insert & Sort operations.
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;
mov ebx,20[esp];
mov ebx,[ebx];
inc cx;
mov [ebx],cx;
jmp retloc;
//This is Delete operations.
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:
mov ebx,20[esp];
mov ebx,[ebx];
dec cx;
mov [ebx],cx;
retloc:
}//_ASM{
return;
}
/************************** End of MAIN-C.C **************************/