Каково реальное значение слова $$ в насме?
$$
определяется как адрес текущего сегмента в 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 может распознать и что-то с ними сделать? Большое спасибо!
1 ответ
$$
это адрес начала текущего раздела. Это перемещаемое значение (не "скалярное" - слово, которое вы найдете в сообщении об ошибке, но не в руководстве). Это смещение, поэтому не важно, что находится в сегментном регистре.
- Документация: https://www.nasm.us/doc/nasmdoc3.html
- пример использования загрузочного сектора: https://www.nasm.us/doc/nasmdo12.html
- Связанный: Как $ работает в NASM, точно? (поскольку
$$
обычно используется с$
).
Единственное, для чего это полезно $ - $$
Длина сечения пока. $ - $$
является "скаляром" (как любая разница между метками) и может использоваться в выражениях, которые в противном случае заставили бы Nasm скулить о "не скалярном значении".
Имена разделов, "известные" Nasm, зависят от формата вывода - "-f obj" вообще ничего не знает. .text
, .data
, а также .bss
довольно универсальны - некоторые форматы вывода знают другие. Лучшее место для их поиска - главы "Формат вывода" в Руководстве. http://www.nasm.us/ если вы не получили Руководство с вашей загрузкой. Эти имена чувствительны к регистру, и ведущий '.' необходимо.
У меня такое ощущение, что здесь есть "вопрос", который я пропускаю. Что ты на самом деле пытаешься сделать?