ページへ戻る

− Links

 印刷 

hideyosi​/aska研究 のバックアップソース(No.2) :: OSASK計画

osaskwiki:hideyosi/aska研究 のバックアップソース(No.2)

« Prev[4]  Next »[5]
askaってあるでそ? Kタン作・今原さん実装・I.Tak.さんandRisapapaさんチューニングのアレ。~
これってアセンブラになるのかな。~
でね。これ、Kタンはよく使ってるんだけど、使い方とか仕様とかがイマイチビビっとまとまってないんだよね。(なんかもったいない)

そんなわけで。こういうものなのか、すこし研究してみようかなぁってなもんで。

*実際の動作 [#cc330070]
**calc1.ask [#ka5f13d5]
原版ともいえる、aska用のソース
 segment CODE(USE32, PARA);
 default(code == CODE);

 void header()
 {
 	DB(0x47, 0x01, 0x05);
 }

 void puteax();

 void main()
 {
 	//	CALL([ESI]);
 	DB(0x38, 0x65, 0x00, 0x21, 0x69, 0x6e, 0x74, 0x87);
 	asmout("DB 'formula'");
 	DB(0x48, 0x60, 0x05, 0x13, 0x3d, 0x20, 0x00);
 	PUSH(EAX);
 	if (EAX < 0) {
 		CALL([ESI]);
 		DB(0x51, 0x2d, 0x00);
 		NEG(EAX);
 	}
 	EBX = EDX;
 	[EBX] = CL;
 	CL = 10;
 	puteax();
 	CALL([ESI]);
 	DB(0x51, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x00);
 	POP(EAX);
 	CL = 16;
 }

 void puteax()
 {
 	do {
 		EBX++;
 		EDX = 0;
 		DIV(ECX);
 		DL += 0x10;
 		[EBX] = DL;
 	} while (EAX != 0);
 	do {
 		EBX--;
 		CALL([ESI]);
 		DB(0x55, 0x16, 0xba);
 		DL = [EBX];
 	} while (DL != 0);
 //	return;
 }

 /* naskcnv0.g01 -l -s */

**calc1.3as [#j245353d]
これがaska.exeでコンパイルされ、calc1.3asになる。(FM-Towns用に販売されてたアセンブラ、386|asm というものの形式)

 CODE			segment	PARA USE32 ER
 header			proc	near
 			DB	47H,01H,05H
 #local			equ	0
 header			endp

 main			proc	near
 			DB	38H,65H,00H,21H,69H,6eH,74H,87H
 DB 'formula'
 			DB	48H,60H,05H,13H,3dH,20H,00H
 			PUSH	EAX
 			test	EAX,EAX
 			jge	#LL0000
 			CALL	[ESI]
 			DB	51H,2dH,00H
 			NEG	EAX
 #LL0000:
 			mov	EBX,EDX
 			mov	[EBX],CL
 			mov	CL,10
 			call	near ptr puteax
 			CALL	[ESI]
 			DB	51H,20H,3dH,20H,30H,78H,00H
 			POP	EAX
 			mov	CL,16
 #local			equ	0
 main			endp

 puteax			proc	near
 #LL0000:
 			inc	EBX
 			xor	EDX,EDX
 			DIV	ECX
 			add	DL,10H
 			mov	[EBX],DL
 			test	EAX,EAX
 			jne	#LL0000
 #LL0001:
 #LL0002:
 			dec	EBX
 			CALL	[ESI]
 			DB	55H,16H,0baH
 			mov	DL,[EBX]
 			test	DL,DL
 			jne	#LL0002
 #LL0003:
 #local			equ	0
 puteax			endp
 CODE			ends
 			end	main
**calc1.nas [#dd430c4e]
naskcnv0によって、nask用のコードに変換される。

 [FORMAT "BIN"  ]
 [INSTRSET "i486p"]
 [OPTIMIZE 1]
 [OPTION 1]
 [BITS 32]
 [SECTION .text]
 header:
 			DB	47H,01H,05H
 .local			equ	0

 main:
 			DB	38H,65H,00H,21H,69H,6eH,74H,87H
 DB 'formula'
 			DB	48H,60H,05H,13H,3dH,20H,00H
 			PUSH	EAX
 			test	EAX,EAX
 			jge	.LL0000
 			CALL	[ESI]
 			DB	51H,2dH,00H
 			NEG	EAX
 .LL0000:
 			mov	EBX,EDX
 			mov	[EBX],CL
 			mov	CL,10
 			call	near     puteax
 			CALL	[ESI]
 			DB	51H,20H,3dH,20H,30H,78H,00H
 			POP	EAX
 			mov	CL,16
 .local			equ	0

 puteax:
 .LL0000:
 			inc	EBX
 			xor	EDX,EDX
 			DIV	ECX
 			add	DL,10H
 			mov	[EBX],DL
 			test	EAX,EAX
 			jne	.LL0000
 .LL0001:
 .LL0002:
 			dec	EBX
 			CALL	[ESI]
 			DB	55H,16H,0baH
 			mov	DL,[EBX]
 			test	DL,DL
 			jne	.LL0002
 .LL0003:
 .local			equ	0


*考察・・・ [#u436cfc5]
**ヘッダ? [#e859e56f]
 segment CODE(USE32, PARA);      →   CODE  segment  PARA USE32 ER →
 default(code == CODE);                                                    [INSTRSET "i486p"]
                                                                           [OPTIMIZE 1]
                                                                           [OPTION 1]
                                                                           [BITS 32]
                                                                           [SECTION .text]

こういう変換がされているってことで合ってるかな・・・~
COLOR(red){ちなみに[FORMAT "BIN"  ]はnaskcnv0による指定で変化する}

**関数? [#f2ec9464]
 void xxxx(){                    xxx:                     ← Void・引数なし。そのままラベル名に?
        ホゲホゲ;                   ホゲ    ホゲ   ホゲ
        フガフガ;     →            フガ    フガ   フガ
        ヌトヌト;                   ヌト    ヌト   ヌト
 ]                               .local     equ      0    ←かならずこれが入る?


**構文? [#a0a87c9e]

***DB [#v006d880]
これは簡単。ほぼ直接変換すればいいんだからwww。~
予測だけどたぶん、aska上では10進数・16進数・2進数が書けるはず。これを自動で変換し、並べてるだけっぽい。

***asmout [#ee495c91]
ほぼ直接、左側に置かれているなぁ・・・

**代入? [#t6372d2c]
 EBX = EDX;          →    mov	EBX,EDX
 [EBX] = CL;               mov	[EBX],CL
こう翻訳されてる。見たままってことでいいはず。~
COLOR(red){でもたぶん、やっちゃいけない代入とかを検知しているはず・・・}

**インクリ・デクリ [#p21ccc94]
これも事実上、直訳でいいはず・・・



*ニセ仕様書を捏造!(まるで某のようw) [#ge740871]

**概要 [#j51b74f5]
-Asukaはi386系CPU専用のアセンブラフロントエンドです??
-あくまでアセンブラです。
-可読性を重視することが最大の目的。
-C言語の仕様に似せているが同じようには使えないこと ←これ重要

-命令、条件文は原則ひとつだけ。複合的な条件判定は指定できない。
-セミコロンで一文が終わる
-スペース・タブ・改行等は基本無視される
-行頭が//の場合、その行はコメント扱いとなる


-レジスタを指定する場合は全て大文字で


« Prev[4]  Next »[5]