什么是$$在nasm中的真正含义

时间:2013-02-18 02:46:08

标签: assembly nasm segment

$$被定义为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,我发现尽管我定义了两个具有相同名称的部分,但$$在两个文件中都不同。所以我想:

  1. 一旦我在文件中定义了一个部分,$$的值就是该部分的起始地址。 $$$$毫无关系 所谓的段寄存器(cs,ss,fs,gs,.etc)。
  2. 如果我在其他文件中定义了另一个具有相同名称的部分,则将其解释为不同的部分。但是,如果在同一文件中定义了具有相同名称的两个部分,则它们之间是否存在其他部分定义,它始终被解释为具有相同.text值的相同部分。如下所示,两个[section .text] global _start _start: mov ebx, $$ [section .d] d: mov ecx, $$ [section .text] another: mov eax, $$ ret 部分是相同的。

    .data
  3. 我猜NASM可以识别一些部分名称,并在编译时将它们放到正确的位置。比如{{1}},那么NASM可以识别并用它们做些什么的这些部分名称是什么?非常感谢!

1 个答案:

答案 0 :(得分:2)

$$是当前部分开头的地址。它是一个可重定位的值(不是“标量” - 您将在错误消息中找到的单词,但不在手册中)。它是一个偏移量,所以不关心段寄存器中的内容。

关于它唯一有用的是$ - $$,到目前为止该部分的长度。 $ - $$是一个“标量”(标签之间的任何差异),可用于表达式,否则会导致Nasm抱怨“不是标量值”。

Nasm的“已知”部分名称取决于输出格式 - “-f obj”根本不知道。 .text.data.bss非常普遍 - 某些输出格式知道其他格式。找到'em的最佳位置是手册中的“输出格式”章节。 http://www.nasm.us如果您没有下载手册。这些名称区分大小写,并且前导'。'是必需的。

我觉得这里有一个“问题”我缺席了。你究竟想做什么?