[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 3821] Re: ぼやきのnaskページ



  こんにちは、川合です。


I.Tak. さんは 2002/06/13 12:59:21 の「[OSASK 3820] Re: ぼやきのn
askページ」で書きました:

> すみません、struc の機能をはしょってしまいました。
    (引用中略)
> コンテキストスタックとか必要ですね(^^;
>これが使えるようになるかも知れないならかなり期待できます(^_^;;;;

  考えているうちに非常にめんどうになってきました(笑)。

  というか本家NASMのマクロは機能がいっぱいありすぎです。使う方は
いいですが、作るのが大変です。

  STRUCやALIGNもやめるかなあ・・・。とりあえず[ABSOLUTE 0]やRESB
とかを直接使いなさいってことにして。[ABSOLUTE n]は[SECTION name]
をサポートした後なら導入は簡単そうなので、やるとは思いますが。

  まあやろうと思えばプリプロセッサだけで30KBくらいで書けそうです
が(そしてNASKの1ルーチンとして組み込むことも簡単にできるのです
が)、これは「やりたい」っていう人にお任せした方がいいと思います
。

  もしかしたらやってみたいという方がおられるかもしれないので、つ
いでに書いておきましょう。

  やり方は2つあります。

  1つは完全に別プログラムにしてしまう方法で、この場合はテキスト
を受け取ってテキストを出力するようなそれだけのプログラムです。こ
の考えに立てば、nasmcnvやASKAもプリプロセッサみたいなものです。

  もう1つはNASKへの組み込みです。これは

UCHAR *prepro(UCHAR *src0, UCHAR *src1, UCHAR *dest0, UCHAR *dest1);

という関数を書きます。UCHARというのは、unsigned charのことです。
NASKでは一貫して全ての作業をオンメモリでやります(これはメモリマ
ップトファイルを強く意識しているせいでもありますが)。src0はソー
スファイルの内容が読み込まれているバッファへのポインタでバイト数
は(src1 - src0)です。ここから1バイトたりともはみ出してはいけませ
んし、まして書き込みなんてもってのほかです。

  一方、dest0は出力用のバッファポインタで、最大で(dest1-dest0)バ
イトを出力していいです。もし出力用のバッファが足りなくなったら、
関数値としてNULLを返してください。プリプロセスでエラーが発生した
場合は

; [ERROR #020] symbol redefined.

みたいな感じで出力ソースに混ぜちゃってください。NASKはエラーがあ
っても極力処理を続行するというのがポリシーです。またリスティング
の際に元の行番号と内容が分かった方がいいと思われるので、

; [ソースでの行番号] ソースの内容

みたいなのを毎行出力するといいかもしれません。エラーやリスティン
グについては、nask()やoutput()と仕様を調節しさえすれば、これ以外
にもどうにでもできますが。

  なおエラー番号は僕の方では16個もあれば十分です。ということで16
番以降はプリプロセッサ側で使ってください。

  prepro()が返す値についてですが、これはdest0からどこまで出力し
たのかそれを知らせるためのポインタです。(dest0 + 出力バイト数)を
返してください。

  ・・・ということで興味のある方はSTRUCを[ABSOLUTE 0]などに開い
たり、ALIGNをRESBに開いたりできるpreproを書いてもらえないでしょ
うか。そうしていただければ、NASKに組み込みますので。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/