【问题标题】:What's the real meaning of $$ in nasmnasm中$$的真正含义是什么
【发布时间】: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,我发现虽然我定义了两个同名的部分,但两个文件中的$$ 是不同的。所以我猜:

  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可以识别并用它们做点什么的这些段名是什么?非常感谢!

【问题讨论】:

    标签: assembly nasm segment


    【解决方案1】:

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

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

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

    我觉得这里有一个我错过的“问题”。你到底想做什么?

    【讨论】:

    • 如果你单独使用$$,它似乎通常只是0,不管org,即使在一个平面二进制文件中。如果您使用的是非段落对齐的 16 位段,它是否会非零?或者它真的只是$ 获得位置/大小而不是绝对地址的魔术修饰符,本身没有用处?
    • @PeterCordes 这似乎不是真的。当使用-f bin 组装原始海报的最后一个示例时,.d 部分中的 $$ 的值如预期的那样非零。如果插入 org 100,则所有 $$ 值都非零。
    • "$ - $$ 是一个“标量”(标签之间的差异也是如此)" -- 更正:两个标签在同一部分之间的任何差异都是一个标量。
    猜你喜欢
    • 2017-05-06
    • 2012-03-30
    • 2011-10-10
    • 2012-08-03
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多