$$
被定义为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
,我发现尽管我定义了两个具有相同名称的部分,但$$
在两个文件中都不同。所以我想:
$$
的值就是该部分的起始地址。 $$
与$$
毫无关系
所谓的段寄存器(cs,ss,fs,gs,.etc)。如果我在其他文件中定义了另一个具有相同名称的部分,则将其解释为不同的部分。但是,如果在同一文件中定义了具有相同名称的两个部分,则它们之间是否存在其他部分定义,它始终被解释为具有相同.text
值的相同部分。如下所示,两个[section .text]
global _start
_start:
mov ebx, $$
[section .d]
d:
mov ecx, $$
[section .text]
another:
mov eax, $$
ret
部分是相同的。
.data
我猜NASM可以识别一些部分名称,并在编译时将它们放到正确的位置。比如{{1}},那么NASM可以识别并用它们做些什么的这些部分名称是什么?非常感谢!
答案 0 :(得分:2)
$$
是当前部分开头的地址。它是一个可重定位的值(不是“标量” - 您将在错误消息中找到的单词,但不在手册中)。它是一个偏移量,所以不关心段寄存器中的内容。
$$
通常与$
一起使用)。关于它唯一有用的是$ - $$
,到目前为止该部分的长度。 $ - $$
是一个“标量”(标签之间的任何差异),可用于表达式,否则会导致Nasm抱怨“不是标量值”。
Nasm的“已知”部分名称取决于输出格式 - “-f obj”根本不知道。 .text
,.data
和.bss
非常普遍 - 某些输出格式知道其他格式。找到'em的最佳位置是手册中的“输出格式”章节。 http://www.nasm.us如果您没有下载手册。这些名称区分大小写,并且前导'。'是必需的。
我觉得这里有一个“问题”我缺席了。你究竟想做什么?