2026-05-02 23:04:46 +03:00
<!DOCTYPE html>
< html lang = "ru" >
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< title > К В С - Ассемблер с русским синтаксисом< / title >
< style >
/* С б р о с и базовые настройки */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Courier New', 'Courier', monospace;
font-size: 14px;
line-height: 1.4;
color: #00ff00;
background-color: #000000;
background-image:
linear-gradient(rgba(0, 20, 0, 0.1) 1px, transparent 1px),
linear-gradient(90deg, rgba(0, 20, 0, 0.1) 1px, transparent 1px);
background-size: 20px 20px;
padding: 20px;
min-height: 100vh;
text-shadow: 0 0 5px rgba(0, 255, 0, 0.3);
}
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
.cursor {
display: inline-block;
width: 8px;
height: 16px;
background-color: #00ff00;
margin-left: 2px;
vertical-align: text-bottom;
animation: blink 1s infinite;
}
.terminal {
max-width: 1200px;
margin: 0 auto;
border: 2px solid #00aa00;
padding: 20px;
position: relative;
box-shadow: 0 0 20px rgba(0, 255, 0, 0.2), inset 0 0 20px rgba(0, 255, 0, 0.1);
}
.terminal::before {
content: "┌───[ К В С v2.0 ]───┐";
position: absolute;
top: -11px;
left: 20px;
background: #000;
padding: 0 10px;
font-size: 12px;
color: #00aa00;
}
.terminal::after {
content: "└─────────────────────┘";
position: absolute;
bottom: -11px;
right: 20px;
background: #000;
padding: 0 10px;
font-size: 12px;
color: #00aa00;
}
h1, h2, h3, h4 {
color: #00ff00;
margin: 25px 0 15px 0;
border-bottom: 1px dashed #00aa00;
padding-bottom: 5px;
text-transform: uppercase;
letter-spacing: 1px;
}
h1 {
font-size: 24px;
color: #00ff88;
text-align: center;
margin-top: 0;
padding: 10px;
border: 1px solid #00aa00;
background: rgba(0, 20, 0, 0.3);
}
h2 {
font-size: 18px;
color: #00ff66;
}
h3 {
font-size: 16px;
color: #00ff44;
}
p {
margin: 15px 0;
text-align: justify;
}
ul, ol {
margin: 15px 0 15px 30px;
}
li {
margin: 8px 0;
position: relative;
}
li::before {
content: "› ";
color: #00ff00;
position: absolute;
left: -15px;
}
a {
color: #00ffff;
text-decoration: none;
border-bottom: 1px dotted #00aaaa;
}
a:hover {
color: #ffff00;
border-bottom: 1px solid #ffff00;
text-shadow: 0 0 10px rgba(255, 255, 0, 0.5);
}
code, pre {
font-family: 'Courier New', monospace;
background: rgba(0, 30, 0, 0.5);
border: 1px solid #005500;
padding: 15px;
margin: 15px 0;
display: block;
overflow-x: auto;
white-space: pre;
color: #88ff88;
box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.5);
position: relative;
}
pre::before {
content: "┌──[ код ]";
position: absolute;
top: -10px;
left: 10px;
background: #000;
padding: 0 5px;
font-size: 11px;
color: #00aa00;
}
table {
width: 100%;
border-collapse: collapse;
margin: 20px 0;
border: 1px solid #005500;
}
th {
background: rgba(0, 40, 0, 0.5);
color: #00ff88;
padding: 10px;
border: 1px solid #005500;
text-align: left;
font-weight: bold;
text-transform: uppercase;
font-size: 12px;
}
td {
padding: 10px;
border: 1px solid #005500;
color: #88ff88;
vertical-align: top;
}
tr:nth-child(even) {
background: rgba(0, 25, 0, 0.3);
}
tr:hover {
background: rgba(0, 50, 0, 0.4);
}
.note {
border-left: 3px solid #ffff00;
padding: 15px;
margin: 20px 0;
background: rgba(40, 40, 0, 0.2);
color: #ffff88;
}
.warning {
border-left: 3px solid #ff4444;
padding: 15px;
margin: 20px 0;
background: rgba(40, 0, 0, 0.2);
color: #ff8888;
}
2026-05-11 15:08:03 +03:00
.success {
border-left: 3px solid #44ff44;
padding: 15px;
margin: 20px 0;
background: rgba(0, 40, 0, 0.2);
color: #88ff88;
}
2026-05-02 23:04:46 +03:00
.process-diagram {
text-align: center;
margin: 30px 0;
font-family: monospace;
white-space: pre;
color: #00ffaa;
background: rgba(0, 20, 0, 0.3);
padding: 20px;
border: 1px dashed #00aa00;
overflow-x: auto;
}
2026-05-11 15:08:03 +03:00
.status-table td:first-child {
font-weight: bold;
}
.status-done {
color: #00ff00;
}
.status-partial {
color: #ffff00;
}
.status-pending {
color: #ff4444;
}
2026-05-02 23:04:46 +03:00
footer {
margin-top: 40px;
padding-top: 20px;
border-top: 1px solid #005500;
text-align: center;
color: #00aa00;
font-size: 12px;
}
.typewriter {
overflow: hidden;
border-right: 3px solid #00ff00;
white-space: nowrap;
margin: 0 auto;
animation: typing 3.5s steps(40, end), blink-caret 0.75s step-end infinite;
}
@keyframes typing {
from { width: 0; }
to { width: 100%; }
}
@keyframes blink-caret {
from, to { border-color: transparent; }
50% { border-color: #00ff00; }
}
.ascii-art {
text-align: center;
margin: 30px 0;
font-family: monospace;
color: #00ff88;
line-height: 1.2;
white-space: pre;
text-shadow: 0 0 10px rgba(0, 255, 136, 0.5);
}
.ascii-art-box {
display: inline-block;
border: none;
background: none;
padding: 0;
margin: 0;
}
2026-05-11 15:08:03 +03:00
.badge {
display: inline-block;
padding: 2px 6px;
margin-left: 8px;
font-size: 10px;
border-radius: 2px;
background: #005500;
color: #00ff00;
}
2026-05-02 23:04:46 +03:00
@media (max-width: 768px) {
body {
padding: 10px;
font-size: 12px;
}
.terminal {
padding: 15px;
}
h1 {
font-size: 18px;
}
h2 {
font-size: 16px;
}
table {
font-size: 11px;
}
pre, code {
font-size: 11px;
padding: 10px;
}
.ascii-art {
font-size: 10px;
overflow-x: auto;
}
}
::-webkit-scrollbar {
width: 12px;
}
::-webkit-scrollbar-track {
background: rgba(0, 20, 0, 0.3);
border: 1px solid #005500;
}
::-webkit-scrollbar-thumb {
background: #005500;
border: 1px solid #00aa00;
}
::-webkit-scrollbar-thumb:hover {
background: #00aa00;
}
< / style >
< / head >
< body >
< div class = "terminal" >
< h1 class = "typewriter" > К В С — Ассемблер с русским синтаксисом для x86-64< / h1 >
< div style = "text-align: center; margin: 30px 0; color: #00ff88;" >
< div class = "ascii-art" >
< pre class = "ascii-art-box" >
╔══════════════════════════════════╗
║ ██╗ ██╗ ██╗ ██╗ ███████╗ ║
║ ██║ ██╔╝ ██╗ ██╗ ██╔════╝ ║
║ █████╔╝ ██╗ ██╗ ███████╗ ║
║ ██║╚██╗ ╚██╗ ██╔╝ ╚════██║ ║
║ ██║ ╚██╗ ╚██╔╝ ███████║ ║
║ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ║
╚══════════════════════════════════╝
< / pre >
< / div >
2026-05-17 17:18:35 +03:00
< p > Версия 2.0 | Экспериментальный проект | 2026< / p >
< p > < span style = "color: #00ff00;" > ✓ Абсолютная адресация реализована< / span > | < span style = "color: #00ff00;" > ✓ Косвенная адресация реализована< / span > | < span style = "color: #00ff00;" > ✓ Секция .bss реализована< / span > < / p >
2026-05-02 23:04:46 +03:00
< / div >
< h2 > ┌──[ ОГЛАВЛЕНИЕ ]────────────────────────────────────────────┐< / h2 >
< ul style = "columns: 2; column-gap: 40px;" >
< li > < a href = "#назначение" > Назначение и концепция< / a > < / li >
< li > < a href = "#особенности" > Особенности и возможности< / a > < / li >
< li > < a href = "#архитектура" > Архитектура и процесс сборки< / a > < / li >
< li > < a href = "#установка" > Установка и запуск< / a > < / li >
< li > < a href = "#синтаксис" > Синтаксис исходных файлов (.квс)< / a > < / li >
< li > < a href = "#команды" > Система команд< / a > < / li >
2026-05-11 15:08:03 +03:00
< li > < a href = "#память" > Работа с памятью< / a > < / li >
2026-05-02 23:04:46 +03:00
< li > < a href = "#регистры" > Регистры процессора< / a > < / li >
< li > < a href = "#директивы" > Директивы ассемблера< / a > < / li >
< li > < a href = "#примеры" > Примеры программ< / a > < / li >
< li > < a href = "#трансляция" > Процесс трансляции< / a > < / li >
2026-05-11 15:08:03 +03:00
< li > < a href = "#статус" > Статус реализации< / a > < / li >
< li > < a href = "#план" > План развития< / a > < / li >
2026-05-02 23:04:46 +03:00
< li > < a href = "#ограничения" > Ограничения< / a > < / li >
< / ul >
< h2 > └──────────────────────────────────────────────────────────────┘< / h2 >
< h2 id = "назначение" > НАЗНАЧЕНИЕ И КОНЦЕПЦИЯ< / h2 >
< p > < strong > К В С < / strong > — это ассемблер для архитектуры x86-64, полностью использующий < strong > русскую лексику< / strong > для мнемоник инструкций, имён регистров и директив. Проект носит < strong > образовательный и экспериментальный характер< / strong > и демонстрирует принципы работы ассемблера, построения ELF-файлов и трансляции высокоуровневых концепций в машинный код.< / p >
< div class = "note" >
< strong > Ключевые принципы проекта:< / strong >
< ul >
< li > < strong > Русскоязычный синтаксис< / strong > — все инструкции, регистры и директивы на кириллице< / li >
< li > < strong > Модульная архитектура< / strong > — лексер, парсер, два прохода, сборщик ELF< / li >
< li > < strong > Минимализм зависимостей< / strong > — только стандартная библиотека Python< / li >
< li > < strong > Подготовка к самокомпиляции< / strong > — архитектура, допускающая написание компилятора на самом К В С < / li >
< / ul >
< / div >
< h2 id = "особенности" > ОСОБЕННОСТИ И ВОЗМОЖНОСТИ< / h2 >
< ul >
2026-05-17 17:18:35 +03:00
< li > < strong > Полностью русский синтаксис< / strong > — < code > переместить< / code > , < code > прибавить< / code > , < code > вызвать< / code > , регистры < code > раикс< / code > , < code > есипи< / code > , < code > ал< / code > , директивы < code > .текст< / code > , < code > .данные< / code > , < code > .б с с < / code > < / li >
2026-05-02 23:04:46 +03:00
< li > < strong > Генерация исполняемых ELF-файлов< / strong > — 64-битные ELF для Linux, готовые к запуску< / li >
< li > < strong > Двухпроходная сборка< / strong > — традиционная схема с разрешением меток< / li >
2026-05-17 17:18:35 +03:00
< li > < strong > Поддержка секций< / strong > — разделение на < code > .текст< / code > (код), < code > .данные< / code > (инициализированные данные) и < code > .б с с < / code > (неинициализированные данные)< / li >
< li > < strong > Полная адресация памяти< / strong > :
< ul >
< li > Абсолютная адресация по меткам < code > [переменная]< / code > < / li >
< li > Абсолютная адресация по числовому адресу < code > [0x402000]< / code > < / li >
< li > Косвенная адресация через регистр < code > [раикс]< / code > < / li >
< li > Всё с RIP-relative кодированием для 64-битных перемещений< / li >
< / ul >
< / li >
2026-05-02 23:04:46 +03:00
< li > < strong > CSV-логирование< / strong > — детальный файл < code > .csv< / code > с соответствием адресов, байтов и исходных команд< / li >
< li > < strong > Более 50 инструкций< / strong > — полный набор основных команд x86-64< / li >
2026-05-11 15:08:03 +03:00
< li > < strong > Рефакторинг< / strong > — кодогенерация вынесена в отдельный модуль < code > kvs_pass2_encoder.py< / code > < / li >
2026-05-02 23:04:46 +03:00
< / ul >
< h2 id = "архитектура" > АРХИТЕКТУРА И ПРОЦЕСС СБОРКИ< / h2 >
< div class = "process-diagram" >
Исходный файл (.квс)
│
▼ (kvs_lexer.py)
Файл токенов (.токены)
│
▼ (kvs_parser.py)
AST-представление (.аст)
│
▼ (kvs_pass1.py)
Первый проход: размеры, метки (.пр о х о д1)
│
2026-05-11 15:08:03 +03:00
▼ (kvs_pass2.py + kvs_pass2_encoder.py)
2026-05-02 23:04:46 +03:00
Второй проход: генерация кода (.csv)
│
▼ (kvs_builder.py)
ELF-компоновщик (.elf)
Исполняемый файл!
< / div >
2026-05-11 15:08:03 +03:00
< h3 > Модули компилятора< / h3 >
< table >
< tr > < th > Файл< / th > < th > Назначение< / th > < / tr >
< tr > < td > < code > kvs_build.py< / code > < / td > < td > Главный сборочный скрипт< / td > < / tr >
< tr > < td > < code > kvs_lexer.py< / code > < / td > < td > Лексический анализ, разбор на токены< / td > < / tr >
< tr > < td > < code > kvs_parser.py< / code > < / td > < td > Синтаксический анализ, построение AST< / td > < / tr >
< tr > < td > < code > kvs_pass1.py< / code > < / td > < td > Первый проход: вычисление размеров и адресов меток< / td > < / tr >
< tr > < td > < code > kvs_pass2.py< / code > < / td > < td > Второй проход: обход AST, генерация CSV< / td > < / tr >
< tr > < td > < code > kvs_pass2_encoder.py< / code > < / td > < td > Кодировщик инструкций (все encode_* функции)< / td > < / tr >
< tr > < td > < code > kvs_builder.py< / code > < / td > < td > Сборка ELF-файла из CSV< / td > < / tr >
< tr > < td > < code > kvs_data.py< / code > < / td > < td > Общие данные (регистры, инструкции)< / td > < / tr >
< / table >
2026-05-02 23:04:46 +03:00
< h2 id = "установка" > У С Т А Н О В К А И ЗАПУСК< / h2 >
< pre > # Клонирование репозитория
2026-05-17 17:18:35 +03:00
git clone https://github.com/artradeskz/kvs.git
2026-05-02 23:04:46 +03:00
cd kvs
# Установка прав на выполнение (при необходимости)
chmod +x kvs_build.py
# Компиляция программы
python3 kvs_build.py программа.квс
# Запуск скомпилированной программы
./программа.elf< / pre >
< h2 id = "синтаксис" > СИНТАКСИС ИСХОДНЫХ ФАЙЛОВ (.квс)< / h2 >
< pre > ; Комментарий начинается с точки с запятой
2026-05-17 17:18:35 +03:00
.б с с ; Начало секции неинициализированных данных
счётчик: .байт 0 ; Переменная без начального значения
.данные ; Начало секции инициализированных данных
2026-05-02 23:04:46 +03:00
message: .с тр о ка _ну ль "Привет, мир!"
.текст ; Начало секции кода
.глобал _start ; Точка входа
_start:
2026-05-17 17:18:35 +03:00
; Абсолютная адресация через метку
2026-05-11 15:08:03 +03:00
пе р е ме с тить_имм раикс, 42
2026-05-17 17:18:35 +03:00
сохранить [счётчик], раикс ; запись в BSS-переменную
; Абсолютная адресация через число
сохранить [0x402000], раикс ; запись по абсолютному адресу
2026-05-11 15:08:03 +03:00
2026-05-17 17:18:35 +03:00
; Косвенная адресация через регистр
пе р е ме с тить_имм рбикс, message
загрузить раикс, [рбикс] ; чтение через регистр
2026-05-11 15:08:03 +03:00
; Системный вызов write
2026-05-02 23:04:46 +03:00
пе р е ме с тить_имм раикс, 1
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм рсиай, message
2026-05-02 23:04:46 +03:00
пе р е ме с тить_имм рдикс, 13
вызо в_с ис те мы
2026-05-17 17:18:35 +03:00
; Выход с кодом из счётчика
загрузить рдиай, [счётчик]
2026-05-02 23:04:46 +03:00
пе р е ме с тить_имм раикс, 60
вызо в_с ис те мы< / pre >
< h2 id = "команды" > СИСТЕМА КОМАНД< / h2 >
< table >
< tr > < th > Категория< / th > < th > Примеры инструкций< / th > < th > Соответствие NASM< / th > < / tr >
2026-05-11 15:08:03 +03:00
< tr > < td > Перемещение данных< / td > < td > < code > переместить< / code > , < code > пе р е ме с тить_имм< / code > < / td > < td > < code > mov< / code > , < code > mov reg, imm< / code > < / td > < / tr >
< tr > < td > Работа с памятью< / td > < td > < code > загрузить< / code > , < code > сохранить< / code > , < code > за г р у зить_а др е с < / code > < / td > < td > < code > mov reg, mem< / code > , < code > mov mem, reg< / code > , < code > lea< / code > < / td > < / tr >
2026-05-17 17:18:35 +03:00
< tr > < td > Арифметика< / td > < td > < code > прибавить< / code > , < code > вычесть< / code > , < code > увеличить< / code > , < code > уменьшить< / code > < / td > < td > < code > add< / code > , < code > sub< / code > , < code > inc< / code > , < code > dec< / code > < / td > < / tr >
< tr > < td > Логические< / td > < td > < code > сравнить< / code > , < code > с р а внить_с < / code > , < code > проверить< / code > < / td > < td > < code > cmp< / code > , < code > test< / code > < / td > < / tr >
< tr > < td > Условные переходы< / td > < td > < code > пе р е х о д_е с ли_р а вно < / code > , < code > пе р е х о д_е с ли_б о льше < / code > , < code > ко р о ткий_пе р е х о д< / code > < / td > < td > < code > je< / code > , < code > jg< / code > , < code > jmp short< / code > < / td > < / tr >
< tr > < td > Безусловные переходы< / td > < td > < code > переход< / code > , < code > ко р о ткий_пе р е х о д< / code > < / td > < td > < code > jmp< / code > , < code > jmp short< / code > < / td > < / tr >
< tr > < td > Системные< / td > < td > < code > вызо в_с ис те мы< / code > < / td > < td > < code > syscall< / code > < / td > < / tr >
2026-05-02 23:04:46 +03:00
< / table >
2026-05-11 15:08:03 +03:00
< h2 id = "память" > РАБОТА С ПАМЯТЬЮ< / h2 >
< div class = "success" >
2026-05-17 17:18:35 +03:00
< strong > ✓ РЕАЛИЗОВАНО (v2.0):< / strong > Абсолютная адресация (метки и числа), косвенная адресация через регистры
2026-05-11 15:08:03 +03:00
< / div >
< h3 > Поддерживаемые формы:< / h3 >
< table >
< tr > < th > Синтаксис< / th > < th > Описание< / th > < th > Пример< / th > < / tr >
2026-05-17 17:18:35 +03:00
< tr > < td > < code > [метка]< / code > < / td > < td > Адрес метки (из .данные или .б с с )< / td > < td > < code > загрузить раикс, [переменная]< / code > < / td > < / tr >
2026-05-11 15:08:03 +03:00
< tr > < td > < code > [число]< / code > < / td > < td > Абсолютный адрес< / td > < td > < code > сохранить [0x402000], раикс< / code > < / td > < / tr >
2026-05-17 17:18:35 +03:00
< tr > < td > < code > [регистр]< / code > < / td > < td > Косвенная адресация через регистр< / td > < td > < code > загрузить раикс, [рбикс]< / code > < / td > < / tr >
2026-05-11 15:08:03 +03:00
< / table >
< h3 > Пример использования:< / h3 >
2026-05-17 17:18:35 +03:00
< pre > .б с с
счётчик: .байт 0
указатель: .байт 0
.данные
переменная: .байт 42
message: .с тр о ка _ну ль "Hello"
2026-05-11 15:08:03 +03:00
.текст
_start:
2026-05-17 17:18:35 +03:00
; Абсолютная адресация через метку
загрузить раикс, [переменная]
2026-05-11 15:08:03 +03:00
2026-05-17 17:18:35 +03:00
; Абсолютная адресация через число
сохранить [0x402000], раикс
2026-05-11 15:08:03 +03:00
2026-05-17 17:18:35 +03:00
; Косвенная адресация
пе р е ме с тить_имм рбикс, переменная
загрузить раикс, [рбикс]
; Работа с BSS
сохранить [счётчик], раикс
; Завершение
2026-05-11 15:08:03 +03:00
пе р е ме с тить_имм раикс, 60
2026-05-17 17:18:35 +03:00
загрузить рдиай, [счётчик]
2026-05-11 15:08:03 +03:00
вызо в_с ис те мы< / pre >
2026-05-17 17:18:35 +03:00
< div class = "note" >
< strong > 📌 ВАЖНО:< / strong > В с е тесты из папки < code > тесты/< / code > успешно собираются и запускаются, включая тест, воспроизводящий б а г с BSS-секцией. Адресация работает корректно во всех формах.
2026-05-11 15:08:03 +03:00
< / div >
2026-05-02 23:04:46 +03:00
< h2 id = "регистры" > РЕГИСТРЫ ПРОЦЕССОРА< / h2 >
< table >
2026-05-17 17:18:35 +03:00
< tr > < th > 64-битные< / th > < th > 32-битные< / th > < th > 16-битные< / th > < th > 8-битные (мл.)< / th > < / tr >
< tr > < td > < code > раикс< / code > < / td > < td > < code > еаикс< / code > < / td > < td > < code > аикс< / code > < / td > < td > < code > ал< / code > < / td > < / tr >
< tr > < td > < code > рбикс< / code > < / td > < td > < code > ебикс< / code > < / td > < td > < code > бикс< / code > < / td > < td > < code > бл< / code > < / td > < / tr >
< tr > < td > < code > рсикс< / code > < / td > < td > < code > есикс< / code > < / td > < td > < code > сикс< / code > < / td > < td > < code > кл< / code > < / td > < / tr >
< tr > < td > < code > рдикс< / code > < / td > < td > < code > едикс< / code > < / td > < td > < code > дикс< / code > < / td > < td > < code > дл< / code > < / td > < / tr >
< tr > < td > < code > рсипи< / code > < / td > < td > < code > есипи< / code > < / td > < td > < code > эсп< / code > < / td > < td > < code > спл< / code > < / td > < / tr >
< tr > < td > < code > рбипи< / code > < / td > < td > < code > ебипи< / code > < / td > < td > < code > бипи< / code > < / td > < td > < code > бпл< / code > < / td > < / tr >
< tr > < td > < code > рсиай< / code > < / td > < td > < code > есиай< / code > < / td > < td > < code > эс< / code > < / td > < td > < code > сил< / code > < / td > < / tr >
< tr > < td > < code > рдиай< / code > < / td > < td > < code > едиай< / code > < / td > < td > < code > ди< / code > < / td > < td > < code > дил< / code > < / td > < / tr >
2026-05-02 23:04:46 +03:00
< / table >
2026-05-17 17:18:35 +03:00
< div class = "warning" >
< strong > ⚠️ ПРИМЕЧАНИЕ:< / strong > Старшие 8-битные регистры (AH, BH, CH, DH) и расширенные младшие (SPL, BPL, SIL, DIL) не поддерживаются. Регистры R8– R15 также отсутствуют.
< / div >
2026-05-02 23:04:46 +03:00
< h2 id = "директивы" > ДИРЕКТИВЫ АССЕМБЛЕРА< / h2 >
< table >
2026-05-11 15:08:03 +03:00
< tr > < th > Директива< / th > < th > Назначение< / th > < th > Пример< / th > < / tr >
< tr > < td > < code > .текст< / code > < / td > < td > Начало секции кода< / td > < td > < code > .текст< / code > < / td > < / tr >
2026-05-17 17:18:35 +03:00
< tr > < td > < code > .данные< / code > < / td > < td > Начало секции инициализированных данных< / td > < td > < code > .данные< / code > < / td > < / tr >
< tr > < td > < code > .б с с < / code > < / td > < td > Начало секции неинициализированных данных< / td > < td > < code > .б с с < / code > < / td > < / tr >
2026-05-11 15:08:03 +03:00
< tr > < td > < code > .глобал< / code > < / td > < td > Объявление глобальной метки< / td > < td > < code > .глобал _start< / code > < / td > < / tr >
2026-05-02 23:04:46 +03:00
< tr > < td > < code > .строка< / code > < / td > < td > Строка без нулевого терминатора< / td > < td > < code > .строка "Hello"< / code > < / td > < / tr >
< tr > < td > < code > .с тр о ка _ну ль< / code > < / td > < td > Строка с нулевым терминатором< / td > < td > < code > .с тр о ка _ну ль "Hello"< / code > < / td > < / tr >
< tr > < td > < code > .байт< / code > < / td > < td > Резервирование байтов< / td > < td > < code > .байт 0x0A, 255, 0b0001< / code > < / td > < / tr >
< tr > < td > < code > .константа< / code > < / td > < td > Определение константы< / td > < td > < code > .константа SIZE = 100< / code > < / td > < / tr >
< / table >
< h2 id = "примеры" > ПРИМЕРЫ ПРОГРАММ< / h2 >
< h3 > Пример 1: "Привет, мир!"< / h3 >
< pre > .глобал _start
.текст
_start:
; write(1, msg, 13)
пе р е ме с тить_имм раикс, 1
2026-05-11 15:08:03 +03:00
пе р е ме с тить_имм рдиай, 1
пе р е ме с тить_имм рсиай, msg
2026-05-02 23:04:46 +03:00
пе р е ме с тить_имм рдикс, 13
вызо в_с ис те мы
; exit(0)
пе р е ме с тить_имм раикс, 60
2026-05-11 15:08:03 +03:00
пе р е ме с тить_имм рдиай, 0
2026-05-02 23:04:46 +03:00
вызо в_с ис те мы
.данные
2026-05-11 15:08:03 +03:00
msg: .с тр о ка _ну ль "Hello, World!"< / pre >
2026-05-02 23:04:46 +03:00
2026-05-17 17:18:35 +03:00
< h3 > Пример 2: Работа с BSS-секцией< / h3 >
2026-05-11 15:08:03 +03:00
< pre > .глобал _start
.текст
_start:
2026-05-17 17:18:35 +03:00
; Инициализация счётчика
пе р е ме с тить_имм раикс, 0
сохранить [счётчик], раикс
; Цикл: увеличить счётчик 10 раз
пе р е ме с тить_имм рсикс, 10
loop:
загрузить раикс, [счётчик]
увеличить раикс
сохранить [счётчик], раикс
уменьшить рсикс
с р а внить_с рсикс, 0
пе р е х о д_е с ли_б о льше loop
2026-05-11 15:08:03 +03:00
2026-05-17 17:18:35 +03:00
; Выход с кодом = значение счётчика
загрузить рдиай, [счётчик]
2026-05-11 15:08:03 +03:00
пе р е ме с тить_имм раикс, 60
вызо в_с ис те мы
2026-05-17 17:18:35 +03:00
.б с с
счётчик: .байт 0< / pre >
2026-05-11 15:08:03 +03:00
2026-05-17 17:18:35 +03:00
< h3 > Пример 3: Косвенная адресация< / h3 >
2026-05-02 23:04:46 +03:00
< pre > .глобал _start
.текст
_start:
2026-05-17 17:18:35 +03:00
; Загружаем адрес переменной в регистр
пе р е ме с тить_имм рбикс, переменная
; Косвенная запись
пе р е ме с тить_имм раикс, 99
сохранить [рбикс], раикс
; Косвенное чтение
загрузить раикс, [рбикс]
; Выход
пе р е ме с тить_имм рдиай, раикс
пе р е ме с тить_имм раикс, 60
вызо в_с ис те мы
2026-05-02 23:04:46 +03:00
2026-05-17 17:18:35 +03:00
.данные
переменная: .байт 0< / pre >
< h3 > Пример 4: Абсолютный адрес< / h3 >
< pre > .глобал _start
.текст
2026-05-02 23:04:46 +03:00
2026-05-17 17:18:35 +03:00
_start:
; Запись по абсолютному адресу 0x402000
пе р е ме с тить_имм раикс, 0x2A
сохранить [0x402000], раикс
; Чтение по абсолютному адресу
загрузить рбикс, [0x402000]
; Выход с кодом 42
2026-05-02 23:04:46 +03:00
пе р е ме с тить_имм раикс, 60
2026-05-17 17:18:35 +03:00
пе р е ме с тить_имм рдиай, 0x2A
2026-05-02 23:04:46 +03:00
вызо в_с ис те мы< / pre >
< h2 id = "трансляция" > ПРОЦЕСС ТРАНСЛЯЦИИ И ВЫХОДНЫЕ ФАЙЛЫ< / h2 >
< p > Запуск ассемблера:< / p >
< pre > python3 kvs_build.py программа.квс< / pre >
< p > < strong > В результате создаются файлы:< / strong > < / p >
< ul >
< li > < strong > < code > программа.токены< / code > < / strong > — результат лексического анализа< / li >
< li > < strong > < code > программа.аст< / code > < / strong > — AST-представление< / li >
< li > < strong > < code > программа.пр о х о д1< / code > < / strong > — результаты первого прохода (размеры, метки)< / li >
< li > < strong > < code > программа.csv< / code > < / strong > — детальный лог с адресами, байтами и командами< / li >
< li > < strong > < code > программа.elf< / code > < / strong > — исполняемый ELF-файл< / li >
< / ul >
2026-05-11 15:08:03 +03:00
< h2 id = "статус" > С Т А Т У С РЕАЛИЗАЦИИ< / h2 >
< h3 > ✅ Полностью реализовано (v2.0)< / h3 >
< ul >
< li > Лексер с токенами < code > [< / code > , < code > ]< / code > , < code > NUMBER< / code > < / li >
< li > Парсер с поддержкой операндов в квадратных скобках< / li >
< li > Первый проход с корректным расчётом размера инструкций с памятью< / li >
2026-05-17 17:18:35 +03:00
< li > Второй проход с кодированием адресации через RIP-relative< / li >
< li > Абсолютная адресация по меткам < code > [переменная]< / code > < / li >
< li > Абсолютная адресация по числовым адресам < code > [0x402000]< / code > < / li >
< li > Косвенная адресация через регистры < code > [раикс]< / code > < / li >
< li > Секция < code > .б с с < / code > для неинициализированных данных< / li >
< li > Рефакторинг: выделение кодировщика в отдельный модуль< / li >
2026-05-11 15:08:03 +03:00
< li > Более 50 инструкций x86-64< / li >
< li > CSV-логирование< / li >
< / ul >
2026-05-17 17:18:35 +03:00
< h3 > ⚠️ Частично реализовано / ограничено< / h3 >
2026-05-11 15:08:03 +03:00
< ul >
< li > < code > за г р у зить_а др е с < / code > (LEA) — только для чисел, не для меток< / li >
2026-05-17 17:18:35 +03:00
< li > Старшие 8-битные регистры (AH, BH, CH, DH) не поддерживаются< / li >
< li > Регистры R8– R15 не поддерживаются< / li >
2026-05-11 15:08:03 +03:00
< / ul >
< h2 id = "план" > ПЛАН РАЗВИТИЯ< / h2 >
2026-05-17 17:18:35 +03:00
< h3 > v2.0 (текущая) — Адресация и BSS< / h3 >
2026-05-11 15:08:03 +03:00
< ul >
< li > ✅ Лексер: < code > [< / code > , < code > ]< / code > , < code > NUMBER< / code > < / li >
2026-05-17 17:18:35 +03:00
< li > ✅ Парсер: < code > [метка]< / code > , < code > [число]< / code > , < code > [регистр]< / code > < / li >
< li > ✅ Pass1: корректный расчёт размера инструкций< / li >
2026-05-11 15:08:03 +03:00
< li > ✅ Pass2: RIP-relative кодирование< / li >
2026-05-17 17:18:35 +03:00
< li > ✅ Абсолютная адресация (метки и числа)< / li >
< li > ✅ Косвенная адресация (< code > [reg]< / code > )< / li >
< li > ✅ Секция < code > .б с с < / code > < / li >
2026-05-11 15:08:03 +03:00
< li > ✅ Рефакторинг энкодера< / li >
< / ul >
2026-05-17 17:18:35 +03:00
< h3 > v3.0 (планируется) — Расширенная адресация< / h3 >
2026-05-11 15:08:03 +03:00
< ul >
2026-05-17 17:18:35 +03:00
< li > ❌ < code > [reg + disp]< / code > — адресация с о смещением< / li >
2026-05-11 15:08:03 +03:00
< li > ❌ < code > [reg + reg*scale]< / code > — с индексным регистром< / li >
< li > ❌ < code > [reg + reg*scale + disp]< / code > — полная SIB-адресация< / li >
< li > ❌ LEA для меток< / li >
2026-05-17 17:18:35 +03:00
< li > ❌ PUSH/POP/CALL/RET< / li >
2026-05-11 15:08:03 +03:00
< / ul >
< h3 > v4.0 (отложено) — Стандартная библиотека< / h3 >
< ul >
< li > ❌ < code > malloc< / code > , < code > free< / code > < / li >
< li > ❌ < code > strlen< / code > , < code > strcmp< / code > , < code > memcpy< / code > < / li >
< li > ❌ < code > putchar< / code > , < code > getchar< / code > < / li >
< / ul >
2026-05-02 23:04:46 +03:00
< h2 id = "ограничения" > ОГРАНИЧЕНИЯ< / h2 >
< div class = "warning" >
< ul >
2026-05-17 17:18:35 +03:00
< li > < strong > Адресация с о смещением< / strong > — формы < code > [reg+disp]< / code > , < code > [reg+reg*scale]< / code > , < code > [reg+reg*scale+disp]< / code > не реализованы< / li >
2026-05-11 15:08:03 +03:00
< li > < strong > LEA для меток< / strong > — < code > за г р у зить_а др е с reg, [метка]< / code > не работает, используйте < code > пе р е ме с тить_имм reg, метка< / code > < / li >
2026-05-17 17:18:35 +03:00
< li > < strong > Старшие 8-битные регистры< / strong > — AH, BH, CH, DH не поддерживаются< / li >
< li > < strong > Расширенные регистры< / strong > — SPL, BPL, SIL, DIL, а также R8– R15 не поддерживаются< / li >
< li > < strong > Нет умножения и деления< / strong > — инструкции MUL/DIV не реализованы< / li >
< li > < strong > Нет операций с о стеком< / strong > — PUSH/POP/CALL/RET отсутствуют< / li >
< li > < strong > Нет динамической памяти< / strong > — нет встроенных malloc/free< / li >
2026-05-02 23:04:46 +03:00
< li > < strong > Нет макросов и условной компиляции< / strong > < / li >
< li > < strong > Экспериментальный статус< / strong > — некоторые инструкции могут быть реализованы не полностью< / li >
< / ul >
< / div >
< footer >
< p > ───────────────────────────────────────────────────────────────────────< / p >
2026-05-17 17:18:35 +03:00
< p > К В С Ассемблер v2.0 | Экспериментальный проект | 2026< / p >
2026-05-02 23:04:46 +03:00
< p > Только для образовательных целей. Используйте на свой страх и риск.< / p >
< p style = "margin-top: 10px; font-size: 10px; color: #005500;" >
> Система готова. Введите команду...
< span class = "cursor" > < / span >
< / p >
< / footer >
< / div >
< script >
document.addEventListener('DOMContentLoaded', function() {
const elements = document.querySelectorAll('h1, h2, h3, p, li, td, th, pre, code');
elements.forEach((el, index) => {
el.style.opacity = '0';
el.style.transition = 'opacity 0.5s ease';
setTimeout(() => { el.style.opacity = '1'; }, 100 + index * 10);
});
});
< / script >
< / body >
< / html >