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