Skip to content

Простая виртуальная машина фон Неймана

Notifications You must be signed in to change notification settings

eshlykov/virtual-machine

Repository files navigation

Виртуальная машина фон Неймана

Описание языка

Синтаксис

<программа> =
  strings
    <описание строки>*
  .
  labels
    <описание метки>*
  .
  functions
    <описание функции>*
  .
  commands
    <описание команды>*
  .

<описание строки> =
  <идентификатор> <текст></n>

<описание метки> =
  <идентификатор>

<описание функции> =
  function <идентификатор>
    <программа>

<описание команды> =
  <print> | <read> | <push> | <pop> | <move> | <if> | <call> | <equal> | <add> | <subtract> | <return> | <pushaddr> | <exit> | <label> | <str>

<print> = print ( <регистр> | <число> )
<read> = read
<push> = push ( <регистр> | <число> )
<pop> = pop
<move> = move ( <регистр> | <число> ) <регистр>
<if> = if ( <регистр> | <число> ) <идентификатор>
<call> = call <идентификатор>
<equal> = equal ( <регистр> | <число> ) ( <регистр> | <число> )
<add> = add ( <регистр> | <число> ) ( <регистр> | <число> )
<subtract> = subtract ( <регистр> | <число> ) ( <регистр> | <число> )
<return> = return
<pushaddr> = pushaddr
<exit> = exit
<label> = label <идентификатор>
<str> = str <идентификатор>

<регистр> = reg1 | reg2 | reg3 | reg4 | reg5 | reg6 | reg7 | res
<число> = [0-9]+
<идентификатор> = [0-9a-z]+
  • Все идентификаторы строк различны, все идентификаторы меток различны, все идентификаторы функций различны.
  • Все идентификаторы, используемые в описании команд, определены в блоках strings, labels, functions.
  • Команда label определяет метоположении метки, и оно не более чем единственное для каждой метки.

Описание команд

Команды read, pop, equal, add и subtract возвращают некоторый результат, который записывается в регистр res. Остальные функции не влияют на регистры.

  • print — выводит значение (в регистре или число) на экран
  • read — считывает число с клавиатуры
  • pop — удаляет значение с вершины стека и возвращает полученное значение, вершину стека сдвигает влево
  • push — кладет значение на вершину стека, сдвигает вершину вправо
  • move — кладет значение в регистр
  • if — если значение не равно 0, то делает переход по метке
  • call — вызов функции
  • equal — возвращает 1, если два значения равны, и 0 иначе
  • add — складывает два числа
  • subtract — вычитает второе число из первого; важно, чтобы второе не было больше
  • return — завершает вызов функции
  • pushaddr — кладет на вершину стека указатель на текущую команду (то есть pushaddr) плюс две
  • exit — завершает выполнение программы; возможно использование внутри функции
  • label — указывает местоположение метки; при переходе по этой метки выполнение начнется со следующей команды
  • str — выводит на экран строку

Ограничения

  • Все числа являются целыми неотрицательными, максимальное возможное число — 2147483647.
  • От криво написанной программы запрещается ожидать чего-то конкретного.

Правила написания работающих программ

  • В конце функции обязательна команда return.
  • В конце всей программа обязательная команда exit.
  • Непосредственно перед командной call должна быть выполнена команда pushaddr.

Остальное на вкус программиста.

About

Простая виртуальная машина фон Неймана

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published