Исходная информация: В конечном счете, я хотел бы написать эмулятор реальной машины, такой как оригинальная Nintendo или Gameboy. Однако я решил, что мне нужно начать с чего-то гораздо более простого. Мой консультант/профессор информатики предложил мне спецификации очень простого воображаемого процессора, который он создал для эмуляции в первую очередь. Есть один регистр (аккумулятор) и 16 опкодов. Каждая инструкция состоит из 16 бит, первые 4 из которых содержат код операции, а остальные — операнд. Инструкции представлены в виде строк в двоичном формате, например, «0101 0101 0000 1111».
Мой вопрос: как в C++ лучше всего анализировать инструкции для обработки? Пожалуйста, помните о моей конечной цели. Вот некоторые моменты, которые я рассмотрел:
Я не могу просто обрабатывать и выполнять инструкции по мере их чтения, потому что код самомодифицируется: инструкция может изменить более позднюю инструкцию. Единственный способ обойти это, как я вижу, - сохранить все изменения и для каждой инструкции проверить, нужно ли применять изменение. Это может привести к большому количеству сравнений при выполнении каждой инструкции, что нехорошо. А так, думаю, придется перекомпилировать инструкцию в другом формате.
Хотя я мог бы разобрать код операции как строку и обработать его, бывают случаи, когда инструкция в целом должна восприниматься как число. Код операции приращения, например, может изменить даже раздел кода операции инструкции.
Если бы мне нужно было преобразовать инструкции в целые числа, я не уверен, как я мог бы анализировать только раздел кода операции или операнда в int. Даже если бы я перекомпилировал каждую инструкцию на три части, всю инструкцию как int, код операции как int и операнд как int, это все равно не решило бы проблему, так как мне, возможно, пришлось бы увеличивать целую инструкцию. а затем проанализируйте затронутый код операции или операнд. Более того, мне нужно написать функцию для выполнения этого преобразования, или есть какая-то библиотека для С++, в которой есть функция преобразования строки в «двоичном формате» в целое число (например, Integer.parseInt(str1, 2) в Java)?
Кроме того, я хотел бы иметь возможность выполнять такие операции, как сдвиг битов. Я не уверен, как этого можно добиться, но это может повлиять на то, как я реализую эту перекомпиляцию.
Спасибо за любую помощь или совет, который вы можете предложить!