gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:59:44 24 4
gpt4 key购买 nike

$$ 被定义为 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
  3. 我猜NASM可以识别一些节名称,并在编译时将它们放在正确的位置。例如.data,那么NASM可以识别并对其进行处理的这些节名称是什么呢?非常感谢!

最佳答案

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

它唯一有用的是$ - $$,即到目前为止该节的长度。 $ - $$ 是一个“标量”(标签之间的任何差异也是如此),可以在表达式中使用,否则会导致 Nasm 提示“不是标量值”。

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

我感觉这里有一个我遗漏的“问题”。你到底想做什么?

关于assembly - nasm中$$的真正含义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14928741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com