49 lines
4.2 KiB
Markdown
49 lines
4.2 KiB
Markdown
- 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 байт) |