Disassembler programmieren
-
Ich möchte einen Disassembler für den Prozessor meiner Uhr programmieren.
Hier ist ein Ausschnitt aus dem Code:
byte=*pAdrC; ilength=1; if(byte/16 <= 0xA) { switch (byte/16) { case 1: mnemonic="movb"; sprintf2(operand, "d_,(a_)", (byte%16)/4, byte%4); break; case 3: mnemonic="movbu"; sprintf2(operand, "(a_),d_", (byte%16)/4, byte%4); break; case 9: mnemonic="add"; sprintf2(operand, "d_,d_", (byte%16)/4, byte%4); break; case 8: mnemonic="mov"; if((byte%16)/4 != byte%4) sprintf2(operand, "d_,d_", (byte%16)/4, byte%4); else { sprintf2(operand, "#8,d_", *(pAdrC+1), byte%4); ilength=2; } break; case 0xA: mnemonic="sub"; sprintf2(operand, "d_,d_", (byte%16)/4, byte%4); break;
Ich bräuchte dann insgesamt über 160 case's. Ich frage mich ob man das nicht effektiver machen könnte. Ich möchte in das Programm auch noch einen Assembler einbauen. Es wäre also praktisch wenn ich nur eine Datenbank hätte, die von Disassembler und Assembler gemeinsam benutzt werden kann.
[ Dieser Beitrag wurde am 26.01.2003 um 21:44 Uhr von DrZoidberg editiert. ]
-
ja klar wie wärs z.b. mit nem array von klassen die daten zum opcode enthalten... dann kannst du die zahlen einfach als index benutzen...
-
Es gibt einmal von z0mbie und einmal von underx eine length disassembler engine. Diese Engine gibt nicht direkt Informationen über den Opcode wieder (bei der von Underx bin ich mir sicher, bei Z0mbies ist das glaube ich schon wieder ein wenig anders. Z0mbie hat glaube ich auch eine richtige disasm engine geschrieben). Eine Length Disassembler Engine gibt nur die Länge des Opcodes wieder was aber auch sehr hilfreich ist. Die von Underx ist nur 408 bytes groß und kann sogar FPU und MMX Instruktionen verarbeiten (Segment- und andere Präfixe sind auch kein Problem). Such mal in Google nach "Z0mbie" (man beachte die Null statt dem O ;)). Die Engine von Underx ist noch unveröffentlich. Da könnte ich höchstens für dich fragen. Ist übrigens alles in Assembler geschrieben, kann aber extern eingebunden werden.
-
Es sollte aber kein disassembler für x86 sein, sondern einer für den panasonic Prozessor aus meiner Uhr.
-
also ich würde mir eine Datei schreiben in der folgende Informationen stehen:
Befehlsbyte
Länge des Befehls in Byte
Anzahl der Parameter
ausgeschriebenes mnemonicDie Datei liest Du als Tabelle ein und rödelst dein Prog byte für Byte durch.
cYa
DjR