Введение
Проект виртуальной машины для языка Toyng.
Машина относится к классу стек-машин. Стек может быть фиксированным (для ускорения работы) или динамическим.
(В процессе проектирования.)
Набор инструкций
- Каждая инструкция занимает один байт.
- Инструкции объединяются в пакеты по восемь.
- Одно данное занимает восемь байт.
- Программа хранится как выровненный массив uint64.
Регистры
Прямой доступ к регистрам из самой программы не предполагается.
- AT — вспомогательный регистр.
- PC — указатель инструкции.
- SP — указатель вершины стека.
- FP — указатель кадра стека.
- LR — текущий адрес возврата (бессмысленная оптимизация?).
Инструкции работы со стеком и вызов процедур
- push — положить следующий пакет (данное) на стек данных: *SP = *IP, SP += 8.
- pop — убрать вершину стека данных: SP -= 8.
- dup — продублировать вершину стека данных: *SP = *(SP - 8), SP += 8.
- call — взять адрес процедуры со стека и вызвать её:
- AT = *(SP - 8);
- *(SP - 8) = LR;
- LR = PC;
- PC = AT;
- *SP = FP;
- FP = SP;
- SP += 8.
- ret — возвратиться из вызова:
- PC = LR;
- SP = FP;
- LR = *(SP - 8);
- FP = *SP;
- SP -= 8.
Переходы и инструкции общего назначения
- nop (код 00) — нет инструкции (ничего не делать).
- icall — вызвать встроенную процедуру с номером на стеке:
- AT = *(SP -= 8);
- вызвать процедуру AT.
- js — перейти по адресу на стеке, PC = *(SP -= 8).
- jfw (код 2n) — перейти вперёд на n+1 пакет: PC += 8*(n+1), где n закодировано в младшей тетраде инструкции.
- jbw (код 3n) — перейти назад на n+1 пакет: PC -= 8*(n+1), где n закодировано в младшей тетраде инструкции.
- jl — перейти на метку, заданную следующим пакетом.
Кувшинов Д.Р. 2017