diff --git a/readme.html b/readme.html new file mode 100644 index 0000000..b25fdc6 --- /dev/null +++ b/readme.html @@ -0,0 +1,685 @@ + + +
+ + ++ __ _____ __ __ + / / / / _ \/ / / / + / / / / __/ /_/ / +/_/ /_/\___/\____/ ++
Версия 9.8 | Экспериментальный проект | 2024
+КВС — это ассемблер для архитектуры 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), в соответствии с философией проекта.