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
.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