Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Assembler > Любителям VSCodium + Fasm


Автор: Majestio 03.09.22, 06:20
Всем привет!

Сегодня решил настроить свой VSCodium для работы с Fasm. Пока речь идет о плагине подсветки и форматировщике.

Форматировщик

В штатном репозитарии его нет. Пришлось искать и ставить "Assembly Formatter" из репы VSCode в виде vsix-файла. Но и это не все. Форматирует, имхо, ну очень коряво - просто отодвигает на табуляцию (делает отступ) все "что не метка", а комментарии располагает на позиции 30 или далее. Пришлось код форматировщика править "под себя". Может быть кому-то мой вариант форматирования покажtтся лучшим:

  • Форматировщик с моими правками, кроме меток, еще не отодвигает (делает отступ) еще кучу конструкций, заданных ключевыми словами - format, entry, include, section, import
  • Форматировщик с моими правками двигает все комментарии вправо - на позицию самого "дальнего" комментария, а можно вообще отключить форматирование комментариев

В принципе, это уже можно править под себя. Делается все это просто. Сперва ставим этот форматировщик из vsix-файла (ссылка есть вверху по тексту). Потом находим файл от корня установки VSCodiun "data/extensions/notaflyinggoose.asmformat-1.0.0/extension.js" и заменяем моим, который я прикреплю к данному сообщению. Настройка ключевых слов, которые остаются при форматировании без отступа, а также настройка включения/отключения форматирования комментариев - делаются прямо в этом файле (строки 2 и 3). После правки файла - обязателен перезапуск VSCodium.

Плагин подсветки

Его мы берем из штатного репозитария. Называется он "ASM Code Lens". К нему тоже есть претензии! Для Fasm он как то слабо заточен. Группы подсветки на сей момент: comments, keywords, strings, mnemonics, numbers, labels. Можно было бы в вместо "keywords" с делать группу "opcodes", а из группы "mnemonics" сделать набор "keywords1...keywords5". Ну да ладно. Возможно потом займусь, если будет острая потребность. Править нужно файл "data/extensions/maziac.asm-code-lens-1.10.0/grammar/asm.json" - так же файл от корня установки VSCodiun. Лично я для себя в строке 83 пока просто добавил "library" и "invoke":

"match": "(?i:(?<=\\s)(?:bank|bankset|limit|protect|write\\s+direct|str|struct|endstruct|ends|invoke|library)\\b)"

После правки файла - обязателен перезапуск VSCodium.

Ну, вощем, как-то так. Может быть кому поможет.

extension.js (, : 5)

Автор: macomics 03.09.22, 06:53
Вот только import и library в fasm1 это имена макроинструкций и они могут меняться по желанию. Хотя слово import - это еще и флаг типа секции в формате PE/PE64.

А вот про слова extrn или public - забыли.

Цитата
"match": "(?i:(?<=\\s)(?:bank|bankset|limit|protect|write\\s+direct|str|struct|endstruct|ends|invoke|library)\\b)"


str - это инструкция процессора, а invoke - имя макроинструкции.

Автор: Majestio 03.09.22, 06:57
Цитата macomics @
Вот только import и library в fasm1 это имена макроинструкций и они могут меняться по желанию.

Ну я понимаю. Я написал, что в принципе не хватает норм разделений на группы раскрасок.

ADD: И да - изначальная редакция форматировщика, да и мои правки - не предусматривают "иерархического кода", типа:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    .IF (BYTE PTR [esi]) == bl
       .IF ($invoke(CheckSignature, $invoke(GetCurrentProcess), OFFSET szKernel32, OFFSET szIsDebuggerPresent, OFFSET IsDebuggerPresentSignature, 14))
          inc BYTE PTR [edi]
          inc ebp
       .ELSE
       ...

ИМХО, это уже на ассемблер - не пользуйтесь форматировщиком, а лучше пишите сразу на Си :yes:

Автор: Majestio 04.09.22, 19:08
Внимание! Achtung! Небезпека!

Прошу помощи. Как-то подумалось, что моя реализация форматировщика в плане форматирования комментариев "сырая" до безобразия. Надо это исправить. Пока ищется первое вхождение ASCII символа ; и это считается началом комментария. Что, собственно, совсем не есть правильно. Ибо нужно учитывать контекст.

Ну оч прошу дополнить варианты для обработки и последующих тестов:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    hello1 db 'hello ; world!',0
    hello2 db "hello ; world!",0
    hello2 db "hello ';' world!",0
    mov al , ';'
    ???

Я так понимаю, чтобы корректно определить начало комментария, нужно выяснить две вещи:

1) Точка-с-запятой "не в строке"
2) Точка-с-запятой "не ASCII символ" в команде

Вощем, жду ваших мыслей :lol:

Автор: macomics 04.09.22, 21:27
Еще
3) точка-с-запятой "не часть комментария"
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ;;;;;;;;;;;;;;;
    ; комментарий ;
    ;;;;;;;;;;;;;;;

Автор: Majestio 05.09.22, 02:20
Цитата macomics @
3) точка-с-запятой "не часть комментария"

Тут скорее нет, чем да. Ибо первое вхождение ; "не-в-строке" и "не-в-символе" - уже есть "начало комментария", а дальше пофик.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)