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

   __  _____  __  __
  / / / / _ \/ / / /
 / / / /  __/ /_/ / 
/_/ /_/\___/\____/  
            

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

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

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

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

КВС — это ассемблер для архитектуры 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, где для каждого байта машинного кода указан его виртуальный адрес, шестнадцатеричное значение, целевой адрес (для инструкций переходов) и исходная команда на русском языке. Неоценим для обучения и отладки.

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