Внешние символы NASM с начальным $

#assembly #nasm #symbols

#сборка #nasm #символы

Вопрос:

В документации NASM говорится:

Единственными символами, которые могут использоваться в качестве первого символа идентификатора, являются буквы, . (со специальным значением: см. Раздел 3.9), _ и ?.

Мне нужно вызвать внешнюю процедуру, символ которой начинается с ведущего $ . К сожалению, в документах не указано, как избежать $ или как справиться с ограничением.

Кто-нибудь знает, как указать внешний символ с начальным знаком доллара?

Комментарии:

1. Я думаю, вы можете заключить имя символа в какие-то кавычки. Вы проверили руководство по NASM?

2. @fuz Я ссылался на руководство; и нет, я ничего не смог найти по этому поводу. Я пытался использовать «, ‘, `. Должен признать, что я все еще учусь писать сборку x86_64 с помощью NASM.

3. @JulianKirsch Хм … в данном случае я считаю, что это невозможно.

4. Обратите внимание, что mov eax, [$foo] выполняется сборка, но objdump -drwC показывает, что она foo не $foo ссылается на символ. Удвоение $ to $$foo приводит к синтаксической ошибке. (В NASM начальное значение $ устраняет неоднозначность между именами символов и именами регистров, например, $eax является символом с таким именем.)

5. Сработает ли это для вас? ld --defsym=nasm.foo=$foo

Ответ №1:

Мне нужно вызвать внешнюю процедуру, символ которой начинается с ведущего $ . К сожалению, в документах не указано, как избежать $ или как справиться с ограничением.

В документации это не объясняется, потому что это невозможно. extern Директива всегда будет игнорировать начальное значение $ (нет никакой двусмысленности между регистром rax и меткой rax , поскольку регистр не может использоваться в объявлении метки). Первый фактический символ любого идентификатора должен быть классифицирован как NCT_IDSTART , иначе он недействителен.