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

Sea*_*ene 4 assembly nasm segment

$$在 NASM 中定义为当前段地址。但它的真正含义是什么?我写了两个asm文件来测试它:

a.asm

extern another

[section .text]
global _start
_start:
    mov ebx, $$
    call another
Run Code Online (Sandbox Code Playgroud)

b.asm

[section .text]
global another
another:
    mov eax, $$
    ret
Run Code Online (Sandbox Code Playgroud)

编译

nasm -f elf a.asm -g
nasm -f elf b.asm -g
ld -o test a.o b.o
Run Code Online (Sandbox Code Playgroud)

使用gdb调试最终文件test,我发现虽然我定义了两个同名的section,但$$两个文件中的不同。所以我猜:

  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我猜有一些部分名称 NASM 可以识别并在编译时将它们放在正确的位置。比如.data,NASM可以识别并使用它们的这些部分名称是什么?非常感谢!

Fra*_*ler 8

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

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

Nasm“已知”的部分名称取决于输出格式——“-f obj”根本不知道。.text, .data, 和.bss非常通用 - 某些输出格式知道其他格式。找到它们的最佳位置是手册中的“输出格式”章节。http://www.nasm.us如果您没有在下载时获得手册。这些名称区分大小写,并以“.”开头。是必须的。

我有一种感觉,这里有一个我遗漏的“问题”。你究竟想做什么?

  • @PeterCordes 这似乎不是真的。当使用“-f bin”组装原始海报的最终示例时,会按预期在“.d”部分中为 $$ 提供非零值。如果插入“org 100”,则所有 $$ 值均非零。 (2认同)