[OSASK 3995] ORG(Re: nask00i).

  こんにちは、川合です。


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/


ML番号でジャンプ
ML単語検索