4.2 KiB
4.2 KiB
- 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 <val>- прямая загрузка (5 байт)load <offset>- относительная загрузка (3 байта)store <offset>- относительное сохранение (3 байта)load_addr <addr>- абсолютная загрузка (5 байт)store_addr <addr>- абсолютное сохранение (5 байт)load_acc- разыменование указателя изAcc(1 байт, загружает значение по адресу из аккумулятораacc <- mem[acc])store_ind- косвенная запись по указателю (5 байт,mem[mem[<address>]] <- acc)
Арифметика
add <addr>/sub <addr>- сложение/вычитание (5 байт,acc +- mem[<address>]), устанавливают флаги)mul <addr>- умножение (5 байт,acc * mem, устанавливает флаги)div <addr>- целочисленное деление (5 байт,acc / mem)rem <addr>- остаток от деления (5 байт,acc % mem)clv/clc- сброс флагов (1 байт)
Побитовые операции
not- побитовая инверсия (1 байт)and <addr>/or <addr>/xor <addr>- логические И, ИЛИ, XOR (5 байт)shiftl <addr>- логический сдвиг влево (5 байт)shiftr <addr>- логический сдвиг вправо (5 байт)
Управление вычислительным процессом
jmp <addr>- безусловный переход (5 байт)beqz <addr>- переход, еслиAcc == 0(5 байт)bnez <addr>- переход, еслиAcc != 0( 5 байт)bgtz <addr>- переход, еслиAcc > 0(5 байт)bgez <addr>- переход, еслиAcc >= 0(5 байт)bltz <addr>- переход, еслиAcc < 0(5 байт)bvs <addr>/bvc <addr>- переход, если флаг переполнения 1/0 (5 байт)bcs <addr>/bcc <addr>- переход, если флаг переноса 1/0 (5 байт)halt- остановка процессора (1 байт)