;
72
.mt 8
.mb 8
.fm 1
.hm 1
.pc 32
.pn 38
Form_Feed
* *EJECT [<exp>]
PAGE [<exp>]
$EJECT
Die Pseudooperation Seitenwechsel veranlasst den Assembler,
die Ausgabe mit einer neuen Seite zu beginnen.
Er setzt ein Seitenwechsel-Steuerzeichen an das Seitenende in
die Protokolldatei.
Der Wert von <exp>, falls er angegeben wurde, bestimmt den
Umfang der neuen Seite (gemessen in Zeilen pro Seite) und muss
im Bereich zwischen 10 und 255 liegen. Die Standardzeilenzahl
pro Seite ist 50.
*EJECT muss in der Spalte 1 beginnen.
Beispiel:
*EJECT 72
Der Assembler veranlasst den Drucker, eine neue Seite zu
beginnen und jedesmal 72 Programmzeilen zu drucken (Diese
Angabe ist zu waehlen bei einer Papierlaenge von 12" und 6
Zeilen pro Zoll).
Titel
TITLE <text>
TITLE spezifiziert eine Kopfzeile, die auf jede Seite als
erste Zeile gesetzt wird.
Wenn mehr als eine TITLE-Anweisung angegeben wird, wird ein
"Q"-Fehler erzeugt.
Wenn keine NAME-Anweisung geschrieben wurde, werden die ersten
6 Zeichen des Titels als Modulname verwendet.
(Ist weder NAME noch TITLE vorhanden, wird der Modulname aus
der Quelldatei genommen.)
Beispiel:
TITLE PROG1
Der Modul heisst jetzt PROG1. Er kann mit diesem Namen aufge-
rufen werden und PROG1 wird als Kopf auf jede Protokollseite
gedruckt.
Untertitel
SUBTTL <text>
$TITLE (<text>)
SUBTTL spezifiziert einen Untertitel, der in jeden Seitenkopf
in die Zeile nach dem Titel gedruckt werden soll.
<text> wird abgebrochen, wenn 60 Zeichen erreicht wurden.
In einem Programm kann eine beliebige Anzahl von Untertiteln
angegeben werden.
Wenn der Assembler eine SUBTTL-Anweisung findet, wird der alte
Text durch den neuen Text ersetzt.
Um den SUBTTL fuer einen Teil der Ausgabe auszuschalten, muss
ein SUBTTL mit einer leeren Kette fuer <text> geschrieben
werden.
Beispiel:
SUBTTL SPEZIELLE E/A-ROUTINE
.
.
.
SUBTTL
.
.
.
.
Das erste SUBTTL veranlasst den Druck von SPEZIELLE E/A-
ROUTINE im Kopf jeder Seite.
Das zweite SUBTTL schaltet den Untertitel aus (die Untertitel-
zeile im Protokoll besteht aus Leerzeichen).
Allgemeine_Pseudooperationen_zur_Listensteuerung
.LIST Protokollieren aller Zeilen mit ihrem Code
.XLIST Unterdruecken des Protokollierens
.LIST ist die Standardbedingung.
Wenn eine Protokolldatei in der Kommandozeile spezifiziert
wurde, dann wird die Datei aufgelistet.
Wenn .XLIST in der Quelldatei vorgefunden wird, werden Quell-
und Objektcode nicht aufgelistet.
.XLIST wirkt bis zum Auftreten eines .LIST.
.XLIST setzt alle anderen Pseudooperationen zur Listensteue-
rung (ausser .LIST) ausser Kraft.
Beispiel:
.
.
.
.XLIST ; Protokollieren wird hier abgebrochen
.
.
.
.
.LIST ; Protokollieren wird hier fortgestzt
.
.
.
Ausgeben_einer_Meldung_auf_den_Bildschirm
.PRINTX <delim><text><delim>
Das erste nichtleere Zeichen nach .PRINTX ist der Begrenzer.
Der folgende Text wird waehrend der Uebersetzung auf den
Bildschirm ausgegeben bis der naechste Begrenzer auftritt.
.PRINTX ist nuetzlich, um den Prozess waehrend einer langen
Uebersetzung darzustellen oder den Wert von Schaltern der
bedingten Assemblierung anzuzeigen.
.PRINTX wird in beiden Paessen ausgegeben.
Wird die Ausgabe nur in einem Pass gewuenscht, verwendet man
die Pseudooperation IF1 oder IF2, um zu bestimmen, in welchem
Pass die Ausgabe gewuenscht wird (siehe auch Pkt. 9.4.3.).
Beispiel:
PRINTX *Uebersetzung zur Haelfte fertig*
Der Assembler gibt diese Meldung bei ihrem Auftreten auf den
Bildschirm aus.
IF1
.PRINTX *PASS 1 BEENDET*; Meldung nur im Pass 1
ENDIF
IF2
.PRINTX *PASS 2 BEENDET*; Meldung nur im Pass 2
ENDIF
Pseudooperationen_zur_bedingten_Listensteuerung
Die 3 Pseudooperationen zur bedingten Listensteuerung werden
verwendet, um anzuzeigen, ob in einem falschen Bedingungsblock
enthaltene Anweisungen auf der Liste erscheinen oder nicht.
Siehe dazu auch die Beschreibung zum /X-Schalter im Abschnitt
"Schalter".
Unterdruecken_falscher_Bedingungen
.SFCOND
.SFCOND unterdrueckt den Teil der Liste, welcher bedingte
Ausdruecke beinhaltet, die als falsch gewertet werden.
Protokollieren
.LFCOND
.LFCOND sichert das Protokollieren der bedingten Ausdruecke,
die als falsch gewertet wurden.
Umkippen_der_Listensteuerung_falscher_Bedingungen
.TFCOND
.TFCOND kippt die aktuelle Einstellung um, die durch das
Vorhandensein oder Nichtvorhandensein vom /X-Schalter in der
Kommandozeile gesetzt wurde.
.TFCOND ist unabhaengig von .LFCOND und .SFCOND.
Wenn /X vorhanden war, veranlasst .TFCOND, die falschen Bedin-
gungen zu drucken. Wenn /X nicht angegeben wurde, unterdrueckt
.TFCOND die falschen Bedingungen.
Pseudooperationen_zur_Listensteuerung_der_Makro-Erweiterung
Pseudooperationen zur Listensteuerung der Makro-Erweiterung
steuern die Protokollierung der Zeilen innerhalb eines Makros
oder einer Wiederholungs-Pseudooperation (REPT, IRP, IRPC) und
koennen nur innerhalb eines Makros oder eines Wiederholungs-
blockes verwendet werden.
Ausschliessen_von_Makrozeilen,_die_keinen_Code_erzeugen
.XALL
.XALL ist Standard. .XALL protokolliert Quellcode und Objekt-
code, der durch einen Makro erzeugt wird.
Quellzeilen, die keinen Code erzeugen, werden nicht protokol-
liert.
Protokollieren_Makrotext
.LALL
.LALL protokolliert den kompletten Text fuer die ganze Ma-
croerweiterung einschliesslich der Zeilen, die keinen Code
erzeugen.
Unterdruecken_der_Makro-Protokollierung
.SALL
.SALL unterdrueckt das Protokollieren des gesamten Textes und
des durch den Makro erzeugten Objektcodes.
Pseudooperationen_zur_Steuerung_der_Cross-Referenz
Es ist moeglich, die Cross-Referenz nur fuer einen Teil, aber
nicht fuer das ganze Programm zu generieren. Dazu verwendet
man die Pseudooperation .CREF und .XCREF in der Quelldatei
fuer den Assembler.
Diese beiden Pseudooperationen koennen an jede beliebige Stel-
le im Programm in das Operationsfeld geschrieben werden.
Wie alle Pseudooperationen zur Listensteuerung haben sie keine
Argumente.
Unterdruecken_der_Cross-Referenz
.XCREF
.XCREF schaltet .CREF (Standard) aus. .XCREF bleibt wirksam
bis der Assembler ein .CREF trifft.
.XCREF wird verwendet, um in einem ausgewaehlten Teil der
Dateien das Erzeugen einer Cross-Referenz zu unterdruecken.
Weil weder .CREF noch .XCREF Wirkung haben, wenn nicht der /C-
Schalter in der Assembler-Kommandozeile gesetzt ist, muss
.XCREF nicht verwendet werden, wenn eine normale Liste (ohne
Cross-Referenz) gewuenscht wird. Das wird auch erreicht, wenn
/C in der Kommandozeile weggelassen wird.
Erzeugen_einer_Cross-Referenz
.CREF
.CREF ist die Standard-Bedingung.
.CREF wird verwendet, um mit der Erstellung der Cross-Refe-
renz fortzufahren, nachdem diese durch .XCREF gestoppt worden
war.
.CREF bleibt wirksam bis ein .XCREF auftritt.
.CREF hat nur dann Wirkung, wenn der /C-Schalter in der
Kommandozeile des Assemblers gesetzt ist.
9.4.2.___Makrofaehigkeit
Die Makrofaehigkeit erlaubt, Bloecke von Anweisungen zu
schreiben, die wiederholt verwendet werden koennen, ohne dass
sie wieder aufgeschrieben werden muessen.
Diese Anweisungsbloecke beginnen entweder mit der Pseudoopera-
tion Makrodefinition oder mit einer der Wiederholungspseudo-
operationen. Sie enden mit ENDM. Alle Makro-Pseudooperationen
koennen innerhalb eines Makroblockes verwendet werden.
Die Schachtelungstiefe von Makros ist nur durch den Speicher-
platz begrenzt.
Die Makrofaehigkeit des Assemblers beinhaltet folgende Pseudo-
operationen, die nachfolgend erlaeutert werden:
- Makrodefinition
MACRO
.pa
- Wiederholungen
REPT (Wiederholung)
IRP (undefinierte Wiederholung)
IRPC (undefinierte Wiederholung mit Zeichen)
- Abschluss
ENDM
EXITM
- nur einmal vorkommende Symbole innerhalb des Makroblockes
LOCAL
Die Makrofaehigkeit unterstuetzt ausserdem einige spezielle
Makrooperatoren:
&>
;;
!
%
9.4.2.1._Pseudooperation_zur_Makrodefinition
<name> MACRO <dummy>[,<dummy>...]
.
.
.
ENDM
Der Anweisungsblock von MACRO bis ENDM bildet den Kern des
Makros oder die Makrodefinition.
<name> ist ein LABEL und unterliegt den Regeln fuer die Bil-
dung von Symbolen. <name> kann jede beliebige Laenge haben,
aber nur die ersten 16 Zeichen werden an den Programmverbinder
uebergeben.
Nachdem der Makro definiert worden ist, kann <name> zum Aufru-
fen des Makros verwendet werden.
<dummy> ist ein symbolischer Parameter, der durch den echten
Parameter durch Eins-zu-Eins-Textsubstitution bei der Verwen-
dung des Makros ersetzt wird.
Jedes <dummy> kann 32 Zeichen lang sein. Die Anzahl der symbo-
lischen Parameter ist nur durch die Laenge der Zeile begrenzt.
Die symbolischen Parameter werden durch Kommas voneinander
getrennt.
Der Assembler interpretiert alle Zeichen zwischen zwei Kommas
als einen einzigen symbolischen Parameter.
Bemerkung:
Ein symbolischer Parameter wird ausschliesslich als solcher
erkannt.
Wenn zum Beispiel ein Registername (A oder B) als symbolischer
Parameter verwendet wurde, wird er waehrend der Erweiterung
durch einen Parameter ersetzt.
Ein Makroblock wird nicht bei seinem Auftreten uebersetzt,
sondern dann, wenn er aufgerufen wird, erweitert der Assembler
die Makro-Aufruf-Anweisung durch den passenden Makroblock.
Wenn die Pseudooperation TITLE, SUBTTL oder NAME fuer den Teil
des Programms, wo der Makroblock erscheint, verwendet werden
soll, ist Vorsicht beim Schreiben dieser Anweisungszeile gebo-
ten.
Beispiel: SUBTTL MACRO DEFINITION
Der Assembler uebersetzt die Anweisung als Makrodefinition mit
dem Namen SUBTTL und DEFINITION als symbolischen Parameter. Um
das zu vermeiden, koennte das Wort MACRO abgeaendert werden.
Makroaufruf
Soll ein Makro verwendet werden, muss eine Makroaufruf-Anwei-
sung geschrieben werden.
<name> <parameter>[,<parameter>...]
<name> ist gleich <name> des Makroblockes.
<parameter> ersetzt Eins-zu-Eins <dummy>. Die Anzahl der Para-
meter wird nur durch die Laenge der Zeile begrenzt. Die Para-
meter muessen durch Kommas voneinander getrennt werden.
Wenn um Parameter, die durch Kommas getrennt sind, spitze
Klammern geschrieben sind, uebergibt der Assembler alles, was
in den spitzen Klammern steht, als einen einzigen Parameter.
Beispiel:
MAC 1,2,3,4,5
uebergibt 5 Parameter an den Makro, aber
MAC <1,2,3,4,5>
uebergibt nur einen Parameter.
Die Anzahl der Parameter in der Makroaufruf-Anweisung muss
nicht mit der Anzahl der symbolischen Parameter (<dummy>) in
der Makrodefinition uebereinstimmen.
Wenn der Aufruf mehr Parameter enthaelt als die Definition,
werden die uebrigen ignoriert. Wenn es weniger sind, werden
die uebriggebliebenen symbolischen Parameter Null gesetzt.
Nach jeder Makroaufruf-Anweisung wird der Makroblock in den
uebersetzten Code eingefuegt.
.pa
Beispiel:
EXCHNG MACRO X,Y
PUSH X
PUSH Y
POP X
POP Y
ENDM
Folgendes Programmstueck enthaelt den Makroaufruf:
LDA 2FH
MOV H,A
LDA 3FH
MOV D,A
EXCHNG H,D
Es wird folgende Uebersetzung erzeugt:
0000' 3A 002F LDA 2FH
0003' 67 MOV H,A
0004' 3A 003F LDA 3FH
0007' 57 MOV D,A
EXCHNG H,D
0008' E5 +PUSH H
0009' D5 +PUSH D
000A' E1 +POP H
000B' D1 +POP D
9.4.2.2._Wiederholungs-Pseudooperationen
Die Pseudooperationen ermoeglichen es, Operationen in einem
Codeblock so oft zu wiederholen, wie spezifiziert wurde.
Die Hauptunterschiede zwischen den Wiederholungs- und den
Makropseudooperationen sind:
1. MACRO gibt dem Block einen Namen, mit welchem er in den
Code an die Stelle, wo er gebraucht wird, aufgerufen werden
kann.
Der Makro kann in mehreren verschiedenen Programmen durch
einfaches Schreiben einer Makroaufruf-Anweisung verwendet
werden.
2. MACRO ermoeglicht das Uebergeben von Parametern an den
Makroblock, wenn er aufgerufen wird; diese Parameter koen-
nen sich aendern.
Die Wiederholungs-Pseudooperationen muessen als ein Teil des
Codeblockes zugewiesen sein.
Das Verwenden der Wiederholungs-Pseudooperationen ist bequem,
wenn die Parameter im Voraus bekannt sind und nicht geaendert
werden und wenn die Wiederholung bei jeder Programmausfuehrung
realisiert werden soll.
Mit der Makro-Pseudooperation muss der Makro jedesmal, wenn er
gebraucht wird, aufgerufen werden!
Beachte, dass jeder Wiederholungsblock mit der ENDM-Pseudoope-
ration abgeschlossen werden muss.
Wiederholung
REPT <exp>
.
.
.
ENDM
Wiederholen des Anweisungsblockes zwischen REPT und ENDM
<exp>-mal.
<exp> ergibt eine vorzeichenlose 16-bit-Zahl.
Wenn <exp> ein externes Symbol oder undefinierte Operanden
enthaelt, wird ein Fehler generiert.
Beispiel:
X SET 0
REPT 10
X SET X+1
DB X
ENDM
erzeugt folgendes Uebersetzungsprotokoll:
0000 X SET 0
REPT 10
X SET X+1
REPT 10
ENDM
0000 '01 + DB X
0001 '02 + DB X
0002 '03 + DB X
0003 '04 + DB X
0004 '05 + DB X
0005 '06 + DB X
0006 '07 + DB X
0007 '08 + DB X
0008 '09 + DB X
0009 '0A + DB X
END
Undefinierte_Wiederholung
IRP <dummy>,<parameter, eingeschlossen in spitze Klammern>
.
.
.
ENDM
Die Parameter muessen in spitze Klammern eingeschlossen wer-
den!
Die Parameter koennen gueltige Symbole, Zeichenketten, Zahlen
oder Zeichenkettenkonstanten sein.
Der Anweisungsblock wird fuer jeden Parameter wiederholt. Jede
Wiederholung ersetzt den naechsten Parameter fuer jedes Auf-
treten von <dummy> in dem Block.
Wenn ein Parameter Null ist (z,B. <>), wird der Block einmal
mit einem Nullparameter ausgefuehrt.
Beispiel:
IRP X,<1,2,3,4,5,6,7,8,9,10>
DB X
ENDM
Dieses Beispiel erzeugt denselben Code (DB 1 - DB 10) wie im
Beispiel bei REPT.
Wenn IRP innerhalb eines Makrodefinitionsblockes verwendet
wird, werden die spitzen Klammern um die Parameter in der
Makroaufruf-Anweisung entfernt, bevor die Parameter an den
Makroblock uebergeben werden.
Ein Beispiel, das den gleichen Code wie oben erzeugt, verdeut-
licht das Entfernen der Klammern von den Parametern:
MAC MACRO X
IRP Y,<X>
DB Y
ENDM
ENDM
Wenn die Makroaufruf-Anweisung
MAC <1,2,3,4,5,6,7,8,9,10>
uebersetzt wird, dann sieht die Makroerweiterung folgendermas-
sen aus:
IRP Y,<1,2,3,4,5,6,7,8,9,10>
DB Y
ENDM
Die spitzen Klammern um die Parameter sind entfernt worden und
der Inhalt wird als ein einziger Parameter uebergeben.
Undefinierte_Wiederholung_mit_Zeichen
IRPC <dummy>,<string>
.
.
.
ENDM
.pa
Die Anweisungen in dem Block werden fuer jedes Zeichen der
Zeichenkette wiederholt.
Jede Wiederholung ersetzt das naechste Zeichen der Zeichenket-
te fuer jedes Auftreten von <dummy> im Block.
Beispiel:
IRPC X,0123456789
DB X+1
ENDM
Dieses Beispiel erzeugt den gleichen Code (DB 1 - DB 10) wie
die beiden vorhergehenden Beispiele.
9.4.2.3._Beendigungs-Pseudooperationen
Makro-Ende
ENDM
ENDM teilt dem Assembler mit, dass der Makro- oder Wiederho-
lungsblock zu Ende ist.
Jede Pseudooperation MACRO, REPT, IRP, IRPC muss mit einem
zugehoerigen ENDM beendet werden. Andererseits wird am Ende
jedes Passes die Meldung "Unterminated REPT/IRP/IRPC/MACRO"
(nicht beendetes REPT/...) erzeugt.
Ein ueberzaehliges ENDM verursacht einen "O"-Fehler.
Wenn ein Makro- oder Wiederholungsblock verlassen werden soll,
bevor die Erweiterung vollstaendig ist, wird die Pseudoopera-
tion EXITM verwendet.
Verlassen_des_Makro
EXITM
EXITM wird innerhalb eines Makro- oder Wiederholungsblockes
zum vorzeitigen Beenden einer Erweiterung verwendet, wenn
irgendeine Bedingung die weitere Erweiterung unnoetig oder
unerwuenscht macht. Meistens wird EXITM in Verbindung mit
einer bedingten Pseudooperation verwendet.
Wenn ein EXITM uebersetzt wird, wird die Erweiterung sofort
abgebrochen. Die restliche Erweiterung oder uebrige Wiederho-
lungen werden nicht generiert.
Wenn der Block, der das EXITM enthaelt, in einem anderen Block
verschachtelt ist, wird die Erweiterung in der aeusseren Ebene
fortgesetzt.
.pa
Beispiel:
MAC MACRO X
Y SET 0
REPT X
Y SET Y + 1
IFE Y - 0FFH ; Test Y
EXITM ; wenn 0, verlassen REPT
ENDIF
DB Y
ENDM
ENDM
9.4.2.4._Pseudooperation_fuer_Makro-Symbole
LOCAL <dummy>[,<dummy>...]
Die Pseudooperation LOCAL wird nur innerhalb eines Makrodefi-
nitionsblockes verwendet.
Wenn LOCAL ausgefuehrt wird, legt der Makroassembler ein ein-
maliges Symbol fuer jedes <dummy> an und ersetzt dieses Symbol
fuer jedes Auftreten von <dummy> in der Erweiterung.
Diese einmaligen Symbole werden meistens zur Definition einer
Marke innerhalb eines Makros verwendet, auf diese Weise ver-
meidet man Mehrfachdefinitionen bei mehrfacher Erweiterung des
Makros.
Die vom Assembler angelegten Symbole reichen von ..0001 bis
..FFFF. Der Anwender sollte eigene Symbole der Form ..nnnn
vermeiden! Die LOCAL-Anweisung muss allen anderen Anweisungs-
typen in der Makrodefinition vorausgehen.
Beispiel:
MAC MACRO NUM,Y
LOCAL A,B,C,D,E
A: DB 7
B: DB 8
C: DB Y
D: DB Y+1
E: DW NUM+1
JMP A
ENDM
MAC 0C00H,0BEH
END
.pa
erzeugt folgende Uebersetzungliste:
MAC MACRO NUM,Y
LOCAL A,B,C,D,E
A: DB 7
B: DB 8
C: DB Y
D: DB Y+1
E: DW NUM+1
JMP A
ENDM
MAC 0C00H,0BEH
0000' 07 + ..0000: DB 7
0001' 08 + ..0001: DB 8
0002' BE + ..0002: DB 0BEH
0003' BF + ..0003: DB 0BEH+1
0004' 0C01 + ..0004: DW 0C00H+1
0006' + JMP ..0000
END
9.4.2.5._Spezielle_Makro-Operatoren
Besondere spezielle Operatoren koennen in einem Makroblock
verwendet werden, um zusaetzliche Assemblerfunktionen auszu-
waehlen.
&> Ampersand verkettet Text oder Symbole. (Das Ampersand
kann nicht in einer Makroaufruf-Anweisung verwendet
werden.)
Ein symbolischer Parameter wird in der Erweiterung nicht
ersetzt, wenn nicht unmittelbar vorher ein &> steht.
Ein Symbol wird aus Text und symbolischem Parameter
gebildet, indem zwischen beide ein &> geschrieben wird.
Beispiel:
ERRGEN MACRO X
ERROR&>X: PUSH B
MVI B,'&>X'
JMP ERROR&>X
ENDM
Der Aufruf ERRGEN A wird erzeugen:
ERROR&>A: PUSH B
MVI B,'A'
JMP ERROR&>A
;; In einem Block wird ein Kommentar, dem 2 Semikolons
vorausgehen, nicht als Teil der Erweiterung erhalten (er
erscheint bei .LALL nicht auf dem Protokoll).
Ein Kommentar nach nur einem Semikolon wird erhalten und
erscheint in der Erweiterung.
! Ein Ausrufezeichen kann in einem Argument geschrieben
werden, um anzuzeigen, dass das naechste Zeichen als
Literal genommen werden soll.
Deswegen ist !; dasselbe wie <;>.
% Das Prozentzeichen wird nur in einem Makroargument zum
Konvertieren des auf das % folgenden Ausdruckes (mei-
stens ein Symbol) in eine Zahl in der aktuellen Zahlen-
basis (festgesetzt mit .RADIX) verwendet.
Waehrend der Makroerweiterung ersetzt diese Zahl den
symbolischen Parameter.
Die Verwendung des %-Operators erlaubt den Makroaufruf
mit einer Zahl.
(Meistens ist ein Makroaufruf ein Aufruf mit einer
Referenz, wobei der Text des Makroarguments exakt den
symbolischen Parameter ersetzt.)
Der auf % folgende Ausdruck muss den gleichen Regeln
genuegen, wie der Ausdruck bei einer DS-Pseudoopera-
tion. Das heisst, es ist ein gueltiger Ausdruck erfor-
derlich, der eine absolute Konstante (nichtverschieb-
lich) ergibt.
Beispiel:
PRINTE MACRO MSG,N
.PRINTX *MSG,N*
ENDM
SYM1 EQU 100
SYM2 EQU 200
PRINTE <SYM1+SYM2=>,%(SYM1+SYM2)
Normalerweise wuerde beim Makroaufruf der symbolische Parame-
ter N durch die Kette (SYM1+SYM2) ersetzt.
Das Resultat waere:
PRINTX*SYM1+SYM2=,(SYM1+SYM2)*
Wenn das % vor dem Parameter steht, wird folgendes erzeugt:
PRINTX*SYM1+SYM2=,300*
9.4.3.___Pseudooperationen_zur_bedingten_Assemblierung
Die bedingten Pseudooperationen ermoeglichen dem Anwender
Codebloecke zu entwerfen, die spezielle Bedingungen testen und
entsprechend vorgehen.
.pa
Alle Bedingungen haben folgendes Format:
IFxxxx [argument] | * COND [argument]
. | .
. | .
. | .
[ELSE | [ELSE
. | .
. | .
. ] | . ]
ENDIF | * ENDC
Zu jedem IFxxxx muss ein zugehoeriges ENDIF die Bedingung ab-
schliessen.
Zu jedem COND muss ein zugehoeriges ENDC die Bedingung ab-
schliessen. Andererseits wird die Meldung "Unterminated Condi-
tional" (nicht beendete Bedingung) am Ende jedes Passes er-
zeugt.
Ein ENDIF ohne zugehoeriges IF oder ein ENDC ohne zugehoeriges
COND verursacht einen "C"-Fehler.
Der Assembler bewertet eine Bedingungsanweisung mit "wahr"
(ist gleich FFFFH oder -1 oder jeder Wert ungleich Null) oder
mit "falsch" (ist gleich Null).
Der Code in dem Bedingungsblock wird uebersetzt, wenn der Wert
der Bedingung entspricht, die in der Bedingungsanweisung
definiert wurde. Wenn der Wert dem nicht entspricht, ignoriert
der Assembler den Bedingungsblock entweder vollstaendig oder,
wenn er eine optionale ELSE-Anweisung enthaelt, uebersetzt er
nur den ELSE-Teil.
Bedingungen koennen bis zu 255mal geschachtelt werden. Jedes
Argument einer Bedingung muss im Pass 1 bekannt sein, um einen
"V"-Fehler und unkorrekte Auswertung zu vermeiden. Der Aus-
druck fuer IF/IFT/COND und IFF/IFE muss einen Wert haben, der
vorher definiert wurde und der absolut ist.
Wenn der Name nach einem IFDEF oder IFNDEF definiert wurde,
betrachtet der Assembler ihn im Pass 1 als undefiniert; aber
er wird im Pass 2 definiert.
Jeder Bedingungsblock kann optional die Pseudooperation ELSE
enthalten, die die Moeglichkeit gibt, alternativen Code zu
erzwingen, wenn die entgegengesetzte Bedingung auftritt.
Fuer ein IFxxxx/COND ist nur ein ELSE erlaubt.
Das ELSE ist immer mit dem zuletzt eroeffneten IF verbunden.
Eine Bedingung mit mehr als einem ELSE oder ein ELSE ohne eine
Bedingung wird einen "C"-Fehler verursachen.
Bedingte_Pseudooperation
IF <exp>
IFT <exp>
* COND <exp>
Die Anweisungen innerhalb des Bedingungsblockes werden ueber-
setzt, wenn <exp> nicht Null ergibt.
IFE <exp>
IFF <exp>
Die Anweisungen innerhalb des Bedingungsblockes werden ueber-
setzt, wenn <exp> den Wert Null hat.
IF1 Pass 1 Bedingung
Die Anweisungen innerhalb des Bedingungsblockes werden ueber-
setzt, wenn sich der Assembler im Pass 1 befindet.
IF2 Pass 2 Bedingung
Die Anweisungen innerhalb des Bedingungsblockes werden ueber-
setzt, wenn sich der Assembler im Pass 2 befindet.
IFDEF <symbol>
Die Anweisungen innerhalb des Bedingungsblockes werden ueber-
setzt, wenn das Symbol definiert ist oder als EXTERNAL er-
klaert wurde.
IFNDEF <symbol>
Die Anweisungen innerhalb des Bedingungsblockes werden ueber-
setzt, wenn das Symbol nicht definiert und nicht als EXTERNAL
erklaert wurde.
IFB <arg>
Die spitzen Klammern um <arg> sind erforderlich. Die Anwei-
sungen im Bedingungsblock werden uebersetzt, wenn das Argument
leer (nicht angegeben) oder Null (<>) ist.
IFNB <arg>
Die spitzen Klammern um das <arg> sind erforderlich. Die
Anweisungen innerhalb des Bedingungsblockes werden uebersetzt,
wenn das Argument nicht leer ist.
Dies wird verwendet, um symbolische Parameter zu testen.
IFIDN <arg1>,<arg2>
Die spitzen Klammern um <arg1> und <arg2> sind erforderlich.
Die Anweisungen innerhalb des Bedingungsblockes werden ueber-
setzt, wenn die Kette <arg1> identisch der Kette <arg2> ist.
IFDIF <arg1>,<arg2>
Die spitzen Klamern um <arg1> und <arg2> sind erforderlich.
Die Anweisungen innerhalb des Bedingungsblockes werden ueber-
setzt, wenn die Kette <arg1> verschieden von der Kette <arg2>
ist.
ELSE
ELSE bietet die Moeglichkeit, alternativen Code zu erzeugen,
wenn die entgegengesetzte Bedingung auftritt. ELSE kann mit
jeder bedingten Pseudooperation verwendet werden.
ENDIF
* ENDC
Diese Pseudooperationen schliessen den Bedingungsblock ab. Sie
muessen zu jeder verwendeten bedingten Pseudooperation ge-
schrieben werden.
ENDIF muss ein zugehoeriges IFxxxx haben und ENDC ein zugehoe-
riges COND.
9.5._____Abarbeitung_des_Assemblers
Wenn das Assemblerprogramm vollstaendig entworfen ist, kann es
uebersetzt werden.
Der Assembler uebersetzt die Quelldateianweisungen ein-
schliesslich der Erweiterung von Makros und Wiederholungspseu-
dooperationen.
Das Ergebnis ist ein verschieblicher Objektcode, der mit dem
Programmverbinder gebunden und geladen werden kann. Der ver-
schiebliche Objektcode kann in eine Diskettendatei, die vom
Assembler den Dateityp .REL bekommt, geschrieben werden. Die
uebersetzte Datei (.REL) ist nicht ausfuehrbar.
Die Datei wird erst nach der Behandlung durch den Programmver-
binder ausfuehrbar.
Der Assembler benoetigt ungefaehr 19K Speicherplatz und hat
eine Abarbeitungsgeschwindigkeit von mehr als 1000 Zeichen je
Minute.
Der Assembler arbeitet unter dem Betriebssystem SCPX 1526.
Der Assembler uebersetzt die Quelldatei in zwei Paessen.
Waehrend des 1. Passes wertet er die Programmanweisungen aus,
berechnet, wieviel Code er erzeugen wird, bildet eine Symbol-
tabelle, in der jedem Symbol ein Wert zugewiesen wird und
erweitert die Makroaufruf-Anweisungen.
Waehrend des 2. Passes setzt er in die Symbole und Ausdruecke
die Werte aus der Symboltabelle ein, erweitert erneut die
Makroaufruf-Anweisungen und gibt den verschieblichen Code aus.
Der Assembler prueft die Werte der Symbole, Ausdruecke und
Makros waehrend beider Paesse. Er gibt einen Phasenfehlercode
zurueck, wenn der Wert waehrend des 2. Passes nicht mit dem
Wert waehrend des 1. Passes uebereinstimmt.