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