2

ラベル アドレス/オフセットの最上位ビットを設定する必要があります。

私は試した:

test.nasm:

BITS 32

dw mylabel | 0x8000

mylabel:
dd 0

しかし、これを組み立てようとすると、次のようになります。

nasm -f bin test.nasm
test.nasm:3: error: `|' operator may only be applied to scalar values

mylabelがスカラー値として認識されないのはなぜですか? ラベルは、アセンブラによってアドレス (スカラー値) に置き換えられるだけだと思いました。

問題がある場合は、nasm v 2.09.04 を使用しています。

助けてくれてありがとう。

編集: |の代わりに+ を使用できました。. ビット単位の演算子がラベルで機能しないようです。どう思いますか、これは意図的なものですか、それともバグですか?

4

2 に答える 2

3

ラベルは再配置可能な値です。その値はリンカー/ローダーによって変更されます。(同じセクション内の) 2 つのラベルの違いはスカラー値であり、Nasm はそれを処理します。

dd (mylabel - $$) | 0x80000000

32 ビット コードのラベルが 16 ビットであるという誤解も修正しました。

これは何を達成することを意図しているのでしょうか。

ベスト、フランク

于 2010-12-07T01:55:36.480 に答える
0

nasm は 2 パスのアセンブラーであるため、「問題のコードの後に​​宣言されたシンボルの値にサイズが依存するコード」を扱うのが難しいため、これはアセンブラーの制限であると思います。

http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoc3.html

セクション 3.7

于 2010-12-05T18:38:44.567 に答える