【发布时间】:2013-02-02 10:29:47
【问题描述】:
$$ 被定义为 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可以识别并用它们做点什么的这些段名是什么?非常感谢!
【问题讨论】: