#arm64 #gnu-assembler
Вопрос:
Я пытаюсь найти какую-либо информацию о синтаксисе скобок для аргументов макросов в ассемблере GNU. Например, у меня есть следующий код:
.macro do_block, enc, in, rounds, rk, rkp, i
eor in().16b, in().16b, v15.16b
...
(взято отсюда)
Что in().16b
означает «паретезисы»? Где найти документацию по этому синтаксису?
Ответ №1:
Ладно, я нашел ответ. Это специальный синтаксис для экранирования имени макро-аргумента.
Из документации:
Обратите внимание, что, поскольку каждый из макаргов может быть идентификатором точно так же, как и любой другой, разрешенный целевой архитектурой, могут возникать случайные проблемы, если цель вручную придает особое значение определенным символам, когда они находятся в особом положении. Например:
…
проблемы могут возникнуть с символом точки ( » .»), который часто допускается в именах кодов операций (и, следовательно, имен идентификаторов). Так, например, создание макроса для построения кода операции из базового имени и спецификатора длины, подобного этому:
.macro opcode base length base.length .endm
и вызов его как «хранилище кодов операций l’ не создаст «хранилище».l’ инструкция, но вместо этого > генерирует какую-то ошибку, когда ассемблер пытается интерпретировать текст >
base.length
.Строка
()
может использоваться для отделения конца аргумента макроса от следующего текста. например:.macro opcode base length base().length .endm