forked from n3tael/labast
51 lines
5.2 KiB
Markdown
51 lines
5.2 KiB
Markdown
# Labaski specification
|
||
Last update: 2024-02-05
|
||
|
||
Программа состоит из команд в формате `ИНСТРУКЦИЯ АРГУМЕНТ` (assembler-like)
|
||
|
||
Аргумент всегда должен быть `uint16` (`unsigned short`, `u16`)
|
||
|
||
Все данные которые программа использует хранятся в стеке, сам стек это массив из этих `unsigned short`'ов
|
||
|
||
Размер стека без разницы, но желательно минимум 256
|
||
|
||
Выполнение программы начинается либо с начала файла, либо с лейбла 0, если он есть
|
||
|
||
Почти каждая инструкция которые читает что-то стека должна POP'ать прочитаннное значение
|
||
|
||
Если название инструкции начинается с #, то парсер программы должен прочитать аргумент к инструкции как строку(до первого пробела)
|
||
|
||
## Инструкции
|
||
|
||
| Инструкция | Аргумент | Описание |
|
||
|-------------|----------------|----------------------------------------------------------------------|
|
||
| PUSH | `uint16` | Добавить в стек |
|
||
| POP | - | Удалить из стека |
|
||
| DUP | - | Дублировать последнее значение в стеке |
|
||
| SWAP | - | Поменять местами последние 2 значения в стеке |
|
||
| ADD | - | Прибавление последних 2-х значений из стека |
|
||
| SUB | - | Вычитание последних 2-х значений из стека |
|
||
| MUL | - | Умножение последних 2-х значений из стека |
|
||
| DIV | - | Деление последних 2-х значений из стека |
|
||
| JMP | `uint16` лейбл | Перейти к лейблу <имя> |
|
||
| JNZ | `uint16` лейбл | Перейти к лейблу <имя> если значение с верхушки стека не 0 |
|
||
| JZ | `uint16` лейбл | Перейти к лейблу <имя> если значение с верхушки стека 0 |
|
||
| NOP | - | Ничего не делает |
|
||
| EXIT | - | Выход из программы с кодом 0 |
|
||
| PUTC | - | Вывести символ в консоль |
|
||
| GETC | - | Получить символ с консоли, добавить символ в стек |
|
||
| MEOW | - | Принт, POP'ает со стека |
|
||
| DUMP | - | Вывести весь стек в консоль, понятное дело не попает со стека |
|
||
| SCAN | - | Сканирует ввод из консоли на `short`'ы и пушит в стек |
|
||
| #EXEC | arg | Выполнить код из файла, указанного в аргументе* |
|
||
| ARGS | `uint16` | POP'ает аргумент значений с основного стека и пушит их в стек модуля, если указать аргумент 0, то нужное кол-во аргументов она возьмет(попнув) с оригинального стека |
|
||
| SIZE | | Пушит в стек значение размера стека |
|
||
| QUIT | `uint16` | Полностью завершает выполнение программы. Как аргумент попает exit-код. |
|
||
|
||
> \*путь относительно места вызова интерпретатора. Создает отдельный стек для модуля, но передает основной для того чтобы взять оттуда аргументы. После того как модуль выполнился, пушит весь стек модуля в основной.
|
||
|
||
## Лейблы
|
||
|
||
Лейблы могут быть только `unsigned short`'ами
|
||
От 0 (main-лейбл) до минимум 256
|
||
Если юзер высрал два лейбла с одинаковыми идентификаторами, то интерпретатор/компилятор должен выдать ошибку |