$$
определяется как адрес текущего сегмента в 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
Я предполагаю, что есть некоторые названия разделов, которые NASM может распознать и поставить их в нужное место при компиляции. Например,
.data
, то каковы названия этих разделов, которые NASM может распознавать и что-то делать с ними? Большое спасибо!