Це дуже цікаве питання. Є мільйони інструкцій, але лише кілька дуже часто використовуваних.
Перше, на що я звернув увагу, - це походження та призначення. Якщо ви підозрюєте, що він був розроблений у США, ви орієнтуєтесь в основному на процесори з таблицями даних, наприклад, англійською мовою. Якщо він був розроблений в Азії, то існує ряд процесорів, які вони використовують для серійних пристроїв, які американські інженери рідко бачать. Навіть у Європі є кілька процесорів, які є більш поширеними, ніж інші.
Тоді я би поглянув на розмір та функціональність коду (якщо припустити, що ви знаєте, що код робить певною мірою). Якщо це кілька мегабайт коду, ви можете значно знизити більшість вбудованих 8-бітових процесорів і почати дивитися на більші пристрої із зовнішньою пам'яттю. Якщо це кілька кілобайт або менше, то замість цього ви хочете зосередитись на менших, дешевших пристроях. Якщо функціональність проста, це може бути навіть код для чотирибітного процесора.
У цей момент варто переглянути структуру пам'яті. Там, швидше за все, є розділ програми та розділ даних як мінімум. Якщо це двійковий файл (порівняно з шестигранним інтелектуальним записом чи записом Motorola), то ви мало розумієте, де в пам'яті розміщуються певні шматки даних. Шестнадцятковий редактор може показати деякі шаблони. Якщо він надходить у шістнадцятковий або s формат запису, у вас може бути додаткова інформація про структуру пам'яті процесора, для якого він призначений. Деякі процесори скидаються на місце пам'яті програми 0, а деякі - на найвищому місці. Програма може включати початкові значення EEPROM в окремому місці пам'яті. Якщо він призначений для захищеного процесора (як це використовується в банківській справі), він може мати навіть ключі безпеки для непарного місця пам'яті.
Залежно від мови, на якій було запрограмовано, у вас можуть з’явитися додаткові підказки. Якщо він був запрограмований на C або подібній процедурній мові, то функції майже завжди починатимуться з послідовності інструкцій для збереження певних регістрів у стек (багато натискань), то прямо перед поверненням безлічі спливаючих вікон, щоб повернути початкові значення зі стека . Якщо ви можете виконати деяке розпізнавання шаблонів, ви знайдете безліч цих послідовностей на протязі, і, можливо, зможете визначити, які вказівки, швидше за все, інструкції push / pop, повернення тощо, що може трохи зменшити ваш вибір.
Якщо це вбудований пристрій з перериваннями, він може мати векторну таблицю переривань, яка буде схожа на купу стрибків у різні місця пам'яті, все у великому блоці, ймовірно, у зручному місці (наприклад, 0x ??? 0) . Таблиці стрибків використовуються і в інших місцях для інших речей, але якщо ви зможете знайти послідовність інструкцій, які виглядають однаково, за винятком того, яким буде адреса, до якої слід перейти, ви зможете зробити висновок про те, як виглядає інструкція про стрибок, і знову звузити ваш вибір знижений.
У цей момент я почав би з найбільш поширених архітектур процесорів і побачив, чи щось корелює. x86, arm, mips, 8051, avr, pic, powerpc, Z80, 68k, 6502, і т. д., і т. д. і т. д. Існують переліки загальних процесорів та наборів інструкцій - принаймні в англомовному світі - які можуть виявитися корисними.
Мені невідомі будь-які автоматизовані інструменти, які допомогли б у цьому допомогти, але MAME наслідує дуже багато архітектур процесорів, і один із можливих методів - запускати код через декілька процесорів і дивитися регістри, щоб побачити, чи щось клацне відповідно до того, що ви знаєте про дизайн.