╔══════════════════════════════════╗ ║ ██╗ ██╗ ██╗ ██╗ ███████╗ ║ ║ ██║ ██╔╝ ██╗ ██╗ ██╔════╝ ║ ║ █████╔╝ ██╗ ██╗ ███████╗ ║ ║ ██║╚██╗ ╚██╗ ██╔╝ ╚════██║ ║ ║ ██║ ╚██╗ ╚██╔╝ ███████║ ║ ║ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ║ ╚══════════════════════════════════╝
Версия 2.0 | Экспериментальный проект | 2026
✓ Абсолютная адресация реализована | ✓ Косвенная адресация реализована | ✓ Секция .bss реализована
КВС — это ассемблер для архитектуры x86-64, полностью использующий русскую лексику для мнемоник инструкций, имён регистров и директив. Проект носит образовательный и экспериментальный характер и демонстрирует принципы работы ассемблера, построения ELF-файлов и трансляции высокоуровневых концепций в машинный код.
переместить, прибавить, вызвать, регистры раикс, есипи, ал, директивы .текст, .данные, .бсс.текст (код), .данные (инициализированные данные) и .бсс (неинициализированные данные)[переменная][0x402000][раикс].csv с соответствием адресов, байтов и исходных командkvs_pass2_encoder.py| Файл | Назначение |
|---|---|
kvs_build.py | Главный сборочный скрипт |
kvs_lexer.py | Лексический анализ, разбор на токены |
kvs_parser.py | Синтаксический анализ, построение AST |
kvs_pass1.py | Первый проход: вычисление размеров и адресов меток |
kvs_pass2.py | Второй проход: обход AST, генерация CSV |
kvs_pass2_encoder.py | Кодировщик инструкций (все encode_* функции) |
kvs_builder.py | Сборка ELF-файла из CSV |
kvs_data.py | Общие данные (регистры, инструкции) |
# Клонирование репозитория git clone https://github.com/artradeskz/kvs.git cd kvs # Установка прав на выполнение (при необходимости) chmod +x kvs_build.py # Компиляция программы python3 kvs_build.py программа.квс # Запуск скомпилированной программы ./программа.elf
; Комментарий начинается с точки с запятой
.бсс ; Начало секции неинициализированных данных
счётчик: .байт 0 ; Переменная без начального значения
.данные ; Начало секции инициализированных данных
message: .строка_нуль "Привет, мир!"
.текст ; Начало секции кода
.глобал _start ; Точка входа
_start:
; Абсолютная адресация через метку
переместить_имм раикс, 42
сохранить [счётчик], раикс ; запись в BSS-переменную
; Абсолютная адресация через число
сохранить [0x402000], раикс ; запись по абсолютному адресу
; Косвенная адресация через регистр
переместить_имм рбикс, message
загрузить раикс, [рбикс] ; чтение через регистр
; Системный вызов write
переместить_имм раикс, 1
переместить_имм рсиай, message
переместить_имм рдикс, 13
вызов_системы
; Выход с кодом из счётчика
загрузить рдиай, [счётчик]
переместить_имм раикс, 60
вызов_системы
| Категория | Примеры инструкций | Соответствие NASM |
|---|---|---|
| Перемещение данных | переместить, переместить_имм | mov, mov reg, imm |
| Работа с памятью | загрузить, сохранить, загрузить_адрес | mov reg, mem, mov mem, reg, lea |
| Арифметика | прибавить, вычесть, увеличить, уменьшить | add, sub, inc, dec |
| Логические | сравнить, сравнить_с, проверить | cmp, test |
| Условные переходы | переход_если_равно, переход_если_больше, короткий_переход | je, jg, jmp short |
| Безусловные переходы | переход, короткий_переход | jmp, jmp short |
| Системные | вызов_системы | syscall |
| Синтаксис | Описание | Пример |
|---|---|---|
[метка] | Адрес метки (из .данные или .бсс) | загрузить раикс, [переменная] |
[число] | Абсолютный адрес | сохранить [0x402000], раикс |
[регистр] | Косвенная адресация через регистр | загрузить раикс, [рбикс] |
.бсс
счётчик: .байт 0
указатель: .байт 0
.данные
переменная: .байт 42
message: .строка_нуль "Hello"
.текст
_start:
; Абсолютная адресация через метку
загрузить раикс, [переменная]
; Абсолютная адресация через число
сохранить [0x402000], раикс
; Косвенная адресация
переместить_имм рбикс, переменная
загрузить раикс, [рбикс]
; Работа с BSS
сохранить [счётчик], раикс
; Завершение
переместить_имм раикс, 60
загрузить рдиай, [счётчик]
вызов_системы
тесты/ успешно собираются и запускаются, включая тест, воспроизводящий баг с BSS-секцией. Адресация работает корректно во всех формах.
| 64-битные | 32-битные | 16-битные | 8-битные (мл.) |
|---|---|---|---|
раикс | еаикс | аикс | ал |
рбикс | ебикс | бикс | бл |
рсикс | есикс | сикс | кл |
рдикс | едикс | дикс | дл |
рсипи | есипи | эсп | спл |
рбипи | ебипи | бипи | бпл |
рсиай | есиай | эс | сил |
рдиай | едиай | ди | дил |
| Директива | Назначение | Пример |
|---|---|---|
.текст | Начало секции кода | .текст |
.данные | Начало секции инициализированных данных | .данные |
.бсс | Начало секции неинициализированных данных | .бсс |
.глобал | Объявление глобальной метки | .глобал _start |
.строка | Строка без нулевого терминатора | .строка "Hello" |
.строка_нуль | Строка с нулевым терминатором | .строка_нуль "Hello" |
.байт | Резервирование байтов | .байт 0x0A, 255, 0b0001 |
.константа | Определение константы | .константа SIZE = 100 |
.глобал _start
.текст
_start:
; write(1, msg, 13)
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, msg
переместить_имм рдикс, 13
вызов_системы
; exit(0)
переместить_имм раикс, 60
переместить_имм рдиай, 0
вызов_системы
.данные
msg: .строка_нуль "Hello, World!"
.глобал _start
.текст
_start:
; Инициализация счётчика
переместить_имм раикс, 0
сохранить [счётчик], раикс
; Цикл: увеличить счётчик 10 раз
переместить_имм рсикс, 10
loop:
загрузить раикс, [счётчик]
увеличить раикс
сохранить [счётчик], раикс
уменьшить рсикс
сравнить_с рсикс, 0
переход_если_больше loop
; Выход с кодом = значение счётчика
загрузить рдиай, [счётчик]
переместить_имм раикс, 60
вызов_системы
.бсс
счётчик: .байт 0
.глобал _start
.текст
_start:
; Загружаем адрес переменной в регистр
переместить_имм рбикс, переменная
; Косвенная запись
переместить_имм раикс, 99
сохранить [рбикс], раикс
; Косвенное чтение
загрузить раикс, [рбикс]
; Выход
переместить_имм рдиай, раикс
переместить_имм раикс, 60
вызов_системы
.данные
переменная: .байт 0
.глобал _start
.текст
_start:
; Запись по абсолютному адресу 0x402000
переместить_имм раикс, 0x2A
сохранить [0x402000], раикс
; Чтение по абсолютному адресу
загрузить рбикс, [0x402000]
; Выход с кодом 42
переместить_имм раикс, 60
переместить_имм рдиай, 0x2A
вызов_системы
Запуск ассемблера:
python3 kvs_build.py программа.квс
В результате создаются файлы:
программа.токены — результат лексического анализапрограмма.аст — AST-представлениепрограмма.проход1 — результаты первого прохода (размеры, метки)программа.csv — детальный лог с адресами, байтами и командамипрограмма.elf — исполняемый ELF-файл[, ], NUMBER[переменная][0x402000][раикс].бсс для неинициализированных данныхзагрузить_адрес (LEA) — только для чисел, не для меток[, ], NUMBER[метка], [число], [регистр][reg]).бсс[reg + disp] — адресация со смещением[reg + reg*scale] — с индексным регистром[reg + reg*scale + disp] — полная SIB-адресацияmalloc, freestrlen, strcmp, memcpyputchar, getchar[reg+disp], [reg+reg*scale], [reg+reg*scale+disp] не реализованызагрузить_адрес reg, [метка] не работает, используйте переместить_имм reg, метка