💡 ВСТУПЛЕНИЕ: ОТ ПОДСВЕТКИ К ПОНИМАНИЮ КОДА

Мы уже рассмотрели множество расширений для VS Code: Z80 Macro-Assembler дал нам навигацию и автодополнение, DeZog — отладку, Z80 Assembly Meter — подсчёт тактов. Но все они работают на уровне отдельного файла и поверхностного анализа.

А что, если бы у нас был инструмент, который действительно понимает ассемблерный код? Который знает, какие регистры существуют, какие инструкции принимают какие аргументы, и может подсказать это всё в любом редакторе — не только в VS Code, но и в Vim, Neovim, Emacs, Sublime Text?

Знакомьтесь: asm-lsp от разработчика bergercookie. Это не просто расширение для конкретного редактора, а полноценный Language Server Protocol (LSP) сервер для ассемблера . Он поддерживает x86, x86_64, ARM, RISC-V и, что самое важное для нас, Z80 .

Если обычные расширения — это "подсветка и автодополнение", то asm-lsp — это искусственный интеллект, который действительно понимает, что вы пишете.


🏗️ ЧТО ТАКОЕ ASM-LSP И ЗАЧЕМ ОН НУЖЕН?

asm-lsp — это Language Server Protocol (LSP) сервер для ассемблерного кода, поддерживающий синтаксис GAS, NASM и Go assembly . Он написан на Rust и предоставляет "интеллектуальную" поддержку для нескольких архитектур, включая Z80 .

🎯 КЛЮЧЕВЫЕ ВОЗМОЖНОСТИ (ЧТО ОН ДАЁТ ПРОГРАММИСТУ)

  1. Интеллектуальное автодополнение — предлагает не просто команды, а именно те, которые уместны в данном контексте .
  2. Переход к определению (Go to Definition) — нажал на метку или переменную — и сразу перешёл туда, где она объявлена .
  3. Поиск всех ссылок (Find References) — показывает все места, где используется метка или константа .
  4. Подсказки при наведении (Hover) — навёл мышь на команду — видишь её полное описание, включая влияния на флаги .
  5. Диагностика ошибок — подчёркивает синтаксические ошибки и даже пытается анализировать семантику .
  6. Signature Help — показывает, какие аргументы ожидает инструкция .
  7. Поддержка Z80 — включая undocumented-инструкции .
  8. Кроссплатформенность — работает с любым редактором, поддерживающим LSP (VS Code, Vim, Neovim, Emacs, Sublime Text и др.) .

🧬 ИСТОРИЧЕСКИЙ КОНТЕКСТ: ЧЕМ LSP ЛУЧШЕ ОБЫЧНЫХ РАСШИРЕНИЙ


ПараметрОбычное расширение (например, Z80 Macro-Assembler)Language Server (asm-lsp)
АрхитектураЖивёт внутри редактора, привязан к его APIОтдельный сервер, общается по протоколу LSP
Поддержка редакторовТолько VS CodeЛюбой LSP-совместимый редактор (VS Code, Vim, Neovim, Emacs, Sublime, Kakoune и др.)
Глубина анализаПоверхностный (регулярки, простой парсинг)Глубокий (понимает структуру кода, метки, типы)
ПроизводительностьСредняяВысокая (написан на Rust)
РасширяемостьЧерез API редактораЧерез стандартный LSP
Z80 поддержкаЧасто хорошаяРастёт с каждой версией

asm-lsp — это не просто очередной плагин, а принципиально иной подход. Он выносит логику анализа кода в отдельный процесс, который может быть написан на любом языке и работать с любым редактором, поддерживающим LSP.


⚙️ УСТАНОВКА И НАСТРОЙКА

📥 Шаг 1: Установка самого LSP-сервера

Поскольку asm-lsp — это отдельный сервер, его нужно установить в систему. Есть несколько способов :

Способ А: Через Cargo (Rust package manager)
Bash:
# Установка из crates.io
cargo install asm-lsp

