2013-02-18 7 views
1

$$ определяется как адрес текущего сегмента в 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 может распознавать и что-то делать с ними? Большое спасибо!

ответ

2

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

О единственном, что полезно для: $ - $$, длина секции до сих пор. $ - $$ является «скалярным» (как и любая разница между метками) и может использоваться в выражениях, которые в противном случае заставляли бы Nasm кричать о «не скалярном значении».

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

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

Смежные вопросы