diff --git a/AGENTS.md b/AGENTS.md
index 59a45a3..22da074 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -23,16 +23,18 @@
### Структура проекта
```
-kvs_lexer.py — лексер (исходник → токены)
-kvs_parser.py — парсер (токены → AST)
-kvs_pass1.py — первый проход (размеры секций, адреса меток)
-kvs_pass2.py — второй проход (AST + pass1 → CSV с байтами)
-kvs_builder.py — сборщик ELF (CSV + pass1 → исполняемый файл)
-kvs_data.py — общие константы и данные
-kvs_build.py — главный сборочный скрипт (вызывает всё по порядку)
-kvs_pass2_encoder_fixsize.py — кодировщик инструкций фиксированного размера
-kvs_pass2_encoder_mutsize.py — кодировщик инструкций переменного размера + диспетчер
-kvs_pass2_encoder.py — реэкспорт из fixsize + mutsize (совместимость)
+kvs_lexer.py — лексер (исходник → токены)
+kvs_parser.py — парсер (токены → AST)
+kvs_pass1.py — первый проход: генерация CSV с заглушками для неизвестных меток
+kvs_pass2.py — второй проход: разрешение меток (замена заглушек на реальные адреса)
+kvs_pass3.py — третий проход: подстановка констант в команды
+kvs_pass4.py — четвёртый проход: перекодирование инструкций с подставленными значениями
+kvs_builder.py — сборщик ELF (CSV → исполняемый файл)
+kvs_data.py — общие константы и данные (регистры, инструкции, функции)
+kvs_encoder.py — фасад кодировщика (реэкспорт из fixsize + mutsize)
+kvs_encoder_fixsize.py — кодировщик инструкций фиксированного размера
+kvs_encoder_mutsize.py — кодировщик инструкций переменного размера + диспетчер
+kvs_build.py — главный сборочный скрипт (запускает все проходы по порядку)
```
### Стиль
diff --git a/README.html b/README.html
deleted file mode 100644
index 9cd59e5..0000000
--- a/README.html
+++ /dev/null
@@ -1,785 +0,0 @@
-
-
-
-
-
КВС — Ассемблер с русским синтаксисом для x86-64
-
-
-
-
-╔══════════════════════════════════╗
-║ ██╗ ██╗ ██╗ ██╗ ███████╗ ║
-║ ██║ ██╔╝ ██╗ ██╗ ██╔════╝ ║
-║ █████╔╝ ██╗ ██╗ ███████╗ ║
-║ ██║╚██╗ ╚██╗ ██╔╝ ╚════██║ ║
-║ ██║ ╚██╗ ╚██╔╝ ███████║ ║
-║ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ║
-╚══════════════════════════════════╝
-
-
-
Версия 2.0 | Экспериментальный проект | 2026
-
✓ Абсолютная адресация реализована | ✓ Косвенная адресация реализована | ✓ Секция .bss реализована
-
-
-
┌──[ ОГЛАВЛЕНИЕ ]────────────────────────────────────────────┐
-
-
└──────────────────────────────────────────────────────────────┘
-
-
НАЗНАЧЕНИЕ И КОНЦЕПЦИЯ
-
КВС — это ассемблер для архитектуры x86-64, полностью использующий русскую лексику для мнемоник инструкций, имён регистров и директив. Проект носит образовательный и экспериментальный характер и демонстрирует принципы работы ассемблера, построения ELF-файлов и трансляции высокоуровневых концепций в машинный код.
-
-
-
Ключевые принципы проекта:
-
- Русскоязычный синтаксис — все инструкции, регистры и директивы на кириллице
- Модульная архитектура — лексер, парсер, два прохода, сборщик ELF
- Минимализм зависимостей — только стандартная библиотека Python
- Подготовка к самокомпиляции — архитектура, допускающая написание компилятора на самом КВС
-
-
-
-
ОСОБЕННОСТИ И ВОЗМОЖНОСТИ
-
- Полностью русский синтаксис — переместить, прибавить, вызвать, регистры раикс, есипи, ал, директивы .текст, .данные, .бсс
- Генерация исполняемых ELF-файлов — 64-битные ELF для Linux, готовые к запуску
- Двухпроходная сборка — традиционная схема с разрешением меток
- Поддержка секций — разделение на .текст (код), .данные (инициализированные данные) и .бсс (неинициализированные данные)
- Полная адресация памяти :
-
- Абсолютная адресация по меткам [переменная]
- Абсолютная адресация по числовому адресу [0x402000]
- Косвенная адресация через регистр [раикс]
- Всё с RIP-relative кодированием для 64-битных перемещений
-
-
- CSV-логирование — детальный файл .csv с соответствием адресов, байтов и исходных команд
- Более 50 инструкций — полный набор основных команд x86-64
- Рефакторинг — кодогенерация вынесена в отдельный модуль kvs_pass2_encoder.py
-
-
-
АРХИТЕКТУРА И ПРОЦЕСС СБОРКИ
-
-Исходный файл (.квс)
- │
- ▼ (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 программа.квс
-
-
В результате создаются файлы:
-
- программа.токены — результат лексического анализа
- программа.аст — AST-представление
- программа.проход1 — результаты первого прохода (размеры, метки)
- программа.csv — детальный лог с адресами, байтами и командами
- программа.elf — исполняемый ELF-файл
-
-
-
СТАТУС РЕАЛИЗАЦИИ
-
-
✅ Полностью реализовано (v2.0)
-
- Лексер с токенами [, ], NUMBER
- Парсер с поддержкой операндов в квадратных скобках
- Первый проход с корректным расчётом размера инструкций с памятью
- Второй проход с кодированием адресации через RIP-relative
- Абсолютная адресация по меткам [переменная]
- Абсолютная адресация по числовым адресам [0x402000]
- Косвенная адресация через регистры [раикс]
- Секция .бсс для неинициализированных данных
- Рефакторинг: выделение кодировщика в отдельный модуль
- Более 50 инструкций x86-64
- CSV-логирование
-
-
-
⚠️ Частично реализовано / ограничено
-
- загрузить_адрес (LEA) — только для чисел, не для меток
- Старшие 8-битные регистры (AH, BH, CH, DH) не поддерживаются
- Регистры R8–R15 не поддерживаются
-
-
-
ПЛАН РАЗВИТИЯ
-
-
v2.0 (текущая) — Адресация и BSS
-
- ✅ Лексер: [, ], NUMBER
- ✅ Парсер: [метка], [число], [регистр]
- ✅ Pass1: корректный расчёт размера инструкций
- ✅ Pass2: RIP-relative кодирование
- ✅ Абсолютная адресация (метки и числа)
- ✅ Косвенная адресация ([reg])
- ✅ Секция .бсс
- ✅ Рефакторинг энкодера
-
-
-
v3.0 (планируется) — Расширенная адресация
-
- ❌ [reg + disp] — адресация со смещением
- ❌ [reg + reg*scale] — с индексным регистром
- ❌ [reg + reg*scale + disp] — полная SIB-адресация
- ❌ LEA для меток
- ❌ PUSH/POP/CALL/RET
-
-
-
v4.0 (отложено) — Стандартная библиотека
-
- ❌ malloc, free
- ❌ strlen, strcmp, memcpy
- ❌ putchar, getchar
-
-
-
ОГРАНИЧЕНИЯ
-
-
- Адресация со смещением — формы [reg+disp], [reg+reg*scale], [reg+reg*scale+disp] не реализованы
- LEA для меток — загрузить_адрес reg, [метка] не работает, используйте переместить_имм reg, метка
- Старшие 8-битные регистры — AH, BH, CH, DH не поддерживаются
- Расширенные регистры — SPL, BPL, SIL, DIL, а также R8–R15 не поддерживаются
- Нет умножения и деления — инструкции MUL/DIV не реализованы
- Нет операций со стеком — PUSH/POP/CALL/RET отсутствуют
- Нет динамической памяти — нет встроенных malloc/free
- Нет макросов и условной компиляции
- Экспериментальный статус — некоторые инструкции могут быть реализованы не полностью
-
-
-
-
- ───────────────────────────────────────────────────────────────────────
- КВС Ассемблер v2.0 | Экспериментальный проект | 2026
- Только для образовательных целей. Используйте на свой страх и риск.
-
- > Система готова. Введите команду...
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/README.md b/README.md
index ab8efc5..26d353c 100644
--- a/README.md
+++ b/README.md
@@ -23,8 +23,8 @@
- **Полностью русский синтаксис** — все инструкции, регистры и директивы на кириллице
- **Генерация исполняемых ELF-файлов** — 64-битные ELF для Linux, готовые к запуску
-- **Двухпроходная сборка** — традиционная схема с разрешением меток
-- **Поддержка секций** — разделение на `.текст` (код), `.данные` (данные) и `.бсс` (неинициализированные данные)
+- **Четырёхпроходная сборка** — традиционная схема с разрешением меток, констант и перекодированием
+- **Поддержка секций** — разделение на `.текст` (код), `.данные` (данные) и `.бнд` (неинициализированные данные)
- **Гибкая адресация памяти**:
- абсолютная адресация по меткам `[переменная]`
- абсолютная адресация по числовому адресу `[0x402000]`
@@ -33,29 +33,31 @@
- **CSV-логирование** — детальный файл с соответствием адресов, байтов и исходных команд
- **Более 50 инструкций** — полный набор основных команд x86-64
- **Минимализм зависимостей** — только стандартная библиотека Python
-- **Рефакторинг** — кодогенерация вынесена в отдельный модуль `kvs_pass2_encoder.py`
## 🏗 Архитектура
-Процесс трансляции исходного кода `.квс` в исполняемый файл `.elf` проходит через несколько этапов:
+Процесс трансляции исходного кода `.квс` в исполняемый файл `.elf` проходит через **6 этапов** (4 прохода + сборка):
```
Исходный файл (.квс)
│
- ▼ (kvs_lexer.py)
+ ▼ (kvs_lexer.py) ← лексический анализ
Файл токенов (.токены)
│
- ▼ (kvs_parser.py)
+ ▼ (kvs_parser.py) ← синтаксический анализ
AST-представление (.аст)
│
- ▼ (kvs_pass1.py)
-Первый проход: размеры, метки (.проход1)
+ ▼ (kvs_pass1.py) ← ПРОХОД 1: генерация CSV с заглушками (0xCC)
+CSV-файл (.csv) ← содержит все байты программы, метки, заглушки
│
- ▼ (kvs_pass2.py + kvs_pass2_encoder.py)
-Второй проход: генерация кода (.csv)
+ ▼ (kvs_pass2.py) ← ПРОХОД 2: разрешение меток (замена заглушек)
│
- ▼ (kvs_builder.py)
-ELF-компоновщик (.elf)
+ ▼ (kvs_pass3.py) ← ПРОХОД 3: подстановка констант (.константа)
+ │
+ ▼ (kvs_pass4.py) ← ПРОХОД 4: перекодирование инструкций
+ │
+ ▼ (kvs_builder.py) ← сборка ELF из CSV
+ELF-файл (.elf)
│
▼
Исполняемый файл!
@@ -65,14 +67,39 @@ 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` | Общие данные (регистры, инструкции) |
+| `kvs_build.py` | Главный сборочный скрипт (запускает все этапы по порядку) |
+| `kvs_lexer.py` | Лексический анализ, разбор на токены (с поддержкой `[]`, `+`, `-`, `*`) |
+| `kvs_parser.py` | Синтаксический анализ, построение AST (директивы, метки, инструкции) |
+| `kvs_data.py` | Общие данные: регистры, таблица инструкций, вспомогательные функции |
+| `kvs_encoder.py` | Фасад кодировщика (реэкспорт из fixsize + mutsize) |
+| `kvs_encoder_fixsize.py` | Кодировщик инструкций фиксированного размера |
+| `kvs_encoder_mutsize.py` | Кодировщик инструкций переменного размера + диспетчер |
+| `kvs_pass1.py` | Первый проход — вычисление размеров секций, адресов меток, генерация CSV с заглушками |
+| `kvs_pass2.py` | Второй проход — разрешение меток |
+| `kvs_pass3.py` | Третий проход — подстановка констант |
+| `kvs_pass4.py` | Четвёртый проход — перекодирование инструкций |
+| `kvs_builder.py` | Сборка ELF: чтение CSV, заполнение байтов по адресам, установка прав на исполнение |
+
+### Почему 4 прохода?
+
+1. **Первый проход** — неизвестно, какие адреса будут у меток (метка может использоваться до определения). Вместо остановки ставим заглушки `0xCC` и продолжаем.
+2. **Второй проход** — после того как все адреса меток известны, можно заменить заглушки на реальные значения.
+3. **Третий проход** — константы могут ссылаться друг на друга и на метки, поэтому их подстановка делается отдельно.
+4. **Четвёртый проход** — после подстановки чисел адреса/констант нужно перегенерировать машинный код (разные операнды могут менять длину инструкции).
+
+### Структура CSV-файла
+
+| Колонка | Назначение |
+|---------|-------------|
+| `сегмент` | Имя секции (`.header`, `.text`, `.data`, `.bss`) |
+| `адрес` | Файловое смещение байта |
+| `байт` | Исходное значение байта (из pass1) |
+| `приводящая_метка` | Имена меток, находящихся на этом адресе (через запятую) |
+| `уводящий_адрес` | Строка `ЗАГЛУШКА имя` для неразрешённых меток |
+| `исходная_команда` | Исходная инструкция (например, `переход метка`) |
+| `команда_со_значениями` | Инструкция с подставленными адресами/константами (pass2/pass3) |
+| `рассчитанный_уводящий_адрес` | Реальный адрес метки (файловое смещение) после разрешения |
+| `рассчитанный_байт` | Итоговый байт после перекодирования (pass4) |
## 🔧 Установка
@@ -142,7 +169,7 @@ Hello, World!
.данные ; секция данных (опциональна)
; ... инициализированные данные ...
-.бсс ; секция неинициализированных данных (опциональна)
+.бнд ; секция неинициализированных данных (опциональна)
; ... переменные без начального значения ...
```
@@ -182,8 +209,8 @@ _start: ; метка _start
переместить_имм рбикс, переменная
загрузить раикс, [рбикс]
-; Работа с BSS-секцией
-.бсс
+; Работа с BND-секцией
+.бнд
счётчик: .байт 0
```
@@ -286,12 +313,16 @@ _start: ; метка _start
|-----------|------------|--------|
| `.текст` | Начало секции кода | `.текст` |
| `.данные` | Начало секции инициализированных данных | `.данные` |
-| `.бсс` | Начало секции неинициализированных данных | `.бсс` |
+| `.бнд` | Начало секции неинициализированных данных | `.бнд` |
| `.глобал` | Объявление глобальной метки | `.глобал _start` |
| `.строка` | Строка без завершающего нуля | `.строка "Hello"` |
| `.строка_нуль` | Строка с завершающим нулём | `.строка_нуль "Hello"` |
| `.байт` | Последовательность байтов | `.байт 0x48, 0x65, 108` |
| `.константа` | Определение константы | `.константа LEN = 10` |
+| `.резб` | Резервирование байтов в BND | `.резб 100` |
+| `.резс` | Резервирование слов в BND | `.резс 50` |
+| `.рездс` | Резервирование двойных слов в BND | `.рездс 25` |
+| `.резкс` | Резервирование квадрослов в BND | `.резкс 10` |
## 📝 Примеры программ
@@ -366,14 +397,14 @@ loop:
вызов_системы
```
-### Использование BSS-секции
+### Использование BND-секции
```assembly
.текст
.глобал _start
_start:
- ; инициализация счётчика в BSS
+ ; инициализация счётчика в BND
переместить_имм раикс,0
сохранить [счётчик], раикс
@@ -392,7 +423,7 @@ loop:
переместить_имм раикс,60
вызов_системы
-.бсс
+.бнд
счётчик: .байт 0
```
@@ -473,44 +504,46 @@ gdb ./программа.elf
### Поддерживается
-- ✅ 64-битные, 32-битные, 16-битные и 8-битные регистры (AL, BL, CL, DL)
-- ✅ Непосредственная загрузка констант (imm) в регистры
-- ✅ Сравнение регистров и регистров с константами
-- ✅ Условные и безусловные переходы (длинные и короткие)
-- ✅ Арифметические операции (ADD, SUB, INC, DEC)
-- ✅ Логическая операция TEST
-- ✅ Системные вызовы Linux (syscall)
-- ✅ Секции `.текст`, `.данные` и `.бсс`
-- ✅ Строковые литералы с escape-последовательностями (`\n`, `\t`, `\\`, `\"`)
-- ✅ Директива `.байт` для raw-данных
-- ✅ Директива `.константа` для имён констант
-- ✅ **Абсолютная адресация** по меткам и числовым адресам `[метка]` / `[0x402000]`
-- ✅ **Косвенная адресация через регистр** `[раикс]`
-- ✅ RIP-relative кодирование для всех видов адресации
+- 64-битные, 32-битные, 16-битные и 8-битные регистры (AL, BL, CL, DL)
+- Непосредственная загрузка констант (imm) в регистры
+- Сравнение регистров и регистров с константами
+- Условные и безусловные переходы (длинные и короткие)
+- Арифметические операции (ADD, SUB, INC, DEC)
+- Логическая операция TEST
+- Системные вызовы Linux (syscall)
+- Секции `.текст`, `.данные` и `.бнд`
+- Строковые литералы с escape-последовательностями (`\n`, `\t`, `\\`, `\"`)
+- Директива `.байт` для raw-данных
+- Директива `.константа` для имён констант
+- Директивы резервирования `.резб`, `.резс`, `.рездс`, `.резкс`
+- Абсолютная адресация по меткам и числовым адресам `[метка]` / `[0x402000]`
+- Косвенная адресация через регистр `[раикс]`
+- RIP-relative кодирование для всех видов адресации
### Не поддерживается (в разработке)
-- ❌ Адресация со смещением `[reg + disp]`
-- ❌ Сложная адресация с индексом `[reg + reg*scale]` и полная SIB-адресация
-- ❌ Инструкции для работы со стеком (PUSH, POP, CALL, RET)
-- ❌ Старшие 8-битные регистры (AH, BH, CH, DH) и расширенные младшие (SPL, BPL, SIL, DIL)
-- ❌ Регистры R8–R15 и их байтовые/словные версии
-- ❌ Поддержка плавающей запятой (FPU/SSE)
-- ❌ Многомодульная компиляция
-- ❌ Макросы
+- Адресация со смещением `[reg + disp]`
+- Сложная адресация с индексом `[reg + reg*scale]` и полная SIB-адресация
+- Инструкции для работы со стеком (PUSH, POP, CALL, RET) — кроме базовых PUSH/POP reg
+- Поддержка плавающей запятой (FPU/SSE)
+- Многомодульная компиляция
+- Макросы
## 📈 План развития
### Реализовано (v2.0)
-- Лексер с токенами `[`, `]`, `NUMBER`
+- Лексер с токенами `[`, `]`, `NUMBER`, `+`, `-`, `*`
- Парсер с поддержкой операндов в квадратных скобках
+- Четырёхпроходная схема сборки
- Первый проход с корректным расчётом размера инструкций с памятью
-- Второй проход с кодированием абсолютной адресации через RIP-relative
+- Второй проход с разрешением меток
+- Третий проход с подстановкой констант
+- Четвёртый проход с перекодированием инструкций
- Поддержка меток в операндах памяти `[переменная]`
- Поддержка числовых адресов `[0x402000]`
- Поддержка косвенной адресации `[регистр]`
-- Секция `.бсс` для неинициализированных данных
+- Секция `.бнд` для неинициализированных данных
- Рефакторинг: выделение кодировщика в отдельный модуль
### В планах (v3.0)
@@ -518,7 +551,6 @@ gdb ./программа.elf
- Адресация со смещением `[reg + disp]`
- Сложная адресация с индексом `[reg + reg*scale]`
- Полная SIB-адресация `[reg + reg*scale + disp]`
-- Поддержка инструкций PUSH/POP/CALL/RET для стековых операций
- Стандартная библиотека (`libkvs.квс`): malloc, free, strlen, strcmp, print
## 📄 Лицензия
diff --git a/todo.txt b/todo.txt
index c732fca..bdbaf88 100644
--- a/todo.txt
+++ b/todo.txt
@@ -250,4 +250,5 @@ Pass2 (шаг 5):
изучить работу с кучей
-сохранить_байт и загрузить_байт_из_памяти есть в INSTRUCTIONS, но не реализованы в диспетчере encode_instruction
\ No newline at end of file
+сохранить_байт и загрузить_байт_из_памяти есть в INSTRUCTIONS, но не реализованы в диспетчере encode_instruction
+