Память виртуальной машины состоит из ячеек типа int32
(little endian), нумерующихся с нуля.
При загрузке файла с программой его содержимое становится содержимым памяти машины.
Загружаемый файл не должен быть пустым, его размер должен быть кратен 4 байтам.
В нулевой ячейке хранится номер первой из ячеек, содержащих команду, которая будет выполнена следующей. Все команды машины занимают 3 ячейки. На каждом шаге значение нулевой ячейки увеличивается на 3, после чего происходит выполнение команды, на которую нулевая ячейка указывала раньше. Машина завершает работу, когда в нулевой ячейке оказывается число -1.
Будем обозначать значение, лежащее в ячейке a
, как *a
.
У виртуальной машины есть единственная команда, S val src dest
. Ее алгоритм работы следующий:
- Если
*val < 0
, не делать ничего. - Если
src = -1
, прочитать символ со стандартного ввода, иначе прочитать**src
. - Если
dest = -1
, записать прочитанное значение в стандартный вывод, иначе записать его в**dest
.
Эта команда кодируется как последовательно записанные значения val
, src
, dest
.