2012-03-24 4 views
4

Gibt es eine gute Referenz zum Schreiben von Code in x86-Assembly. Ich schreibe einen Compiler und ich bin gerade in der Code-Generierungsphase. Die Sprache, die ich implementiere, ist Objektorientiert. Zum Beispiel habe ich jetzt Probleme beim Schreiben von Assemblys für Klassendeklarationen, Objektlayouts etc ... Gibt es ein Buch oder eine Referenz, die dieses Thema behandeln?Codierung in x86 - Compilercode-Generierung

+1

Ihre Frage ist ein groß vage. Es sollte keine Assembly für Klassendeklarationen oder Objektlayouts geben. –

+2

Vielleicht können Sie den [clang/llvm] (http://llvm.org/) Quellcode lesen? Nach meiner Erfahrung war es sehr einfach zu verstehen. –

+0

Was meinst du mit keiner Assembly für Klassendeklarationen? Was passiert, wenn ich eine Klasse mit mehreren Methoden und Feldern habe? Wenn ich nicht die Methoden in Assembly codiere, wo/wann wird das deklariert, wenn sie später benutzt werden? –

Antwort

2

Die architecture reference documentation ist Ihre beste Wette.

Erwarten Sie jedoch keine Hilfe für Klassendeklarationen oder vieles für Objektlayouts. Die zu kompilierende Sprachspezifikation würde etwas davon haben, aber der Maschinencode, der für Klassendeklarationen erzeugt wird, ist sehr lose an die Sprache gekoppelt und ist weitgehend eine Wahl des Implementierers, nicht der CPU-Architektur.

+0

Können Sie bitte genauer sein, zum Beispiel gibt es eine Referenz, die erklärt, wie Methoden Verzögerungen in Assembly usw. übersetzt werden ... das wäre toll –

+0

@MikeG: Methodendeklaration Übersetzung zu Code ist keine CPU-Architektur Problem, was ist die Dokumente sind für. Der Job eines Compiler-Schreibers besteht darin, einen Code zu erstellen, der Quellcode in Objektcode kompiliert. Da Sie sich für die Aufgabe entschieden haben, einen Compiler zu schreiben, erwarten wir, dass Sie * bereits * verstehen, wie man Parse-Bäume aus der Quelle generiert und diese in Pseudobefehle (oder echte Anweisungen) umsetzt, die auf eine bestimmte Architektur abzielen. – wallyk

+1

@MikeG: Wie schon gesagt, Sachen wie das Auslegen von Stapelrahmen; Setzen von Argumenten auf den Stapel für Methodenaufrufe; und wie Felder, Dispositionstabellenzeiger usw. in Speicherobjekten angeordnet werden, sind nicht an einen Befehlssatz gebunden. Es gibt nur einen Weg, es zu tun. Du solltest in das Drachenbuch schauen. – blackcompe

0

Es kann "direkte" und "nützliche" Antworten auf Ihre Frage geben, die wahrscheinlich nicht kompatibel sind.

Die direkte Antwort ist, dass Sie Architekturreferenz (siehe Link in der vorherigen Antwort) mit Details des genauen Assemblers kombinieren sollten, den Sie dafür ausgewählt haben - z. Gas, Nasm, Yasm, Fasm, Masm [32], Tasm usw .; sie haben alle Referenzen auf Befehlssyntax, Pseudoinstruktionen (wie Segmentierung, Speicherzuweisung, etc.), Implementierungsdetails, Objektdateiformat ...

Die nützliche (jIMHO) Antwort ist das Duplizieren von Ergebnissen von Branchenführern, wie GNU Compiler-Sammlung, Microsoft Developer Studio, etc. erfordert Tausende von Mann Jahren, so ist dies ziemlich komisch; Stattdessen sollten Sie bestehende Maßnahmen so weit wie möglich wiederverwenden. Um beispielsweise das Konzept Ihrer Sprache zu überprüfen, können Sie Konverter in C-Code implementieren und dafür eine Bibliothek unterstützen. Oder schreiben Sie für eine bekannte virtuelle Maschine und ihre Sprache als Java oder C#. Auf fortgeschrittener Ebene können Sie das Compiler-Frontend durch Ihr eigenes ersetzen (wie GCC und LLVM erlauben) und ihre Code-erzeugenden Backends wiederverwenden, die gut geschrieben und auf mehrere Ziele abgestimmt sind.

Ich bezweifle ziemlich, dass Sie etwas entwerfen, das nicht in C konvertiert werden kann und Bibliotheksaufrufe unterstützt. Der Zwischencode soll nicht gut aussehen, er soll einfach funktionieren.

Wenn Sie noch Sonnenuntergang wollen manuell tun, bearbeiten Sie bitte die Frage mit mehr Details zu Zielplattform (Windows/Linux/etc., 16- 32- oder 64-Bit ...)