КВС (kvs_9_8.py) — Ассемблер с русским синтаксисом для x86-64

╔══════════════════════════════════╗
║   ██╗  ██╗  ██╗   ██╗  ███████╗  ║
║   ██║ ██╔╝  ██╗   ██╗  ██╔════╝  ║
║   █████╔╝   ██╗   ██╗  ███████╗  ║
║   ██║╚██╗   ╚██╗ ██╔╝  ╚════██║  ║
║   ██║ ╚██╗    ╚██╔╝    ███████║  ║
║   ╚═╝  ╚═╝     ╚═╝     ╚══════╝  ║
╚══════════════════════════════════╝

Версия 9.8 | Экспериментальный проект | 2025

┌──[ ОГЛАВЛЕНИЕ ]────────────────────────────────────────────┐

└──────────────────────────────────────────────────────────────┘

НАЗНАЧЕНИЕ И КОНЦЕПЦИЯ

КВС — это ассемблер для архитектуры x86-64, полностью использующий русскую лексику для мнемоник инструкций, имён регистров и директив. Проект носит образовательный и экспериментальный характер и демонстрирует принципы работы ассемблера, построения ELF-файлов и трансляции высокоуровневых концепций в машинный код.

Ключевые философские принципы проекта:

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

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

Процесс трансляции исходного кода .квс в исполняемый файл .elf проходит через несколько этапов:

Исходный файл (.квс) │ ▼ (Этап 1: Разбор и импорт) Промежуточный файл (.квс.промежуточный) │ ▼ (Этап 2: Двухпроходное ассемблирование) Данные секций + Таблица меток │ ▼ (Этап 3: Генерация ELF) Исполняемый файл (.elf) + Лог (.log.csv)

Подробнее об этапах:

  1. Построение промежуточного представления: Исходный файл и все импортированные модули объединяются в один текст. Метки и константы переименовываются (получают суффикс имени модуля) для избежания коллизий.
  2. Первый проход ассемблирования: Анализируется промежуточный файл, вычисляются размеры всех инструкций и данных, строится таблица меток с их смещениями внутри секций.
  3. Второй проход ассемблирования: Генерируется машинный код. Адреса меток подставляются в инструкции переходов, загрузки адресов и т.д. Формируются бинарные содержимое секций .text и .data.
  4. Компоновка ELF: Собранные секции упаковываются в формат исполняемого файла ELF 64-bit с корректными заголовками, таблицами секций и сегментов.

ФОРМАТ ИСХОДНЫХ ФАЙЛОВ (.квс)

Исходные файлы имеют расширение .квс. Их структура следует традициям ассемблера:

; Комментарий начинается с точки с запятой
.данные                   ; Начало секции данных
    приветствие: .строка_нуль "Здравствуй, мир!"
    число: .байт 0x2A

.текст                    ; Начало секции кода
.глобал _start            ; Объявление точки входа

_start:                   ; Метка
    переместить_имм раикс, 60   ; Системный вызов exit (60) в rax
    переместить_имм рдикс, 42   ; Код возврата (42) в rdi
    вызов_системы               ; Вызов ядра (syscall)

СИСТЕМА КОМАНД (ИНСТРУКЦИИ)

Ассемблер поддерживает обширный набор инструкций x86-64, сгруппированных по категориям:

Категория Примеры инструкций Соответствие NASM
Перемещение данных переместить, загрузить, сохранить, загрузить_адрес mov, lea
Арифметика прибавить, вычесть, умножить, разделить, увеличить add, sub, mul, div, inc
Логические операции и, или, инвертировать, проверить and, or, not, test
Управление потоком переход, переход_если_равно, вызвать, вернуться jmp, je, call, ret
Работа со стеком втолкнуть, вытолкнуть push, pop
Сдвиги и вращения сдвиг_влево, вращать_вправо shl, ror
Строковые операции переместить_байт, сравнить_байты movsb, cmpsb
Системные вызовы вызов_системы, прервать syscall, int

Особенности кодирования: Проект корректно генерирует префиксы REX, учитывает размеры операндов (8/16/32/64 бита) и поддерживает базовые режимы адресации памяти (например, [раикс]).

РЕГИСТРЫ ПРОЦЕССОРА

Поддерживаются регистры x86-64 во всех их размерах:

64-битные 32-битные 16-битные 8-битные (младшие) 8-битные (старшие)
раикс еаикс аикс ал аш
рбикс ебикс бикс бл бш
рсикс есикс сикс кл чш
рдикс едикс дикс дл дш
рсипи есипи эсп спл
рбипи ебипи бипи бпл
рсиай есиай эс сил
рдиай едиай ди дил
р8 ... р15 р8д ... р15д р8в ... р15в р8б ... р15б

ДИРЕКТИВЫ АССЕМБЛЕРА

Директивы управляют процессом ассемблирования, не превращаясь в машинный код напрямую.

Директива Описание Пример
.текст Переключает ассемблер на запись в секцию кода. .текст
.данные Переключает ассемблер на запись в секцию данных. .данные
.глобал Объявляет метку глобальной (точку входа программы). .глобал _start
.строка / .строка_нуль Резервирует место в секции данных для строки (без нуля / с нулевым завершителем). .строка_нуль "Текст"
.байт Резервирует один или несколько байт с заданными значениями. .байт 1, 0xFE, 255
.константа Определяет символьную константу, которую можно использовать как число. .константа ВЫХОД = 60
.импорт Включает содержимое другого файла .квс в текущую сборку. .импорт библиотека.квс

СИСТЕМА ИМПОРТА МОДУЛЕЙ

Директива .импорт позволяет разбивать проект на несколько файлов.

Принцип работы:

  1. Рекурсивный поиск: Ассемблер ищет указанный файл в той же директории, что и импортирующий файл.
  2. Переименование: Чтобы избежать конфликтов имён, все метки и константы импортированного модуля автоматически получают суффикс, основанный на имени файла (например, метка цикл из модуль.квс станет цикл_модуль).
  3. Объединение: Содержимое всех секций .данные из импортированных файлов сливается в общую секцию .данные промежуточного файла. Аналогично для .текст.
Это упрощает создание библиотек и организацию больших проектов.

ПРОЦЕСС ТРАНСЛЯЦИИ И ВЫХОДНЫЕ ФАЙЛЫ

Запуск ассемблера:

python3 kvs_9_8.py программа.квс

В результате создаются три файла:

  1. программа.квс.промежуточный: Текстовый файл, содержащий объединённый и переименованный код всех модулей. Используется для отладки процесса импорта.
  2. программа.elf: Исполняемый 64-битный ELF-файл. Для запуска может потребоваться установить флаг исполнения: chmod +x программа.elf.
  3. программа.log.csv: Детальный лог в формате CSV, где для каждого байта машинного кода указан его виртуальный адрес, шестнадцатеричное значение, целевой адрес (для инструкций переходов) и исходная команда на русском языке. Неоценим для обучения и отладки.

ОГРАНИЧЕНИЯ И ОСОБЕННОСТИ РЕАЛИЗАЦИИ