Stack-based virtual machine.
- Все инструкции занимают 1 байт памяти, за исключением инструкции push, которая занимает 5 байт памяти (1 байт сама инструкция + 4 байта аргумент инструкции).
- Псевдоинструкции не занимают памяти вовсе.
- Принимает в качестве аргумента строку
- Участвует только при компиляции ассемблерного кода и не участвует в выполнении самой программы.
- Создаёт именованную область памяти на месте которой данная метка ставится.
labl label_name
- Комментарий.
; это комментарий
- Загружает в стек целое число. Если в качестве аргумента выступает имя метки, то берётся её адрес и также загружается в стек.
push 5
push -5
push label_name
- Выгружает одно число из стека. Иными словами удаляет последнее число в стеке.
pop
- Выгружает одно число из стека, прибавляет к нему единицу и помещает результат сложения обратно в стек.
push 5
inc
Такой же принцип работы у следующих инструкций:
- dec - вычитание единицы
- not - битовая операция НЕ
- Выгружает два числа из стека, складывает их и помещает результат сложения обратно в стек.
push 5
push 10
add
Такой же принцип работы у следующих инструкций:
- sub - вычитание
- mul - умножение
- div - целочисленное деление
- mod - деление с остатком
- shr - битовый сдвиг вправо
- shl - битовый сдвиг влево
- xor - битовая операция Исключающее ИЛИ
- and - битовая операция И
- or - битовая операция ИЛИ
- Выгружает одно число = N из стека и загружает в стек N-ое количество нулей.
push 5
allc
- Выгружает одно число = N из стека и перемещает чтение памяти программы на N-ую позицию.
push label_name
jmp
- Выгружает три числа = X, Y, N из стека, сравнивает числа X и Y, и если числа равны, то перемещает чтение памяти программы на N-ую позицию.
push 5
push 5
push label_name
je
Такой же принцип работы у следующих инструкций:
- jl - если X < Y
- jg - если X > Y
- jle - если X <= Y
- jge - если X >= Y
- jne - если X != Y
- Выгружает одно число = N из стека и интерпретирует данное число как адрес стека, после чего из полученного адреса копирует число и загружает его в стек. Если число положительное, то выгрузка числа будет происходить с начала стека. Если число отрицательное, то выгрузка числа будет происходить с конца стека.
push -1
load
- Выгружает два числа = N, L из стека и интерпретирует данные числа как адреса в стеке, после чего копирует число из полученного адреса N в адрес L.
push -1
push -4
stor
- Принудительно прекращает выполнение программы.
hlt
- Работает в паре с инструкцией jmp. Выгружает из стека число = N, загружает в стек текущую позицию в памяти программы и перемещает чтение памяти программы на N-ую позицию.
- При окончании процедуры, должна произвестись инструкция jmp, чтобы вернуться на место вызова процедуры. Обязательным условием является критерий возврата, при котором размер стека на входе в процедуру должен быть равен размеру стека на выходе из процедуры.
push 5
push add10
call
hlt
labl add10
push -2
load
push 10
add
push -1
push -3
stor
pop
jmp