Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 什么';在nasm中,$$的真正含义是什么_Assembly_Nasm_Segment - Fatal编程技术网

Assembly 什么';在nasm中,$$的真正含义是什么

Assembly 什么';在nasm中,$$的真正含义是什么,assembly,nasm,segment,Assembly,Nasm,Segment,$在NASM中定义为当前段地址。但它的真正含义是什么?我编写了两个asm文件来测试它: a.asm b.asm 编译 使用gdb调试最后一个文件test,我发现尽管我用相同的名称定义了两个部分,但两个文件中的$$是不同的。所以我想: 一旦我在文件中定义了一个节,$的值就是该节的起始地址。而$$与此无关 所谓的段寄存器(cs、ss、fs、gs等) 如果我在其他文件中定义了另一个具有相同名称的节,它将被解释为不同的节。但是,如果在同一文件中定义了具有相同名称的两个节,则无论它们之间是否存在其他节定义

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

a.asm

b.asm

编译

使用gdb调试最后一个文件
test
,我发现尽管我用相同的名称定义了两个部分,但两个文件中的
$$
是不同的。所以我想:

  • 一旦我在文件中定义了一个节,
    $
    的值就是该节的起始地址。而
    $$
    与此无关 所谓的段寄存器(cs、ss、fs、gs等)
  • 如果我在其他文件中定义了另一个具有相同名称的节,它将被解释为不同的节。但是,如果在同一文件中定义了具有相同名称的两个节,则无论它们之间是否存在其他节定义,都会将其解释为具有相同
    $$
    值的相同节。如下所示,两个
    .text
    部分完全相同

    [section .text]
    global _start
    _start:
        mov ebx, $$
    
    [section .d]
    d:
        mov ecx, $$ 
    
    [section .text]
    another:
        mov eax, $$
        ret
    
  • 我想NASM可以识别一些节名,并在编译时将它们放在正确的位置。例如
    .data
    ,那么NASM可以识别并使用哪些节名?非常感谢


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

    • 文件:
    • 引导扇区的示例用例:
    • 相关:(因为
      $$
      通常与
      $
      一起使用)
    它唯一有用的是
    $-$$
    ,这是到目前为止的部分长度
    $-$$
    是一个“标量”(标签之间的任何差异都是如此),可以在表达式中使用,否则会导致Nasm抱怨“不是标量值”

    Nasm知道的节名取决于输出格式-“-f obj”根本不知道
    .text
    .data
    .bss
    是非常通用的—一些输出格式知道其他格式。找到它们的最佳位置是手册中的“输出格式”章节。如果你没有下载手册。这些名称区分大小写,前导“.”是必需的


    我觉得这里有一个“问题”我不知道。你到底想做什么?

    如果你单独使用
    $
    ,它看起来通常只是
    0
    ,而不管
    org
    ,即使是在一个简单的二进制文件中。如果您使用的是一个没有段落对齐的16位段,它会是非零的吗?或者它真的只是一个神奇的修饰符,
    $
    获得一个位置/大小,而不是一个绝对地址,它本身没有任何用处吗?@PeterCordes,这似乎不是真的。将原始海报的最后一个示例与
    -f bin
    组合时,
    .d
    部分中的$$按预期值为非零值。如果插入了
    org 100
    ,则所有$$值均为非零。“
    $-$$$
    是一个“标量”(标签之间的任何差异也是如此)”--更正:同一节中两个标签之间的任何差异都是一个标量。
    [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
    
    [section .text]
    global _start
    _start:
        mov ebx, $$
    
    [section .d]
    d:
        mov ecx, $$ 
    
    [section .text]
    another:
        mov eax, $$
        ret