- 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` и прыгнуть) - `