[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]
[OSASK 3570] nask00a.
こんにちは、川合です。
nask00aをベータリリースします。そう、あのNASKです。
・・・ええと、でも、まだ未完成なのであまり多くを期待しないで下
さい。実用にはならないレベルです。
詳しい特徴を説明するのが面倒なので、例によってドキュメントから
抜粋します。
---
2.現時点での制限事項(将来改善する仕様)
かなり多くの命令が使えません。これはNASKの完成度が著しく低いためです。使える
命令は以下の通りです。
[BITS n], [INSTRSET cpu], [FORMAT "BIN"], [OPTIMIZE n], [OPTION n]
AAA, AAS, ARPL, BOUND, BSF, BSR, BSWAP, CBW, CDQ, CLC, CLD, CLI, CLTS, CMC,
CMPS, CMPXCHG, CWD, CWDE, DAA, DAS, DIV, HLT, IDIV, INS, INT3, INTO, INVD,
INVLPG, IRET, LAHF, LAR, Lseg, LEA, LEAVE, LGDT, LIDT, LLDT, LMSW, LODS, LSL,
LTR, MOVS, MUL, NEG, NOP, NOT, OUTS, POPA, POPF, PUSHA, PUSHF, SAHF, SCAS,
SETcc, SGDT, SIDT, SLDT, SMSW, STC, STD, STI, STOS, STR, VERR, VERW, WAIT,
WBINVD, XADD, XLATB
これを見て分かるように、MOVやADD、CMPなどはまだです(付け加えるのは簡単なので
すが、まだ面倒なのでやっていなかったんです)。
エラー処理が弱いので、エラーは起こさないようにしましょう。
そしてこれは非常にマイナスポイントなのですが、ラベルが使えません。定義するこ
とも参照することもできません。
・・・ということで、このバージョンはまったく使い物になりません。期待しないで
下さい。
3.特筆すべき(?)仕様
今のところバイナリーサイズは18.5KBです。多分、最終的に50KBという目標は達成で
きるでしょう。
NASKでは、BITSを[]でくくらなければなりません。
また、INSTRETなどの追加命令があるので、NASMとの互換ソースを書く際に問題になる
かもしれません。そのために、「;%NASK」という記述をすることができます。これはNAS
Mでは当然注釈になりますが、NASKではスペース扱いになります。NASK専用ソースという
ことでしたら、この記述はいりません。
INSTRSETはCPU名を指定します。今のところ以下のCPU名が指定できます。
"8086", "80186", "80286", "80286p", "i386", "i386p", "i486", "i486p"
8086モードでは、FSやEBXなどが予約語になりません。デフォルトは8086です。末尾に
pが付くのはプロテクトモード用の命令群です。
FORMATは出力ファイルのフォーマット指定です。NASKでは、コマンドラインではなく
ソースで指定します。"BIN"と"COFF"があります。デフォルトは"BIN"です。
OPTIMIZEは最適化のON/OFFです。0だとNASM並みです。1だとNASKの真価を味わえます(
笑)。デフォルトは0です。
OPTIONは/や%、>>の扱いです。0だとNASMのように符号無しになります。1だと符号有
りになります。デフォルトは0です。なお、[OPTION 1]では、//や%%が符号無しになりま
す。右シフトについては、OPTIONに関わらず、&>が符号無しシフト、|>が符号有りシフ
トです。
4.メモリアドレッシング
(1)セグメントオーバーライドプリフィックス
セグメントオーバーライドは、以下の3つの場所にいずれかに書けます。お好きなと
ころに書いてください。
・[]の中(NASM準拠)
・[]の前(MASM準拠)
・オペコードの前("cs movsb"や、"es mul [edi]"のように)
なお、OPTIMIZEがONになっていれば、省略可能なDSやSSの指定はあっさりと消し去
られます。これで僕のようにいつでもセグメントを書きたがるプログラマーも、気に
しないで書けます(笑)。LEA命令では、どんなセグメントオーバーライドがついていて
もあっさりとキャンセルされます。
(2)実効アドレス式
NASMのように、かなり複雑な記述を許します。"IDIV BYTE [EBX*3]"なんていうのが
OKなのはもちろんですが、"LEA EAX,[(EAX+ECX-5)*8/2-3*EAX]"というのもOKです。ス
ケールに割り算を認めるのは、NASMを超えています(もちろん、[EAX*3/2]というのは
できない)。また、シフトもできます([EAX<<1])。
(3)ベースとインデックス
[EAX+ECX+8]みたいな記述では、NASKはどちらをベースにすればいいのかを自分の裁
量で決めて良いと判断します。しかし[EAX*1+ECX+8]や[EAX+ECX*1+8]のようにどちら
かに掛け算がかかっていたら、勝手な裁量をせずにそちらをインデックスにまわしま
す。掛け算は、1*ECXのようなものでもかまいません。両方に掛け算してあれば、NASK
の裁量でやります。
[EBP+EDX]のようなものでは、SSやDSが指定されていればプリフィックスを省略でき
る方法を求めてどちらをベースにするか選びますし、そうでなければEDXをベースにし
て、disp8の省略を狙います。
(4)アドレスモード
実効アドレス式中に32bitレジスタが使われていれば32bitアドレッシング、16bitレ
ジスタが使われていれば16bitアドレッシングになります。これらとBITSの内容を比較
して必要に応じてアドレスサイズオーバーライドプリフィックスが出力されます。
もし実効アドレス式がdispのみの場合は、dispの値によらず、アドレスサイズオー
バーライドしないという前提でアセンブルされます。もしこれを覆したい場合は、[]
内に、WORDもしくはDWORDと書いて下さい。
6.各種いいわけ(笑)
4月のはじめから本格的に作りはじめて、半月でここまで来れば、まあまあということ
ろでしょう。サイズも現時点で18.5KBであり、これでMOVなどをサポートすれば5KBくら
い増えて、ラベルをサポートして15KBくらい増えて、そんでもってCOFFをサポートすれ
ばさらに10KBくらい増えるでしょう。だからまあ、予定通りのサイズです。
NASKを作るのは結構楽しいのですが、こればかりやっているわけにもいかないので、
Peteを作ることにします。
ソースはANSI-Cで書くつもりだったんですが、つい便利さに負けて注釈に「//」を使
っています。その部分さえ直せば、ほとんどの32bitコンパイラで通るでしょう。
---
ええと、それでですね、もし物好きな方がおられましたら、サポート
している命令の範囲でアセンブルして遊んで下さい。そんでもってアセ
ンブル結果がおかしいなどのバグを見つけたらご報告ください。
なおソースは結構汚いです。期待しないで下さい(笑)。
僕は明日からNASKを保留にしてPeteを書きます。
それでは。
--
川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/