;
72
.mt 8
.mb 8
.pc 32
.fm 1
.hm 1
.pn 23
9.4.1.1._Pseudooperationen_zur_Auswahl_der_Anweisungsliste
Standard ist die 8080-Mnemonik.
Wenn nicht die richtige Pseudooperation zur Auswahl der Anwei-
sungsliste angegeben wurde, gibt der Assembler einen schweren
Fehler fuer jene Operationscodes zurueck, die fuer die aktuel-
le Anweisungsliste ungueltig sind. Das heisst, .Z80 uebersetzt
nur Z80-Operationscodes und .8080 nur 8080-Operationscodes.
Deshalb muss bei einem im Z80-Code geschriebenen Assemblerpro-
gramm die Pseudooperation zur Auswahl dieser Anweisungsliste,
.Z80, geschrieben werden.
Bemerkung:
Alle in diesem Kapitel aufgelisteten Pseudooperationen werden
bei beiden Anweisungslisten verarbeitet.
.Z80
.Z80 hat keine Argumente.
.Z80 weist den Assembler auf die Uebersetzung von Z80-Opera-
tionscodes hin.
.8080
.8080 hat keine Argumente.
.8080 weist den Assembler auf die Uebersetzung von 8080- Code
hin. Die Auswahl dieses Befehlssatzes ist Standard.
Alle Operationscodes, die der Pseudooperation zur Auswahl des
Befehlssatzes folgen, werden entsprechend uebersetzt, bis die
alternative Pseudooperation auftritt.
Tritt ein Operationscode auf, der nicht zum ausgewaehlten
Befehlssatz gehoert, gibt der Assembler einen "U-Fehler"
zurueck.
9.4.1.2._Pseudooperation_zur_Daten-_und_Symboldefinition
Alle Programmoperationen zur Definition von Daten und Symbolen
werden fuer beide Befehlssaetze unterstuetzt. (Die einzige
Ausnahme bildet SET, das fuer die Z80-Anweisungsliste nicht
erlaubt ist.)
Zu beachten: Es gilt:
* zeigt an, dass die Pseudooperation fuer .Z80 ist.
Kein Stern zeigt an, dass die Pseudooperation fuer
.8080 ist.
.pa
Definiere_Byte
DB <exp>[,<exp>...]
* DEFB <exp>[,<exp ...]
DB <string>[,<string>...]
* DEFM <string>[,<string>...]
Die Argumente der DB's sind entweder Ausdruecke oder Zeichen-
ketten.Die Argumente der DEFB's sind Ausdruecke. Die Argumente
der DEFM's sind Ketten. Ketten muessen in einfache oder
doppelte Anfuehrungszeichen eingeschlossen werden.
Bemerkung:
DB wird in den folgenden Erklaerungen stellvertretend fuer
alle moeglichen Definiere-Byte-Pseudooperationen verwendet.
DB wird verwendet, um einen Wert (Kette oder numerisch) in
einem Speicherplatz abzulegen, beginnend ab laufenden Spei-
cherplatzzuordnungszaehler.
Ausdruecke muessen sich auf ein Byte auswerten lassen. Wenn
das hoehere Byte 0 oder 255 ergibt, ergibt sich kein Fehler,
anderenfalls wird ein A-Fehler erzeugt.
Ketten mit 3 oder mehr Zeichen koennen in Ausdruecken nicht
verwendet werden (sie muessen unmittelbar von einem Komma oder
dem Ende der Zeile gefolgt werden).
Die Zeichen einer 8080- oder Z80-Kette werden in der Reihen-
folge ihres Auftretens gespeichert, jedes als ein Ein-Byte-
Wert, das hoechstwertige Bit auf 0 gesetzt.
Beispiel: DB 'AB'
DB 'AB' AND 0FFH
DB 'ABC'
erzeugt:
0000' 41 42 DB 'AB'
0002' 42 DB 'AB' AND 0FFH
0003' 41 42 43 DB 'ABC'
Definiere_Zeichen
DC <string>
DC speichert die Zeichen der Kette in <string> in aufeinander-
folgende Speicherplaetze, beginnend ab laufenden Speicherzu-
weisungszaehler.
Wie bei DB werden die Zeichen in der Reihenfolge ihres Auf-
tretens gespeichert, jedes als ein Ein-Byte-Wert, das hoechst-
wertige Bit auf 0 gesetzt. Jedoch wird beim letzten Zeichen
der Kette das hoechstwertige Bit auf 1 gesetzt.
Es wird ein Fehler erzeugt, wenn das Argument von DC eine
Nullkette ist.
.pa
Beispiel:
MARKE: DC "ABC"
erzeugt:
0000 41 42 C3 MARKE: DC "ABC"
Definiere_Speicher
DS <exp>[,<val>]
* DEFS <exp>[,<val>]
Die Pseudooperation "Definiere Speicher" reserviert einen
Speicherbereich. Der Wert von <exp> gibt die Anzahl der zu
reservierenden Bytes an.
Zum Initialisieren des reservierten Bereiches setzt <val> den
gewuenschten Wert.
Wenn <val> weggelassen ist, wird der reservierte Speicher
nicht initialisiert. Der reservierte Speicherbereich wird
nicht automatisch auf 00H initialisiert. Eine Moeglichkeit,
den reservierten Speicherbereich auf 00H zu initialisieren,
bietet der /M-Schalter waehrend der Uebersetzung (siehe Pkt.
9.5.2.4.).
Alle Namen, die in Ausdruecken verwendet werden, muessen
vorher definiert sein (alle Namen muessen im Pass 1 zu diesem
Zeitpunktpunkt bekannt sein).
Ansonsten wird waehrend des Pass 1 ein V-Fehler erzeugt, ein
U-Fehler kann im 2. Pass erzeugt werden; ein Phasenfehler
ergibt sich wahrscheinlich, weil die Pseudooperation "Defi-
niere Speicher" im Pass 1 keinen Code erzeugt hat.
Beispiel:
DS 100H
reserviert 100 Byte Speicherplatz nicht initialisiert, d.h.,
es bleiben dort die Werte stehen, die an dieser Stelle waren,
bevor das Programm geladen wurde.
Soll der Bereich auf 00H initialisiert werden, kann waehrend
der Uebersetzung der /M-Schalter verwendet werden.
Oder es kann die folgende Anweisung geschrieben werden, um den
reservierten Speicherbereich auf 00H oder einen beliebigen
anderen Wert zu setzen.
DS 100H,2
reserviert 100H Bytes, von denen jedes Byte mit dem Wert 2
(02H) initialisiert wird.
.pa
Definiere_Wort
DW <exp>[,<exp>...]
*DEFW <exp>[,<exp>...]
Die Pseudooperation "Definiere Wort" speichert den Wert des
Ausdruckes in aufeinanderfolgende Speicherplaetze, beginnend
ab laufenden Speicherzuordnungszaehler. Ausdruecke sind 2-Byte
Werte (Wort).
Die Werte werden, das niederwertige Byte zuerst und dann das
hoeherwertige Byte, gespeichert.Das ist ein Unterschied zu DB!
Beispiel:
MARKE: DW 1234H
erzeugt:
0000 1234 MARKE: DW 1234H
Bemerkung: Die Bytes werden in der Liste in Reihenfolge ihres
Auftretens gezeigt, nicht in der Reihenfolge, wie
sie abgespeichert sind.
Equate
<name> EQU <exp>
EQU weist <name> den Wert des Ausdruckes <exp> zu. <name> kann
ein Label, ein Symbol oder eine Variable sein und spaeter in
Ausdruecken verwendet werden.
Nach <name> darf kein Doppelpunkt(e) stehen.
Wenn <exp> ein External ist, wird ein Fehler erzeugt.
Wenn <name> schon einen anderen Wert als <exp> hat, erscheint
ein M-Fehler.
Wenn <name> spaeter im Programm wieder (zurueck) definiert
werden soll, so ist die Pseudooperation SET oder ASET anstelle
von EQU zu verwenden.
Das ist ein Unterschied zu SET.
Beispiel:
BUF EQU 0F3H
Externes_Symbol
EXT <name>[,<name>...]
EXTRN <name>[,<name>...]
* EXTERNAL <name>[,<name>...]
BYTE EXT <symbol>
BYTE EXTRN <symbol>
BYTE EXTERNAL <symbol>
Diese Pseudooperation erklaert, dass der (die) Name(n) in der
Liste extern (ist) sind (d.h. definiert in einem anderen
Modul).
Ist einer der in der Liste auftretenden Namen im laufenden
Programm definiert, wird ein M-Fehler erzeugt.
Ein Verweis auf einen Namen, bei dem dem Namen unmittelbar 2
Doppelkreuze folgen (z.B. NAME##) wird ebenfalls als EXTERNAL
erklaert.
EXTERNAL's koennen auf ein oder zwei Byte ausgewertet werden.
Bei allen externen Symbolnamen werden nur die ersten 6 Zeichen
an den Programmverbinder uebergeben.
Zusaetzliche Zeichen werden intern abgeschnitten.
Beispiel:
EXTRN MARKEX
Der Assembler generiert fuer diese Anweisungszeile keinen Code
beim Uebersetzten dieses Moduls. Wenn MARKEX als Argument in
einer CALL-Anweisung verwendet wird, wird nur der Code fuer
CALL erzeugt und fuer MARKEX wird ein 0-Wert eingetragen.
Der Programmverbinder durchsucht alle geladenen Moduln nach
einer PUBLIC MARKEX-Anweisung und verwendet die Definition,
die er fuer MARKEX gefunden hat in der CALL MARKEX-Anweisung.
PUBLIC-Symbol
ENTRY <name>[,<name>...]
GLOBAL <name>[,<name>...]
PUBLIC <name>[,<name>...]
Die Pseudooperation PUBLIC erklaert jeden Namen der Liste als
intern und deshalb verfuegbar fuer die Verwendung in diesem
Programm und in anderen, die gemeinsam geladen und mit dem
Programmverbinder gebunden sind.
Es wird ein M-Fehler erzeugt, wenn der Name ein EXTERNAL oder
ein Common-Block-Name ist.
Nur die ersten 6 Zeichen des PUBLIC-Symbolnamens werden an den
Programmverbinder uebergeben.
Zusaetzliche Zeichen werden intern abgeschnitten.
Beispiel:
PUBLIC MARKEX
MARKEX: LD HL,BER1
Der Assembler uebersetzt die LD-Anweisung wie ueblich, aber er
generiert fuer die PUBLIC MARKEX-Anweisung keinen Code.
Wenn der Programmverbinder im anderen Modul die EXTERN MARKEX-
Anweisung findet, weiss er, dass er suchen muss, bis er
diese PUBLIC MARKEX-Anweisung gefunden hat. Dann verbindet der
Programmverbinder den Adresswert der MARKEX:LD HL,BER1-
Anweisung mit der (den) CALL MARKEX-Anweisung(en) im (in den)
anderen Modul(n).
SET
<name> SET <exp> (nicht fuer den .Z80-Modus)
* <name> DEFL <exp>
<name> ASET <exp>
Die Pseudooperation SET weist <name> den Wert von <exp> zu.
<name> kann ein Label, ein Symbol oder eine Variable sein und
kann spaeter in Ausdruecken verwendet werden.
Nach <name> duerfen keine Doppelpunkte stehen. Wenn <exp> ein
EXTERNAL ist, wird ein Fehler erzeugt.
Die Pseudooperation SET kann im .Z80-Modus nicht verwendet
werden, weil SET ein Z80-Operationscode ist.
ASET und DEFL koennen in beiden Anweisungslisten verwendet
werden.
Wenn <name> spaeter neu definiert werden soll, muss eine der
SET-Pseudooperationen anstelle von EQU verwendet werden.
Zum neu Definieren von <name> kann jede beliebige SET-Pseudo-
operation benutzt werden, unabhaengig, mit welcher Pseudoope-
ration die urspruengliche Definition erfolgte (das Verbot von
SET im .Z80-Modus wird davon nicht beruehrt).
Das ist ein Gegensatz zu EQU.
Beispiel:
MARKE ASET BER+1000H
Wann immer MARKE als Ausdruck (Operand) verwendet wird, wertet
der Assembler den Ausdruck BER+1000H aus und setzt diesen Wert
fuer MARKE. Spaeter, wenn MARKE einen anderen Wert darstellen
soll, wird einfach eine MARKE ASET-Anweisung mit einem anderen
Ausdruck eingetragen.
MARKE ASET BER+1000H
.
.
.
MARKE ASET 3000H
.
.
.
MARKE DEFL 6CDEH
9.4.1.3._Pseudooperation_zum_Zuweisen_des_Speicherplatz-
zuordnungszaehler-Modus
Viele Pseudooperationen beziehen sich auf den aktuellen Spei-
cherplatzzuordnungszaehler.
Der laufende Speicherplatzzuordnungszaehler ist die Adresse
des naechsten Bytes, das zu erzeugen ist.
Im Assembler erhalten Symbole und Ausdruecke ihren
zugewiesenen Modus (siehe Pkt. 9.3.2.).
Jeder Modus fuer ein Speichersegment wird durch den Programm-
verbinder entsprechend dem Typ der uebersetzten Anweisung
zugeordnet.
Es gibt 4 Modi:
. absoluter Modus
. datenrelativer Modus
. coderelativer Modus
. commonrelativer Modus.
Wenn der Speicherplatzzuordnungszaehler-Modus absolut ist,
dann ist er eine absolute Adresse.
Wenn der Speicherplatzzuordnungszaehler-Modus relativ ist,
dann ist er eine relative Adresse und kann einen Offset einbe-
ziehen von der absoluten Startadresse eines relativen Seg-
ments, das vom Programmverbinder geladen werden kann.
Die Pseudooperation zur Zuweisung des Speicherplatzzuordnungs-
zaehler-Modus wird fuer die Spezifizierung genutzt, in welchem
Typ ein Programmteil zu uebersetzen ist.
Absolutes_Segment
ASEG
ASEG hat niemals Operanden. ASEG erzeugt nichtverschieblichen
Code.
ASEG setzt den Speicherplatzzuordnungszaehler auf ein absolu-
tes Speichersegment (aktuelle Adresse). Der Standardwert ist
0, das kann die Ursache sein, dass Teile des Betriebssystems
ueberschrieben werden.
Nach ASEG sollte eine ORG-Anweisung mit 103H oder hoeher
geschrieben werden.
Code-Segment
CSEG
CSEG hat niemals Operanden.
Der Code wird im coderelativen Modus uebersetzt und kann in
den ROM oder PROM geladen werden.
CSEG setzt den Speicherzuordnungszaehler auf das coderelative
Segment des Speichers zurueck.
Die Zuordnung ist diejenige des letzten CSEG (Standard 0),
wenn nicht danach eine ORG-Anweisung folgt, die die Zuordnung
aendert.
Man muss jedoch beachten, dass die ORG-Anweisung im CSEG-Modus
keine absolute Adresse setzt.
Eine ORG-Anweisung im CSEG-Modus veranlasst den Assembler, zu
der letzten fuer CSEG geladenen Adresse die im Argument der
ORG-Anweisung festgelegte Anzahl Bytes zu addieren.
Wenn beispielsweise ORG 50 angegeben ist, addiert der
Assembler 50 Bytes zu der aktuellen CSEG-Zuordnung, und dies
ist dann die neue Zuordnung von CSEG.
Die Wirkung der auf ein CSEG (oder DSEG) folgenden ORG-Anwei-
sung ist die, dass einem Modul ein Offset gegeben werden kann.
ORG setzt keine absolute Adresse fuer CSEG, sondern CSEG
behaelt seine Verschieblichkeit.
Will man fuer CSEG eine absolute Adresse setzen, verwendet man
den /P-Schalter im Programmverbinder.
CSEG ist der Standard-Modus des Assemblers. Der Assembler
beginnt automatisch mit einem CSEG und der Speicherplatz-
zuordnungszaehler im coderelativen Modus weist auf den Platz 0
des coderelativen Speichersegments. Alle folgenden Anweisungen
werden in das coderelative Speichersegment uebersetzt, bis
eine ASEG-, DSEG- oder COMMON- Pseudooperation abgearbeitet
wird.
CSEG wird folglich eingetragen, damit der Assembler zum code-
relativen Modus zurueckkehrt, der Speicherplatzzuordnungszaeh-
ler wird auf den Punkt des naechsten freien Platzes im code-
relativen Segment zurueckgesetzt.
Daten-Segment
DSEG
Die Pseudooperation DSEG hat keine Operanden.
DSEG spezifiziert Segmente des uebersetzten verschieblichen
Codes, die spaeter nur in den RAM geladen werden.
DSEG setzt den Speicherplatzzuordnungszaehler auf das datenre-
lative Speichersegment.
Die Zuordnung des datenrelativen Zaehlers ist die des letzten
DSEG (Standard 0), wenn nicht eine folgende ORG-Anweisung die
Zuordnung aendert.
Man muss jedoch beachten, dass die ORG-Anweisung im DSEG-Modus
keine absolute Adresse setzt.
Eine ORG-Anweisung im DSEG-Modus veranlasst den Assembler, zu
der letzten fuer DSEG geladenen Adresse die im Argument der
ORG-Anweisung festgelegte Anzahl Bytes zu addieren.
Wenn beispielsweise ORG 50 angegeben ist, addiert der
Assembler 50 Bytes zu der aktuellen DSEG-Zuordnung, und dies
ist dann die neue Zuordnung von DSEG.
Die Wirkung der auf ein DSEG (oder CSEG) folgenden ORG-Anwei-
sung ist die, dass einem Modul ein Offset gegeben werden kann.
ORG setzt keine absolute Adresse fuer DSEG, sondern DSEG
behaelt seine Verschieblichkeit.
Will man eine absolute Adresse fuer DSEG setzten, verwendet
man den /D-Schalter im Programmverbinder.
Common-Block_(gemeinsamer_Bereich)
COMMON /[<blockname>]/
das Argument von COMMON ist der Name des gemeinsamen
Bereiches.
COMMON legt einen gemeinsamen Datenbereich fuer alle COMMON-
Bloecke an, die in dem Programm benannt sind.
Wenn <blockname> weggelassen wurde oder aus Leerzeichen
besteht, wird der Block als leerer Bereich betrachtet.
COMMON-Anweisungen sind nicht ausfuehrbare Speicherzuordnungs-
anweisungen.
COMMON weist einem Speicherbereich, genannt gemeinsamer Be-
reich, Variable, Felder und Daten zu.
Das ermoeglicht, dass sich verschiedene Programmoduln in den-
selben Speicherbereich teilen.
Die der COMMON-Anweisung folgenden Anweisungen werden in den
COMMON-Bereich unter <blockname> uebersetzt.
Die Laenge eines COMMON-Bereiches ergibt sich aus der Anzahl
Bytes, die erforderlich sind, um die in diesem COMMON-Block
definierten Variablen, Felder und Daten unterzubringen. Der
COMMON-Block wird beendet, wenn eine andere Pseudooperation
zur Zuweisung des Speicherplatzzuordnungszaehler-Modus auf-
tritt.
Gemeinsame Bloecke desselben Namens koennen unterschiedliche
Laenge haben.
Ist die Laenge verschieden, dann muss der Programmodul mit dem
laengsten gemeinsamen Block zuerst geladen werden (, d.h., er
muss der erste Modulname in der Kommandozeile des Programmver-
binders sein).
Siehe dazu auch die Beschreibung des Programmverbinders.
COMMON setzt den Speicherplatzzuordnungszaehler auf den ausge-
waehlten gemeinsamen Speicherblock.
Die Zuweisung ist immer der Beginn des Bereiches, so dass
Kompatibilitaet mit der FORTRAN COMMON-Anweisung besteht.
Beispiel:
COMMON /DATBIN/
BER2 EQU 100H
DB 0FFH
DW 1234H
DC 'WERK'
CSEG
.pa
Set_Origin
ORG <exp>
Der Wert des Speicherplatzzuordnungszaehlers kann zu jeder
Zeit durch die Verwendung von ORG geaendert werden. Im ASEG-
Modus wird der Speicherplatzzuordnungszaehler auf den Wert von
<exp> gesetzt, und der Assembler weist den erzeugten Code
beginnend mit diesem Wert zu.
Im CSEG-, DSEG- und COMMON- Modus wird der Speicherplatzzuord-
nungszaehler in diesem Segment um den Wert von <exp> erhoeht,
und der Assembler weist den erzeugten Code beginnend mit der
letzten geladenen Segmentadresse plus dem Wert von <exp> zu.
Alle in <exp> verwendeten Namen muessen im Pass 1 bekannt sein
und der Wert muss entweder absolut sein oder im selben Be-
reich, wie der Speicherplatzzuordnungszaehler.
Beispiel:
DSEG
ORG 50
Setzt den datenrelativen Speicherplatzzuordnungszaehler auf
50, relativ zum Start des datenrelativen Speichersegments.
Diese Methode liefert Verschieblichkeit. Die ORG <exp> - An-
weisung spezifiziert im CSEG- oder DSEG- Modus keine feste
Adresse, vielmehr laedt der Programmverbinder das Segment auf
eine flexible Adresse, die fuer die gemeinsam zu ladenden
Moduln verwendet wird.
Andererseits wird ein Programm, das mit den Anweisungen
ASEG
ORG 800H
beginnt und vollstaendig im absoluten Modus uebersetzt ist,
immer beginnend ab 800H geladen, es sei denn, die ORG-Anwei-
sung wird in der Quelldatei geaendert.
Das heisst, die dem ASEG folgende ORG <exp> - Anweisung setzt
das Segment auf eine feste (im Beispiel absolute) Adresse, die
durch <exp> bestimmt wird.
Das gleiche Programm - im coderelativen Modus, ohne ORG -
Anweisung uebersetzt - kann auf jede beliebige Adresse geladen
werden, wenn an die Kommandokette des Programmverbinders der
Schalter /P:<address> angehaengt wird.
Verschieben
.PHASE <exp>
.DEPHASE
.PHASE ermoeglicht es, Code in einen Bereich zu laden, aber
nur in einem anderen Bereich mit der durch <exp> spezifi-
zierten Adresse abzuarbeiten.
<exp> muss ein absoluter Wert sein. .DEPHASE wird verwendet,
um anzuzeigen, dass der verschobene Codeblock zu Ende ist.
Der Modus innerhalb eines .Phase-Blockes ist absolut. Der Code
wird in den Bereich geladen, wenn die .PHASE-Anweisung er-
reicht wird.
Der Code innerhalb eines Blockes wird spaeter auf die durch
<exp> fuer die Ausfuehrung spezifizierte Adresse transpor-
tiert.
Beispiel:
.PHASE 100H
MARKE: CALL UP1
JMP MARKE1
UP1: RET
.DEPHASE
MARKE1: JMP 5
erzeugt folgende Uebersetzung:
.PHASE 100H
0100 CD 0106 MARKE: CALL UP1
0103 C3 0007 JMP MARKE1
0106 C9 UP1: RET
.DEPHASE
0007' C3 0005 MARKE1: JMP 5
END
.PHASE-.... .DEPHASE-Block sind eine Moeglichkeit, den Code-
block ab einer spezifischen absoluten Adresse auszufuehren.
9.4.1.4._Dateibezogene_Pseudooperationen
Die dateibezogenen Pseudooperationen:
. fuegen lange Kommentare ein
. geben dem Modul einen Namen
. beenden den Modul oder
. transportieren andere Dateien in das laufende Programm
Comment-Anweisung
.COMMENT <delim><text><delim>
Das erste nichtleere Zeichen, das nach .COMMENT gefunden wird,
wird als Begrenzer genommen. Der dem Begrenzer folgende <text>
wird ein Kommentarblock, der fortgesetzt wird bis zum naech-
sten Auftreten des Begrenzers <delim>.
.COMMENT wird fuer lange Kommentare verwendet. Es ist nicht
notwendig, das Semikolon zum Anzeigen des Kommentars zu
schreiben.
Waehrend der Uebersetzung wird der .COMMENT-Block ignoriert
und nicht uebersetzt.
Beispiel:
.COMMENT * hier kann jeder beliebige Text
eingetragen sein
.
.
.
* ; Rueckkehr zur normalen Uebersetzung
Programmende
END [<exp>]
Die End-Anweisung bezeichnet das Programmende. Wenn diese
Anweisung fehlt, wird folgende Warnung erzeugt:
"%NO END statement".
<exp> kann ein Label, ein Symbol, eine Zahl oder jedes andere
gueltige Argument sein, das der Programmverbinder als Start-
punkt fuer das Pogramm laden kann.
Wenn <exp> angegeben wurde, schreibt der Programmverbinder auf
die Adresse 100H eine Sprunganweisung im 8080-Code zu der in
<exp> angegebenen Adresse.
Wenn <exp> nicht angegeben wurde, wird an den Programmverbin-
der fuer dieses Programm keine Startadresse uebergeben und die
Ausfuehrung beginnt mit dem ersten geladenen Modul.
(Das heisst, wenn kein <exp> spezifiziert wurde, ist der /G-
Schalter im Programmverbinder unwirksam.)
<exp> teilt dem Programmverbinder mit, dass das Programm ein
Hauptprogramm ist, sonst wird es als Unterprogramm angesehen.
Wenn nur Assemblerprogramme gebunden werden, von denen keines
eine END-Anweisung mit <exp> enthaelt, wird der Programmver-
binder nach dem Hauptprogramm fragen.
Haben zwei oder mehr Programme eine END-Anweisung mit <exp>,
so kann der Programmverbinder nicht unterscheiden, welches das
Hauptprogramm ist.
Wenn zwei oder mehr Programme gebunden werden sollen, muss
/G:Name - oder /E:Name - Schalter im Programmverbinder benutzt
werden.
Name ist der <exp> der END-Anweisung des Programms, welches
als Hauptprogramm angesehen werden soll.
Wenn ein Programm in einer hoeheren Programmiersprache gemein-
sam mit einem Assemblerprogramm geladen werden soll, wird vom
Programmverbinder automatisch das Programm in der hoeheren
Sprache als Hauptprogramm genommen.
Das kann man aendern mit dem /G:Name - oder /E:Name - Schal-
ter, dabei muss Name der Name des Assemblerprogramms sein.
.pa
Eine andere Moeglichkeit ist das Setzen eines CALL oder
INCLUDE an den Anfang des Programms in der hoeheren Program-
miersprache, um das Assemblerprogramm zuerst abzuarbeiten.
INCLUDE-Anweisung
INCLUDE <dateiname>
$INCLUDE <dateiname>
MACLIB <dateiname>
Alle drei Pseudooperationen sind sinnverwandt.
Waehrend der Assemblierung fuegen die INCLUDE-Pseudooperatio-
nen Quellcode aus einer anderen Quelldatei in die laufende
Quelldatei ein.
Durch die Verwendung der INCLUDE-Pseudooperation ist es nicht
erforderlich, haeufig gebrauchte Anweisungsfolgen in der lau-
fenden Quelldatei wiederholt zu schreiben.
<dateiname> ist jede fuer das Betriebssystem gueltige
Dateispezifikation und muss in grossen Buchstaben geschrieben
werden.
Wenn der Dateityp und/oder die Geraetezuweisung andere als die
zugewiesenen sind, muss die Quelldatei-Spezifikation diese
enthalten.
Der zugewiesene Dateityp fuer Quelldateien ist .MAC. Die
Standard-Geraetezuweisung ist das aktuelle (current) Laufwerk
bzw. Geraet.
Die INCLUDE-Datei wird eroeffnet und in die aktuelle Quellda-
tei uebersetzt, unmittelbar anschliessend an die INCLUDE-
Anweisung. Wenn das Dateiende erreicht worden ist, setzt der
Assembler mit der auf INCLUDE folgenden Anweisung fort.
Geschachtelte INCLUDE's sind nicht erlaubt. Fuer den Fall,
dass dies auftritt, wird ein Objektcode-Syntax-Fehler, "O",
erzeugt.
Die im Operandenfeld spezifizierte Datei muss existieren,
ansonsten wird ein "V"-Fehler erzeugt und das INCLUDE wird
ignoriert. Es wird auch ein "V"-Fehler erzeugt, wenn der
Dateityp der INCLUDE-Datei nicht .MAC ist.
Im Assemblerprotokoll wird der Buchstabe "C" zwischen den
uebersetzten Code und die Quellzeile gedruckt (Siehe Pkt.
9.5.3.).
Modulname
NAME ("modulname")
Name definiert den Namen fuer den Modul. Die runden Klammern
und Anfuehrungszeichen um den Modulnamen sind erforderlich.
Nur die ersten 6 Zeichen des Modulnamens sind signifikant.
Ein Modulname kann auch mit der Pseudooperation TITLE defi-
niert werden. Wenn keine der beiden Pseudooperationen NAME
oder TITLE vorhanden sind, wird der Modulname aus dem Namen
der Quellcodedatei erzeugt.
RADIX_(Zahlenbasis)
.RADIX <exp>
<exp> in einer .RADIX-Anweisung ist immer eine dezimale nume-
rische Konstante, ohne Ruecksicht auf die aktuelle Zahlenba-
sis.
Die .RADIX-Anweisung erlaubt die Aenderung der Standardzahlen-
basis in irgendeine beliebige zwischen 2 und 16.
.RADIX aendert nicht die Zahlenbasis auf der Liste, sondern
ermoeglicht die Eingabe numerischer Werte in der gewuenschten
Basis ohne spezielle Schreibweise. (Werte in anderen Zahlenba-
sen erfordern spezielle Schreibweisen, erlaeutert im Abschnitt
"Operanden")
Die Werte im erzeugten Code erscheinen immer in der hexadezi-
malen Zahlenbasis.
Beispiel:
DEC: DB 20
.RADIX 2
BIN: DB 00011110
.RADIX 16
HEX: DB 0CF
.RADIX 8
OCT: DB 73
.RADIX 10
DECI: DB 16
HEXA: DB 0CH
erzeugt folgende Uebersetzung:
0000' 14 DEC: DB 20
0002 .RADIX 2
0001' 1E BIN: DB 00011110
0010 .RADIX 16
0002' CF HEX: DB 0CF
0008 .RADIX 8
0003' 3B OCT: DB 73
000A .RADIX 10
0004' 10 DECI: DB 16
0005' 0C HEXA: DB 0CH
Request_(Anforderung)
.REQUEST <dateiname>[,<dateiname>...]
.REQUEST stellt an den Programmverbinder die Forderung, die
in der Liste enthaltenen Dateinamen nach undefinierten
externen Symbolen zu durchsuchen (externe Symbole, fuer die
zum gleichen Zeitpunkt kein korrespondierendes PUBLIC-Symbol
geladen ist).
Die vom Programmverbinder gefundenen undefinierten Symbole
werden benoetigt, um einen oder mehrere zusaetzliche Moduln
fuer einen kompletten Programmverbinderlauf zu laden.
Die Dateinamen in der Liste sollten gueltige Symbole sein und
weder Dateityp noch Geraetezuweisung beinhalten.
Der Programmverbinder setzt den Standarddateityp .REL und das
aktuelle Laufwerk voraus.
Beispiel:
.
.
.
.REQUEST SUBR1
.
.
.
Der Programmverbinder durchsucht SUBR1 nach externen Symbolen,
fuer die kein korrespondierendes PUBLIC-Symbol in den bereits
geladenen Moduln definiert ist.
9.4.1.5_Pseudooperationen_zur_Listensteuerung
Die Pseudooperationen zur Listensteuerung fuehren 2 allgemeine
Funktionen aus:
. Formatsteuerung
. Listensteuerung.
Die Pseudooperationen zur Formatsteuerung ermoeglichen dem
Programmierer Seitenwechsel und Kopfzeilen einzufuegen.
Das Protokollieren gesamter Assemblerdateien oder von Teilen
davon wird mit den Pseudooperationen zur Listensteuerung ein-
und ausgeschaltet.
Pseudooperationen_zur_Formatsteuerung
Diese Pseudooperationen erlauben das einfuegen von Seitenwech-
seln und das Festlegen von Titel- und Untertitelzeilen im
Assemblerprotokoll.