# Или самая свежая версия из GitHub
cargo install --git https://github.com/bergercookie/asm-lsp

Способ Б: Готовые бинарники
На странице релизов проекта на GitHub есть готовые сборки для разных платформ. Скачайте подходящую версию и положите в PATH.

Способ В: Через пакетные менеджеры
  • FreeBSD: pkg install asm-lsp
  • MSYS2 (Windows): pacman -S mingw-w64-clang-x86_64-asm-lsp
  • macOS (Homebrew): пока нет официального пакета, но можно собрать из исходников.

🔧 Шаг 2: Настройка VS Code для работы с asm-lsp

Поскольку официального расширения для VS Code пока нет , нужно настроить подключение вручную через настройки редактора.

Вариант А: Через настройки пользователя

Добавьте в settings.json (глобальные или рабочей области) следующую конфигурацию :
JSON:
{
    "lsp-client": {
        "servers": {
            "asm-lsp": {
                "command": "asm-lsp",
                "filetypes": ["asm", "s", "S"]
            }
        }
    }
}

Вариант Б: Использовать встроенную поддержку LSP в VS Code

VS Code имеет встроенного клиента LSP. Можно настроить через расширение vscode-language-pack или создать простой клиент через workspace/configuration.

Вариант В: Использовать dev-расширение из репозитория

В папке editors/code репозитория есть заготовка расширения для VS Code . Можно склонировать репозиторий и установить его вручную:
Bash:
git clone https://github.com/bergercookie/asm-lsp.git
cd asm-lsp/editors/code
npm install
npm run compile
code --install-extension asm-lsp.vsix

⚙️ Шаг 3: Конфигурация через .asm-lsp.toml

Для тонкой настройки сервера (какие архитектуры и ассемблеры использовать) можно создать файл .asm-lsp.toml в корне проекта или в ~/.config/asm-lsp/ .

Пример для Z80:
Код:
version = "0.1"

[assemblers]
gas = false
go = false
z80 = true
nasm = false
masm = false

[instruction_sets]
x86 = false
x86_64 = false
z80 = true
arm = false
riscv = false
6502 = false
avr = false

Пример для смешанного проекта:
Код:
version = "0.1"

[assemblers]
gas = true
z80 = true

[instruction_sets]
x86_64 = true
z80 = true

Генерация конфига (доступно в master-ветке):
Код:
asm-lsp gen-config --help

Эта команда проведёт вас через интерактивный процесс создания конфигурации .

📁 Шаг 4: Корень проекта и Git

Важное требование: asm-lsp ищет корень проекта по наличию папки .git . Если ваш проект не в git-репозитории, выполните:
Bash:
git init

Или создайте пустую папку .git вручную (не рекомендуется, но технически возможно).

🔍 Шаг 5: Диагностика (опционально)

Для расширенной диагностики можно добавить файл compile_commands.json или compile_flags.txt в корень проекта . Это позволит asm-lsp находить include-файлы и анализировать код глубже.

Пример compile_flags.txt для Z80 с GCC:
Код:
-x
assembler-with-cpp
-I./include

🚀 РАБОЧИЙ ПРОЦЕСС (ДЕНЬ ОПЛАТЫ)

✍️ Шаг 1: Пишем код

Открываем файл game.asm (или .s, .S). Благодаря asm-lsp, мы получаем:

Автодополнение :
Начинаем печатать ld a, — сервер предлагает варианты: (hl), (bc), (de), n, (ix+0), (iy+0) и т.д.

Подсказки при наведении :
Наводим мышь на ldir — всплывает окно с описанием: *"LDIR: Block transfer, repeats until BC=0, 21 t-states per iteration"*.

Переход к определению :
Нажимаем F12 на метке MyLoop — мгновенно перемещаемся к строке, где она объявлена.

Поиск ссылок :
Shift+F12 на переменной score — видим все места, где она используется.

