Wie kann ich umwandeln Intel 80386 Maschinencode zu Assembler?
Ich habe die folgende Aufgabe:
Betrachten Sie die folgende Sequenz von hexadezimal-Werte:
55 89 E5 83 EC 08 83 E4 F0 31 C9 BA 01 00 00 00 B8 0D 00 00 00 01 D1 01 CA 48 79 F9 31 C0 C9 C3
Diese Sequenz von bytes repräsentiert einen Intel-80386-Unterprogramm in Maschinensprache, die in 32-bit-Modus.
Wenn die Anweisungen in diesem Unterprogramm ausgeführt werden, lassen Sie die Werte in die Register %ecx und %edx. Was sind die Werte?
Was ist das Programm in C, führt die Berechnung erfolgt durch das Unterprogramm, und gibt dann die Werte berechnet, die durch dieses Programm, %ecx und %edx, wie Sie erscheinen würden am Ende der Ausführung der subroutine.
Als ich nicht die 80386-Befehlssatz auswendig kann, muss ich zuerst konvertieren Sie diese opcode-bytes in Ihre assembly-Sprache mnemotechnische Mittel. So gibt es eine online-Referenz irgendwo ein mapping-Tabelle hex-Werte Instruktionen oder wie? Ich habe auf den Webseiten von Intel, konnte aber nichts finden. Oder gibt es eine bessere Methode zur Entschlüsselung dieser...?
InformationsquelleAutor Ray | 2010-01-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während Sie könnte cheat und verwenden Sie einen dissassembler (ein disassembler wäre nicht sehr viel beim lernen helfen), würde ich empfehlen, tatsächlich lernen etwas durch Lesen der relevanten Kapitel in der Intel-80386-Handbuch. Beginnen Sie mit Kapitel 17. Wenn Sie stecken bleiben, kommen Sie zurück zu StackOverflow und poste eine Frage die Angabe genau, wie weit Sie es gebracht haben und was Sie nicht verstehen.
Ja, es ist Betrug, wenn Sie versuchen, zu verstehen Maschine opcodes/Ihre Kodierungen und übersetzungen zu höheren Sprachen (opcode -> Montage -> C). Wenn der einzige Zweck der Aufgabe war es, zu verstehen, die Anweisungen dann wird der professor sollte begonnen haben mit Assembler nicht Maschinen-code. Das ist, warum ich glaube, dass die Absicht des Einsatzes zu erfassen, ein wenig von machine code, die ist nicht so schwierig.
Wenn ich wollte, dass meine Studenten lernen, Unterricht Codierung für eine bestimmte Architektur, ich hätte Sie gebeten, zu schreiben Sie einen disassembler, nicht decodiert Zeug von hand. Ich glaube nicht, dass jeder vernünftige Lehrer geben Hausaufgaben für den Zweck des Unterrichts-Codierung. Ich nahm an, der Zweck der Hausaufgaben war, um trace-Anweisungen. Durch die Art und Weise, die ich gewählt hätte etwas mehr eleganter sein, als x86 zu lehren und Ihnen Unterricht Codierungen. Die x86 instruction encoding ist zu Komplex, um Sie zum lernen geeignet.
Nein, ich bin nicht. Aber ich behalte mir das Recht zu äußern, ist meine persönliche Meinung und neutralisieren Dummheit (im Falle dass was Sie denken, ist der Zweck der Hausaufgabe, die ich nicht davon ausgehen, um wahr zu sein) so viel wie ich kann.
Ich hat Sie einen link, dass würde Ihnen helfen, enorm. Haben Sie sich die Mühe der Lesen es? Ich würde sagen, zumindest versuchen zu Dekodieren, die ein oder zwei Anweisungen in einem Versuch, zumindest den gain-Wert etwas mehr von der Zuordnung als ja, ich gepostet auf stackoverflow und Sie sagten download ein disassembler, aber ich habe noch nicht zu tun, weil Sie erzielte die zerlegt bytes für mich.
InformationsquelleAutor
Sollten Sie einen disassembler zu sehen, was sind die Anweisungen. Sie können schnappen Sie sich NDISASM aus der NASM-Paket. Speichern der bytes in einer Datei, und führen Sie:
Mehrdad, ich habe nicht die assembly-Datei, die nur die Befehle in Hex.
Ein hex-editor, geben Sie die hex-Werte in eine Datei. Google hex-editor für eine für Ihre Plattform.
Carroll - ich denke, Ihr Kommentar ist beleidigend und out-of-line. Sie falsch verstehen und falsch auslegen, was gesagt worden in diesem thread, wie der post mit den bytes zerlegt wurde entfernt (Danke!). Sagt mir Dinge wie "grow up" ist kindisch. Ich bin nicht gegen Hausaufgaben Fragen. Ganz im Gegenteil. Ich versuche mein bestes, um zu helfen, die OP - lernen, ohne dabei stimmte sich StackOverflow. In der Tat, ich lade ihn ein, nach zurück, uns zu erzählen, wo er bleibt am nächsten, so dass wir ihm helfen kann. In dem bemühen, zu ermutigen, zu lernen, krasse Antworten/Hilfe zu den Hausaufgaben Fragen sollte nie gegeben werden.
hier: wie Sie sehen können, mit dem disassembler lehrt zwei brand-neue, praktische Dinge für die op: hex-Editoren und disassemblern auf seine eigenen. also, es ist nicht allzu schlecht, einen disassembler zu benutzen für diese Aufgabe 😉
InformationsquelleAutor Mehrdad Afshari
Ich würde nicht mit einem disassembler, gehen Sie durch die Bedienungsanleitung und herauszufinden, was jede Gruppe von bits bedeuten könnte. Diese erhalten Sie der entsprechenden Montageanleitung. Von dort aus sollte es nicht allzu schwer sein, das dann in C. ich Stimme mit anderen poster, dass es ist ein Durcheinander, das zu tun diese Zuordnung in der x86-Architektur. So etwas wie SPARC oder MIPS wäre viel einfacher (da diese eine Feste Breite haben Anweisungen).
InformationsquelleAutor Polaris878
Gibt es eine viel einfachere Methode als diese vorgeschlagen, und ich vermute, das ist die, die der Lehrer im Sinn hat:
Decodierung der opcodes aus dem chart ist sehr, sehr mühsam, und ich würde sein überrascht, wenn das war, was beabsichtigt war.
Wahr. Gibt es ein äquivalent, interaktive assembler " - tool in *nix?
Oder die anderen Antworten werden vorausgesetzt Linux, wenn in Wirklichkeit ist es eine Solaris-Maschine 🙂
ndisasm ist tragbar und funktioniert auf Windows und Linux. Ich von Ihnen positiv bewertet werden Mehrdad Antwort.
InformationsquelleAutor egrunin
Verwenden objdump -d wenn Sie mit Unix.
InformationsquelleAutor 0fnt
x /i
muss nur die Berechtigung Lesen. Oder nutzen Sie einfach kompilieren mitgcc -zexecstack
oder setzenconst char code[] =
im globalen Gültigkeitsbereich, so wird es ein symbol in der.rodata
Abschnitt im text-segment.InformationsquelleAutor francogrex