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言語の仕様に似せているが同じようには使えないこと ←これ重要 -命令、条件文は原則ひとつだけ。複合的な条件判定は指定できない。 -セミコロンで一文が終わる -スペース・タブ・改行等は基本無視される -行頭が//の場合、その行はコメント扱いとなる -レジスタを指定する場合は全て大文字で -即値(なんだっけ?数字を直接指定すること)の場合、10進数・16進数・2進数を書くことができる。また、文字を指定してコードとすることもできる **代入 [#k4536bb4] 基本、イコールを使って右辺から左辺に指定する。(ほぼMOV命令に直訳されると考えればよい)~ COLOR(red){当然だが、CPUの仕様上代入が許されないものはエラーになる}
(This host) = http://osask.net