★ APPLICATIONS ★ PROGRAMMATION ★ EDITOR-ASSEMBLER ★![]() |
Editor-Assembler | Applications Programmation |
Ein vollständig in BASIC geschriebener Editor-Assembler für den Schneider CPC 464, der Labels verarbeitet und relative Sprünge berechnet. Natürlich versteht er auch alle Mnemoniks in ihrer allgemein üblichen Schreibweise (maximal 650 Zeilen und 200 Label). Der Editor Die Eingabe Das zu schreibende Assemblerprogramm wird in ähnlicher Weise wie ein BASIC-Listing eingegeben, wobei die Zeilennummer lediglich dazu dient, die Reihenfolge der Befehlskürzel (Mnemoniks) festzulegen, in der sie später assembliert werden sollen. Jede Zeile enthält genau ein Mnemonik. Ist das erste Zeichen einer Eingabe eine Ziffer, wird die Eingabe als Zeile interpretiert. Die Zeilennummer darf Werte zwischen 1und 99999 haben. Auf die Zeilennummer folgt grundsätzlich das Mnemonik und danach, falls erforderlich, durch ein Leerzeichen getrennt, der oder die Operanden (zum Beispiel ,,10 LD A,2“). Die erste Zeile eines Listings muß die Assemblerdirektive ORG ( = ORIGIN) enthalten. Mit ihr wird später der Beginn des Maschinencodes festgelegt. Solange der Maschinencode nicht abgesaved wurde, hat ORG keine Funktion. Ein ,,ORG 40000“ bewirkt beispielsweise, daß der Maschinencode beim absaven so assembliert wird, daß er später bei der Adresse 40 000 beginnt. Um eine Zeile des Listings zu löschen, muß nur die zugehörige Zeilennummer eingegeben werden. Die Editor-Befehle LIST: Gebrauch wie in BASIC. Dient zum Auflisten des Assemblerlistings. ASSEMBLE: Die Mnemoniks werden der Reihe nach assembliert, das heißt, sie werden in den Maschinencode übertragen. Danach fragt er, ob das as-semblierte Listing ausgegeben werden soll. Bei Eingabe von „j'‘ steht links die hexadezimale Adresse, dann ein bis vier Byte, die Übersetzung der Mnemoniks, und dahinter die zugehörige Zeile. Andernfalls wird direkt, sonst nach dem Listing, die Labeltable ausgegeben, das heißt alle Label werden mit ihren Werten aufgelistet. RENUM: Gebrauch wie in BASIC. Dient zum Umnumerieren der Zeilennummern. RUN: Ruft ein Maschinenprogramm auf, das bei der Adresse beginnt, auf die das Label zeigt. Das ist gewöhnlich die Adresse A000hex. Befindet sich kein korrekt assemblierter Code im Speicher, wird mit der Meldung ,,Kein Code im Speicher“ unterbrochen. SAVE “Name'M: Das Assemblerlisting wird unter dem Namen ,,Name“ auf Kassette gespeichert. SAVE “Name”,c: Das Assemblerlisting wird assembliert, im Bezug auf die Startadresse, auf die die ORG-Direktive zeigt. Dann wird der Code unter dem Namen ,,Name“ auf Kassette gespeichert. LOAD “Name”: Ein Assemblerlisting mit dem Namen „Name“ wird in den Speicher geladen. Ein eventuell schon vorhandenes Listing wird dabei gelöscht. NEW: Der Editor-Assembler wird erneut mit RUN gestartet, wobei alle Information verlorengeht. BASIC: Dieser Befehl bewirkt einen Rücksprung nach BASIC. Mit der Funktionstaste 0 bzw. 1 kann man in den Assembler zurückkehren. Der Editor enthält keine EDIT-Befehl. Man kann ihn aber voll durch den Copy-Cursör ersetzen. Bei einem List-Vorgang kann das Listing durch Gedrückthalten der Taste „S“ angehalten werden. Der Assembler Der Assembler versteht alle Mnemoniks in ihrer üblichen Schreibweise. Allerdings sind einige Dinge erlaubt, die eigentlich falsch sind. Der Assembler versteht den Mnemonik aber trotzdem richtig. Die Label Ein Label ist eine Zeichenkette, der man irgendwo im Programm einen Wert zuweist. Das erste Zeichen muß ein : sein, gefolgt von bis zu zehn Zeichen (,,:LABEL“). Ein.Label kann dann an Stelle einer Zahl als Operand gebraucht werden. Um einen Label zu definieren, wird er zwischen Zeilennummer und dem zugehörigen Mnemonik eingegeben (durch ein Leerzeichen getrennt). Es gibt drei Möglichkeiten ein Label zu definieren: Gewöhnliche Label: Einem gewöhnlichen Label wird beim Assembliervorgang die aktuelle Adresse zugewiesen. EQU: Steht hinter dem Label keine Mnemonik, sondern die Assemblerdirektive EQU, dann wird dem Label der Wert zugeordnet, der im Operandenfeld von EQU steht. Dies darf kein weiteres Label sein. Bei den obigen Labeltypen darfein Label nur einmal im ganzen Assemblerlisting definiert werden. Eine Ausnahme ist der dritte Label-typ. DEFL: Wie bei EQU wird bei DEFL dem Label der Wert nach DEFL zugewiesen. Im Gegensatz zu EQU kann ein solcher Label aber im Laufe eines Listings umdefiniert werden. Dieser Labeltyp muß aber dafür schon mal definiert worden sein, bevor er verwendet wird. Label, die durch EQU oder DEFL definiert wurden, werden nicht durch das ORG-Kommando beeinflußt. In der Labeltable am Ende eines assemblierten Listing sind EQU-Label mit einem vorangestellten DEFL- Numerische Operanden Ein numerischer Operand kann folgendermaßen aus-sehen: eine Zahl: dezimal (zum Beispiel 10) = 10 hexadez. (zum Beispiel &A) = 10 binär (zum Beispiel &x1010) - 10 ein Label: zum Beispiel: LD HL,:LABEL ein String: Es wird der ASCII-Code verwertet. Zum Beispiel LD A, “B” entspricht LD A,66 LD BC, “OK” entspricht LD BC,20299 (20299 = 79 * 256 + 75) In einem Operanden darf keine Rechenoperation durchgeführt werden. Assemblerdirektiven Neben den Mnemoniks versteht der Assembler noch folgende sogenannte Assemblerdirektiven : DEFB n: Weist dem aktuellen Byte den Wert n zu. DEFW nn: Weist den aktuellen zwei Bytes die Adresse nn zu. (Übliche Reihenfolge LByte, HByte) DEFS n: Weist den folgenden n Bytes den Wert 0 zu. DEFM n: Den folgenden Bytes werden die ASCII-Werte des Strings zugewiesen. END: Bei diesem Kommando bricht der Assembler das Assemblieren ab, auch wenn noch Zeilen folgen. Relative Sprünge In ,,JR“ und ,,DJNZ“ werden relative Sprünge benutzt. Weist man ihnen statt des numerischen Operanden einen gewöhnlichen Label zu, berechnet der Assembler den relativen Sprung zu der Adresse, auf die das Label zeigt. Die Fehlermeldungen Integer out of ränge - Zeilennummer außerhalb des erlaubten Bereichs. Syntax error - Eingabe kein Kommando oder Zeile. Improper argument — Falsches Argument bei einem Mnemonik. Label too long - ein Labelname überschreitet die maximale Länge. ORG missing - die erste Zeile eines Programms enthält kein ORG. Type mismatch - fehlerhafter Operand. Invalid command — ein Mnemonik oder eine Assemblerdirektive wurde falsch gebraucht. Unknown command — ein unbekanntes Mnemonik. Label already defined — ein EQU oder ein gewöhnlicher Label wurde zum zweitenmal definiert. Machine-Code too long -der Maschinencode ist zu lang für den Speicher. Label not defined - es wurde ein nicht definierter Label benutzt. Die Grenzen des Assemblers Der Assembler kann maximal 650Zeilen und 200 Label verarbeiten, da das Programm selbst sehr lang ist. Es könnte aber auch sein, daß das Programm vorher mit „Memory full“ unterbrochen wird. Der Maschinen-code darf eine Länge von knapp 3 KByte erreichen, sonst würde ein Teil des BASIC-RAMs überschrieben. Es ist zu beachten, daß, bevor man einen Maschinencode von Kassette lädt, der Speicher zurückgesetzt worden ist, da der Computer sonst mit „Memory full“ aussteigt.
|