Каково реальное значение слова $$ в насме?

$$ определяется как адрес текущего сегмента в 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Я обнаружил, что, хотя я определил два раздела с одинаковым именем, $$ отличается в обоих файлах. Итак, я думаю, что:

  1. После того как я определил раздел в файле, значение $$ это начальный адрес этого раздела. А также $$ не имеет ничего общего с так называемыми сегментными регистрами (cs,ss, fs, gs, .etc).
  2. Если я определил другой раздел с тем же именем в другом файле, он интерпретируется как другой раздел. Но если два раздела с одинаковым именем определены в одном и том же файле, есть ли между ними другие определения разделов, это всегда интерпретируется как один и тот же раздел с одинаковым $$ значение. Такие как следующие, два .text разделы точно такие же.

    [section .text]
    global _start
    _start:
        mov ebx, $$
    
    [section .d]
    d:
        mov ecx, $$ 
    
    [section .text]
    another:
        mov eax, $$
        ret
    
  3. Я предполагаю, что есть некоторые названия разделов, которые NASM может распознать и поместить их в нужное место при компиляции. Такие как .data, тогда каковы эти названия разделов, которые NASM может распознать и что-то с ними сделать? Большое спасибо!

1 ответ

Решение

$$ это адрес начала текущего раздела. Это перемещаемое значение (не "скалярное" - слово, которое вы найдете в сообщении об ошибке, но не в руководстве). Это смещение, поэтому не важно, что находится в сегментном регистре.

Единственное, для чего это полезно $ - $$Длина сечения пока. $ - $$ является "скаляром" (как любая разница между метками) и может использоваться в выражениях, которые в противном случае заставили бы Nasm скулить о "не скалярном значении".

Имена разделов, "известные" Nasm, зависят от формата вывода - "-f obj" вообще ничего не знает. .text, .data, а также .bss довольно универсальны - некоторые форматы вывода знают другие. Лучшее место для их поиска - главы "Формат вывода" в Руководстве. http://www.nasm.us/ если вы не получили Руководство с вашей загрузкой. Эти имена чувствительны к регистру, и ведущий '.' необходимо.

У меня такое ощущение, что здесь есть "вопрос", который я пропускаю. Что ты на самом деле пытаешься сделать?

Другие вопросы по тегам