# 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 Если юзер высрал два лейбла с одинаковыми идентификаторами, то интерпретатор/компилятор должен выдать ошибку