Sea*_*ene 4 assembly nasm segment
$$在 NASM 中定义为当前段地址。但它的真正含义是什么?我写了两个asm文件来测试它:
a.asm
extern another
[section .text]
global _start
_start:
mov ebx, $$
call another
Run Code Online (Sandbox Code Playgroud)
b.asm
[section .text]
global another
another:
mov eax, $$
ret
Run Code Online (Sandbox Code Playgroud)
编译
nasm -f elf a.asm -g
nasm -f elf b.asm -g
ld -o test a.o b.o
Run Code Online (Sandbox Code Playgroud)
使用gdb调试最终文件test,我发现虽然我定义了两个同名的section,但$$两个文件中的不同。所以我猜:
$$就是该段的起始地址。与$$所谓的段寄存器(cs、ss、fs、gs、.etc)无关。如果我在其他文件中定义了同名的另一个部分,它会被解释为不同的部分。但是如果在同一个文件中定义了两个同名段,无论它们之间是否存在其他段定义,它总是被解释为同一个段,具有相同的$$值。如下,这两个.text部分是一样的。
[section .text]
global _start
_start:
mov ebx, $$
[section .d]
d:
mov ecx, $$
[section .text]
another:
mov eax, $$
ret
Run Code Online (Sandbox Code Playgroud)我猜有一些部分名称 NASM 可以识别并在编译时将它们放在正确的位置。比如.data,NASM可以识别并使用它们的这些部分名称是什么?非常感谢!
$$是当前节的开始地址。它是一个可重定位的值(不是“标量”——一个你会在错误消息中找到的词,但在手册中找不到)。它是一个偏移量,所以不关心段寄存器中的内容。
$$通常与 一起使用$)。关于它唯一有用的是$ - $$,到目前为止该部分的长度。$ - $$是一个“标量”(就像标签之间的任何差异一样)并且可以用在表达式中,否则会导致 Nasm 抱怨“不是标量值”。
Nasm“已知”的部分名称取决于输出格式——“-f obj”根本不知道。.text, .data, 和.bss非常通用 - 某些输出格式知道其他格式。找到它们的最佳位置是手册中的“输出格式”章节。http://www.nasm.us如果您没有在下载时获得手册。这些名称区分大小写,并以“.”开头。是必须的。
我有一种感觉,这里有一个我遗漏的“问题”。你究竟想做什么?