$$
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
ことがわかりました。$$
だから私はそれを推測します:
- ファイルにセクションを定義すると、 の値は
$$
そのセクションの開始アドレスになります。また$$
、いわゆるセグメント レジスタ (cs、ss、fs、gs、.etc) とは関係ありません。 別のファイルに同名の別セクションを定義した場合、別のセクションとして解釈されます。ただし、同じ名前の 2 つのセクションが同じファイルで定義されている場合、それらの間に他のセクション定義があるかどうかに関係なく、常に同じセクションとして同じ
$$
値で解釈されます。以下のように、2 つの.text
セクションはまったく同じです。[section .text] global _start _start: mov ebx, $$ [section .d] d: mov ecx, $$ [section .text] another: mov eax, $$ ret
NASM が認識してコンパイル時に適切な場所に配置できるセクション名がいくつかあると思います。など
.data
の場合、NASM が認識して処理できるセクション名は何ですか? どうもありがとう!