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 ←かならずこれが入る?EBX = EDX; → mov EBX,EDX [EBX] = CL; mov [EBX],CL
こう翻訳されてる。見たままってことでいいはず。
でもたぶん、やっちゃいけない代入とかを検知しているはず・・・