Signature Help :
Печатаем call и ждём — появляется подсказка, что ожидается метка или адрес.

🔨 Шаг 2: Диагностика ошибок

Сервер подсвечивает ошибки прямо во время набора :
  • ld a, 300 — подчёркивает красным, так как 300 не влезает в 8-битный регистр.
  • jp [hl] — подсвечивает как ошибку, правильный синтаксис jp (hl).
  • push af — ок, а push bc — ок, а push 123 — ошибка (можно push только регистры).

🐛 Шаг 3: Отладка

asm-lsp не занимается отладкой — это задача DeZog или другого отладчика. Но asm-lsp готовит почву: понимает метки, может переходить к определениям, что очень помогает при отладке.


🧠 ПРОДВИНУТЫЕ ВОЗМОЖНОСТИ

📋 Поддерживаемые архитектуры и ассемблеры

Начиная с версии 0.10.0, asm-lsp поддерживает :
АрхитектурыАссемблеры
x86, x86-64GAS (AT&T), NASM (Intel)
ARM, ARM64MASM
RISC-VGO Assembly
Z80z80
6502ca65
AVRavr

🆕 Новые возможности в версии 0.10.0

Версия 0.10.0 принесла множество улучшений :
  • Поддержка 6502 — полная документация инструкций и регистров.
  • Поддержка AVR — для разработки под микроконтроллеры.
  • Генератор конфигов — интерактивное создание .asm-lsp.toml.
  • Улучшенная диагностика — возможность указать компилятор через compiler поле в конфиге.
  • Per-directory конфигурация — можно задать разные настройки для разных подпапок проекта.
Пример сложной конфигурации с разными настройками для подпапок :
Код:
# Конфигурация по умолчанию
compiler = "gcc"
default_diagnostics = true
include_directories = ["include"]

# Специальная конфигурация для ARM-проекта
[[config]]
pattern = "arm-project/**/*.s"
assembler = "gas"
instruction_set = "arm"
compiler = "arm-none-eabi-gcc"
include_directories = ["arm-project/include"]

🔌 Интеграция с другими инструментами

asm-lsp отлично работает в связке с:
ИнструментРоль
DeZogОтладка кода
Z80 Assembly MeterПодсчёт тактов (нужно добавить язык в настройки)
Z80 Macro-AssemblerМожет использоваться параллельно (не конфликтует)

📊 СРАВНЕНИЕ: ASM-LSP VS АЛЬТЕРНАТИВЫ


КритерийZ80 Macro-AssemblerASM Code Lensasz80 supportasm-lsp
ТипРасширение VS CodeРасширение VS CodeРасширение VS CodeLanguage Server
РедакторыТолько VS CodeТолько VS CodeТолько VS CodeЛюбые LSP
Z80 поддержкаОтличнаяЧастичнаяХорошаяРастёт
АвтодополнениеХорошееСреднееНетИнтеллектуальное
Переход к определениюДа (свои метки)ДаНетДа
Поиск ссылокДаДаНетДа
ДиагностикаНетНетНетДа
Hover-подсказкиНет (есть в Z80 Instruction Set)НетНетДа
Поддержка других архитектурНетНетНетx86, ARM, RISC-V, 6502, AVR
ПроизводительностьВысокаяВысокаяВысокаяОчень высокая (Rust)

🎨 ПЛЮСЫ И МИНУСЫ

✅ Плюсы (Почему это must-have для профессионалов)

  • Универсальность: работает с любым LSP-совместимым редактором (VS Code, Vim, Neovim, Emacs, Sublime, Kakoune, и даже Emacs ).
  • Глубокий анализ: понимает семантику кода, а не просто текст .
  • Диагностика в реальном времени: находит ошибки, которые другие расширения пропускают .
  • Поддержка множества архитектур: x86, ARM, RISC-V, Z80, 6502, AVR — всё в одном инструменте .
  • Высокая производительность: написан на Rust, работает быстро даже на больших проектах.
  • Активная разработка: последние версии (0.10.0) вышли недавно, добавляются новые архитектуры .
  • Открытый исходный код: можно посмотреть, как работает, и внести свой вклад.

