КВС — Ассемблер с русским синтаксисом для x86-64

╔══════════════════════════════════╗
║   ██╗  ██╗  ██╗   ██╗  ███████╗  ║
║   ██║ ██╔╝  ██╗   ██╗  ██╔════╝  ║
║   █████╔╝   ██╗   ██╗  ███████╗  ║
║   ██║╚██╗   ╚██╗ ██╔╝  ╚════██║  ║
║   ██║ ╚██╗    ╚██╔╝    ███████║  ║
║   ╚═╝  ╚═╝     ╚═╝     ╚══════╝  ║
╚══════════════════════════════════╝

Версия 2.0 | Экспериментальный проект | 2026

✓ Абсолютная адресация реализована | ✓ Косвенная адресация реализована | ✓ Секция .bss реализована

┌──[ ОГЛАВЛЕНИЕ ]────────────────────────────────────────────┐

└──────────────────────────────────────────────────────────────┘

НАЗНАЧЕНИЕ И КОНЦЕПЦИЯ

КВС — это ассемблер для архитектуры x86-64, полностью использующий русскую лексику для мнемоник инструкций, имён регистров и директив. Проект носит образовательный и экспериментальный характер и демонстрирует принципы работы ассемблера, построения ELF-файлов и трансляции высокоуровневых концепций в машинный код.

Ключевые принципы проекта:

ОСОБЕННОСТИ И ВОЗМОЖНОСТИ

АРХИТЕКТУРА И ПРОЦЕСС СБОРКИ

Исходный файл (.квс) │ ▼ (kvs_lexer.py) Файл токенов (.токены) │ ▼ (kvs_parser.py) AST-представление (.аст) │ ▼ (kvs_pass1.py) Первый проход: размеры, метки (.проход1) │ ▼ (kvs_pass2.py + kvs_pass2_encoder.py) Второй проход: генерация кода (.csv) │ ▼ (kvs_builder.py) ELF-компоновщик (.elf) Исполняемый файл!

Модули компилятора

ФайлНазначение
kvs_build.pyГлавный сборочный скрипт
kvs_lexer.pyЛексический анализ, разбор на токены
kvs_parser.pyСинтаксический анализ, построение AST
kvs_pass1.pyПервый проход: вычисление размеров и адресов меток
kvs_pass2.pyВторой проход: обход AST, генерация CSV
kvs_pass2_encoder.pyКодировщик инструкций (все encode_* функции)
kvs_builder.pyСборка ELF-файла из CSV
kvs_data.pyОбщие данные (регистры, инструкции)

УСТАНОВКА И ЗАПУСК

# Клонирование репозитория
git clone https://github.com/artradeskz/kvs.git
cd kvs

# Установка прав на выполнение (при необходимости)
chmod +x kvs_build.py

# Компиляция программы
python3 kvs_build.py программа.квс

# Запуск скомпилированной программы
./программа.elf

СИНТАКСИС ИСХОДНЫХ ФАЙЛОВ (.квс)

; Комментарий начинается с точки с запятой

.бсс                        ; Начало секции неинициализированных данных
    счётчик: .байт 0        ; Переменная без начального значения

.данные                     ; Начало секции инициализированных данных
    message: .строка_нуль "Привет, мир!"

.текст                      ; Начало секции кода
.глобал _start              ; Точка входа

_start:
    ; Абсолютная адресация через метку
    переместить_имм раикс, 42
    сохранить [счётчик], раикс    ; запись в BSS-переменную
    
    ; Абсолютная адресация через число
    сохранить [0x402000], раикс   ; запись по абсолютному адресу
    
    ; Косвенная адресация через регистр
    переместить_имм рбикс, message
    загрузить раикс, [рбикс]      ; чтение через регистр

    ; Системный вызов write
    переместить_имм раикс, 1
    переместить_имм рсиай, message
    переместить_имм рдикс, 13
    вызов_системы

    ; Выход с кодом из счётчика
    загрузить рдиай, [счётчик]
    переместить_имм раикс, 60
    вызов_системы

СИСТЕМА КОМАНД

КатегорияПримеры инструкцийСоответствие NASM
Перемещение данныхпереместить, переместить_иммmov, mov reg, imm
Работа с памятьюзагрузить, сохранить, загрузить_адресmov reg, mem, mov mem, reg, lea
Арифметикаприбавить, вычесть, увеличить, уменьшитьadd, sub, inc, dec
Логическиесравнить, сравнить_с, проверитьcmp, test
Условные переходыпереход_если_равно, переход_если_больше, короткий_переходje, jg, jmp short
Безусловные переходыпереход, короткий_переходjmp, jmp short
Системныевызов_системыsyscall

РАБОТА С ПАМЯТЬЮ

✓ РЕАЛИЗОВАНО (v2.0): Абсолютная адресация (метки и числа), косвенная адресация через регистры

Поддерживаемые формы:

