こんにちは、川合です。
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/