4

$$NASM の現在のセグメント アドレスとして定義されます。しかし、それの本当の意味は何ですか?私はasmそれをテストするために2つのファイルを書きました:

a.asm

extern another

[section .text]
global _start
_start:
    mov ebx, $$
    call another

b.asm

[section .text]
global another
another:
    mov eax, $$
    ret

コンパイル

nasm -f elf a.asm -g
nasm -f elf b.asm -g
ld -o test a.o b.o

gdb を使用して最終的なファイルをデバッグすると、同じ名前の 2 つのセクションを定義しても、両方のファイルで が異なるtestことがわかりました。$$だから私はそれを推測します:

  1. ファイルにセクションを定義すると、 の値は$$そのセクションの開始アドレスになります。また$$、いわゆるセグメント レジスタ (cs、ss、fs、gs、.etc) とは関係ありません。
  2. 別のファイルに同名の別セクションを定義した場合、別のセクションとして解釈されます。ただし、同じ名前の 2 つのセクションが同じファイルで定義されている場合、それらの間に他のセクション定義があるかどうかに関係なく、常に同じセクションとして同じ$$値で解釈されます。以下のように、2 つの.textセクションはまったく同じです。

    [section .text]
    global _start
    _start:
        mov ebx, $$
    
    [section .d]
    d:
        mov ecx, $$ 
    
    [section .text]
    another:
        mov eax, $$
        ret
    
  3. NASM が認識してコンパイル時に適切な場所に配置できるセクション名がいくつかあると思います。など.dataの場合、NASM が認識して処理できるセクション名は何ですか? どうもありがとう!

4

1 に答える 1

8

$$現在のセクションの先頭のアドレスです。これは再配置可能な値です (「スカラー」ではなく、エラー メッセージに表示される単語ですが、マニュアルにはありません)。これはオフセットであるため、セグメント レジスタの内容は関係ありません。

役に立つのは$ - $$、これまでのセクションの長さだけです。$ - $$は「スカラー」(ラベル間の違いと同様) であり、Nasm が「スカラー値ではない」と愚痴をこぼす原因となる式で使用できます。

Nasm に「認識される」セクション名は、出力形式に依存します。「-f obj」はまったく認識しません。.text.data、および.bssは非常に普遍的です。一部の出力形式は他の形式を認識しています。それらを見つけるのに最適な場所は、マニュアルの「出力形式」の章です。http://www.nasm.usダウンロードでマニュアルを取得しなかった場合。これらの名前は大文字と小文字が区別され、先頭の「.」必要とされている。

ここに私が見逃している「質問」があると感じています。あなたは実際に何をしようとしていますか?

于 2013-02-18T09:36:29.393 に答える