2010-12-14 11 views
2

変数のアドレスを取得し、4096(メモリページのアドレスに対応する)のアドレスを取得したいとします。中のx86アセンブラの結果と、このファイルをコンパイルしようとGnu AS式で '&'演算子を使用できません

.data 
    v:  .zero 0x100 
    vpage: .long v & 0xfffff000 

:これは私がこのようなものを(vは変数とv25ページは、そのページのアドレスが含まれている必要があります)やったオフラインで計算することができるものであるので、次のエラー:

test.S: Assembler messages: 
test.S:3: Error: invalid sections for operation on `v' and `L0' 

なぜGASはこれを計算しないのですか?今度は変わった部分があります: '&'を「+」で置き換えます。コードはコンパイルされ、アドレスはリンクの後で正しく計算されます。この行動の理由や解決方法についてのヒントは大歓迎です。

+0

通常、バックエンドアセンブラとしてガスが使用されます。コンパイラはすでにすべての定数式を評価しています –

+0

@Marcoその場合、私はNASMまたはYASMに切り替えることができると思います。 – Gnurou

+0

重要な金額は:はい。または、コンパイラのインラインアセンブラを使用し、コンパイラに修正させます。 –

答えて

6

これは、GASがリンカによって処理されるオブジェクトファイルを生成するという問題です。 GASはビット単位のAND演算をサポートしていますが、絶対アドレスでは実行できません。これらはリンカによって変更される可能性があるため、GASは限られた操作(主にオフセットのみ)をサポートする再配置エントリを生成する必要があります。絶対アドレスを(ローカル)相対アドレスにすることができれば、GASはアセンブリ時にそれを計算することができます。それ以外の場合は、実行時にコードから実行する必要があります。

+0

偉大な答え。この問題は、asの代わりにgccを呼び出し、そのためにCプリプロセッサを使用することで回避策が簡単ですが、この動作の理由を理解することができました。ありがとう! – Gnurou

0

インテルの構文では、これを実現するために_AND_OR_NOT_SHL_SHRと多分他の人を使用することができます。これはGNUのアセンブラでも動作します。

+0

残念ながら、GASはそれらを認識しません。 – Gnurou

関連する問題