|
CP/M 68K Programmierkurs - Der Assembler AS68
Der Assembler AS68 dient zum Übersetzen von Quelltexten in einen Objektcode, der Anweisungen für den 68000 Prozessor enthält. Unter CP/M 68K haben Quelltexte normalerweise die Dateiendung .S, es sind aber auch Quelltexte mit der Endung .A68 zu finden, die meist für andere Assembler geschrieben sind und möglicherweise angepasst werden müssen.
Themen dieses Kapitels
- Vorbereitung einer Arbeitsdiskette
- Aufruf des Assemblers
- Parameter und Beispiele
- Assembler-Direktiven im Quelltext
- Programmsegmente
- Labels
- Automatische Optimierungen
Vorbereitung einer Arbeitsdiskette
Am einfachsten ist es, wenn man sich eine Boot-Diskette zusammenstellt, auf der die wichtigsten Programme vorhanden sind. So kann man gleich nach dem Start des Systems mit der Arbeit beginnen. Diese Diskette sollte neben dem CP/M-System mindestens die folgenden Dateien enthalten
- AS68.68K
- AS68SYMB.DAT
- LO68.68K
- EDITRDK.68K
- PIP.68K
- STAT.68K
Im Download des NKC-Emulators ist bereits ein Diskettenimage mit diesen Dateien und noch einigen anderen Tools enthalten. Zur Sicherheit sollte man sich eine Kopie der Diskette bzw. des Images anlegen.
Aufruf des Assemblers
Nachdem ein Quelltext eingegeben oder auf die Arbeitsdiskette kopiert wurde, kann der Aufruf des Assemblers erfolgen. Die Arbeitsweise des Assemblers kann durch diverse Parameter beim Aufruf und durch sogenannte Direktiven im Quellcode beeinflusst werden.
Parameter beim Aufruf
Hier werden nur die wichtigsten Parameter aufgelistet, eine komplette Liste der Parameter findet sich ab Seite 117 in der Originaldokumentation CP/M Programmer's Manual (in englisch).
Parameter |
Bedeutung |
Quelldateiname |
Name der Text-Datei, die den Assembler-Quelltext enthält. Normalerweise haben Quelltexte die Endung .S |
-P |
Während des Übersetzungsvorgangs wird ein Listing auf dem Standard-Ausgabegerät (Konsole) erzeugt. Das Listing kann auf den Drucker oder in eine Datei umgelenkt werden. |
-L |
Bewirkt, dass alle Konstanten von Adressen als Langworte definiert werden. Diese Option sollte genutzt werden, wenn die ausführbare Datei den Umfang von 64 kByte übersteigt. |
-U |
Bewirkt, dass innerhalb des angegebenen Quelltextes nicht definierte Symbole als globale Symbole betrachtet werden. Diese Symbole können durch andere Objektdateien während des Linkens beigesteuert werden. Die Verwendung von -U kann die Fehlersuche erschweren, da undefinierte Labels nicht erkannt werden. |
-N |
Deaktiviert die automatische Optimierung von Sprungbefehlen. Ohne diesen Parameter werden automatisch kürzere Sprungbefehle generiert um kürzere Programme zu erzeugen. |
-O Objektdateiname |
Erlaubt das Angeben eines abweichenden Namens für die generierte Objektdatei. Normalerweise ist dieser identisch mit dem Quelldateinamen, wobei die Dateiendung .O lautet. |
>Listingdateiname |
In Verbindung mit der Option -P wird das generierte Listing in eine Datei ausgegeben. Zu beachten ist, dass zwischen dem >-Zeichen und dem Dateinamen kein Leerzeichen erlaubt ist. Als Dateiendung wird üblicherweise .LST genutzt. |
Aufruf-Beispiele
Hier einige Beispiele zum Aufruf des Assemblers mit Erklärung. Informationen zur Automatisierung der Übersetzung folgen im nächsten Teil, der sich hauptsächlich mit dem Linker LO68 und den SUBMIT-Dateien beschäftigt.
Kommandozeile |
Erklärung |
AS68 TEST.S |
Startet den Assembler und übersetzt den Quelltext in der Datei TEST.S in die Objektdatei TEST.O, die später durch den Linker in eine ausführbare Datei umgewandelt werden muss. |
AS68 -P TEST.S |
Übersetzt den Quelltext in TEST.S und erzeugt während der Übersetzung ein Listing auf der Konsole. Dabei sollte beachtet werden, dass sich die Geschwindigkeit bei langen Quelltexten extrem reduzieren kann. |
AS68 -P TEST.S >TEST.LST |
Übersetzt den Quelltext in TEST.S und erzeugt während der Übersetzung ein Listing in der Datei TEST.LST. Das Listing kann später mittels TYPE angezeigt oder zur Analyse in den Editor geladen werden. |
AS68 TEST.S -O TEST.OBJ |
Übersetzt den Quelltext in TEST.S in die Objektdatei TEST.OBJ, also anders als die Standardausgabe in die Datei TEST.O. |
Direktiven im Quelltext
Hier werden die für den einfachen Einstieg notwendigen Assembler-Direktiven kurz erläutert. Direktiven sind Anweisungen an den Assembler, die in den Quelltext eingefügt werden können. Die Namen der Direktiven weichen von den offiziellen Mnemonics der 68000-Befehle ab und erzeugen keinen eigenen Code. Alle gelisteten Direktiven können mit einem Punkt beginnen, müssen aber nicht. Eine vollständige Liste der Direktiven findet sich im Programmers Manual ab Seite 120.
Direktive |
Bedeutung |
END |
Zeigt das Ende des Quelltextes an, danach dürfen keine weiteren Programmzeilen oder Kommentare folgen. Jeder Quelltext muss mit dieser Direktive enden. |
DC.B DC.W DC.L |
Dient zum Definieren einer beliebigen Menge von Konstanten Werten im Programm. Dies können Tabellen, Texte, Labels, Ausdrücke oder andere Werte sein. So definierte Werte haben immer einen Umfang von 1,2 oder 4 Byte.DC.B $01, $02, $03, $04 DC.B 'Hallo Welt',0 DC.W $55AA, $1234, $0000, $FFFF, 12345 DC.L $55AA0180 |
DS.B DS.W DS.L |
Reserviert eine Anzahl von Byte, Word oder Long-Speicherplätzen. Die Speicherplätze werden nicht initialisiert.DS.B 16 * Reserviert 16 Bytes DS.W 1 * Reservier 1 Wort (2 Byte) DS.L 4 * Reserviert 4 Langworte (16 Byte) |
EVEN |
Setzt den Programmzähler auf die nächste gerade Adresse. Falls Byte-Konstanten im Quelltext definiert werden, sollte man diese Direktive benutzen, damit die nächste Programmanweisung auf einer geraden Speicherdresse beginnt. |
EQU ausdruck |
Dient dazu, einem Label einen definierten Wert zuzuordnen. Später im Programmcode kann der Label anstelle des Wertes verändert werden. EQU wird meist dazu benutzt, programmweite Konstanten zu definieren, die leicht änderbar sein sollen. Es ist zu beachten, dass der Label keinen Doppelpunkt besitzen darf und dass im Ausdruck keine Referenzen verwendet werden dürfen, die erst später im Quelltext definiert werden.GDP EQU $FFFFFF70 * Basisadresse der Grafikkarte WIDTH EQU 512 * Bildschirmauflösung horizontal |
ORG n |
Dient zum Festlegen der Speicheradresse des Programms auf einen festen vorgegebenen Wert. Dies wird zum Beispiel benötigt, um Programmcode zu erzeugen, der in einem EPROM abseits von CP/M ausführbar sein soll.. |
PAGE |
Fügt im Falle der Generierung eines Listings (Kommandozeilen-Parameter -P) einen Seitenumbruch an einer bestimmten Stelle des Listings ein. |
Programmsegmente
Ein unter CP/M 68K ausführbares Programm ist in bis zu 16 Segmente unterteilt, die jeweils bis zu 64 kByte umfassen dürfen.
Direktive |
Bedeutung |
SECTION n |
Adressiert ein bestimmtes Programmsegment mit der angegebenen Nummer im Bereich von 0 bis 15. Für die drei wichtigsten Segmente gibt es eigene Direktiven: TEXT, DATA und BSS. Der Linker ordnet alle Segmente in aufsteigender Reihenfolge an, wenn die ausführbare Datei erzeugt wird. |
TEXT |
Adressiert das Textsegment (segment 0) eines Programms. Jedes ausführbare Programm beginnt mit der ersten Anweisung im Textsegment. |
DATA |
Adressiert das Datensegment (Segment 14) eines Programms. Das Segment ist vorgesehen zur Ablage von konstanten Date und Tabellen sowie für Texte. |
BSS |
Adressiert das Blockspeichersegment (Segment 15) eines Programms. Dieses Segment ist vorgesehen für variable Datenbereiche, die aus dem Programmcode verändert werden.Innerhalb dieses Segments kann kein Programmcode erzeugt oder feste Daten erzeugt werden. |
Labels
Labes dienen zur Strukturierung des Programmcodes und erlauben das Verwenden von klarschriftlichen Namen für Sprungadressen, Variablen und Konstanten.
- Labels dürfen beliebig lang sein und sollen mit einem Doppelpunkt enden.
- Sie dürfen nicht mit einer Ziffer beginnen.
- Labels unterscheiden zwischen Groß- und Kleinschreibung.
- Die ersten 8 Zeichen von Labels müssen eindeutig sein.
- Labels sollten in der ersten Spalte einer Zeile beginnen.
Automatische Optimierungen und Erweiterungen
- Die Instruktionen ADD, SUB und CMP sind auch mit Adressregistern zulässig, es werden automatisch die äquivalenten Instruktionen ADDA, SUBA und CMPA generiert. Andersherum gilt das nicht.
- Bei den Instruktionen ADD, AND, CMP, EOR, OR, SUB dürfen auch Konstanten angegeben werden, es werden automatisch die passenden Instruktionen ADDI, ANDI, CMPI, EORI, ORI und SUBI verwendet.
- Alle Sprungoperationen wie BRA, BSR, BEQ, BGE, ... erzeugen kurze Sprünge, wenn das Ziel weniger als 128 Bytes entfernt liegt. Diese Optimierung kann durch den Kommandozeilen-Parameter -N deaktiviert werden.
- Unterprogrammaufrufe mittels JSR werden automatisch in BSR gewandelt, wenn das Sprungziel mit der kürzeren Implementierung erreicht werden kann. Auch diese Optimierung lässt sich mit -N abschalten.
- Die Instruktionen ADD, SUB, AND und MOVE mit einem Datenregister generieren die entsprechenden Instruktionen ADDQ, SUBQ, ANDQ und MOVEQ, wann immer es möglich ist.
- Schiebebefehle wie ASL, ASR, ROL, ROR erzeugen automatisch Befehle zum Schieben bzw. Rotieren um 1 Bit, wenn die Anzahl der Schiebeoperationen nicht angegeben wird.
Fazit
Der Assembler AS68 ist ein ausreichendes Entwicklungstool, auch wenn viele Möglichkeiten moderner Assembler wie Makros, Include-Dateien und vieles mehr fehlen. Ohne Probleme lassen sich kleine und große Programme sowohl für CP/M als auch für andere Betriebssysteme erstellen. Weitere Möglichkeiten und Besonderheiten des Assemblers werden später im im Verlauf der Serie angesprochen.
Weiter zu Teil 2 der Serie: Der Linker LO68
Zurück zur Startseite: Kursübersicht
|