Введение
Проект виртуальной машины для языка 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