[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/