---------------------------------------------------------------------
                  C^AZu"Asuka" Ver1.0
---------------------------------------------------------------------
PDAsukaƂ

@]^AZűLqAPP߂CɂȂׂ߂
悤Ƃ\z̉ɐ܂ꂽ̂ASKAłB
@]AAZułifloopȂǂł͕sKvɃxĂ
ǗɑςłB܂\̂nȂ߁AƂf[^
^ʂ悭T|[ĝɍłBɁAAZu
t[X^C^̌ł͂Ȃ߂ɂPsɂP߂ƂȂsɑ
ȂăvǑʂȂĂ܂B
@̂悤ȖɑΏׂAJꂽ̂ASKAƂ킯łB

@AsukáAASKA Ver.1.020ĥłB
@hȂ̂ŕʂ̕łAvOɂ͎ĂȂ
̂ŎASKA Ver 1.020ƓeɂȂĂ܂B
@R}h݊̂߁Aaska.exeƂt@CĂ܂B


QDAsuka̎g

@DOS̃R}hvvgォ

	ASKA ̓t@C o̓t@C

ƂƓ̓t@CRpC386ASM`̏o̓t@C𐶐
܂Bo̓t@CȗƂł܂B̏ꍇA̓t@C
"sample.ask"ȂΏo̓t@C"sample.asm"ɂȂ܂B

F
	C:\ASKA\WORK\>ASKA sample.ask sample.asm
	C:\ASKA\WORK\>ASKA sample.ask


dvFR}hvvg̃vpeBicommand.com̃V[gJbg
@@@vpeBj̃|veNg[h(DPMI)̍v
@@@łȂ1024ȂǂɂĂB̂܂܂Ɠ܂B


RDAsuka̓Iȋ@\

@Asukał́A

Eif`else`Aloop`breakAforAwhileAdo`whileAcontinueg܂B
EcharAshortAlongAbyteAwordAdwordŕϐ錾o܂B
E֐staticL[[hgƂŐÓIȕϐ錾ł܂B
E֐͖߂lAȂvoid funcname();Ő錾o܂B
Eɂ=A+=A-=A*=A/=A&=A|=A^=A<<=A>>=A=-A=~Ag܂B
Erɂ==A!=A<A<=A>A>=Ag܂B
E\̂ɂ^`g܂B
E|C^zg܂B
EsegmentɂZOg`Əo܂B
Eo[WASKAŕ₢ĂȂ386ASM{̃j[jbN߂
@uasmkeyword(list, ...);vŃT|[gB
ELŏoȂ".386p"Ȃǂasmout(".386p");ŃT|[gB
EGCAXƂWX^ϐɊ蓖ĂĎgo܂B
E[Jϐ`ł܂B

@tɁAAsukał́A

Ex̑OQƂo܂B
E֐Ɉ邱Ƃo܂B



SDȈՌdl

ECN[h
	include "t@C"
Ƃ邱ƂŃt@CǂݍނƂo܂B
@܂Aincludȇ#includeł܂B


ERg
	// Rg
Ƃ鎖//ȍ~As܂ł̕RgAEg܂B
̃Rg͐؂̂Ă܂B
@܂ACۂ/* ` */T|[g܂BAlXg悤
gł̂ŒӂKvłB


Ẽp[^
@̃p[^̓WX^(r)AQ(m)Al(i)̂Rނ
BꂼA
	r:EAX, CX, DS, CR0
	m:data, data[0], [EAX], [DS:EAX+EBX*2+&data+~3], *(EAX+1)
	i:0xffff,-1,100,0b0011,&DATA,sizeof(TYPE),
Ȃǂ̂悤ɂ܂B܂Aϐ⃁QƂ̃f[^^ꎞIɕς
`ꍇɂ̓LXggƂo܂B

ɃLXg֌WAlZ֌WA[]Lq֌W


E
@
	rm  = rmi;		MOV	rm,rmi
				MOVSX or MOVZX	(TCYႤƂ)
	r   =   0;		XOR	r ,r
	rm += rmi;		ADD	rm,rmi
	rm +=   1;		INC	rm
	rm -= rmi;		SUB	rm,rmi
	rm -=   1;		DEC	rm
	rm *=   1;		œKɂȗ
	reg*=   2;		ADD	reg,reg
	rm *=   2;		SHL	rm,2
	r32*=   3;		LEA	r32,[r32 * 2 + r32]
	rm *=   4;		SHL	rm,2
	r32*=   5;		LEA	r32,[r32 * 4 + r32]
	rm *=   8;		SHL	rm,3
	r32*=   9;		LEA	r32,[r32 * 8 + r32]
	rm *=   1;		œKɂȗ
	rm *=   2;		SAR	rm,1	(unsigned̎SHR)
	rm *=   4;		SAR	rm,2	(unsigned̎SHR)
	rm *=   8;		SAR	rm,4	(unsigned̎SHR)
	rm &= rmi;		AND	rm,rmi
	rm |= rmi;		OR	rm,rmi
	rm ^= rmi;		XOR	rm,rmi
	rm<<= rmi;		SAL	rm,rmi	(unsigned̎SHL)
	reg<<=  1;		ADD	reg,reg
	rm>>= rmi;		SAR	rm,rmi	(unsigned̎SHR)
	rm =- rmi;		NEG	rm
	rm =~ rmi;		NOT	rm
	rm++;			INC	rm
	rm--;			DEC	rm
̂悤ɂȂ܂BCNgƃfNgȊO͍ɂPp[^A
EɂPp[^łBA=-=~͍ƉẼp[^܂
łȂ΂Ȃ܂B
o[Wł̓`FbN͍sĂ܂񂪁EEE

ȏꍇƂfar*Ő錾ꂽxуGCAX́A+=,-=,++,--
ɌoffsetLXgȂĂftHgŃItZbgɉZ{
܂B܂AӂƉEӂœ̃ZOgWX^w肵GC
AX̏ꍇ́AItZbĝ݂܂BɁAӂGCAX
ŉEӂ̎͗̂悤L(segreg)߂găfR[h܂B

F
	int*	a == DS:EAX;
	int*	b;
	a = b				LDS	EAX,b


Erif`else
@rif()̒ŎgĂ܂AZqႤƈȊO͎
܂łBu==A!=A<A<=A>A>=vg܂B
@A召̔r̎ɕ̂ȂdvɂȂĂ̂ŁAϐ
^Ȃꍇɂ̓LXg(unsigned)(signed)ĖIɕ
Ȃ錾Kv܂B̂ƂAK̃p[^̑O
悤ɂĂBȊO̓G[ƂȂ܂B

F
						cmp	eax,0
	if((unsigned)EAX > 0){			jbe	#LL0000
		
						jmp	#LL0001
	}else{				#LL0000:
		
	}				#LL0001:

@if`gotoif`breakif`continue̓xœKăW
vQ񂨂Ȃ邱Ƃ͂܂B

F
	if((unsigned)EAX > 0)			cmp	eax,0
		goto label;			ja	#label

@܂Arۂ

F
	if((unsigned)>){			jbe	#LL0000
		
						jmp	#LL0001
	}else{				#LL0000:
		
	}				#LL0001:

̂悤ɋLq邱Ƃł܂Bɂr͍sꂸɃtOɂ
Wv݂̂𐶐܂B

ȉAQlƂāArŎgpł`܂B

	a==b, a!=b, a<b, a<=b, a>b, a>=b	Fcmpt
	==, !=, <, <=, >, >=			Fcmp
	==0, !=0				Fcmpʃo[W
	a, !a					Fa!=0, a==0̕ʂ̏


Eloop
@loop͉iv[vo܂Biv[v甲邽߂ɂbreak
gKv܂B

F
	loop{				#LL0000:
		
						jmp	#LL0000
	}				#LL0001:


Ebreak
@breakloop甲邽߂ɂ܂BlXgloopCɔ
邽߂break̂Ƃɐ邱Ƃo܂B͈̐Cloop
𔲂鐔\܂B܂AȂbreak;'1'
Ă邱ƂɂȂ܂B

F
	break;
	break 2;


Efor
@lɁAfor͈ȉ̂悤ɂȂ܂B

F
	for(ECX=0; ECX<10; ECX++){		xor	ecx,ecx
					#LL0000:
						cmp	ecx,10
						jge	#LL0001
		
						inc	ecx
						jmp	#LL0000
	}				#LL0001:

ᕶłmov r,0    xor r,r̍œKĂ܂


Ewhile

@lɁAwhile͈ȉ̂悤ɂȂ܂B

F
	while(EAX == 0){		#LL0000:
						test	eax,eax
						jne	#LL0001
		
						jmp	#LL0000
	}				#LL0001:

ᕶłcmp r,0    test r,r̍œKĂ܂


Edo`while

@lɁAdo`while͈ȉ̂悤ɂȂ܂B

F
	do{				#LL0000:
		
						test	eax,eax
						je	#LL0000
	}while(EAX == 0);		#LL0001:

ᕶłcmp r,0    test r,r̍œKĂ܂


Eϐ`
@ϐ`

F
	char		a;	1oCg
	short		b;	2oCg
	long		c;	4oCg
	byte		d;	Ȃ1oCg
	word		e;	Ȃ2oCg
	dword		f;	Ȃ4oCg
	long*		g;	ftHgłfar|C^
	long near *	h;	nearL[[hnear|C^
	dword		i[12];	dword^̔z12oCg
	int		j;	4oCg
	unsigned int	k;	unsignedɂ蕄Ȃ4oCg

̂悤ɂȂ܂BŒӂׂ͔zł傤BʏCł͔z
́u^̗vfmۂ邩vłAASKAł͒PɁuoCgm
邩vƂӖɂȂ܂B܂Aᕶ̈Ӗ́udword^̔zR
vfmۂvƂӖɂȂ܂B
@܂AꂪO[oȒ`ȂΏ܂BA
ł͍\̂邱Ƃ͏o܂Bz̏ꍇ""g
̂݉\łB

F
	long	c = 1;

@܂A[JȒ`A݂ł͏͋܂B
[JϐgꍇAȂ萧񂪂̂ŒӂĂB

F

	void function()
	{
	    PUSH(EBP);  /* ́Agݍ݊֐ */
	    ESP -= local;  /* locaĺAASKA̓ʂȕϐ */
	    EBP = ESP;
	
	    int a, b;
	    a = 3;
	    b = ECX;
	
	    ESP = EBP + local;
	    POP(EBP);
	    return;
	}

̂悤ɁAX^bN̊Ǘ肵ȂƖ\܂B
\[Xlocal̓VXeϐŁÅ֐ŎgĂ郍[Jϐ
oCg\܂B܂A[JϐftHgSS:EBPɊt
Ȃꍇ́A

F
	default(local == SS:EBP - local);

̍\ŕύX邱Ƃo܂BȂ݂ɁAL̕@ENTER,LEAVEg
łB

default == ̎A&&͔p~܂B


@[JȒ`̃GCAXɂ郌WX^ւ̊t́A

F
	long	c == EAX;

@邱ƂŁAcANZXEAXANZX̂Ɠʂ
܂Bꌩ܂ӖeɎv܂A_ƂĈ̓WX^
ɖO^鎖o邽߂ɗpr͂肷̂ƁA́A

F
	struct	Point{
		long	x;
		long	y;
	};

	Point*	p == DS:EAX;

̂悤ɍ\̂`Ẵ|C^̃GCAX邱ƂŁA

F
	p->x = 7;			mov	DS:[EAX],7
	p->y = 9;			mov	DS:[EAX+4],9

̂悤ɍ\̂ɃANZX邱Ƃo悤ɂȂ܂B
@́Aʏϐ̃|C^͎QƂłȂƂ_₤̂ɏ\
głƍl܂B܂A

F
	void	[2];

Ŏ蓮ACsƂo܂B

ɁAstaticL[[hgƂŁA֐ɐÓIϐo
o悤ɂȂ܂B

F
	static long DATA::staticdata;

̒ʂAKtZOg𖾎ĂB

܂AstaticϐƂׂA񎩓tT|[g܂B

F
	EAX = DATA::"string\n";

̂悤ɁA֐ɕt邱Ƃo܂B


E\̒`
@\̂Cƌ́AC++ɋ߂܂B
𒆂Ɋ܂߂͏o܂񂪁Atypedefł`肵ȂĂ
ǂƂ낪C̍\̂ɔׂĕ֗łB̓GCAX̏Q
ĂB


EZOg`
@֐ϐǂ̃ZOgɊt邩͂`Ȃ΂
܂B

F
	segment DATA(DWORD, PRIVATE, USE32, RW, 'DATA');

@ŁA()̃p[^͏Ɋ֌W܂BDȂ悤ɏ
B܂AO[oϐ͂segmentߓłƂo
܂B

F
	segment DATA(DWORD, PRIVATE, USE32, RW, 'DATA'){
		long	a = 1;
		dword	b;
	}


E֐`
@֐́A܂tZOg΂Ȃ܂BL
segment߂ɂăZOg쐬ĂB

F
	segment CODE(DWORD, PRIVATE, USE32, ER, 'CODE');

̂ƁA

F
	void CODE::func(){
		
	}
		܂
	void CODE::func(void){
		
	}

Ŋ֐錾邱Ƃo܂B̊֐̒ɃvOƂ
Ȃ܂B̂ƂAĈ悤Ɏreturnt͂Ȃ̂
ӂĂB
@܂ACƓAʂȊ֐Ƃmain()܂Bꂪv
OɂꍇAuend mainvAZuւ̓WJɒǉ
B܂AmainGg|CgɂȂ킯łB

Ɋ֐̃vg^Cv錾T|[gĂ܂̂ŁA

F
	void CODE::func();
		܂
	void CODE::func(void);

ƏƂł܂B

Ex
@x

F
label1:
@label2:
#label3:

void	main(){
label4:
@label5:
#label6:
}

̏܂B@̓O[oXR[vӖA#̓[JXR[v
Ӗ܂BȂɂȂƃftHg̈ӖɂȂ܂B
O[oXR[vŃ[Jx͒`łȂ̂ŁAlabel3̓G[
Ȃ܂B

ӂĂ̂́Ãx̎głBQƂꍇɂ͎I
O[o[JfĂ̂ł悢̂łAOQƂ̏ꍇɂ
IɔʂłA[JXR[vɂĂ܂܂B


TDTv

@\󂠂܂A܂oĂ܂i

UDƐ
@̓t[\tgłB̃\tggĂȂ炩̏QNƂĂ
͐ӔC܂B


