From bb80efac8d4c815d9e154988d740ea122b6d0f3b Mon Sep 17 00:00:00 2001 From: mzhoot Date: Sat, 23 May 2026 16:30:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D1=80=D0=B8=D0=B4=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 22 +- README.html | 785 ---------------------------------------------------- README.md | 138 +++++---- todo.txt | 3 +- 4 files changed, 99 insertions(+), 849 deletions(-) delete mode 100644 README.html 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
  • -
  • Подготовка к самокомпиляции — архитектура, допускающая написание компилятора на самом КВС
  • -
-
- -

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

- - -

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

-
-Исходный файл (.квс) - │ - ▼ (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 (отложено) — Стандартная библиотека

- - -

ОГРАНИЧЕНИЯ

-
-
    -
  • Адресация со смещением — формы [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 +