2026-05-02 23:17:09 +03:00
```markdown
2026-05-17 17:18:35 +03:00
# К В С — Ассемблер с русским синтаксисом для x86-64
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
## 📋 Оглавление
- [Особенности ](#-особенности )
- [Архитектура ](#-архитектура )
- [Установка ](#-установка )
- [Быстрый старт ](#-быстрый-старт )
2026-06-09 22:43:10 +03:00
- [Система тестирования ](#-система-тестирования )
2026-05-02 23:17:09 +03:00
- [Синтаксис ](#-синтаксис )
- [Система команд ](#-система-команд )
- [Регистры ](#-регистры-процессора )
- [Директивы ](#-директивы-ассемблера )
- [Примеры программ ](#-примеры-программ )
2026-06-09 22:43:10 +03:00
- [Отладка и проверка ](#-отладка-и-проверка )
2026-05-02 23:17:09 +03:00
- [Ограничения ](#-ограничения )
2026-05-11 15:08:03 +03:00
- [План развития ](#-план-развития )
2026-05-02 23:17:09 +03:00
- [Лицензия ](#-лицензия )
## ✨ Особенности
- **Полностью русский синтаксис** — все инструкции, регистры и директивы на кириллице
- **Генерация исполняемых ELF-файлов** — 64-битные ELF для Linux, готовые к запуску
2026-06-09 22:43:10 +03:00
- **Шестипроходная сборка** — разделение логики на независимые этапы для прозрачности и отладки
2026-05-23 16:30:12 +03:00
- **Поддержка секций** — разделение на `.текст` (код), `.данные` (данные) и `.бнд` (неинициализированные данные)
2026-05-17 17:18:35 +03:00
- **Гибкая адресация памяти**:
- абсолютная адресация по меткам `[переменная]`
- абсолютная адресация по числовому адресу `[0x402000]`
- косвенная адресация через регистр `[раикс]`
- всё с RIP-relative кодированием для 64-битных перемещений
2026-05-23 18:56:43 +03:00
- **CSV-логирование** — детальный файл с соответствием адресов, байтов, меток и исходных команд
2026-05-02 23:17:09 +03:00
- **Более 50 инструкций** — полный набор основных команд x86-64
2026-06-09 22:43:10 +03:00
- **Автоматическая система регрессионного тестирования** — 9+ тестов, проверяющих все аспекты работы ассемблера
2026-05-02 23:17:09 +03:00
- **Минимализм зависимостей** — только стандартная библиотека Python
## 🏗 Архитектура
2026-06-09 22:43:10 +03:00
Процесс трансляции исходного кода `.квс` в исполняемый файл `.elf` проходит через **6 этапов** :
2026-05-02 23:17:09 +03:00
```
Исходный файл (.квс)
2026-05-17 17:18:35 +03:00
│
2026-05-23 16:30:12 +03:00
▼ (kvs_lexer.py) ← лексический анализ
2026-05-02 23:17:09 +03:00
Файл токенов (.токены)
2026-05-17 17:18:35 +03:00
│
2026-05-23 16:30:12 +03:00
▼ (kvs_parser.py) ← синтаксический анализ
2026-05-02 23:17:09 +03:00
AST-представление (.аст)
2026-05-17 17:18:35 +03:00
│
2026-05-23 16:30:12 +03:00
▼ (kvs_pass1.py) ← ПРОХОД 1: генерация CSV с заглушками (0xCC)
2026-05-23 18:56:43 +03:00
CSV-файл (.csv) ← содержит все байты программы, метки, виртуальные адреса
2026-05-17 17:18:35 +03:00
│
2026-05-23 18:56:43 +03:00
▼ (kvs_pass2.py) ← ПРОХОД 2: разрешение меток
2026-05-17 17:18:35 +03:00
│
2026-05-23 16:30:12 +03:00
▼ (kvs_pass3.py) ← ПРОХОД 3: подстановка констант (.константа)
│
▼ (kvs_pass4.py) ← ПРОХОД 4: перекодирование инструкций
│
2026-06-09 22:43:10 +03:00
▼ (kvs_pass5.py) ← ПРОХОД 5: генерация корректных таблиц секций для совместимости с toolchain
│
▼ (kvs_pass6.py) ← ПРОХОД 6: постобработка CSV для визуального анализа
│
2026-05-23 16:30:12 +03:00
▼ (kvs_builder.py) ← сборка ELF из CSV
ELF-файл (.elf)
2026-05-17 17:18:35 +03:00
│
▼
2026-05-02 23:17:09 +03:00
Исполняемый файл!
```
2026-06-09 22:43:10 +03:00
### Почему 6 проходов?
1. **Первый проход** — неизвестно, какие адреса будут у меток. Ставим заглушки `0xCC` .
2. **Второй проход** — после того как все адреса меток известны, заменяем заглушки.
3. **Третий проход** — константы могут ссылаться друг на друга и на метки.
4. **Четвёртый проход** — после подстановки чисел перегенерируем машинный код (разная длина инструкций).
5. **Пятый проход** — генерируем корректные таблицы секций для работы `objdump` , `readelf` и GDB.
6. **Шестой проход** — сортируем CSV для удобного визуального анализа человеком.
Такой подход позволяет **изолировать логику** каждого этапа и делает отладку прозрачной.
2026-05-02 23:17:09 +03:00
### Модули компилятора
2026-05-02 23:04:46 +03:00
| Файл | Назначение |
2026-05-17 17:18:35 +03:00
|------|-------------|
2026-06-09 22:43:10 +03:00
| `kvs_build.py` | Главный сборочный скрипт |
| `kvs_lexer.py` | Лексический анализ |
| `kvs_parser.py` | Синтаксический анализ, построение AST |
| `kvs_data.py` | Общие данные: регистры, таблица инструкций |
| `kvs_encoder.py` | Фасад кодировщика |
2026-05-23 16:30:12 +03:00
| `kvs_encoder_fixsize.py` | Кодировщик инструкций фиксированного размера |
2026-06-09 22:43:10 +03:00
| `kvs_encoder_mutsize.py` | Кодировщик инструкций переменного размера |
| `kvs_pass1.py` | Генерация CSV с заглушками |
| `kvs_pass2.py` | Разрешение меток |
| `kvs_pass3.py` | Подстановка констант |
| `kvs_pass4.py` | Перекодирование инструкций |
| `kvs_pass5.py` | Генерация таблиц секций |
| `kvs_pass6.py` | Сортировка CSV |
| `kvs_builder.py` | Сборка ELF из CSV |
2026-05-23 16:30:12 +03:00
### Структура CSV-файла
| Колонка | Назначение |
|---------|-------------|
| `сегмент` | Имя секции (`.header`, `.text` , `.data` , `.bss` ) |
| `адрес` | Файловое смещение байта |
2026-06-09 22:43:10 +03:00
| `вир ту а льный_а др е с ` | Виртуальный адрес байта в памяти |
2026-05-23 16:30:12 +03:00
| `байт` | Исходное значение байта (из pass1) |
2026-06-09 22:43:10 +03:00
| `пр иво дяща я_ме тка ` | Имена меток на этом адресе |
2026-05-23 16:30:12 +03:00
| `у во дящий_а др е с ` | Строка `ЗАГЛУШКА имя` для неразрешённых меток |
2026-06-09 22:43:10 +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-17 17:18:35 +03:00
git clone https://github.com/artradeskz/kvs.git
2026-05-02 23:17:09 +03:00
cd kvs
2026-05-02 23:04:46 +03:00
2026-06-09 22:43:10 +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-17 17:18:35 +03:00
```assembly
2026-05-02 23:17:09 +03:00
.текст
.глобал _start
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
_start:
2026-06-09 22:43:10 +03:00
; write(1, msg, 21)
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм раикс,1
пе р е ме с тить_имм рдиай,1
2026-05-02 23:17:09 +03:00
пе р е ме с тить_имм рсиай, msg
2026-06-09 22:43:10 +03:00
пе р е ме с тить_имм рдикс,21
2026-05-02 23:17:09 +03:00
вызо в_с ис те мы
; exit(0)
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм раикс,60
пе р е ме с тить_имм рдиай,0
2026-05-02 23:17:09 +03:00
вызо в_с ис те мы
.данные
2026-06-09 22:43:10 +03:00
msg: .строка "Привет мир!\n"
2026-05-02 23:17:09 +03:00
```
### 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
```
**Вывод:**
2026-05-17 17:18:35 +03:00
2026-05-02 23:17:09 +03:00
```
2026-06-09 22:43:10 +03:00
Привет мир!
2026-05-02 23:17:09 +03:00
```
2026-05-02 23:04:46 +03:00
2026-06-09 22:43:10 +03:00
## 🧪 Система тестирования
Проект включает автоматическую систему регрессионного тестирования, которая проверяет все аспекты работы ассемблера.
### Структура тестов
```
тесты/
├── kvs_full_test.py # диспетчер тестов
├── kvs_full_test.csv # таблица активных тестов
├── cleaner.py # очистка артефактов
├── привет/ # тест вывода строки
│ ├── привет.квс
│ └── привет.py
├── с ло жный_те с т/ # тест запутанных переходов
├── длин_те с т/ # тест длинных переходов (jmp rel32)
├── выво д_а р г у ме нта / # тест аргументов командной строки
├── те с т_а др е с а ции_р 8/ # косвенная адресация через R8
├── те с т_а др е с а ции1/ # абсолютная адресация по числовому адресу
├── те с т_а др е с а ции2/ # абсолютная адресация по метке
├── те с т_а др е с а ции3/ # косвенная адресация через RBX
└── те с т_б нд/ # проверка BSS секции (.bss)
```
### Запуск тестов
```bash
python3 тесты/kvs_full_test.py
```
### Добавление нового теста
1. Создать папку `тесты/имя_те с та /`
2. Положить туда `имя_те с та .квс` и `имя_те с та .py`
3. Добавить строку в `kvs_full_test.csv` :
```
1;имя_те с та ;Описание теста
```
4. Запустить `python3 тесты/kvs_full_test.py`
### Что проверяют тесты
| Тест | Проверяет |
|------|-----------|
| `привет` | Вывод строки на русском, exit(0) |
| `с ло жный_те с т` | Короткие условные переходы |
| `длин_те с т` | Длинные переходы (jmp rel32) |
| `выво д_а р г у ме нта ` | Аргументы командной строки (2 сценария) |
| `те с т_а др е с а ции_р 8` | Косвенную адресацию через R8 |
| `те с т_а др е с а ции1` | Абсолютную адресацию `[0x402000]` |
| `те с т_а др е с а ции2` | Абсолютную адресацию по метке |
| `те с т_а др е с а ции3` | Косвенную адресацию через RBX |
| `те с т_б нд` | BSS секцию: NOBITS, размер, p_memsz |
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-17 17:18:35 +03:00
```assembly
2026-05-02 23:04:46 +03:00
.текст ; секция кода (обязательна)
; ... инструкции ...
.данные ; секция данных (опциональна)
2026-05-17 17:18:35 +03:00
; ... инициализированные данные ...
2026-05-23 16:30:12 +03:00
.бнд ; секция неинициализированных данных (опциональна)
2026-05-17 17:18:35 +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-17 17:18:35 +03:00
```assembly
2026-05-02 23:04:46 +03:00
_start: ; метка _start
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм раикс,1
2026-05-02 23:04:46 +03:00
переход _start ; переход на метку
```
2026-05-02 23:17:09 +03:00
### Комментарии
2026-05-02 23:04:46 +03:00
2026-05-17 17:18:35 +03:00
```assembly
2026-05-02 23:04:46 +03:00
; Это комментарий
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм раикс,42 ; комментарий после инструкции
2026-05-02 23:04:46 +03:00
```
2026-05-17 17:18:35 +03:00
### Работа с памятью
2026-05-11 15:08:03 +03:00
2026-05-17 17:18:35 +03:00
```assembly
2026-05-11 15:08:03 +03:00
; Запись значения в память по метке
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм раикс,42
2026-05-11 15:08:03 +03:00
сохранить [переменная], раикс
; Чтение значения из памяти
2026-05-17 17:18:35 +03:00
загрузить рбикс,[переменная]
2026-05-11 15:08:03 +03:00
; Запись по абсолютному адресу
сохранить [0x402000], раикс
2026-05-17 17:18:35 +03:00
; Косвенная адресация через регистр
пе р е ме с тить_имм рбикс, переменная
загрузить раикс, [рбикс]
2026-05-23 16:30:12 +03:00
; Работа с BND-секцией
.бнд
2026-05-17 17:18:35 +03:00
счётчик: .байт 0
2026-05-11 15:08:03 +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-17 17:18:35 +03:00
```assembly
пе р е ме с тить_имм раикс,42 ; RAX = 42
пе р е ме с тить_имм еаикс,0x7FFF ; EAX = 32767
пе р е ме с тить_имм ал,0xFF ; AL = 255
2026-05-02 23:04:46 +03:00
```
2026-05-11 15:08:03 +03:00
### Работа с памятью
| Инструкция | Синтаксис | Описание |
|------------|-----------|----------|
2026-05-17 17:18:35 +03:00
| `загрузить` | `загрузить р е г , [метка/адрес/регистр]` | Загрузить значение из памяти |
| `сохранить` | `сохранить [метка/адрес/регистр], р е г ` | Сохранить значение в память |
2026-05-11 15:08:03 +03:00
2026-05-17 17:18:35 +03:00
```assembly
загрузить раикс,[переменная] ; RAX = *переменная
2026-05-11 15:08:03 +03:00
сохранить [результат], раикс ; *результат = RAX
2026-05-17 17:18:35 +03:00
загрузить рбикс,[0x402000] ; загрузка по абсолютному адресу
загрузить раикс,[рбикс] ; косвенная загрузка через регистр
2026-05-11 15:08:03 +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
2026-05-17 17:18:35 +03:00
```assembly
2026-05-02 23:04:46 +03:00
прибавить раикс, рбикс ; RAX += RBX
увеличить рсикс ; RCX++
2026-05-17 17:18:35 +03:00
сравнить раикс,10 ; сравнить RAX с 10
2026-05-02 23:04:46 +03:00
```
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
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
2026-05-17 17:18:35 +03:00
```assembly
2026-05-02 23:04:46 +03:00
; Пример: завершение программы
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм раикс,60 ; syscall 60 = exit
пе р е ме с тить_имм рдиай,0 ; код возврата 0
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
К В С поддерживает все основные 64-битные регистры x86-64:
2026-05-02 23:04:46 +03:00
2026-05-17 17:18:35 +03:00
| 64-бит | 32-бит | 16-бит | 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-17 17:18:35 +03:00
| `.данные` | Начало секции инициализированных данных | `.данные` |
2026-05-23 16:30:12 +03:00
| `.бнд` | Начало секции неинициализированных данных | `.бнд` |
2026-05-02 23:17:09 +03:00
| `.глобал` | Объявление глобальной метки | `.глобал _start` |
| `.строка` | Строка без завершающего нуля | `.строка "Hello"` |
| `.с тр о ка _ну ль` | Строка с завершающим нулём | `.с тр о ка _ну ль "Hello"` |
| `.байт` | Последовательность байтов | `.байт 0x48, 0x65, 108` |
| `.константа` | Определение константы | `.константа LEN = 10` |
2026-05-23 16:30:12 +03:00
| `.резб` | Резервирование байтов в BND | `.резб 100` |
| `.резс` | Резервирование слов в BND | `.резс 50` |
| `.рездс` | Резервирование двойных слов в BND | `.рездс 25` |
| `.резкс` | Резервирование квадрослов в BND | `.резкс 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-11 15:08:03 +03:00
### Работа с памятью (переменные)
2026-05-17 17:18:35 +03:00
```assembly
2026-05-11 15:08:03 +03:00
.текст
.глобал _start
_start:
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм раикс,42
2026-05-11 15:08:03 +03:00
сохранить [переменная], раикс
2026-05-17 17:18:35 +03:00
загрузить рбикс,[переменная]
пе р е ме с тить_имм раикс,60
загрузить рдиай,[переменная]
2026-05-11 15:08:03 +03:00
вызо в_с ис те мы
.данные
переменная: .байт 0
```
2026-05-02 23:17:09 +03:00
### Цикл и условный переход
2026-05-02 23:04:46 +03:00
2026-05-17 17:18:35 +03:00
```assembly
2026-05-02 23:04:46 +03:00
.текст
.глобал _start
_start:
2026-06-09 22:43:10 +03:00
пе р е ме с тить_имм рсикс,10
2026-05-02 23:04:46 +03:00
loop:
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм раикс,1
пе р е ме с тить_имм рдиай,1
2026-05-02 23:04:46 +03:00
пе р е ме с тить_имм рсиай, msg
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм рдикс,10
2026-05-02 23:04:46 +03:00
вызо в_с ис те мы
2026-06-09 22:43:10 +03:00
уменьшить рсикс
2026-05-17 17:18:35 +03:00
с р а внить_с рсикс,0
2026-06-09 22:43:10 +03:00
пе р е х о д_е с ли_б о льше loop
2026-05-02 23:04:46 +03:00
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм раикс,60
пе р е ме с тить_имм рдиай,0
2026-05-02 23:04:46 +03:00
вызо в_с ис те мы
.данные
2026-05-11 15:08:03 +03:00
msg: .строка "Iteration\n"
2026-05-02 23:04:46 +03:00
```
2026-05-02 23:17:09 +03:00
### Вычисление суммы чисел от 1 до 10
2026-05-02 23:04:46 +03:00
2026-05-17 17:18:35 +03:00
```assembly
2026-05-02 23:17:09 +03:00
.текст
.глобал _start
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
_start:
2026-06-09 22:43:10 +03:00
пе р е ме с тить_имм р 8,0
пе р е ме с тить_имм р 9,10
2026-05-02 23:04:46 +03:00
2026-05-02 23:17:09 +03:00
loop:
прибавить р 8, р 9
уменьшить р 9
2026-05-17 17:18:35 +03:00
с р а внить_с р 9,0
2026-05-02 23:17:09 +03:00
пе р е х о д_е с ли_б о льше loop
2026-05-02 23:04:46 +03:00
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм раикс,60
2026-05-02 23:17:09 +03:00
переместить рдикс, р 8
вызо в_с ис те мы
2026-05-02 23:04:46 +03:00
```
2026-05-23 16:30:12 +03:00
### Использование BND-секции
2026-05-17 17:18:35 +03:00
```assembly
.текст
.глобал _start
_start:
пе р е ме с тить_имм раикс,0
сохранить [счётчик], раикс
пе р е ме с тить_имм рсикс,10
2026-06-09 22:43:10 +03:00
2026-05-17 17:18:35 +03:00
loop:
загрузить раикс,[счётчик]
увеличить раикс
сохранить [счётчик], раикс
уменьшить рсикс
с р а внить_с рсикс,0
пе р е х о д_е с ли_б о льше loop
2026-06-09 22:43:10 +03:00
2026-05-17 17:18:35 +03:00
загрузить рдиай,[счётчик]
пе р е ме с тить_имм раикс,60
вызо в_с ис те мы
2026-05-23 16:30:12 +03:00
.бнд
2026-05-17 17:18:35 +03:00
счётчик: .байт 0
```
### Косвенная адресация
```assembly
.текст
.глобал _start
_start:
пе р е ме с тить_имм рбикс, переменная
пе р е ме с тить_имм раикс,99
сохранить [рбикс], раикс
загрузить раикс,[рбикс]
пе р е ме с тить_имм рдиай, раикс
пе р е ме с тить_имм раикс,60
вызо в_с ис те мы
.данные
переменная: .байт 0
```
2026-06-09 22:43:10 +03:00
### Вывод аргумента командной строки
```assembly
.текст
.глобал _start
_start:
с р а внить_с рдиай, 2
пе р е х о д_е с ли_не _р а вно no_arg
загрузить р 8, [рсиай + 8]
переместить рдиай, р 8
ис ключа юще е _или рдикс, рдикс
strlen:
загрузить ал, [р 8]
с р а внить_с ал, 0
пе р е х о д_е с ли_р а вно strlen_done
увеличить р 8
увеличить рдикс
переход strlen
strlen_done:
пе р е ме с тить_имм раикс, 1
переместить рсиай, рдиай
пе р е ме с тить_имм рдиай, 1
вызо в_с ис те мы
ис ключа юще е _или рдиай, рдиай
пе р е ме с тить_имм раикс, 60
вызо в_с ис те мы
no_arg:
пе р е ме с тить_имм раикс, 1
пе р е ме с тить_имм рдиай, 1
пе р е ме с тить_имм рсиай, msg_no_arg
пе р е ме с тить_имм рдикс, 26
вызо в_с ис те мы
пе р е ме с тить_имм рдиай, 1
пе р е ме с тить_имм раикс, 60
вызо в_с ис те мы
.данные
msg_no_arg: .строка "Ошибка не передан аргумент\n"
```
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-06-09 22:43:10 +03:00
После компиляции создаётся файл `программа.csv` с полной информацией о каждом байте программы.
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-06-09 22:43:10 +03:00
(gdb) break _start
(gdb) run
(gdb) info registers
(gdb) x/10i $rip
(gdb) stepi
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-23 16:30:12 +03:00
- 64-битные, 32-битные, 16-битные и 8-битные регистры (AL, BL, CL, DL)
- Непосредственная загрузка констант (imm) в регистры
- Сравнение регистров и регистров с константами
- Условные и безусловные переходы (длинные и короткие)
- Арифметические операции (ADD, SUB, INC, DEC)
- Логическая операция TEST
- Системные вызовы Linux (syscall)
- Секции `.текст` , `.данные` и `.бнд`
- Строковые литералы с escape-последовательностями (`\n`, ` \t`, ` \\`, ` \"`)
- Директива `.байт` для raw-данных
- Директива `.константа` для имён констант
- Директивы резервирования `.резб` , `.резс` , `.рездс` , `.резкс`
- Абсолютная адресация по меткам и числовым адресам `[метка]` / `[0x402000]`
- Косвенная адресация через регистр `[раикс]`
- RIP-relative кодирование для всех видов адресации
2026-06-09 22:43:10 +03:00
- Полная совместимость с `objdump` , `readelf` , `gdb`
2026-05-02 23:04:46 +03:00
2026-05-11 15:08:03 +03:00
### Н е поддерживается (в разработке)
2026-05-02 23:04:46 +03:00
2026-05-23 16:30:12 +03:00
- Адресация с о смещением `[reg + disp]`
2026-06-09 22:43:10 +03:00
- Сложная адресация с индексом `[reg + reg*scale]`
- Полная SIB-адресация `[reg + reg*scale + disp]`
2026-05-23 16:30:12 +03:00
- Поддержка плавающей запятой (FPU/SSE)
- Многомодульная компиляция
- Макросы
2026-05-02 23:04:46 +03:00
2026-06-14 14:00:41 +03:00
### Инструменты разработчика
**Подсветка синтаксиса для VS Code** — доступно расширение [Universal Assembly Syntax Highlighting ](https://github.com/artradeskz/Universal-Assembly-Syntax-Highlighting ) с поддержкой языка К В С (русские инструкции, регистры, секции и директивы)
2026-05-11 15:08:03 +03:00
## 📈 План развития
### Реализовано (v2.0)
2026-05-17 17:18:35 +03:00
2026-06-09 22:43:10 +03:00
- Лексер с поддержкой `[]` , `+` , `-` , `*`
2026-05-17 17:18:35 +03:00
- Парсер с поддержкой операндов в квадратных скобках
2026-06-09 22:43:10 +03:00
- Шестипроходная схема сборки (включая генерацию таблиц секций и сортировку CSV)
2026-05-17 17:18:35 +03:00
- Поддержка меток в операндах памяти `[переменная]`
- Поддержка числовых адресов `[0x402000]`
- Поддержка косвенной адресации `[регистр]`
2026-05-23 16:30:12 +03:00
- Секция `.бнд` для неинициализированных данных
2026-06-09 22:43:10 +03:00
- Автоматическая система регрессионного тестирования (9+ тестов)
- Полная совместимость с о стандартным toolchain Linux
2026-05-11 15:08:03 +03:00
### В планах (v3.0)
2026-05-17 17:18:35 +03:00
- Адресация с о смещением `[reg + disp]`
- Сложная адресация с индексом `[reg + reg*scale]`
- Полная SIB-адресация `[reg + reg*scale + disp]`
- Стандартная библиотека (`libkvs.квс`): malloc, free, strlen, strcmp, print
2026-05-11 15:08:03 +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-17 17:18:35 +03:00
---
*К В С Ассемблер | Экспериментальный проект | 2026*
*Только для образовательных целей. Используйте на свой страх и риск.*
2026-06-14 14:00:41 +03:00
```