СинтаксисОписаниеПример
[метка]Адрес метки (из .данные или .бсс)загрузить раикс, [переменная]
[число]Абсолютный адрессохранить [0x402000], раикс
[регистр]Косвенная адресация через регистрзагрузить раикс, [рбикс]

Пример использования:

.бсс
счётчик: .байт 0
указатель: .байт 0

.данные
переменная: .байт 42
message: .строка_нуль "Hello"

.текст
_start:
    ; Абсолютная адресация через метку
    загрузить раикс, [переменная]
    
    ; Абсолютная адресация через число
    сохранить [0x402000], раикс
    
    ; Косвенная адресация
    переместить_имм рбикс, переменная
    загрузить раикс, [рбикс]
    
    ; Работа с BSS
    сохранить [счётчик], раикс
    
    ; Завершение
    переместить_имм раикс, 60
    загрузить рдиай, [счётчик]
    вызов_системы
📌 ВАЖНО: Все тесты из папки тесты/ успешно собираются и запускаются, включая тест, воспроизводящий баг с BSS-секцией. Адресация работает корректно во всех формах.

РЕГИСТРЫ ПРОЦЕССОРА

64-битные32-битные16-битные8-битные (мл.)
раиксеаиксаиксал
рбиксебиксбиксбл
рсиксесикссикскл
рдикседиксдиксдл
рсипиесипиэспспл
рбипиебипибипибпл
рсиайесиайэссил
рдиайедиайдидил
⚠️ ПРИМЕЧАНИЕ: Старшие 8-битные регистры (AH, BH, CH, DH) и расширенные младшие (SPL, BPL, SIL, DIL) не поддерживаются. Регистры R8–R15 также отсутствуют.

ДИРЕКТИВЫ АССЕМБЛЕРА

ДирективаНазначениеПример
.текстНачало секции кода.текст
.данныеНачало секции инициализированных данных.данные
.бссНачало секции неинициализированных данных.бсс
.глобалОбъявление глобальной метки.глобал _start
.строкаСтрока без нулевого терминатора.строка "Hello"
.строка_нульСтрока с нулевым терминатором.строка_нуль "Hello"
.байтРезервирование байтов.байт 0x0A, 255, 0b0001
.константаОпределение константы.константа SIZE = 100

ПРИМЕРЫ ПРОГРАММ

Пример 1: "Привет, мир!"

.глобал _start
.текст

_start:
    ; write(1, msg, 13)
    переместить_имм раикс, 1
    переместить_имм рдиай, 1
    переместить_имм рсиай, msg
    переместить_имм рдикс, 13
    вызов_системы

    ; exit(0)
    переместить_имм раикс, 60
    переместить_имм рдиай, 0
    вызов_системы

.данные
msg: .строка_нуль "Hello, World!"

Пример 2: Работа с BSS-секцией

.глобал _start
.текст

_start:
    ; Инициализация счётчика
    переместить_имм раикс, 0
    сохранить [счётчик], раикс
    
    ; Цикл: увеличить счётчик 10 раз
    переместить_имм рсикс, 10
loop:
    загрузить раикс, [счётчик]
    увеличить раикс
    сохранить [счётчик], раикс
    уменьшить рсикс
    сравнить_с рсикс, 0
    переход_если_больше loop
    
    ; Выход с кодом = значение счётчика
    загрузить рдиай, [счётчик]
    переместить_имм раикс, 60
    вызов_системы

.бсс
счётчик: .байт 0

Пример 3: Косвенная адресация

.глобал _start
.текст

_start:
    ; Загружаем адрес переменной в регистр
    переместить_имм рбикс, переменная
    
    ; Косвенная запись
    переместить_имм раикс, 99
    сохранить [рбикс], раикс
    
    ; Косвенное чтение
    загрузить раикс, [рбикс]
    
    ; Выход
    переместить_имм рдиай, раикс
    переместить_имм раикс, 60
    вызов_системы

.данные
переменная: .байт 0

Пример 4: Абсолютный адрес

.глобал _start
.текст

_start:
    ; Запись по абсолютному адресу 0x402000
    переместить_имм раикс, 0x2A
    сохранить [0x402000], раикс
    
    ; Чтение по абсолютному адресу
    загрузить рбикс, [0x402000]
    
    ; Выход с кодом 42
    переместить_имм раикс, 60
    переместить_имм рдиай, 0x2A
    вызов_системы

ПРОЦЕСС ТРАНСЛЯЦИИ И ВЫХОДНЫЕ ФАЙЛЫ

Запуск ассемблера:

python3 kvs_build.py программа.квс

В результате создаются файлы:

СТАТУС РЕАЛИЗАЦИИ

✅ Полностью реализовано (v2.0)

⚠️ Частично реализовано / ограничено

ПЛАН РАЗВИТИЯ

v2.0 (текущая) — Адресация и BSS

v3.0 (планируется) — Расширенная адресация

v4.0 (отложено) — Стандартная библиотека

ОГРАНИЧЕНИЯ