$$
在 NASM 中定义为当前段地址。但它的真正含义是什么?我写了两个asm
文件来测试它:
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 调试最终文件test
,我发现虽然我定义了两个同名的部分,但$$
两个文件中的部分不同。所以我猜:
- 一旦我在文件中定义了一个部分, 的值
$$
就是该部分的起始地址。并且$$
与所谓的段寄存器(cs,ss,fs,gs,.etc)无关。 如果我在其他文件中定义了另一个具有相同名称的部分,它将被解释为不同的部分。但是如果同名的两个section定义在同一个文件中,无论它们之间是否有其他的section定义,总是被解释为同一个section,具有相同的
$$
值。如下所示,这两个.text
部分是一样的。[section .text] global _start _start: mov ebx, $$ [section .d] d: mov ecx, $$ [section .text] another: mov eax, $$ ret
我想有一些 NASM 可以识别的部分名称,并在编译时将它们放在正确的位置。比如
.data
,那么这些 NASM 可以识别并对其进行操作的部分名称是什么?非常感谢!