- Операции по работе с данными
- Арифметические операции
- Побитовые операции
- Операции манипуляции со стеком (данных)
- Операции манипуляции со стеком адресов возврата
- Операции сравнения
- Операции управления потоком
- Операции обработки прерываний
- Комментарии
- Включение кода
- Булевы значения
При упоминании стека имеется ввиду всегда стек данных, если не указано иное.
-
Загрузка числа на стек
- Синтаксис:
<number> - Описание: загрузить на стек число
<number> - Операция:
dataStack.push(<number>)
- Синтаксис:
-
Загрузка адреса переменной на стек
- Синтаксис:
<var> - Описание: загрузить на стек адрес переменной
<var> - Операция:
dataStack.push(addrof(<var>))
- Синтаксис:
-
Сохранение значения по адресу
- Синтаксис:
! - Описание: по адресу значения первого элемента стека сохранить значение второго элемента стека
- Операция:
M[dataStack.pop()] = dataStack.pop()
- Синтаксис:
-
Загрузка значения по адресу
- Синтаксис:
@ - Описание: загрузить на стек значение по адресу значения первого элемента стека
- Операция:
dataStack.push(M[dataStack.pop()])
- Синтаксис:
-
Загрузка значения константы
- Синтаксис:
<const> - Описание: загрузить на стек значение константы
<const> - Операция:
dataStack.push(<const>)
- Синтаксис:
-
Объявление переменной
- Синтаксис:
var <ident> - Описание: объявить переменную
<ident>; определённая ячейка памяти привязывается к имени переменной
- Синтаксис:
-
Объявление переменной с заданным значением
- Синтаксис:
var <ident> <number> - Описание: объявить переменную
<ident>и присвоить значение<number>; определённая ячейка памяти привязывается к имени переменной
- Синтаксис:
-
Объявление константы
- Синтаксис:
const <ident> <number> - Описание: объявить константу
<ident>значением<number>
- Синтаксис:
-
Объявление блока памяти
- Синтаксис:
alloc <ident> <number> - Описание: выделить блок памяти
<ident>длины<number>; размер указывается в ячейках памяти; определённая ячейка памяти начала блока привязывается к имени переменной
- Синтаксис:
-
Объявление строкового литерала
- Синтаксис:
str <ident> <string> - Описание: объявить строковый литерал
<ident>и значением<string>; определённая ячейка памяти начала литерала привязывается к имени переменной; литерал хранится в памяти в виде паскаль-строки (то есть, в первой ячейке непрерывного блока памяти литерала хранится размер строки)
- Синтаксис:
-
Сложение
- Синтаксис:
+ - Описание: сложить первое и второе значение со стека и положить результат обратно на стек
- Операция:
dataStack.push(dataStack.pop() + dataStack.pop())
- Синтаксис:
-
Вычитание
- Синтаксис:
- - Описание: вычесть первое значение на стеке из второго и положить результат обратно на стек
- Операция:
dataStack.push(-dataStack.pop() + dataStack.pop())
- Синтаксис:
-
Умножение
- Синтаксис:
* - Описание: перемножить первое и второе значение со стека и положить результат обратно на стек
- Операция:
dataStack.push(dataStack.pop() * dataStack.pop())
- Синтаксис:
-
Деление нацело
- Синтаксис:
/ - Описание: разделить нацело второе значение со стека на первое и положить результат обратно на стек
- Операция:
dataStack.push(1 / dataStack.pop() * dataStack.pop())
- Синтаксис:
-
Остаток от деления
- Синтаксис:
mod - Описание: разделить нацело второе значение со стека на первое и положить остаток обратно на стек
- Операция:
swap; dataStack.push(dataStack.pop() % dataStack.pop())
- Синтаксис:
-
И
- Синтаксис:
and - Описание: выполнить побитовое
Имежду двумя первыми элементами стека и положить результат обратно на стек - Операция:
dataStack.push(dataStack.pop() & dataStack.pop())
- Синтаксис:
-
ИЛИ
- Синтаксис:
or - Описание: выполнить побитовое
ИЛИмежду двумя первыми элементами стека и положить результат обратно на стек - Операция:
dataStack.push(dataStack.pop() | dataStack.pop())
- Синтаксис:
-
ИСКЛЮЧАЮЩЕЕ ИЛИ
- Синтаксис:
^ - Описание: выполнить побитовое
ИСКЛЮЧАЮЩЕЕ ИЛИмежду двумя первыми элементами стека и положить результат обратно на стек - Операция:
dataStack.push(dataStack.pop() ^ dataStack.pop())
- Синтаксис:
-
НЕ
- Синтаксис:
not - Описание: выполнить побитовое
НЕнад первым элементом стека и положить результат обратно на стек - Операция:
dataStack.push(~dataStack.pop())
- Синтаксис:
-
Отрицательное значение
- Синтаксис:
negate - Описание: выполнить побитовое
НЕнад первым элементом стека, прибавить единицу и положить результат обратно на стек - Операция:
dataStack.push(~dataStack.pop() + 1)
- Синтаксис:
-
Абсолютное значение
- Синтаксис:
abs - Описание: взять абсолютное значение от первого элемента стека и положить обратно на стек
- Операция:
dataStack.push(abs(dataStack.pop()))
- Синтаксис:
-
Максимум
- Синтаксис:
max - Описание: взять максимум из значений первых двух элементов стека и положить обратно на стек
- Операция:
dataStack.push(max(dataStack.pop(), dataStack.pop()))
- Синтаксис:
-
Минимум
- Синтаксис:
min - Описание: взять минимум из значений первых двух элементов стека и положить обратно на стек
- Операция:
dataStack.push(min(dataStack.pop(), dataStack.pop()))
- Синтаксис:
Примечание: для описания стандартных потоков ввода/вывода зарезервированы переменные stdin/stdout, стандартные значения которых равны 1 и 2 соответственно. Эти значения соответствуют номерам внешних устройств (в текущей реализации номер устройства равен номеру порта, к которому оно подключено). Программист может их самостоятельно переопределять, изменяя значения переменных stdin/stdout.
-
Дублирование (первого)
- Синтаксис:
dup - Описание: продублировать первый элемент стека
- Операция:
dataStack.push(dataStack.top())
- Синтаксис:
-
Дублирование (второго)
- Синтаксис:
over - Описание: продублировать второй элемент стека
- Операция:
FV <- dataStack.pop(), SV <- dataStack.pop(); dataStack.push(SV), dataStack.push(FV), dataStack.push(SV)
- Синтаксис:
-
Обмен
- Синтаксис:
swap - Описание: обменять значения первых двух элементов стека
- Операция:
FV <- dataStack.pop(), SV <- dataStack.pop(); dataStack.push(FV), dataStack.push(SV)
- Синтаксис:
-
Поворот
- Синтаксис:
rot - Описание: "повернуть" три первых элемента стека: третий элемент окажется на первом месте, остальные два останутся в том же порядке
- Операция:
FV <- dataStack.pop(), SV <- dataStack.pop(), TV <- dataStack.pop(); dataStack.push(SV), dataStack.push(FV), dataStack.push(TV)
- Синтаксис:
-
Удаление первого элемента стека
- Синтаксис:
drop - Описание: удалить первый элемент со стека
- Операция:
dataStack.pop()
- Синтаксис:
-
Удаление второго элемента стека
- Синтаксис:
nip - Описание: удалить второй элемент со стека
- Операция:
TV <- dataStack.pop(), SV <- dataStack.pop(); SV.drop(); dataStack.push(TV)
- Синтаксис:
-
Вывод символа на стандартный поток вывода
- Синтаксис:
. - Описание: взять первый элемент со стека и передать на стандартный поток вывода
- Операция:
STDOUT <- dataStack.pop()
- Синтаксис:
-
Вывод символа на стандартный поток вывода (
ascii)- Синтаксис:
emit - Описание: взять первый элемент со стека и передать на стандартный поток вывода, интерпретировав этот символ как символ таблицы
ascii - Операция:
STDOUT <- ascii[dataStack.pop()]
- Синтаксис:
-
Вывод символа перевода каретки на стандартный поток вывода
- Синтаксис:
cr - Описание: передать на стандартный поток вывода символ перевода каретки
- Операция:
STDOUT <- \r
- Синтаксис:
-
Вывод строки на стандартный поток вывода
- Синтаксис:
." - Описание: передать на стандартный поток вывода все символы;
."отмечает начало строки для вывода, а конец строки определяется по" - Операция:
STDOUT <- some string - Пример: при вводе
." Hello!"на стандартный поток вывода будет поданоHello!
- Синтаксис:
-
Чтение символа со стандартного потока ввода
- Синтаксис:
key - Описание: получить со стандартного потока ввода один символ и положить его на вершину стека (значение символа будет взято из таблицы
ascii) - Операция:
dataStack.push(STDIN[0])
- Синтаксис:
-
Перенос первого элемента со стека (данных) на стек адресов возврата
- Синтаксис:
>r - Описание: взять первый элемент со стека (данных) и положить на стек адресов возврата
- Операция:
returnStack.push(dataStack.pop())
- Синтаксис:
-
Перенос первого элемента со стека адресов возврата на стек (данных)
- Синтаксис:
r> - Описание: взять первый элемент со стека адресов возврата и положить на стек данных
- Операция:
dataStack.push(returnStack.pop())
- Синтаксис:
-
Дублирование первого элемента стека адресов возврата на стек (данных)
- Синтаксис:
r@ - Описание: взять первый элемент со стека адресов возврата и продублировать на стек данных
- Операция:
dataStack.push(returnStack.top())
- Синтаксис:
Раздел Описание для каждой из операций этого типа будет почти идентичным, поэтому вынесен в начало:
-
Описание: сравнить два первых элемента стека и положить результат обратно на стек
-
Равно
- Синтаксис:
= - Операция:
dataStack.push(dataStack.pop() == dataStack.pop())
- Синтаксис:
-
Меньше или равно
- Синтаксис:
<= - Операция:
dataStack.push(dataStack.pop() >= dataStack.pop())
- Синтаксис:
-
Больше или равно
- Синтаксис:
>= - Операция:
dataStack.push(dataStack.pop() <= dataStack.pop())
- Синтаксис:
-
Меньше
- Синтаксис:
< - Операция:
dataStack.push(dataStack.pop() > dataStack.pop())
- Синтаксис:
-
Больше
- Синтаксис:
> - Операция:
dataStack.push(dataStack.pop() < dataStack.pop())
- Синтаксис:
-
Условный переход
- Синтаксис:
if <body> then - Описание: если на вершине стека находится значение
истина, то выполнить набор инструкций из<body>
- Синтаксис:
-
Условный переход с альтернативой
- Синтаксис:
if <body#1> else <body#2> then - Описание: если на вершине стека находится значение
истина, то выполнить набор инструкций из<body#1>, иначе выполнить набор инструкций из<body#2>
- Синтаксис:
-
Цикл с постусловием
- Синтаксис:
begin <body> until - Описание: выполнить набор инструкций из
<body>, если после этого на вершине стека находится значениеложь, то перейти к следующей итерации, иначе - выйти из цикла
- Синтаксис:
-
Цикл со счётчиком
- Синтаксис:
<number> "times" <body> "next" - Описание: вначале взять значение со стека (данных) и поместить на стек адресов возврата; затем выполнить набор инструкций из
<body>, отнять 1 от вершины со стека адресов возврата, если вершина больше нуля, то перейти к следующей итерации, иначе - удалить вершину со стека адресов возврата и выйти из цикла
- Синтаксис:
-
Объявление процедуры
- Синтаксис:
: <ident> <body> ; - Описание: объявить процедуру
<ident>с набором инструкций<body>
- Синтаксис:
-
Завершение программы
- Синтаксис:
_exit_ - Описание: завершить программу
- Синтаксис:
Примечание: обработка прерываний требует их ручного включения. То есть, на момент начала исполнения программы, прерывания отключены.
-
Включение прерываний
- Синтаксис:
_enable_int_ - Описание: включить прерывания
- Синтаксис:
-
Отключение прерываний
- Синтаксис:
_disable_int_ - Описание: отключить прерывания
- Синтаксис:
-
Возвращение из процедуры-обработчика
- Синтаксис:
_iret_ - Описание: вернуться из процедуры-обработчика и вернуть состояние, которое было до входа в данную процедуру
- Синтаксис:
-
Определение векторов прерываний
- Синтаксис:
vector <number> : <ident> - Описание: определить для устройства
<number>(в текущей реализации номер устройства равен номеру порта, к которому оно подключено) процедуру-обработчик
- Синтаксис:
Начинаются с символа \ и заканчиваются там, где заканчивается строка
С помощью директивы #require <string> (где <string> - имя включаемого файла) можно включать код из других модулей .forth. Включение - подстановка всего содержимого файла.
истина- любое значение, кроме 0 (каноническое значение --1)ложь- 0