4

$$在 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. 如果我在其他文件中定义了另一个具有相同名称的部分,它将被解释为不同的部分。但是如果同名的两个section定义在同一个文件中,无论它们之间是否有其他的section定义,总是被解释为同一个section,具有相同的$$值。如下所示,这两个.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 回答