Эффективный алгоритм разбора опкодов

Допустим, я пишу виртуальную машину. Я читаю в программе данные в массив байтов. Теперь мне нужно пройтись по этим байтам (инструкции состоят из двух байтов) и создать экземпляр небольшого класса, представляющего каждую инструкцию и ее аргументы.

Каким будет быстрый подход к синтаксическому анализу? Вот два способа, о которых я подумал:

  1. Логическое разветвление путем проверки каждого бита слева направо, пока я не сужу его до определенного кода операции. Это будет похоже на бинарный поиск.
  2. Проверка некоторых программ для составления списка кодов операций, упорядоченных по частоте использования, а затем проверка полного кода операции в этом порядке.

Примечание. Для проверки я буду использовать сдвиг битов и маскирование в C, а не регулярные выражения или строковые композиции или что-то в этом роде.


person Josh Pearce    schedule 14.06.2013    source источник
comment
Часто коды операций имеют красивый узор из нескольких небольших полей. Например, поле, идентифицирующее определенную группу кодов операций, которые имеют одинаковую структуру полей, за которыми следуют поля, следующие за структурой, характерной для этой группы (с указанием конкретной операции и операндов и т. д.). Также могут быть подгруппы. Обычно вы можете использовать это, чтобы сделать несколько вложенных switches, не получая огромной перегрузки случаев. У вас есть ссылка на описание этой ВМ?   -  person harold    schedule 14.06.2013
comment
АВР. В середине страницы Izotech красиво их размещает. avrfreaks.net/   -  person Josh Pearce    schedule 14.06.2013
comment
Хорошо, это не так уж плохо, декодирование по полям должно хорошо работать на этом   -  person harold    schedule 14.06.2013


Ответы (1)


Вам не нужно ничего разбирать. Если это в C, вы создаете таблицу указателей функций, в которой есть 256 записей, по одной для каждого возможного значения байта, а затем переходите к соответствующей функции на основе первого значения байта. Если второй байт имеет значение, то внутри функции можно использовать оператор switch для обработки второго байта. Так работал оригинальный интерпретатор Visual Basic (версии 1-6).

person Tyler Durden    schedule 14.06.2013