askaってあるでそ? Kタン作・今原さん実装・I.Tak.さんandRisapapaさんチューニングのアレ。
これってアセンブラになるのかな。
でね。これ、Kタンはよく使ってるんだけど、使い方とか仕様とかがイマイチビビっとまとまってないんだよね。(なんかもったいない)
そんなわけで。こういうものなのか、すこし研究してみようかなぁってなもんで。
原版ともいえる、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 */
これが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
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
segment CODE(USE32, PARA); → CODE segment PARA USE32 ER → default(code == CODE); [INSTRSET "i486p"] [OPTIMIZE 1] [OPTION 1] [BITS 32] [SECTION .text]
こういう変換がされているってことで合ってるかな・・・
ちなみに[FORMAT "BIN" ]はnaskcnv0による指定で変化する
void xxxx(){ xxx: ← Void・引数なし。そのままラベル名に? ホゲホゲ; ホゲ ホゲ ホゲ フガフガ; → フガ フガ フガ ヌトヌト; ヌト ヌト ヌト ] .local equ 0 ←かならずこれが入る?
これは簡単。ほぼ直接変換すればいいんだからwww。
予測だけどたぶん、aska上では10進数・16進数・2進数が書けるはず。これを自動で変換し、並べてるだけっぽい。
ほぼ直接、左側に置かれているなぁ・・・
EBX = EDX; → mov EBX,EDX [EBX] = CL; mov [EBX],CL
こう翻訳されてる。見たままってことでいいはず。
でもたぶん、やっちゃいけない代入とかを検知しているはず・・・
これも事実上、直訳でいいはず・・・
基本、イコールを使って右辺から左辺に指定する。(ほぼMOV命令に直訳されると考えればよい)
当然だが、CPUの仕様上代入が許されないものはエラーになる
(This host) = http://osask.net