ページへ戻る
印刷
hideyosi/aska研究
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:hideyosi/aska研究 をテンプレートにして作成
開始行:
askaってあるでそ? Kタン作・今原さん実装・I.Tak.さんandR...
これってアセンブラになるのかな。~
でね。これ、Kタンはよく使ってるんだけど、使い方とか仕様と...
そんなわけで。こういうものなのか、すこし研究してみようか...
*実際の動作
**calc1.ask
原版ともいえる、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
これがaska.exeでコンパイルされ、calc1.3asになる。(FM-Tow...
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
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 ...
default(code == CODE); ...
...
...
...
...
こういう変換がされているってことで合ってるかな・・・~
COLOR(red){ちなみに[FORMAT "BIN" ]はnaskcnv0による指定で...
**関数?
void xxxx(){ xxx: ...
ホゲホゲ; ホゲ ホゲ ホゲ
フガフガ; → フガ フガ フガ
ヌトヌト; ヌト ヌト ヌト
] .local equ 0 ...
**構文?
***DB
これは簡単。ほぼ直接変換すればいいんだからwww。~
予測だけどたぶん、aska上では10進数・16進数・2進数が書ける...
***asmout
ほぼ直接、左側に置かれているなぁ・・・
**代入?
EBX = EDX; → mov EBX,EDX
[EBX] = CL; mov [EBX],CL
こう翻訳されてる。見たままってことでいいはず。~
COLOR(red){でもたぶん、やっちゃいけない代入とかを検知して...
**インクリ・デクリ
これも事実上、直訳でいいはず・・・
*ニセ仕様書を捏造!(まるで某のようw)
**概要
-Asukaはi386系CPU専用のアセンブラフロントエンドです??
-あくまでアセンブラです。
-可読性を重視することが最大の目的。
-C言語の仕様に似せているが同じようには使えないこと ←これ...
-命令、条件文は原則ひとつだけ。複合的な条件判定は指定でき...
-セミコロンで一文が終わる
-スペース・タブ・改行等は基本無視される
-行頭が//の場合、その行はコメント扱いとなる
-レジスタを指定する場合は全て大文字で
-即値(なんだっけ?数字を直接指定すること)の場合、10進数...
**代入
基本、イコールを使って右辺から左辺に指定する。(ほぼMOV命...
COLOR(red){当然だが、CPUの仕様上代入が許されないものはエ...
終了行:
askaってあるでそ? Kタン作・今原さん実装・I.Tak.さんandR...
これってアセンブラになるのかな。~
でね。これ、Kタンはよく使ってるんだけど、使い方とか仕様と...
そんなわけで。こういうものなのか、すこし研究してみようか...
*実際の動作
**calc1.ask
原版ともいえる、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
これがaska.exeでコンパイルされ、calc1.3asになる。(FM-Tow...
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
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 ...
default(code == CODE); ...
...
...
...
...
こういう変換がされているってことで合ってるかな・・・~
COLOR(red){ちなみに[FORMAT "BIN" ]はnaskcnv0による指定で...
**関数?
void xxxx(){ xxx: ...
ホゲホゲ; ホゲ ホゲ ホゲ
フガフガ; → フガ フガ フガ
ヌトヌト; ヌト ヌト ヌト
] .local equ 0 ...
**構文?
***DB
これは簡単。ほぼ直接変換すればいいんだからwww。~
予測だけどたぶん、aska上では10進数・16進数・2進数が書ける...
***asmout
ほぼ直接、左側に置かれているなぁ・・・
**代入?
EBX = EDX; → mov EBX,EDX
[EBX] = CL; mov [EBX],CL
こう翻訳されてる。見たままってことでいいはず。~
COLOR(red){でもたぶん、やっちゃいけない代入とかを検知して...
**インクリ・デクリ
これも事実上、直訳でいいはず・・・
*ニセ仕様書を捏造!(まるで某のようw)
**概要
-Asukaはi386系CPU専用のアセンブラフロントエンドです??
-あくまでアセンブラです。
-可読性を重視することが最大の目的。
-C言語の仕様に似せているが同じようには使えないこと ←これ...
-命令、条件文は原則ひとつだけ。複合的な条件判定は指定でき...
-セミコロンで一文が終わる
-スペース・タブ・改行等は基本無視される
-行頭が//の場合、その行はコメント扱いとなる
-レジスタを指定する場合は全て大文字で
-即値(なんだっけ?数字を直接指定すること)の場合、10進数...
**代入
基本、イコールを使って右辺から左辺に指定する。(ほぼMOV命...
COLOR(red){当然だが、CPUの仕様上代入が許されないものはエ...
ページ名: