Неоднозначность синтаксиса комментариев в GAS ARM target - PullRequest
1 голос
/ 16 апреля 2020

Как представляется, в документации GNU GAS неправильно определены некоторые синтаксические функции для цели ARM, поэтому у меня возникают трудности при написании даже простой сборки.

Два таких примера:

  • В руководстве по миграции и совместимости компилятора версии 6.02 указано, что наряду с многострочными комментариями в синтаксисе GNU:

    Маркер // идентифицирует остаток строки в качестве комментария:

    MOV R0,#16 // Load R0 with 16

    , который, кажется, конфликтует с руководством Using as , в котором говорится:

    Наличие символа «@» в любом месте строки указывает на начало комментария, который простирается до конца этой строки.

  • Проблема неявных сдвигов в инструкциях только передается в документации по Arm и дает только случай сбоя:

    Синтаксическая сборка GNU ожидает немедленного представления значений в кодированном виде. Инструкция MOVK x1, #0x40000 приводит к следующему сообщению: error: immediate must be an integer in range [0, 65535].

    Что именно означает «закодировано»? Должен ли я считать, что синтаксис LSL поддерживается идентично в GNU? Кажется, это не рассматривается в документации GAS.

Где-нибудь я могу найти конкретное и полное определение синтаксиса для цели GAS + ARM? Заранее спасибо.

1 Ответ

2 голосов
/ 16 апреля 2020

GAS поддерживает как комментарии //, так и комментарии @, даже без использования препроцессора C для обработки комментариев в стиле C / C ++.

(Назовите файл foo.S с заглавной буквы S и gcc -c foo.S сначала пройдут через CPP, поэтому вы можете использовать #define и #if 0 и все в таком духе.)

«Кодированный» означает представимость в машинном коде. например, MOVK x1, #0x40000 не является ошибкой синтаксиса , это ошибка на более позднем этапе, чем синтаксический анализ, потому что нет способа представить его с указанием c числа в машинном коде с этим кодом операции. Но mov x1, #0x40000 хорошо, потому что ассемблер может выбрать кодировку битового диапазона для orr -посредственно с xzr. Обратите внимание, что это AArch64, который использует машинный код, отличный от ARM.

Синтаксис GAS ARM такой же, как и в официальных документах ARM. Директивы отличаются от ARMasm Кейла , но синтаксис командных строк (в основном?) идентичен. @old_timer говорит, что есть или были некоторые различия с синтаксисом mrc и mcr, но по большей части GAS стремится быть совместимым со стандартным синтаксисом ARM.

См. руководство по GAS Зависимые от ARM функции * глава 1029 *, включая раздел о синтаксисе.

(Обратите внимание, что ARM имеет несколько различных режимов синтаксиса, «унифицированный» и более старый, который использовал другой синтаксис для ARM и Режим большого пальца. Обычно вы хотите .syntax unified)

Вы всегда можете посмотреть примеры вывода компилятора G CC C (например, на https://godbolt.org/z/Tk_jrD), хотя для конкретного c на случай, если вам придется написать C функцию, в которой G CC будет использовать интересующий вас режим инструкции или адресации. G CC использует директивы GAS.

...