ВСТУПЛЕНИЕ: ОТ ПОДСВЕТКИ К ПОНИМАНИЮ КОДА
Мы уже рассмотрели множество расширений для 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 .
КЛЮЧЕВЫЕ ВОЗМОЖНОСТИ (ЧТО ОН ДАЁТ ПРОГРАММИСТУ)
- Интеллектуальное автодополнение — предлагает не просто команды, а именно те, которые уместны в данном контексте .
- Переход к определению (Go to Definition) — нажал на метку или переменную — и сразу перешёл туда, где она объявлена .
- Поиск всех ссылок (Find References) — показывает все места, где используется метка или константа .
- Подсказки при наведении (Hover) — навёл мышь на команду — видишь её полное описание, включая влияния на флаги .
- Диагностика ошибок — подчёркивает синтаксические ошибки и даже пытается анализировать семантику .
- Signature Help — показывает, какие аргументы ожидает инструкция .
- Поддержка Z80 — включая undocumented-инструкции .
- Кроссплатформенность — работает с любым редактором, поддерживающим 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-64 | GAS (AT&T), NASM (Intel) |
| ARM, ARM64 | MASM |
| RISC-V | GO Assembly |
| Z80 | z80 |
| 6502 | ca65 |
| AVR | avr |
Новые возможности в версии 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-Assembler | ASM Code Lens | asz80 support | asm-lsp |
|---|---|---|---|---|
| Тип | Расширение VS Code | Расширение VS Code | Расширение VS Code | Language 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: требует изучения формата, хотя есть генератор конфигов .
СОВЕТЫ БЫВАЛОГО (КАК ВЫЖАТЬ МАКСИМУМ)
- Настройте .asm-lsp.toml правильно. Не оставляйте включёнными все архитектуры — это может замедлить работу. Включите только то, что реально используете .
- Для 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, в будущих могут добавить новые архитектуры .
РЕСУРСЫ И ССЫЛКИ
- Официальный репозиторий: github.com/bergercookie/asm-lsp
- Crates.io: crates.io/crates/asm-lsp
- Документация на Docs.rs: docs.rs/asm-lsp
- Интеграция с Emacs: emacs-lsp.github.io/lsp-mode/page/lsp-asm/
- Пакет для FreeBSD: freshports.org/lang/asm-lsp
- Пакет для MSYS2: packages.msys2.org/packages/mingw-w64-clang-x86_64-asm-lsp
ЗАКЛЮЧЕНИЕ: БУДУЩЕЕ АССЕМБЛЕРНОЙ РАЗРАБОТКИ
asm-lsp — это не просто очередной инструмент. Это смена парадигмы в разработке на ассемблере.Впервые у нас есть инструмент, который действительно понимает ассемблерный код — не как набор строк, а как структурированную программу с метками, вызовами, регистрами и флагами. Он даёт нам те возможности, которые давно стали стандартом для C++, Java или Python: интеллектуальное автодополнение, переход к определению, поиск ссылок, диагностика ошибок.
Да, у него есть недостатки. Да, для VS Code нужно настраивать вручную. Да, поддержка Z80 ещё не идеальна. Но это инструмент будущего. По мере развития он будет только улучшаться, добавлять новые архитектуры и становиться стандартом де-факто для ассемблерной разработки во всех редакторах.
Если вы профессионально занимаетесь ассемблером под Z80 (или другие архитектуры) и хотите получить максимум от своего редактора — asm-lsp обязателен к установке и настройке. Один раз потратив время, вы получите среду, которая понимает ваш код почти как человек.
P.S. Автору проекта, bergercookie, огромное спасибо за этот инструмент. Он делает для ассемблерного сообщества то же, что когда-то сделал LSP для "больших" языков — поднимает планку инструментальной поддержки на недосягаемую ранее высоту.
P.P.S. Если вы пользуетесь не VS Code, а другим редактором — не отчаивайтесь. asm-lsp работает везде, где есть LSP-клиент. Попробуйте настроить его в своём любимом редакторе — скорее всего, это проще, чем кажется.