Итак, я пытаюсь создать программу, которая имитирует 8-битный процессор на C ++, и я специально нахожу препятствие на той части, где процессор выбирает следующую инструкцию из памяти. (не настоящий процессор, хотя набор инструкций основан на 6502). Этот проект является чисто компьютерным упражнением, с которым я не слишком знаком.
У меня есть функция fetchInst(location)
, который принимает адрес памяти (как в индексе для имитируемого массива памяти ЦП, а не фактический указатель C ++) и возвращает объект структуры, который включает в себя код операции, режим адресации и, в идеале, список операндов, которые являются отношение к инструкции.
Проблема в том, что каждая операция требует различного набора операндов, и даже это зависит от режима адресации. Например, для одной инструкции может потребоваться только одно 8-разрядное целое число в качестве операндов, в то время как для другой команды может потребоваться, например, два 8-разрядных целых числа и 16-разрядное целое число для своих операндов.
по существу организация произвольных двоичных данных инструкции, например
1011011110101000100011100011011011100001
, в массив дискретных операндов, с которыми легче работать, например
opcode operand
[10110111], [10101000]
или
opcode operand operand operand
[10110111], [10101000], [10001110], [0011011011100001]
в зависимости от режима работы и адресации я не знаю, как это сделать эффективно.
Теоретически, наивным решением было бы дать исполняющей функции наибольшее число байтов после кода операции, которое она когда-либо могла нужно (вероятно, около 5), и полагаться на код выполнения для анализа операндов из необработанных байтовых данных, которые он дает, что может сработать, но я сильно сомневаюсь, что это самое эффективное решение.