- 32-битная аккумуляторная архитектура процессора - Вся логика использует единственный регистр общего назначения - аккумулятор ## Регистры и флаги - `Acc` - 32-битный главный регистр - `V` - overflow flag - флаг переполнения для чисел со знаком - `C` - carry flag - флаг переноса из старшего бита - `PC` - program counter - счетчик команд, хранит адрес следующей инструкции > [!info] В YAML-конфигах состояние аккумулятор выводится через `{Acc:dec}` и `{Acc:hex}`, флаги - через `{V}` и `{C}` ## Кодирование и размеры инструкций Команды имеют переменную длину для оптимизации плотности кода - 1 байт - код операции - 4 байта (полный операнд) - 32-битный адрес - 2 байта (относительный операнд) - 16-битное знаковое смещение относительно `PC` | Тип инструкции | Операнд | Полный размер | Примеры | | :------------- | :---------------------- | :------------ | :----------------------------------------------------- | | Без операнда | Нет | **1 байт** | `halt`, `not`, `clv`, `clc`, `load_acc` | | Относительные | Смещение (2 байта) | **3 байта** | `load`, `store`, `add`, `sub`, `and` | | Абсолютные | Адрес / Число (4 байта) | **5 байт** | `jmp`, ветвления, `load_imm`, `load_addr`, `store_ind` | ## Система команд ### 1. Операции над памятью - `load_imm ` - прямая загрузка (5 байт) - `load ` - относительная загрузка (3 байта) - `store ` - относительное сохранение (3 байта) - `load_addr ` - абсолютная загрузка (5 байт) - `store_addr ` - абсолютное сохранение (5 байт) - `load_acc` - разыменование указателя из `Acc` (1 байт, загружает значение по адресу из аккумулятора `acc <- mem[acc]`) - `store_ind` - косвенная запись по указателю (5 байт, `mem[mem[
]] <- acc`) ## Арифметика - `add ` / `sub ` - сложение/вычитание (5 байт, `acc +- mem[
])`, устанавливают флаги) - `mul ` - умножение (5 байт, `acc * mem`, устанавливает флаги) - `div ` - целочисленное деление (5 байт, `acc / mem`) - `rem ` - остаток от деления (5 байт, `acc % mem`) - `clv` / `clc` - сброс флагов (1 байт) ### Побитовые операции - `not` - побитовая инверсия (1 байт) - `and ` / `or ` / `xor ` - логические И, ИЛИ, XOR (5 байт) - `shiftl ` - логический сдвиг влево (5 байт) - `shiftr ` - логический сдвиг вправо (5 байт) ### Управление вычислительным процессом - `jmp `- безусловный переход (5 байт) - `beqz ` - переход, если `Acc == 0` (5 байт) - `bnez ` - переход, если `Acc != 0` ( 5 байт) - `bgtz ` - переход, если `Acc > 0` (5 байт) - `bgez ` - переход, если `Acc >= 0` (5 байт) - `bltz ` - переход, если `Acc < 0` (5 байт) - `bvs ` / `bvc ` - переход, если флаг переполнения 1/0 (5 байт) - `bcs ` / `bcc ` - переход, если флаг переноса 1/0 (5 байт) - `halt` - остановка процессора (1 байт)