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

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

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

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

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

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

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

КВС — это ассемблер для архитектуры 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/username/kvs.git
cd kvs

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

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

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

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

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

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

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

_start:
    ; Работа с памятью
    переместить_имм раикс, 42
    сохранить [переменная], раикс    ; запись в память
    
    загрузить рбикс, [переменная]    ; чтение из памяти

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

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

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

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

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

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

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

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

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

.данные
переменная: .байт 0
результат: .байт 0

.текст
_start:
    ; Запись значения
    переместить_имм раикс, 42
    сохранить [переменная], раикс
    
    ; Чтение значения
    загрузить рбикс, [переменная]
    
    ; Завершение с кодом 42
    переместить_имм раикс, 60
    загрузить рдиай, [переменная]
    вызов_системы
⚠️ ВАЖНО: Порядок объявления в секции .данные имеет значение! Переменные, объявленные перед строковыми константами, могут затереть первые байты строк. Рекомендуется объявлять строки первыми, а изменяемые переменные — после.

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

64-битные32-битные16-битные8-битные (мл.)8-битные (ст.)
раиксеаиксаиксалаш
рбиксебиксбиксблбш
рсиксесикссиксклчш
рдикседиксдиксдлдш
рсипиесипиэспспл—
рбипиебипибипибпл—
рсиайесиайэссил—
рдиайедиайдидил—
р8…р15р8д…р15др8в…р15вр8б…р15б—

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

ДирективаНазначениеПример
.текстНачало секции кода.текст
.данныеНачало секции данных.данные
.глобалОбъявление глобальной метки.глобал _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: Работа с переменными в памяти

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

_start:
    ; Запись 42 в переменную
    переместить_имм раикс, 42
    сохранить [переменная], раикс
    
    ; Завершение с кодом 42
    переместить_имм раикс, 60
    загрузить рдиай, [переменная]
    вызов_системы

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

Пример 3: Цикл для вычисления суммы

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

_start:
    переместить_имм р8, 0      ; сумма
    переместить_имм р9, 10     ; счётчик

loop:
    прибавить р8, р9
    уменьшить р9
    сравнить_с р9, 0
    переход_если_больше loop

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

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

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

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

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

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

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

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

❌ В разработке (v3.0)

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

v2.0 (текущая) — Абсолютная адресация

v3.0 (планируется) — Косвенная и относительная адресация

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

Зависимости между подзадачами: Лексер (шаг 1) ✅ ↓ Парсер (шаг 2) ✅ ↓ Данные инструкций (шаг 3) ⚠️ ↓ Pass1 (шаг 4) ✅ ↓ Pass2 (шаг 5): ⚠️ ЧАСТИЧНО 5.1 → 5.2 → 5.3 → 5.4 → 5.5 ↓ 5.6 (генераторы инструкций) ↓ 5.7 (диспетчер) ✅ ↓ Тестирование (шаг 6) ⚠️ ЧАСТИЧНО ↓ Библиотека (шаг 7) ❌ ОТЛОЖЕНО

ОГРАНИЧЕНИЯ