Das ist eine sehr interessante Frage. Es gibt Millionen von Anweisungen, aber nur eine Handvoll sehr häufig verwendeter.
Das erste, was ich mir ansehen möchte, ist die Herkunft und die beabsichtigte Verwendung. Wenn Sie es wurde vermuten , entworfen in den USA, dann würden Sie in erster Linie Prozessoren mit Datenblatt in englischer Sprache verfügbar sein Targeting, zum Beispiel. Wenn es in Asien entwickelt wurde, gibt es eine Reihe von Prozessoren, die von US-Ingenieuren nur selten für Massenprodukte verwendet werden. Sogar in Europa gibt es einige Prozessoren, die üblicher sind als andere.
Ich würde dann einen Blick auf die Codegröße und -funktionalität werfen (vorausgesetzt, Sie wissen, was der Code zu einem gewissen Grad tut). Wenn es sich um ein paar Megabyte Code handelt, können Sie die meisten eingebetteten 8-Bit-Prozessoren billiger einsetzen und größere Geräte mit externem Speicher in Betracht ziehen. Wenn es ein paar Kilobyte oder weniger sind, sollten Sie sich stattdessen auf kleinere, billigere Geräte konzentrieren. Wenn die Funktionalität einfach ist, kann es sich sogar um Code für einen Vier-Bit-Prozessor handeln.
An dieser Stelle lohnt es sich, die Speicherstruktur zu betrachten. Es wird wahrscheinlich mindestens einen Programmabschnitt und einen Datenabschnitt geben. Wenn es sich um eine Binärdatei handelt (im Vergleich zu Intel Hex oder Motorola S Record), wissen Sie nicht genau, wo bestimmte Datenblöcke im Speicher abgelegt werden. Ein Hex-Editor kann einige Muster anzeigen. Wenn es sich um ein hexadezimales oder s-Datensatzformat handelt, verfügen Sie möglicherweise über weitere Informationen zur Speicherstruktur des Prozessors, für den es bestimmt ist. Einige Prozessoren werden am Programmspeicherplatz 0 zurückgesetzt, andere am höchsten Speicherplatz. Das Programm kann EEPROM-Anfangswerte an einem separaten Speicherort enthalten. Wenn es für einen sicheren Prozessor gedacht ist (wie er im Bankgeschäft verwendet wird), verfügt es möglicherweise sogar über Sicherheitsschlüssel für einen ungeraden Speicherort.
Abhängig von der Sprache, in der es programmiert wurde, haben Sie möglicherweise einige zusätzliche Hinweise. Wenn es in C oder einer ähnlichen prozeduralen Sprache programmiert wurde, beginnen die Funktionen fast immer mit einer Abfolge von Anweisungen zum Speichern bestimmter Register im Stapel (viele Pushs), bevor unmittelbar vor dem Zurückgeben vieler Pops die ursprünglichen Werte vom Stapel zurückgegeben werden . Wenn Sie eine Mustererkennung durchführen können, werden Sie durchgehend viele dieser Sequenzen finden und möglicherweise feststellen können, welche Anweisungen wahrscheinlich Push- / Pop-Anweisungen, Return-Anweisungen usw. sind, was Ihre Auswahl etwas einschränken könnte.
Wenn es sich um ein eingebettetes Gerät mit Interrupts handelt, verfügt es möglicherweise über eine Interrupt-Vektortabelle, die wie ein Haufen von Sprüngen zu verschiedenen Speicherorten in einem großen Block aussieht, wahrscheinlich an einem geeigneten Ort (Adresse 0x ??? 0 zum Beispiel). . Sprungtabellen werden an anderer Stelle auch für andere Zwecke verwendet. Wenn Sie jedoch eine Abfolge von Anweisungen finden können, die bis auf die Adresse, zu der gesprungen werden soll, identisch aussehen, können Sie möglicherweise ableiten, wie eine Sprunganweisung aussieht, und sie erneut eingrenzen Ihre Entscheidungen nach unten.
An diesem Punkt würde ich mit den gebräuchlichsten Prozessorarchitekturen beginnen und prüfen, ob irgendetwas korreliert. x86, arm, mips, 8051, avr, pic, powerpc, Z80, 68k, 6502 usw. usw. Es gibt Listen gängiger Prozessoren und Befehlssätze - zumindest im englischsprachigen Raum -, die sich als hilfreich erweisen könnten.
Mir sind keine automatisierten Tools bekannt, die dabei helfen könnten, aber MAME emuliert eine Vielzahl von Prozessorarchitekturen. Eine mögliche Methode besteht darin, den Code durch eine Reihe von Prozessoren zu führen und die Register zu überwachen, um festzustellen, ob die gewünschten Klicks vorliegen Sie kennen das Design.