ページへ戻る

− Links

 印刷 

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

osaskwiki:hideyosi/aska研究 のバックアップ差分(No.2)

« Prev[4]  Next »[5]
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言語の仕様に似せているが同じようには使えないこと ←これ重要
 +
 +-命令、条件文は原則ひとつだけ。複合的な条件判定は指定できない。
 +-セミコロンで一文が終わる
 +-スペース・タブ・改行等は基本無視される
 +-行頭が//の場合、その行はコメント扱いとなる
 +
 +
 +-レジスタを指定する場合は全て大文字で
« Prev[4]  Next »[5]