こんばんは、川合です。
I.Tak. さんは 2002/07/11 17:02:13 の「[OSASK 3989] Re: nask00i..
」で書きました:
>>これでgccで最適化しても大丈夫になるかもしれません。
> できました!gccのバグじゃなくて良かった……
おお、これは嬉しいです。この辺を指摘してくださった光成さんやGa
kuさんに感謝です。Gakuさんのメールでは、なぜ最適化しないときにと
ても大きなバイナリになるのかもよくわかりました。ありがとうござい
ます。
> ところが、
>label:mov eax, ebx
>などとラベルと命令をくっつけるとエラーを返します。(^^;
NASKではコロンは一般的なセパレータではないというのが方針です。
パラメータの区切りでは、コンマなどとともにセパレータとして扱いま
すが(もちろんふさわしくないところに書けばエラーです)、ニーモニ
ックを検出するまでは、コロンは単なる文字です。
これがなんの役に立つのかといわれれば、それはよくわかりません。
でもコロンを含むニーモニックを許すことになります。そんなものが将
来にわたって出てくるのかどうか分かりませんが。ニーモニックは数字
で始まってもいいです。たとえば、
486::MOV
なんていうニーモニックがあってもいいわけです。まあ、結局は役に立
たない仕様かもしれませんが。
ということで、「label: mov eax, ebx」とスペースやタブ、もしく
は改行を入れてください。・・・この仕様はお気に召さないでしょうか
???
>> NASKのBINモードでは、ラベルの差をとらなくても全ての演算が可能です。(LABEL1+L
>>ABEL2)/2とか、LABEL1*5とか、もう好きなようにやってください。$$は恒等的に0です
>>。COFFモードではまた挙動が変わりますが。
>$$=0 はまずいと思います。org はどうなっちゃうんですか。
うーん、なるほど。確かにまずいかもしれません。
base_at.nasで示したように、NASKでは同一セクションに対し何度で
もORGができます。
ORG 0x0000
DB $,..$
ORG 0x0008
DB $-1,0x12
ORG 0x0005
DW $
なんていうのをアセンブルすると、
0x00 0x02 0x07 0x12 0x05 0x00
なんていうバイト列が出力されます。MASMのORGとは異なり、間を何ら
かのバイトで埋めようとはしませんし、戻っても何のエラーにもなりま
せん。これでプログラムを特定のアドレスに転送するようなプログラム
が簡単にかけます。
さて、一番最初にNASKは暗黙のORG 0を実行しています。それゆえ、
「セクションの最初」という意味では「$$ == 0」なわけです。しかし
これはこれで、NASMとの互換性で問題になるともいえます。というこ
とで改善案を提案します。それは、$$がもっとも最後にORGされたアド
レスを返すという仕様に変更することです。
この仕様だと、
ORG 0x0000
DB $$
ORG 0x0008
DB $$
ORG 0x0005
DB $$
をアセンブルすると、「0x00 0x08 0x05」というバイト列が返ることに
なります。・・・という案はいかがでしょうか?>I.Tak.さん。問題が
ないということでしたら、その方針でnask00jを作ります。
それでは。
--
川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/