1: 2010-02-09 (火) 13:58:58 lina[6] [7] | 2: 2010-02-09 (火) 15:12:34 lina[6] [8] | ||
---|---|---|---|
Line 6: | Line 6: | ||
*実際の動作 [#cc330070] | *実際の動作 [#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言語の仕様に似せているが同じようには使えないこと ←これ重要 | ||
+ | |||
+ | -命令、条件文は原則ひとつだけ。複合的な条件判定は指定できない。 | ||
+ | -セミコロンで一文が終わる | ||
+ | -スペース・タブ・改行等は基本無視される | ||
+ | -行頭が//の場合、その行はコメント扱いとなる | ||
+ | |||
+ | |||
+ | -レジスタを指定する場合は全て大文字で |
(This host) = http://osask.net