<p><strong>КВС</strong> — это ассемблер для архитектуры x86-64, полностью использующий <strong>русскую лексику</strong> для мнемоник инструкций, имён регистров и директив. Проект носит <strong>образовательный и экспериментальный характер</strong> и демонстрирует принципы работы ассемблера, построения ELF-файлов и трансляции высокоуровневых концепций в машинный код.</p>
<li><strong>Самодокументируемый код</strong>: Читаемость и ясность важнее краткости.</li>
<li><strong>Изоляция логики</strong>: Разделение парсера, трансформатора и кодогенератора.</li>
<li><strong>Минимизация зависимостей</strong>: Используется только <code>struct</code> для упаковки данных, <code>re</code> не используется.</li>
<li><strong>Избегание чрезмерного ООП</strong>: В контексте возможной будущей самокомпиляции.</li>
</ul>
</div>
<!-- Раздел 2: Особенности и возможности -->
<h2id="особенности">ОСОБЕННОСТИ И ВОЗМОЖНОСТИ</h2>
<ul>
<li><strong>Полностью русский синтаксис</strong>: Все инструкции (<code>переместить</code>, <code>прибавить</code>, <code>вызвать</code>), регистры (<code>раикс</code>, <code>есипи</code>, <code>ал</code>) и директивы (<code>.текст</code>, <code>.данные</code>) используют кириллицу.</li>
<li><strong>Генерация исполняемых ELF-файлов</strong>: На выходе создаются 64-битные ELF-файлы для Linux, готовые к запуску.</li>
<li><strong>Двухпроходная сборка</strong>: Традиционная для ассемблеров схема с разрешением меток.</li>
<li><strong>Поддержка секций</strong>: Явное разделение на секции кода (<code>.текст</code>) и данных (<code>.данные</code>).</li>
<li><strong>Система импорта модулей</strong>: Директива <code>.импорт</code> для включения других файлов <code>.квс</code>с автоматическим разрешением имён.</li>
<li><strong>Подготовка к сложной адресации</strong>: Архитектура заложена для будущей трансформации сложных режимов адресации памяти в последовательности простых инструкций через промежуточное представление.</li>
<li><strong>Детальное логирование</strong>: Генерация <code>.log.csv</code> файла с полным соответствием машинных кодов, виртуальных адресов и исходных команд.</li>
</ul>
<!-- Раздел 3: Архитектура и процесс сборки -->
<h2id="архитектура">АРХИТЕКТУРА И ПРОЦЕСС СБОРКИ</h2>
<p>Процесс трансляции исходного кода <code>.квс</code> в исполняемый файл <code>.elf</code> проходит через несколько этапов:</p>
<divclass="process-diagram">
Исходный файл (.квс)
│
▼ (Этап 1: Разбор и импорт)
Промежуточный файл (.квс.промежуточный)
│
▼ (Этап 2: Двухпроходное ассемблирование)
Данные секций + Таблица меток
│
▼ (Этап 3: Генерация ELF)
Исполняемый файл (.elf) + Лог (.log.csv)
</div>
<p><strong>Подробнее об этапах:</strong></p>
<ol>
<li><strong>Построение промежуточного представления</strong>: Исходный файл и все импортированные модули объединяются в один текст. Метки и константы переименовываются (получают суффикс имени модуля) для избежания коллизий.</li>
<li><strong>Первый проход ассемблирования</strong>: Анализируется промежуточный файл, вычисляются размеры всех инструкций и данных, строится таблица меток с их смещениями внутри секций.</li>
<li><strong>Второй проход ассемблирования</strong>: Генерируется машинный код. Адреса меток подставляются в инструкции переходов, загрузки адресов и т.д. Формируются бинарные содержимое секций <code>.text</code> и <code>.data</code>.</li>
<li><strong>Компоновка ELF</strong>: Собранные секции упаковываются в формат исполняемого файла ELF 64-bit с корректными заголовками, таблицами секций и сегментов.</li>
</ol>
<!-- Раздел 4: Формат исходных файлов -->
<h2id="формат">ФОРМАТ ИСХОДНЫХ ФАЙЛОВ (.квс)</h2>
<p>Исходные файлы имеют расширение <code>.квс</code>. Их структура следует традициям ассемблера:</p>
<pre>
; Комментарий начинается с точки с запятой
.данные ; Начало секции данных
приветствие: .строка_нуль "Здравствуй, мир!"
число: .байт 0x2A
.текст ; Начало секции кода
.глобал _start ; Объявление точки входа
_start: ; Метка
переместить_имм раикс, 60 ; Системный вызов exit (60) в rax
переместить_имм рдикс, 42 ; Код возврата (42) в rdi
вызов_системы ; Вызов ядра (syscall)</pre>
<!-- Раздел 5: Система команд -->
<h2id="команды">СИСТЕМА КОМАНД (ИНСТРУКЦИИ)</h2>
<p>Ассемблер поддерживает обширный набор инструкций x86-64, сгруппированных по категориям:</p>
<p><strong>Особенности кодирования:</strong> Проект корректно генерирует префиксы REX, учитывает размеры операндов (8/16/32/64 бита) и поддерживает базовые режимы адресации памяти (например, <code>[раикс]</code>).</p>
<!-- Раздел 6: Регистры процессора -->
<h2id="регистры">РЕГИСТРЫ ПРОЦЕССОРА</h2>
<p>Поддерживаются регистры x86-64 во всех их размерах:</p>
<table>
<tr>
<th>64-битные</th>
<th>32-битные</th>
<th>16-битные</th>
<th>8-битные (младшие)</th>
<th>8-битные (старшие)</th>
</tr>
<tr>
<td><code>раикс</code></td>
<td><code>еаикс</code></td>
<td><code>аикс</code></td>
<td><code>ал</code></td>
<td><code>аш</code></td>
</tr>
<tr>
<td><code>рбикс</code></td>
<td><code>ебикс</code></td>
<td><code>бикс</code></td>
<td><code>бл</code></td>
<td><code>бш</code></td>
</tr>
<tr>
<td><code>рсикс</code></td>
<td><code>есикс</code></td>
<td><code>сикс</code></td>
<td><code>кл</code></td>
<td><code>чш</code></td>
</tr>
<tr>
<td><code>рдикс</code></td>
<td><code>едикс</code></td>
<td><code>дикс</code></td>
<td><code>дл</code></td>
<td><code>дш</code></td>
</tr>
<tr>
<td><code>рсипи</code></td>
<td><code>есипи</code></td>
<td><code>эсп</code></td>
<td><code>спл</code></td>
<td>—</td>
</tr>
<tr>
<td><code>рбипи</code></td>
<td><code>ебипи</code></td>
<td><code>бипи</code></td>
<td><code>бпл</code></td>
<td>—</td>
</tr>
<tr>
<td><code>рсиай</code></td>
<td><code>есиай</code></td>
<td><code>эс</code></td>
<td><code>сил</code></td>
<td>—</td>
</tr>
<tr>
<td><code>рдиай</code></td>
<td><code>едиай</code></td>
<td><code>ди</code></td>
<td><code>дил</code></td>
<td>—</td>
</tr>
<tr>
<td><code>р8</code> ... <code>р15</code></td>
<td><code>р8д</code> ... <code>р15д</code></td>
<td><code>р8в</code> ... <code>р15в</code></td>
<td><code>р8б</code> ... <code>р15б</code></td>
<td>—</td>
</tr>
</table>
<!-- Раздел 7: Директивы ассемблера -->
<h2id="директивы">ДИРЕКТИВЫ АССЕМБЛЕРА</h2>
<p>Директивы управляют процессом ассемблирования, не превращаясь в машинный код напрямую.</p>
<table>
<tr>
<th>Директива</th>
<th>Описание</th>
<th>Пример</th>
</tr>
<tr>
<td><code>.текст</code></td>
<td>Переключает ассемблер на запись в секцию кода.</td>
<td><code>.текст</code></td>
</tr>
<tr>
<td><code>.данные</code></td>
<td>Переключает ассемблер на запись в секцию данных.</td>
<td>Резервирует место в секции данных для строки (без нуля / с нулевым завершителем).</td>
<td><code>.строка_нуль "Текст"</code></td>
</tr>
<tr>
<td><code>.байт</code></td>
<td>Резервирует один или несколько байт с заданными значениями.</td>
<td><code>.байт 1, 0xFE, 255</code></td>
</tr>
<tr>
<td><code>.константа</code></td>
<td>Определяет символьную константу, которую можно использовать как число.</td>
<td><code>.константа ВЫХОД = 60</code></td>
</tr>
<tr>
<td><code>.импорт</code></td>
<td>Включает содержимое другого файла <code>.квс</code> в текущую сборку.</td>
<td><code>.импорт библиотека.квс</code></td>
</tr>
</table>
<!-- Раздел 8: Система импорта модулей -->
<h2id="импорт">СИСТЕМА ИМПОРТА МОДУЛЕЙ</h2>
<p>Директива <code>.импорт</code> позволяет разбивать проект на несколько файлов.</p>
<p><strong>Принцип работы:</strong></p>
<ol>
<li><strong>Рекурсивный поиск</strong>: Ассемблер ищет указанный файл в той же директории, что и импортирующий файл.</li>
<li><strong>Переименование</strong>: Чтобы избежать конфликтов имён, все метки и константы импортированного модуля автоматически получают суффикс, основанный на имени файла (например, метка <code>цикл</code> из <code>модуль.квс</code> станет <code>цикл_модуль</code>).</li>
<li><strong>Объединение</strong>: Содержимое всех секций <code>.данные</code> из импортированных файлов сливается в общую секцию <code>.данные</code> промежуточного файла. Аналогично для <code>.текст</code>.</li>
</ol>
<divclass="note">
Это упрощает создание библиотек и организацию больших проектов.
</div>
<!-- Раздел 9: Процесс трансляции -->
<h2id="трансляция">ПРОЦЕСС ТРАНСЛЯЦИИ И ВЫХОДНЫЕ ФАЙЛЫ</h2>
<p>Запуск ассемблера:</p>
<pre>python3 kvs_9_8.py программа.квс</pre>
<p><strong>В результате создаются три файла:</strong></p>
<ol>
<li><strong><code>программа.квс.промежуточный</code></strong>: Текстовый файл, содержащий объединённый и переименованный код всех модулей. Используется для отладки процесса импорта.</li>
<li><strong><code>программа.elf</code></strong>: Исполняемый 64-битный ELF-файл. Для запуска может потребоваться установить флаг исполнения: <code>chmod +x программа.elf</code>.</li>
<li><strong><code>программа.log.csv</code></strong>: Детальный лог в формате CSV, где для каждого байта машинного кода указан его виртуальный адрес, шестнадцатеричное значение, целевой адрес (для инструкций переходов) и исходная команда на русском языке. Неоценим для обучения и отладки.</li>
</ol>
<!-- Раздел 10: Ограничения -->
<h2id="ограничения">ОГРАНИЧЕНИЯ И ОСОБЕННОСТИ РЕАЛИЗАЦИИ</h2>
<divclass="warning">
<ul>
<li><strong>Экспериментальный статус</strong>: Проект в активной разработке, некоторые углы архитектуры x86-64 могут быть реализованы не полностью.</li>
<li><strong>Базовая адресация памяти</strong>: На данный момент поддерживаются преимущественно простые формы адресации (например, <code>[регистр]</code>). Режимы со сдвигом и несколькими регистрами (<code>[база + индекс*масштаб + смещение]</code>) предназначены для реализации через <strong>трансформацию в промежуточном представлении</strong> (задел на будущее).</li>
<li><strong>Отсутствие макросов и условной компиляции</strong>: В текущей версии эти конструкции не поддерживаются.</li>
<li><strong>Лексический анализатор (лексер)</strong>: Написан "вручную", без использования регулярных выражений (<code>re</code>), в соответствии с философией проекта.</li>
<li><strong>Генерация ELF</strong>: Реализация фокусируется на создании рабочих исполняемых файлов для Linux. Некоторые необязательные или специфичные поля заголовков ELF могут быть заполнены упрощённо.</li>