Как заставить GNU Assembler использовать косую черту / для комментариев?

Это действительно моя глупая идиосинкразия, но я терпеть не могу того, как GNU AS вставляет комментарий. Я слишком привык к подходу Sun (который используется в большинстве ассемблеров UNIX), в котором используется простой слэш «/», чтобы закомментировать код до конца строки.

Вы знаете, как исполнить мою маленькую прихоть?


person mghis    schedule 27.03.2013    source источник
comment
Некоторые регулярные выражения (Vim, Perl, sed ...), вероятно, справятся с этим легко. Вы можете добавить соответствующую команду регулярного выражения в Makefile для предварительной обработки исходного кода, чтобы преобразовать синтаксис комментария по вашему выбору в синтаксис комментария, действительный для GNU AS.   -  person nrz    schedule 27.03.2013
comment
Моя версия as (2.20.1, x86_64-linux-gnu) принимает /, // и # в качестве стартеров комментариев.   -  person Michael    schedule 27.03.2013
comment
@Michael: видите ли, / работает в as, только если это первый символ в строке. Нельзя ставить его после инструкции, чтобы закомментировать оставшуюся часть строки.   -  person mghis    schedule 27.03.2013
comment
В порядке. Значит, тогда вам придется использовать #. Если вас это отвлекает при чтении кода, вы можете последовать совету nrz.   -  person Michael    schedule 27.03.2013
comment
gnu гордится тем, что разрушает концепции нормального синтаксиса языка ассемблера.   -  person old_timer    schedule 27.03.2013
comment
Я прекрасно понимаю, что это не очень хорошая идея, но, наконец, я изменил GNU в качестве исходного кода, чтобы добиться желаемого поведения. Я могу использовать флаг --divide, чтобы изменить значение / на оператор деления. Фактически, использование комментариев GNU характерно для реализации GNU AS и не может быть найдено в других ассемблерах UNIX. Если кому-то будет полезно, измените строки 329-330 binutils-2.23 / gas / config / tc-i386.c на const char *i386_comment_chars = "#/";, #define SVR4_COMMENT_CHARS 1, #define PREFIX_SEPARATOR '\\'.   -  person mghis    schedule 13.05.2013
comment
Позвольте задать более тупой вопрос ... Планируете ли вы собирать файл? Или это что-то для читабельности? Если целью является удобочитаемость после предварительной обработки, возможно, вы сможете cat source.s | sed 's|^#|/|g'.   -  person jww    schedule 26.02.2018


Ответы (3)


Документы GNU GAS

В разделе Machine Dependencies перейдите в каждую арку, а затем в синтаксис и символы.

Это документирует комментарии к каждой арке.

x86

https://sourceware.org/binutils/docs-2.26/as/i386_002dChars.html#i386_002dChars

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

Если '#' появляется как первый символ строки, тогда вся строка рассматривается как комментарий, но в этом случае строка также может быть директивой логического номера строки (см. Комментарии) или командой управления препроцессором (см. Предварительная обработка) .

Если опция командной строки --divide не указана, то символ '/', появляющийся в любом месте строки, также вводит комментарий к строке.

Однако я либо что-то упускаю, либо есть ошибка, так как мои тесты не соответствуют документации.

OK:

/ mycomment
# mycomment
nop # mycomment

Потерпеть поражение:

nop / mycomment

Это говорит о том, что / работает, только если это первый символ.

И --divide не имело никакого значения.

рука

https://sourceware.org/binutils/docs-2.26/as/ARM_002dInstruction_002dSet.html#ARM_002dInstruction_002dSet

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

Если '#' появляется как первый символ строки, тогда вся строка рассматривается как комментарий, но в этом случае строка также может быть директивой логического номера строки (см. Комментарии) или командой управления препроцессором (см. Предварительная обработка) .

Мои тесты с arm-linux-gnuabihf-as подтверждают то, что написано в документации.

OK:

# mycomment
@ mycomment
nop @ mycomment

Потерпеть поражение:

nop # mycomment

aarch64

https://sourceware.org/binutils/docs-2.26/as/AArch64_002dChars.html#AArch64_002dChars

Наличие символа «//» в строке указывает на начало комментария, который продолжается до конца текущей строки. Если символ # появляется как первый символ строки, вся строка рассматривается как комментарий.

Кроме того, это также поддерживается в руководстве по ARMv8-fb по адресу C1.2 Структура самого языка ассемблера A64:

В примере C1-1 на странице C1-185 последовательность // используется в качестве лидера комментария, и ассемблерам A64 рекомендуется принять этот синтаксис.

Мои тесты с aarch64-linux-gnuabihf-as подтверждают то, что написано в документации.

OK:

// mycomment
# mycomment
nop // mycomment

Потерпеть поражение:

nop # mycomment

Личная рекомендация

Если вы можете выбрать, просто всегда компилируйте свою сборку с gcc или явно используйте препроцессор C cpp и используйте комментарии препроцессора C:

/* mycomment */

так как:

  • C стандартизирован, и он будет работать для всех арок
  • препроцессор C вам понадобится в любом случае, потому что макросы GNU GAS недостаточно мощны
  • # плохо, так как может конфликтовать с # директивами препроцессора.

Проверено на Ubuntu 16.04, Binutils 2.26.1.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 23.08.2018

В ассемблере Gnu начальный символ комментария зависит от цели. Для i386 и x86_64 это #. Для ARMv7 это @.

Некоторые другие соглашения о комментариях работают при определенных условиях. Я не уверен в деталях. // Комментарии в начале комментария и / * * / многострочные комментарии - вот примеры, которые я видел.

person Uwe Geuder    schedule 18.06.2013
comment
Спасибо. Я пробовал # случайным образом, но, очевидно, получил ошибку, когда попытался поместить комментарий в конец непустой строки. Теперь я использую @ везде. - person Antoine Pinsard; 11.11.2014
comment
Это не может быть серьезно. Его ; на AVR - person thekiwi5000; 09.01.2018
comment
Я не нашел ни одной арки, которая использует /* */ (кроме, конечно, самого препроцессора C). У вас есть пример? - person Ciro Santilli 新疆再教育营六四事件ۍ 23.08.2018

Да, продолжайте использовать #, и вы к этому привыкнете.

Могут быть способы заставить / работать, но тогда ваш код зависит не только от процессора, но и буквально от компьютера. Лучше привыкнуть к мелочам, чем полностью разрушить переносимость кода из-за своей прихоти.

person Veltas    schedule 27.03.2013