Skip to content

Latest commit

 

History

History
132 lines (118 loc) · 5.48 KB

DOCS.md

File metadata and controls

132 lines (118 loc) · 5.48 KB

Документация

Stack-based virtual machine.

Размер инструкций в памяти программы

  • Все инструкции занимают 1 байт памяти, за исключением инструкции push, которая занимает 5 байт памяти (1 байт сама инструкция + 4 байта аргумент инструкции).
  • Псевдоинструкции не занимают памяти вовсе.

Псевдоинструкция labl

  • Принимает в качестве аргумента строку
  • Участвует только при компиляции ассемблерного кода и не участвует в выполнении самой программы.
  • Создаёт именованную область памяти на месте которой данная метка ставится.
labl label_name

Псевдоинструкция ;

  • Комментарий.
; это комментарий

Инструкция push

  • Загружает в стек целое число. Если в качестве аргумента выступает имя метки, то берётся её адрес и также загружается в стек.
push 5
push -5
push label_name

Инструкция pop

  • Выгружает одно число из стека. Иными словами удаляет последнее число в стеке.
pop

Инструкция inc

  • Выгружает одно число из стека, прибавляет к нему единицу и помещает результат сложения обратно в стек.
push 5
inc

Такой же принцип работы у следующих инструкций:

  • dec - вычитание единицы
  • not - битовая операция НЕ

Инструкция add

  • Выгружает два числа из стека, складывает их и помещает результат сложения обратно в стек.
push 5
push 10
add

Такой же принцип работы у следующих инструкций:

  • sub - вычитание
  • mul - умножение
  • div - целочисленное деление
  • mod - деление с остатком
  • shr - битовый сдвиг вправо
  • shl - битовый сдвиг влево
  • xor - битовая операция Исключающее ИЛИ
  • and - битовая операция И
  • or - битовая операция ИЛИ

Инструкция allc

  • Выгружает одно число = N из стека и загружает в стек N-ое количество нулей.
push 5
allc

Инструкция jmp

  • Выгружает одно число = N из стека и перемещает чтение памяти программы на N-ую позицию.
push label_name
jmp

Инструкция je

  • Выгружает три числа = 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

Инструкция load

  • Выгружает одно число = N из стека и интерпретирует данное число как адрес стека, после чего из полученного адреса копирует число и загружает его в стек. Если число положительное, то выгрузка числа будет происходить с начала стека. Если число отрицательное, то выгрузка числа будет происходить с конца стека.
push -1
load

Инструкция stor

  • Выгружает два числа = N, L из стека и интерпретирует данные числа как адреса в стеке, после чего копирует число из полученного адреса N в адрес L.
push -1
push -4
stor

Инструкция hlt

  • Принудительно прекращает выполнение программы.
hlt

Инструкция call

  • Работает в паре с инструкцией 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