こんにちは、川合です。 I.Tak. さんは 2002/07/12 10:26:51 の「[OSASK 3993] Re: nask00i.. 」で書きました: > NASMだと、org はアドレスのオリジンを設定するだけ、つまり >"org hoge" の意味は "$$ = hoge" です。そんでもって、$$ は >最後に(内部のbinリンカで)評価されるようです。たとえば > org 0xff > dw $ > org 0x10 > dw $ >というコードは > org 0x10 > dw $ > dw $ >と全く同じ意味です。 > > この制限は、MASMみたいにトリッキーなことをしてコードを破壊する >危険をさけるため、と説明されています。今のnask仕様でも、上書きする >つもりはないのに、前の部分が存外に長くて上書きしてしまったという >問題を招きかねません。戻って上書きすることの意味はなんでしょうか? > > ファイル中を戻って上書きできるのに、進むことはできないという非対称 >も変な感じです。先頭からずらずら書く方が分かりやすいと思います。 うーん、I.Tak.さんは誤解なさっているようです。[OSASK 3992]では 「$」の挙動を中心に説明しましたが、上書き問題が分かりやすいよう な例にしましょう。 ORG 0x0004 DB 1,2,3,4,5,6,7,8 ORG 0x0000 DB 1,2,3,4,5,6,7,8 をNASKにかければ、 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x8 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 というコードが得られます。つまりORGがどんな値になろうと、上書き や余白の挿入は行いません。[SECTION]が絡まない限り、書かれた順序 で展開されます。ラベル計算時の値の基点が変わるだけです。そんな わけで、 ORG 0xff DW $ ; 0xff 0x00 になる ORG 0x10 DW $ ; 0x10 0x00 になる となり、 ORG 0x10 DW $ ; 0x10 0x00 になる DW $ ; 0x12 0x00 になる となるわけです。 この仕様をご理解いただいた上で、僕が[OSASK 3992]で提案した案を ご検討ください。 > そして、たぶんアセンブラとリンカが完全に別れているからだと >思いますが、 >> DB $$ >こんなことをすると "error: one-byte relocation attempted" と >しかられます。org 0x100 とか出てくるとまずいからでしょう。 この辺はNASKは柔軟です。結果が収まりさえすれば、OKです。だから [BIT 32]下で、DW $などとやってもかまいません。 それでは。 -- 川合 秀実(KAWAI Hidemi) OSASK計画代表 / システム設計開発担当 E-mail:kawai !Atmark! imasy.org Homepage http://www.imasy.org/~kawai/