2

変数のアドレスを取得し、4096 (メモリ ページのアドレスに対応する) で処理したいと考えています。これはオフラインで計算できるものなので、次のようにしました (v は変数で、vpage にはそのページのアドレスが含まれている必要があります)。

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

このファイルを x86 アセンブラーでコンパイルしようとすると、次のエラーが発生します。

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

なぜGASはこれを計算することを拒否するのでしょうか? 奇妙な部分:「&」を「+」に置き換えると、コードがコンパイルされ、リンク後にアドレスが正しく計算されます。この動作の理由や修正方法についてのヒントは大歓迎です。

4

2 に答える 2

7

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

于 2011-02-21T19:11:30.860 に答える
0

Intel 構文では_AND_OR_NOT_SHL_SHRおよびおそらく他のものを使用して、これを実現できます。これは、GNU のアセンブラーでも機能する可能性があります。

于 2010-12-14T07:25:07.587 に答える