╔══════════════════════════════════╗ ║ ██╗ ██╗ ██╗ ██╗ ███████╗ ║ ║ ██║ ██╔╝ ██╗ ██╗ ██╔════╝ ║ ║ █████╔╝ ██╗ ██╗ ███████╗ ║ ║ ██║╚██╗ ╚██╗ ██╔╝ ╚════██║ ║ ║ ██║ ╚██╗ ╚██╔╝ ███████║ ║ ║ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ║ ╚══════════════════════════════════╝
Версия 9.8 | Экспериментальный проект | 2025
КВС — это ассемблер для архитектуры x86-64, полностью использующий русскую лексику для мнемоник инструкций, имён регистров и директив. Проект носит образовательный и экспериментальный характер и демонстрирует принципы работы ассемблера, построения ELF-файлов и трансляции высокоуровневых концепций в машинный код.
struct для упаковки данных, re не используется.переместить, прибавить, вызвать), регистры (раикс, есипи, ал) и директивы (.текст, .данные) используют кириллицу..текст) и данных (.данные)..импорт для включения других файлов .квс с автоматическим разрешением имён..log.csv файла с полным соответствием машинных кодов, виртуальных адресов и исходных команд.Процесс трансляции исходного кода .квс в исполняемый файл .elf проходит через несколько этапов:
Подробнее об этапах:
.text и .data.Исходные файлы имеют расширение .квс. Их структура следует традициям ассемблера:
; Комментарий начинается с точки с запятой
.данные ; Начало секции данных
приветствие: .строка_нуль "Здравствуй, мир!"
число: .байт 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 |
.импорт |
Включает содержимое другого файла .квс в текущую сборку. |
.импорт библиотека.квс |
Директива .импорт позволяет разбивать проект на несколько файлов.
Принцип работы:
цикл из модуль.квс станет цикл_модуль)..данные из импортированных файлов сливается в общую секцию .данные промежуточного файла. Аналогично для .текст.Запуск ассемблера:
python3 kvs_9_8.py программа.квс
В результате создаются три файла:
программа.квс.промежуточный: Текстовый файл, содержащий объединённый и переименованный код всех модулей. Используется для отладки процесса импорта.программа.elf: Исполняемый 64-битный ELF-файл. Для запуска может потребоваться установить флаг исполнения: chmod +x программа.elf.программа.log.csv: Детальный лог в формате CSV, где для каждого байта машинного кода указан его виртуальный адрес, шестнадцатеричное значение, целевой адрес (для инструкций переходов) и исходная команда на русском языке. Неоценим для обучения и отладки.[регистр]). Режимы со сдвигом и несколькими регистрами ([база + индекс*масштаб + смещение]) предназначены для реализации через трансформацию в промежуточном представлении (задел на будущее).re), в соответствии с философией проекта.