❌ Минусы (О чём нужно знать)

  • Нет готового расширения для VS Code: нужно настраивать вручную или использовать dev-версию . Для неопытных пользователей это может быть барьером.
  • Требует установки Rust/Cargo: если нет готового бинарника, нужно ставить Rust toolchain.
  • Поддержка Z80 пока не идеальна: в версии 0.8.0 поддержка Z80 была опциональной и отключаемой . В 0.10.0 она есть, но некоторые undocumented-инструкции могут не распознаваться .
  • Требует .git для определения корня проекта: если проект не в git, нужно создавать пустую папку .git .
  • Конфигурация через TOML: требует изучения формата, хотя есть генератор конфигов .

🧪 СОВЕТЫ БЫВАЛОГО (КАК ВЫЖАТЬ МАКСИМУМ)

  1. Настройте .asm-lsp.toml правильно. Не оставляйте включёнными все архитектуры — это может замедлить работу. Включите только то, что реально используете .
  2. Для Z80 укажите явно:
Код:
[assemblers]
z80 = true

[instruction_sets]
z80 = true

Используйте compile_flags.txt для include-директорий. Если ваш проект использует макросы или include-файлы, создайте compile_flags.txt
Код:
-I./includes
-I./system
  • Для больших проектов используйте compile_commands.json. Это даст максимально точную диагностику .
  • Комбинируйте с Z80 Assembly Meter. В настройках метра добавьте "z80-asm-meter.languageIds": ["z80", "asm-lsp"] (зависит от того, как называется язык).
  • Попробуйте в Neovim. Если вы пользуетесь Neovim, asm-lsp там настраивается буквально несколькими строками :
Код:
require'lspconfig'.asm_lsp.setup{
    cmd = {"asm-lsp"},
    filetypes = {"asm", "s", "S"},
    root_dir = require'lspconfig'.util.root_pattern(".git"),
}

Следите за обновлениями. В версии 0.10.0 добавили 6502 и AVR, в будущих могут добавить новые архитектуры .

📚 РЕСУРСЫ И ССЫЛКИ


📖 ЗАКЛЮЧЕНИЕ: БУДУЩЕЕ АССЕМБЛЕРНОЙ РАЗРАБОТКИ

asm-lsp — это не просто очередной инструмент. Это смена парадигмы в разработке на ассемблере.

Впервые у нас есть инструмент, который действительно понимает ассемблерный код — не как набор строк, а как структурированную программу с метками, вызовами, регистрами и флагами. Он даёт нам те возможности, которые давно стали стандартом для C++, Java или Python: интеллектуальное автодополнение, переход к определению, поиск ссылок, диагностика ошибок.

Да, у него есть недостатки. Да, для VS Code нужно настраивать вручную. Да, поддержка Z80 ещё не идеальна. Но это инструмент будущего. По мере развития он будет только улучшаться, добавлять новые архитектуры и становиться стандартом де-факто для ассемблерной разработки во всех редакторах.

Если вы профессионально занимаетесь ассемблером под Z80 (или другие архитектуры) и хотите получить максимум от своего редактора — asm-lsp обязателен к установке и настройке. Один раз потратив время, вы получите среду, которая понимает ваш код почти как человек.


P.S. Автору проекта, bergercookie, огромное спасибо за этот инструмент. Он делает для ассемблерного сообщества то же, что когда-то сделал LSP для "больших" языков — поднимает планку инструментальной поддержки на недосягаемую ранее высоту.

P.P.S. Если вы пользуетесь не VS Code, а другим редактором — не отчаивайтесь. asm-lsp работает везде, где есть LSP-клиент. Попробуйте настроить его в своём любимом редакторе — скорее всего, это проще, чем кажется.