ассемблер для архитектуры x86-64, полностью использующий русскую лексику
Find a file
2025-12-23 16:21:26 +03:00
jcc Add files via upload 2025-10-29 13:20:30 +03:00
jumps Add files via upload 2025-11-08 20:42:59 +03:00
nop Add files via upload 2025-10-27 14:15:58 +03:00
objdump_readelf Add files via upload 2025-11-03 14:23:23 +03:00
short_jumps Update kvs_6.py 2025-11-08 15:26:11 +03:00
квс Add files via upload 2025-10-24 04:45:07 +03:00
asm21_.py Add files via upload 2025-10-22 17:06:00 +03:00
kvs_9_8.py Add files via upload 2025-11-27 08:03:07 +03:00
readme.html Update readme.html 2025-12-23 16:21:26 +03:00
readme.md Create readme.md 2025-12-23 16:07:23 +03:00
привет.квс Update привет.квс 2025-10-23 08:25:12 +03:00
тест.квс Add files via upload 2025-10-22 17:06:00 +03:00

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

📖 Оглавление

🎯 Назначение и концепция

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

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

  • Самодокументируемый код: Читаемость и ясность важнее краткости.
  • Изоляция логики: Разделение парсера, трансформатора и кодогенератора.
  • Минимизация зависимостей: Используется только struct для упаковки данных, re не используется.
  • Избегание чрезмерного ООП: В контексте возможной будущей самокомпиляции.

🚀 Особенности и возможности

  • Полностью русский синтаксис: Все инструкции (переместить, прибавить, вызвать), регистры (раикс, есипи, ал) и директивы (.текст, .данные) используют кириллицу.
  • Генерация исполняемых ELF-файлов: На выходе создаются 64-битные ELF-файлы для Linux, готовые к запуску.
  • Двухпроходная сборка: Традиционная для ассемблеров схема с разрешением меток.
  • Поддержка секций: Явное разделение на секции кода (.текст) и данных (.данные).
  • Система импорта модулей: Директива .импорт для включения других файлов .квс с автоматическим разрешением имён.
  • Подготовка к сложной адресации: Архитектура заложена для будущей трансформации сложных режимов адресации памяти в последовательности простых инструкций через промежуточное представление.
  • Детальное логирование: Генерация .log.csv файла с полным соответствием машинных кодов, виртуальных адресов и исходных команд.

⚙️ Архитектура и процесс сборки

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

⚠️ Ограничения и особенности реализации

  • Экспериментальный статус: Проект в активной разработке, некоторые углы архитектуры x86-64 могут быть реализованы не полностью.
  • Базовая адресация памяти: На данный момент поддерживаются преимущественно простые формы адресации (например, [регистр]). Режимы со сдвигом и несколькими регистрами ([база + индекс*масштаб + смещение]) предназначены для реализации через трансформацию в промежуточном представлении (задел на будущее).
  • Отсутствие макросов и условной компиляции: В текущей версии эти конструкции не поддерживаются.
  • Лексический анализатор (лексер): Написан "вручную", без использования регулярных выражений (re), в соответствии с философией проекта.
  • Генерация ELF: Реализация фокусируется на создании рабочих исполняемых файлов для Linux. Некоторые необязательные или специфичные поля заголовков ELF могут быть заполнены упрощённо.