2009-08-20 11 views
8

Ich bin sehr neu in dem Konzept, einen Assembler zu schreiben, und selbst nachdem ich eine Menge Material gelesen habe, habe ich immer noch Schwierigkeiten, meinen Kopf um ein paar Konzepte zu wickeln.Einen Z80-Assembler schreiben - ASM lexieren und einen Parsing-Baum mithilfe der Komposition erstellen?

  1. Was ist der Prozess, um eine Quelldatei tatsächlich in Token aufzuteilen? Ich glaube, dass dieser Prozess lexing genannt wird, und ich habe Hochs und Tiefs nach einem echten Code-Beispiele gesucht, die Sinn machen, aber ich kann nichts so einfach, Code-Beispiele sehr willkommen finden;)

  2. Beim Parsen tut müssen Informationen jemals den Baum hinauf oder hinunter geführt werden? Der Grund, warum ich frage ist wie folgt nehmen:

    LD BC, nn

Es muss in den folgenden Parsing-Baum einmal (???)

___ LD ___ 
    |  | 
BC  nn 

Jetzt Token versehen gedreht werden Wenn dieser Baum durchquert wird, braucht es die folgenden Maschinencode zu erzeugen:

01 n n 

Wenn der Befehl gewesen war:

LD DE,nn 

Dann müsste der Ausgang sein:

11 n n 

Was bedeutet, dass es die Frage aufwirft, ist die LD-Knoten Rückkehr etwas anderes auf der Grundlage der Operanden oder ist es die Operanden, der etwas zurückgibt? Und wie wird das erreicht? Einfachere Codebeispiele wären hervorragend, wenn es die Zeit erlaubt.

Ich bin am meisten daran interessiert, einige der rohen Prozesse hier zu lernen, anstatt sich die fortgeschrittenen existierenden Werkzeuge anzuschauen. Bitte denken Sie daran, bevor Sie mich an Yacc oder Flex schicken.

Antwort

8

Nun, die Struktur des Baumes Sie wirklich für wollen eine Anweisung, die wie diese aussehen würde, auf ein Register und einen Speicher Adressierungsart involing eine Offsetverschiebung und ein Indexregister arbeitet:

INSTRUCTION-----+ 
    |  |  | 
    OPCODE REG  OPERAND 
        |  | 
       OFFSET INDEXREG 

Und ja, Sie wollen Werte im Baum nach oben und unten weitergeben. Eine Methode zur formellen Spezifikation solcher Wertübergabe heißt "attribute grammars", und Sie dekorieren die Grammatik für Ihre Sprache (in Ihrem Fall, Ihre Assembler-Syntax) mit dem Wert- und die Berechnungen über diese Werte. Für mehr Hintergrund, siehe Wikipedia on attribute grammars.

In einem related question you asked, besprach ich ein Werkzeug, DMS, , die die Expression Grammatiken und Gebäude Bäume behandelt.Als Sprache Manipulation Werkzeug, DMS Gesichter genau diese gleichen oben und unten die Baum Informationsflüsse Probleme. Es sollte Sie nicht überraschen, , dass als High-End-Sprachmanipulations-Tool, kann es Attribut Grammatik Berechnungen direkt behandeln.

+1

Dies sollte veranschaulichen, welche Bäume er bauen muss, anstatt eine spezifische Z80-Instrumentierung zu finden. Ich habe in den 1980er Jahren eine Menge Z80-Assembler programmiert; Ich weiß vielleicht mehr darüber als du denkst. –

+0

Dann demonstrieren Sie Ihr Wissen. Hast du einen Z80 Assembler geschrieben? Ich habe nicht, aber ich habe 8080 und 6809 Assembler geschrieben, und Ihr Rat scheint mir völlig falsch zu sein. –

+0

Ihre Erfahrung ist wahrscheinlich anders als meine. Ich habe Assembler für die Collins 8311 (ca. 1968), eine 12- und 16-Bit-Maschine, die es nicht kommerziell gemacht hat, also nicht von ihnen gehört, Mikrocode-Assembler und den 6809-Assembler, den Sie in der anderen Nachricht gesehen haben. Ich habe auch eine Vielzahl von Compiler-Frontends gebaut (siehe meine Bioinformationen und Website). Meine frühen Monteure wurden mit Ad-hoc-Mitteln gebaut und arbeiteten. Stuff seit den 80er Jahren habe ich mit Lexer und Parsern gebaut, weil es viel einfacher zu spezifizieren, zu pflegen, zu erweitern, Sie nennen es. –

5

Es ist nicht notwendig, einen Syntaxbaum zu erstellen. Z80 Op-Codes sind sehr einfach. Sie bestehen aus dem Op-Code und 0, 1 oder 2 Operanden, getrennt durch Kommas. Sie müssen nur den Opcode in die (maximal 3) Komponenten mit einem sehr einfachen Parser aufteilen - es wird kein Baum benötigt.

+0

Wie verhält es sich mit relativen Speicheradressen? Sicherlich wird dafür eine Art symbolischer Baum benötigt? vielleicht sogar eine Tabelle – Darknight

+0

Der Fragesteller fragte nach dem Parsen der OP-Codes. Sie benötigen sicherlich eine Symboltabelle, die Ihnen beim Erstellen der tatsächlichen Maschinencodeausgabe des Assemblers hilft, aber das ist ein ganz anderes Problem. –

+0

@Darknight: Wäre es immer noch nicht möglich, einen Syntaxbaum zu erstellen. Zum Beispiel könnten andere Vorkommen eine Rolle spielen, wie hier einige ASM-Code-Strings, die Variationen in der Syntax haben: Labels, Kommentare, Klammern, Globale Variablen, .DB, .DS, .DW Würden diese nicht auch werden vereinfacht, wenn ein Syntaxbaum verwendet wurde? @Neil: Könnten Sie näher ausführen? Grüße, GP –

3

Eigentlich haben die Opcodes keine Byte-Basis, sondern eine oktale Basis. Die beste Beschreibung, die ich kenne, ist DECODING Z80 OPCODES.

+0

Ya, direkt an. Octal lässt Sie direkt übersetzen, und ein rekursiver Aufruf kann mit den Offset-Registern umgehen. Man muss überhaupt keinen Syntaxbaum erstellen. Jede Anweisung und direkt zugeordnet werden. – EvilTeach