Это очень интересный вопрос. Существуют миллионы наборов инструкций, но только несколько очень часто используемых.
Первое, на что я посмотрю, это происхождение и предполагаемое использование. Если вы подозреваете, что он был разработан в США, вы, в первую очередь, будете ориентироваться на процессоры, например, на английском языке. Если он был разработан в Азии, то есть ряд процессоров, которые они используют для массово выпускаемых устройств, которые американские инженеры редко видят. Даже в Европе есть несколько процессоров, которые встречаются чаще других.
Затем я бы посмотрел на размер и функциональность кода (если вы знаете, что код в некоторой степени делает). Если это несколько мегабайт кода, вы можете в значительной степени сбрасывать со счетов большинство встроенных 8-битных процессоров и начать смотреть на большие устройства с внешней памятью. Если он составляет несколько килобайт или меньше, вместо этого вам следует сосредоточиться на более дешевых и дешевых устройствах. Если функциональность проста, это может быть даже код для четырехбитного процессора.
На данный момент стоит посмотреть на структуру памяти. Там, скорее всего, будет раздел программы и раздел данных как минимум. Если это бинарный файл (по сравнению с Intel hex или записями Motorola), у вас мало информации о том, где в памяти находятся определенные куски данных. Шестнадцатеричный редактор может показывать некоторые шаблоны. Если он записан в формате hex или s, вы можете получить больше информации о структуре памяти процессора, для которого он предназначен. Некоторые процессоры сбрасываются в ячейку памяти программы 0, некоторые в самую верхнюю ячейку памяти. Программа может содержать начальные значения EEPROM в отдельной ячейке памяти. Если он предназначен для безопасного процессора (как используется в банковском деле), он может даже иметь ключи безопасности для нечетного места в памяти.
В зависимости от языка, на котором он был запрограммирован, у вас могут быть некоторые дополнительные подсказки. Если он был запрограммирован на C или аналогичном процедурном языке, то функции почти всегда будут начинаться с последовательности инструкций для сохранения определенных регистров в стек (много нажатий), а затем перед возвратом множества всплывающих окон для возврата исходных значений из стека. , Если вы сможете выполнить какое-то распознавание паттернов, вы найдете множество этих последовательностей повсюду и сможете определить, какие инструкции, скорее всего, являются командами push / pop, return и т. Д., Что может немного сузить ваш выбор.
Если это встроенное устройство с прерываниями, оно может иметь таблицу векторов прерываний, которая будет выглядеть как набор переходов в разные области памяти, все в большом блоке, вероятно, в удобном месте (например, адрес 0x ??? 0) , Таблицы перехода используются где-то еще и для других вещей, но если вы можете найти последовательность инструкций, которые выглядят одинаково, за исключением того, к какому адресу будет переходить, вы могли бы вывести, как выглядит инструкция перехода, и снова сузить ваш выбор вниз.
На этом этапе я бы начал с самых распространенных процессорных архитектур и посмотрел, что-нибудь коррелирует. x86, arm, mips, 8051, avr, pic, powerpc, Z80, 68k, 6502 и т. д., и т. д. и т. д. Существуют списки распространенных процессоров и наборов инструкций - по крайней мере, в англоговорящем мире - которые могут оказаться полезными.
Мне неизвестны какие-либо автоматизированные инструменты, которые могли бы помочь с этим, но MAME эмулирует множество процессорных архитектур, и один из возможных способов - запустить код через несколько процессоров и посмотреть регистры, чтобы увидеть, щелкает ли что-нибудь в соответствии с тем, что Вы знаете о дизайне.