2026-05-02 23:17:09 +03:00
```markdown
# К В С (Компилятор B Семейства) — Ассемблер с русским синтаксисом для x86-64
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
[](https://github.com/username/kvs)
[](https://python.org)
[](LICENSE)
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
**К В С ** — это экспериментальный ассемблер для архитектуры x86-64, полностью использующий **русскую лексику** для мнемоник инструкций, имён регистров и директив. Проект носит образовательный характер и демонстрирует принципы работы ассемблера, построения ELF-файлов и трансляции высокоуровневых концепций в машинный код.
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
## 📋 Оглавление
- [Особенности ](#-особенности )
- [Архитектура ](#-архитектура )
- [Установка ](#-установка )
- [Быстрый старт ](#-быстрый-старт )
- [Синтаксис ](#-синтаксис )
- [Система команд ](#-система-команд )
- [Регистры ](#-регистры-процессора )
- [Директивы ](#-директивы-ассемблера )
- [Примеры программ ](#-примеры-программ )
- [Отладка ](#-отладка-и-проверка )
- [Ограничения ](#-ограничения )
- [Лицензия ](#-лицензия )
## ✨ Особенности
- **Полностью русский синтаксис** — все инструкции, регистры и директивы на кириллице
- **Генерация исполняемых ELF-файлов** — 64-битные ELF для Linux, готовые к запуску
- **Двухпроходная сборка** — традиционная схема с разрешением меток
- **Поддержка секций** — разделение на `.текст` (код) и `.данные` (данные)
- **CSV-логирование** — детальный файл с соответствием адресов, байтов и исходных команд
- **Более 50 инструкций** — полный набор основных команд x86-64
- **Минимализм зависимостей** — только стандартная библиотека Python
## 🏗 Архитектура
Процесс трансляции исходного кода `.квс` в исполняемый файл `.elf` проходит через несколько этапов:
```
Исходный файл (.квс)
│
▼ (kvs_lexer.py)
Файл токенов (.токены)
│
▼ (kvs_parser.py)
AST-представление (.аст)
│
▼ (kvs_pass1.py)
Первый проход: размеры, метки (.пр о х о д1)
│
▼ (kvs_pass2.py)
Второй проход: генерация кода (.csv)
│
▼ (kvs_builder.py)
ELF-компоновщик (.elf)
Исполняемый файл!
```
### Модули компилятора
2026-05-02 23:04:46 +03:00
| Файл | Назначение |
|------|------------|
2026-05-02 23:17:09 +03:00
| `kvs_build.py` | Главный сборочный скрипт |
2026-05-02 23:04:46 +03:00
| `kvs_lexer.py` | Лексический анализ, разбор на токены |
| `kvs_parser.py` | Синтаксический анализ, построение AST |
| `kvs_pass1.py` | Первый проход: вычисление размеров и адресов меток |
| `kvs_pass2.py` | Второй проход: генерация машинного кода |
2026-05-02 23:17:09 +03:00
| `kvs_builder.py` | Сборка ELF-файла из CSV |
| `kvs_data.py` | Общие данные (регистры, инструкции) |
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
## 🔧 Установка
2026-05-02 23:04:46 +03:00
```bash
2026-05-02 23:17:09 +03:00
# Клонирование репозитория
git clone https://github.com/username/kvs.git
cd kvs
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
# Установка прав на выполнение (при необходимости)
chmod +x kvs_build.py
# Проверка работы
python3 kvs_build.py --help
2026-05-02 23:04:46 +03:00
```
2026-05-02 23:17:09 +03:00
## 🚀 Быстрый старт
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
### 1. Создайте файл `hello.квс`:
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
```asm
.текст
.глобал _start
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
_start:
; write(1, msg, 13)
пе р е ме с тить_имм раикс, 1
пе р е ме с тить_имм рдиай, 1
пе р е ме с тить_имм рсиай, msg
пе р е ме с тить_имм рдикс, 13
вызо в_с ис те мы
; exit(0)
пе р е ме с тить_имм раикс, 60
пе р е ме с тить_имм рдиай, 0
вызо в_с ис те мы
.данные
msg: .с тр о ка _ну ль "Hello, World!"
```
### 2. Скомпилируйте:
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
```bash
python3 kvs_build.py hello.квс
```
### 3. Запустите:
```bash
./hello.elf
```
**Вывод:**
```
Hello, World!
```
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
## 📝 Синтаксис
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
### Структура программы
2026-05-02 23:04:46 +03:00
```
.текст ; секция кода (обязательна)
; ... инструкции ...
.данные ; секция данных (опциональна)
; ... данные ...
```
2026-05-02 23:17:09 +03:00
### Метки
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
Метка — это имя, за которым следует двоеточие:
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
```asm
2026-05-02 23:04:46 +03:00
_start: ; метка _start
пе р е ме с тить_имм раикс, 1
переход _start ; переход на метку
```
2026-05-02 23:17:09 +03:00
### Комментарии
2026-05-02 23:04:46 +03:00
Однострочные комментарии начинаются с `;` :
2026-05-02 23:17:09 +03:00
```asm
2026-05-02 23:04:46 +03:00
; Это комментарий
пе р е ме с тить_имм раикс, 42 ; комментарий после инструкции
```
2026-05-02 23:17:09 +03:00
## 📖 Система команд
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
### Загрузка констант
2026-05-02 23:04:46 +03:00
| Инструкция | Синтаксис | Описание |
|------------|-----------|----------|
| `пе р е ме с тить_имм` | `пе р е ме с тить_имм р е г , значение` | Загрузить константу в регистр |
```asm
пе р е ме с тить_имм раикс, 42 ; RAX = 42
2026-05-02 23:17:09 +03:00
пе р е ме с тить_имм еаикс, 0x7FFF ; EAX = 32767
пе р е ме с тить_имм ал, 0xFF ; AL = 255
2026-05-02 23:04:46 +03:00
```
2026-05-02 23:17:09 +03:00
### Арифметика и логика
2026-05-02 23:04:46 +03:00
| Инструкция | Синтаксис | Описание |
|------------|-----------|----------|
| `прибавить` | `прибавить р е г 1, р е г 2` | р е г 1 += р е г 2 |
| `вычесть` | `вычесть р е г 1, р е г 2` | р е г 1 -= р е г 2 |
| `увеличить` | `увеличить р е г ` | р е г ++ |
| `уменьшить` | `уменьшить р е г ` | р е г -- |
2026-05-02 23:17:09 +03:00
| `сравнить` | `сравнить р е г 1, р е г 2` | Сравнить регистры |
| `с р а внить_с ` | `с р а внить_с р е г , значение` | Сравнить с константой |
| `проверить` | `проверить р е г 1, р е г 2` | TEST (логическое AND) |
2026-05-02 23:04:46 +03:00
```asm
прибавить раикс, рбикс ; RAX += RBX
увеличить рсикс ; RCX++
сравнить раикс, 10 ; сравнить RAX с 10
```
2026-05-02 23:17:09 +03:00
### Переходы
| Инструкция | Условие |
|------------|---------|
| `переход` | Безусловный |
| `ко р о ткий_пе р е х о д` | Безусловный (смещение ±127) |
| `пе р е х о д_е с ли_р а вно ` | ZF = 1 |
| `пе р е х о д_е с ли_не р а вно ` | ZF = 0 |
| `пе р е х о д_е с ли_ме ньше ` | SF ≠ OF (signed < ) |
| `пе р е х о д_е с ли_б о льше ` | ZF = 0 и SF = OF (signed >) |
| `пе р е х о д_е с ли_ме ньше _или_р а вно ` | ZF = 1 или SF ≠ OF |
| `пе р е х о д_е с ли_б о льше _или_р а вно ` | SF = OF |
| `пе р е х о д_е с ли_пе р е но с ` | CF = 1 |
| `пе р е х о д_е с ли_не т_пе р е но с а ` | CF = 0 |
2026-05-02 23:04:46 +03:00
**Короткие условные переходы** (префикс `ко р о ткий_` ):
- `ко р о ткий_пе р е х о д_е с ли_р а вно ` , `ко р о ткий_пе р е х о д_е с ли_не р а вно ` , и т.д.
- Генерируют 2-байтовые инструкции (смещение ±127 байт)
2026-05-02 23:17:09 +03:00
### Системные вызовы
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
| Инструкция | Описание |
|------------|----------|
| `вызо в_с ис те мы` | Вызов ядра Linux (syscall) |
2026-05-02 23:04:46 +03:00
```asm
; Пример: завершение программы
пе р е ме с тить_имм раикс, 60 ; syscall 60 = exit
пе р е ме с тить_имм рдиай, 0 ; код возврата 0
вызо в_с ис те мы
```
2026-05-02 23:17:09 +03:00
## 💾 Регистры процессора
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
К В С поддерживает все основные 64-битные регистры x86-64:
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
| 64-бит | 32-бит | 16-бит | 8-бит (мл.) | 8-бит (ст.) |
|--------|--------|--------|-------------|-------------|
| `раикс` | `еаикс` | `аикс` | `ал` | `аш` |
| `рбикс` | `ебикс` | `бикс` | `бл` | `бш` |
| `рсикс` | `есикс` | `сикс` | `кл` | `чш` |
| `рдикс` | `едикс` | `дикс` | `дл` | `дш` |
| `рсипи` | `есипи` | `эсп` | `спл` | — |
| `рбипи` | `ебипи` | `бипи` | `бпл` | — |
| `рсиай` | `есиай` | `эс` | `сил` | — |
| `рдиай` | `едиай` | `ди` | `дил` | — |
| `р 8` …`р 15` | `р 8д` …`р 15д` | `р 8в` …`р 15в` | `р 8б ` …`р 15б ` | — |
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
## 🔧 Директивы ассемблера
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
| Директива | Назначение | Пример |
|-----------|------------|--------|
| `.текст` | Начало секции кода | `.текст` |
| `.данные` | Начало секции данных | `.данные` |
| `.глобал` | Объявление глобальной метки | `.глобал _start` |
| `.строка` | Строка без завершающего нуля | `.строка "Hello"` |
| `.с тр о ка _ну ль` | Строка с завершающим нулём | `.с тр о ка _ну ль "Hello"` |
| `.байт` | Последовательность байтов | `.байт 0x48, 0x65, 108` |
| `.константа` | Определение константы | `.константа LEN = 10` |
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
## 📝 Примеры программ
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
### Цикл и условный переход
2026-05-02 23:04:46 +03:00
```asm
.текст
.глобал _start
_start:
пе р е ме с тить_имм рсикс, 10 ; счетчик = 10
loop:
пе р е ме с тить_имм раикс, 1
пе р е ме с тить_имм рдиай, 1
пе р е ме с тить_имм рсиай, msg
пе р е ме с тить_имм рдикс, len_msg
вызо в_с ис те мы
уменьшить рсикс ; счетчик--
с р а внить_с рсикс, 0
пе р е х о д_е с ли_б о льше loop ; если > 0, продолжаем
пе р е ме с тить_имм раикс, 60
пе р е ме с тить_имм рдиай, 0
вызо в_с ис те мы
.данные
2026-05-02 23:17:09 +03:00
msg: .с тр о ка _ну ль "Iteration\n"
2026-05-02 23:04:46 +03:00
.константа len_msg = 10
```
2026-05-02 23:17:09 +03:00
### Вычисление суммы чисел от 1 до 10
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
```asm
.текст
.глобал _start
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
_start:
пе р е ме с тить_имм р 8, 0 ; сумма
пе р е ме с тить_имм р 9, 10 ; счётчик
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
loop:
прибавить р 8, р 9
уменьшить р 9
с р а внить_с р 9, 0
пе р е х о д_е с ли_б о льше loop
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
; exit(сумма в r8)
пе р е ме с тить_имм раикс, 60
переместить рдикс, р 8
вызо в_с ис те мы
2026-05-02 23:04:46 +03:00
```
2026-05-02 23:17:09 +03:00
## 🐛 Отладка и проверка
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
### Просмотр сгенерированного кода
2026-05-02 23:04:46 +03:00
```bash
2026-05-02 23:17:09 +03:00
# Дизассемблирование
2026-05-02 23:04:46 +03:00
objdump -d программа.elf
2026-05-02 23:17:09 +03:00
# Просмотр секций
objdump -h программа.elf
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
# Просмотр заголовков программы
2026-05-02 23:04:46 +03:00
readelf -l программа.elf
2026-05-02 23:17:09 +03:00
# Извлечение строк из ELF
strings программа.elf
2026-05-02 23:04:46 +03:00
```
2026-05-02 23:17:09 +03:00
### CSV-лог
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
После компиляции создаётся файл `программа.csv` с о структурой:
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
| адрес | байт | це ле во й_а др е с | ис х о дна я_ко ма нда |
|-------|------|---------------|------------------|
| 0x401000 | 48 | | пе р е ме с тить_имм раикс, 1 |
| 0x401001 | B8 | | |
| 0x401002 | 01 | | |
| ... | ... | ... | ... |
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
### Трассировка системных вызовов
2026-05-02 23:04:46 +03:00
```bash
strace ./программа.elf
```
2026-05-02 23:17:09 +03:00
### Отладка с GDB
2026-05-02 23:04:46 +03:00
```bash
gdb ./программа.elf
```
2026-05-02 23:17:09 +03:00
```gdb
2026-05-02 23:04:46 +03:00
(gdb) break _start ; установить точку останова
(gdb) run ; запустить
(gdb) info registers ; показать регистры
(gdb) x/10i $rip ; показать 10 инструкций
(gdb) stepi ; выполнить одну инструкцию
```
2026-05-02 23:17:09 +03:00
## ⚠️ Ограничения
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
### Поддерживается
2026-05-02 23:04:46 +03:00
- ✅ 64-битные, 32-битные, 16-битные и 8-битные регистры
- ✅ Непосредственная загрузка констант (imm) в регистры
- ✅ Сравнение регистров и регистров с константами
- ✅ Условные и безусловные переходы (длинные и короткие)
- ✅ Арифметические операции (ADD, SUB, INC, DEC)
- ✅ Логическая операция TEST
- ✅ Системные вызовы Linux (syscall)
2026-05-02 23:17:09 +03:00
- ✅ Секции `.текст` и `.данные`
2026-05-02 23:04:46 +03:00
- ✅ Строковые литералы с escape-последовательностями (`\n`, ` \t`, ` \\`, ` \"`)
- ✅ Директива `.байт` для raw-данных
- ✅ Директива `.константа` для имён констант
2026-05-02 23:17:09 +03:00
### Н е поддерживается
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
- ❌ Косвенная адресация памяти `[reg+disp]` (в разработке)
- ❌ Инструкции для работы с о стеком (PUSH, POP, CALL, RET)
- ❌ Поддержка плавающей запятой (FPU/SSE)
- ❌ Многомодульная компиляция
- ❌ Макросы
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
## 📄 Лицензия
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
Только для образовательных целей. Используйте на свой страх и риск.
2026-05-02 23:04:46 +03:00
```
2026-05-02 23:17:09 +03:00
К В С Ассемблер | Экспериментальный проект | 2025
Только для образовательных целей. Используйте на свой страх и риск.
2026-05-02 23:04:46 +03:00
```
2026-05-02 23:17:09 +03:00
```