На всякий случай, если это поможет, вот последний эмулятор процессора, который я написал на C ++. На самом деле, это единственный эмулятор, который я написал на C ++.
Язык спецификации немного своеобразен, но это вполне респектабельное, простое описание виртуальной машины, возможно, очень похожее на виртуальную машину вашего профессора:
http://www.boundvariable.org/um-spec.txt
Вот мой (несколько чрезмерно спроектированный) код, который должен дать вам некоторые идеи. Например, в инструкции Giant Switch в um.cpp показано, как реализовать математические операторы:
http://www.eschatonic.org/misc/um.zip
Возможно, вы сможете найти другие реализации для сравнения с веб-поиском, поскольку в конкурсе приняло участие множество людей (я не был одним из них: я сделал это намного позже). Хотя не так много в C ++, я думаю.
На вашем месте я бы начал хранить инструкции в виде строк, только если спецификация вашей виртуальной машины определяет операции с ними. Затем конвертируйте их в целые числа по мере необходимости, каждый раз, когда вы хотите их выполнить. Это будет медленно, но что с того? Ваша не настоящая виртуальная машина, которую вы собираетесь использовать для запуска критичных ко времени программ, и медленный переводчик по-прежнему иллюстрирует важные моменты, которые вы должны знать на этом этапе.
Вполне возможно, что виртуальная машина на самом деле определяет все в терминах целых чисел, и строки предназначены только для описания программы, когда она загружается в машину. В этом случае преобразуйте программу в целые числа в начале. Если виртуальная машина хранит программы и данные вместе с одинаковыми операциями, действующими в обоих случаях, то это путь.
Способ выбрать между ними - посмотреть код операции, который используется для изменения программы. Новая инструкция передается ей как целое число или как строка? Что бы это ни было, проще всего начать с сохранения программы в этом формате. Вы всегда можете изменить позже, когда это сработает.
В случае единой системы обмена сообщениями, описанной выше, машина определяется в терминах «пластин» с пространством для 32 бит. Очевидно, что они могут быть представлены в C ++ как 32-разрядные целые числа, поэтому моя реализация так и делает.