[SAMPLE45] SAMPLE
10 REM SAMPLE45 ;20040620 Remake
20 CLS:DIM A%(100)
30 DEF SEG = DEFUSER:M%=0
40 BLOAD "C_SORT2.EXE", M%
50 B%=&H1000:N%=100
55 PRINT:PRINT "Native DATA"
60 FOR I%=1 TO 100
70 X%= INT(RND * 100):A%(I%)=X%
80 PRINT A%(I%);" ";
90 NEXT I%
100 CALL B%(N%,A%(1))
110 PRINT:PRINT:PRINT "SORT DATA with C_Sort program"
200 FOR I%=1 TO 100
220 PRINT A%(I%);" ";
230 NEXT I%
240 PRINT:END
これは、A%(100)に格納された 100個のRandomDataを一挙にSortしています。
BLOAD、CALL文による実行ファイルはVisual StudioのCでCompileしたもので、
実行開始番地は0x1000です。
尚、[SAMPLE45_2]はBLOADProgramをC_SORT2.EXEの実行Core部だけを取り出して作成した
C_SORT2_CORE.EXEに変えたものです。C_SORT2.EXEの&H1000番地以降でC3,90,90,、、、
の部分までをHexaファイルでResaveしたものです。
C_SORT2_CORE.EXE のHexaのDumpFileを以下に入れてあります。
BASICではCALL文の呼び出し番地が&H1000から0に変わります。
尚、[SAMPLE45_3]はBLOADProgramをASM_SORT2.EXEの実行Core部だけを取り出して作成した
ASM_SORT2_CORE.EXEに変えたものです。
ASM_SORT2.EXEの&H1000番地以降でC3,90,90,、、、の部分までをHexaファイルで
Resaveしたものです。ASM_SORT_CORE.EXE のHexaのDumpFileを以下に
入れてあります。BASICではCALL文の呼び出し番地は0に変わります。
C_SORT2.EXEのSourceは次のとうりです。
/************************** Start of MAIN.H **************************/
#ifndef _[#ifndef _
#define _[#define _
#ifdef __STDC__
#else /* __STDC__ */
#endif /* __STDC__ */
#endif /* _[#endif /* _ */
/*************************** End of MAIN.H ***************************/
/************************* Start of MAIN-C.C *************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
#ifdef __STDC__
#else
#endif
void main( argv )
char *argv[];
{
short n,d;
short *ii,*jj,*kk,*ll;
ii=(short*)(argv[0]);
n=*ii; ////This is N% The numbers of data.
////////////////////////////
////BASIC-INT = C++ SHORT 2byte
////C++ int = 4byte
jj=(short*)(argv[1]); ////This is pointer of 2nd argument.
for (k=0;k<(i-1);k++) {
kk=(short*) (unsigned int)(jj+k*4);
for (l=k+1;l<n;l++) {
ll=(short*) (unsigned int)(jj+l*4);
if (*kk > *ll) {
d=*kk;
*kk=*ll;
*ll=d; }
}
}
return;
}
/************************** End of MAIN-C.C **************************/
F:\C_SORT2_CORE.EXE
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 8B 44 24 04 55 8B 08 8B 40 04 66 8B 09 0F BF E9
00000001 8D 4D FF 85 C9 7E 3D 53 56 57 BB 01 00 00 00 8B
00000002 F0 3B DD 7D 1E 8B FD 8D 46 08 2B FB 66 8B 0E 66
00000003 8B 10 66 3B CA 7E 06 66 89 16 66 89 08 83 C0 08
00000004 4F 75 E9 83 C6 08 43 8D 45 FF 8D 53 FF 3B D0 7C
00000005 D0 5F 5E 5B 5D C3 90 90 90 90 90 90 90 90 90 90
これはC_SORT2.EXEの0x1000番地から実行部の最後までで、後続のWindowsまわりのコード部
を切除したものです。C3 90 90 90 90 、、、、となる部分で実行部は終了です。
ASM_SORT2.EXEはVisualStudioのCでAssembleしたものです。SourceCodeは次のとうりです。
/************************** Start of MAIN.H **************************/
#ifndef _[#ifndef _
#define _[#define _
#ifdef __STDC__
#else /* __STDC__ */
#endif /* __STDC__ */
#endif /* _[#endif /* _ */
/*************************** End of MAIN.H ***************************/
/************************* Start of MAIN-C.C *************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
#ifdef __STDC__
#else
#endif
void main( argv )
char *argv[];
{
_asm {
MOV EBX,DWORD PTR 16[ESP] //EBX,ESI,EDI
MOV ESI,DWORD PTR 4[EBX];
DEC ESI;
DEC ESI;
MOV EBX,DWORD PTR [EBX];
MOV BX,WORD PTR [EBX];
DEC BX;
LST0:
INC ESI;
INC ESI;
MOV CX,WORD PTR [ESI];
MOV EDI,ESI;
MOV DX,BX;
LST1:
INC EDI;
INC EDI;
MOV AX,DS: WORD PTR [EDI];
CMP AX,CX;
JGE LAD1;
MOV DS: WORD PTR [ESI],AX;
MOV DS: WORD PTR [EDI],CX;
MOV CX,WORD PTR [ESI];
LAD1:
DEC DX;
JNZ LST1;
DEC BX;
JNZ LST0;
}
return ;
}
/************************** End of MAIN-C.C **************************/