diff --git a/Computer Science/Архитектуры/ACC32.md b/Computer Science/Архитектуры/acc32.md similarity index 100% rename from Computer Science/Архитектуры/ACC32.md rename to Computer Science/Архитектуры/acc32.md diff --git a/Computer Science/Архитектуры/f32a.md b/Computer Science/Архитектуры/f32a.md new file mode 100644 index 0000000..13aac53 --- /dev/null +++ b/Computer Science/Архитектуры/f32a.md @@ -0,0 +1,88 @@ +- 32-битная стековая архитектура +- Главный принцип - команды не имеют операндов в коде. Все данные неявно берутся с веришны стека, результат кладется обратно в стек. +- Небольшая пасхалка на [[Evaluate Reverse Polish Notation|вот эту задачу с литкода]] +## Регистры, флаги и стеки +- Имеет два независимых аппаратных стека и два регистра-указателя +### Стеки +- `Data Stack` - место где происходят вычисления +- `T` - вершина стека данных +- `S` - второй элемент на стеке данных +- `Return Stack` - стек возврата +- `R` - вершина стека возвратов +### Регистры +- `A` - указатель адреса памяти с поддержкой автоинкремента +- `B` - второй указатель памяти +### Флаги +- `C` - перенос +- `EAM` - режим расширенной арифметики +> [!info] Все регистры, флаги и стеки можно выводить в отчете: `A:dec`, `stack:dec`, `rstack:hex`, `C`, `EAM` и так далее + +> [!info] Получение максимальной глубины стека, которая была достигнута на конкретном шаге через: `f32a:data-stack-max` и `f32a:return-stack-max` +## Система команд +- Комментарии - `\` +- Опкод - 1 байт. Если есть операнд, то еще 4 байта +### 1. Операции со стеком +- `dup` - дублировать вершину (`[X] -> [X, X`]) +- `drop` - удалить вершину (`[X, Y] -> [X]`) +- `over` - скопировать второй элемент наверх (`[X, Y] -> [X, Y, X]`) +### 2. Операции над памятью +- `` (или `lit `) - положить константу на `Data Stack` (от слова literal) +- `a!` / `b!` - снять значение со стека и записать в регистр `A` / `B` +- `a` - скопировать значение из регистра `A` на стек + +- `@p ` - прочитать из адреса на стек +- `!p ` - снять со стека и записать по адресу + +- `@` / `!` - чтение/запись по адресу, который лежит в регистре `A` +- `@+` / `!+` - чтеение/запись по адресу в `A` и инкремент `A` +- `@b` / `!b` - чтение/запись по адресу, который лежит в регистре `B` +### 3. Арифметика +- `+` - сумма, снимает два верхних числа, складывает, кладет на вершину стека. Если в режиме `EAM`, то прибавляет еще и флаг переноса. Устанавливает флаг переноса в любом случае +- `+*` - один шаг умножения +- `+/` - один шаг деления +- `2*` - сдвиг влево вершины стека +- `2/` - сдвиг вправо вершины стека +- `inv` - побитовая инверсия вершины стека +- `eam` - снять число с `Data Stack` и записать его в `EAM` +### 4. Побитовые операции +- `and` - побитовое И над `T` и `S` (снимает их) +- `xor` - исключающее ИЛИ +### 5. Управление вычислительным процессом +- `;` - возврат из подпрограммы (снять адрес с `Return Stack` и прыгнуть) +- `