Ассемблер GNU (Arm64). Скобки в ссылках на аргументы макросов

#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