Format eines Makroaufrufs
Das Makroaufruf-Format ist aus zwei Feldern aufgebaut.
Das obere Feld enthält das optionale Namensfeld und den Makronamen. Das untere Feld enthält die möglichen Operanden.
[name] Makroname |
<operand1> ,<operand2> |
Ein Eintrag im Namensfeld ist grundsätzlich erlaubt. Der hier angegebene Name stellt die symbolische Adresse des ersten Befehls der Makroauflösung dar. Der Benutzer kann diese Adresse z.B. als Sprungziel oder als Haltepunkt für die Dialogtesthilfe benutzen.
Die Aufruf-Formate in diesem Handbuch verzichten allgemein auf die Darstellung des Namensfeldes außer in den Fällen, wo einer Angabe im Namensfeld besondere Bedeutung zukommt. Ein Beispiel dafür ist der Aufruf eines Makros vom Typ S in der L-Form (siehe "S-Typ-Makroaufrufe"): die im Namensfeld angegebene symbolische Adresse ist nötig zur Verknüpfung des Datenbereichs mit dem Befehlsteil des Makros (E-Form). Weitere Beispiele sind die Makros ARDS, CUPAB, DCSTA und TMODE, wo der Standardname des generierten Pseudoabschnittes durch die Angabe im Namensfeld ersetzt werden kann. Die Formatdarstellung dieser Makros umfasst auch das Namensfeld.
Der Makroname bezeichnet den gewünschten Makro. Das Zeichen „$“ als erstes Zeichen kommt bei Makros für Benutzer nicht vor, da es den privilegierten Makroaufrufen vorbehalten ist.
Das Operandenfeld kann eine beliebige Anzahl von Operanden enthalten, die durch Kommas getrennt sind. Es kann auch leer sein. Die Art und Anzahl der Operanden, die angegeben werden können oder müssen, ist der Formatdarstellung des jeweiligen Makroaufrufs zu entnehmen.
Beim Aufruf des Makros im Assemblerprogramm müssen das Namensfeld, der Makroname und der erste Operand mit mindestens einem Leerzeichen getrennt sein. Mehrere Operanden müssen durch Kommas getrennt werden.
Fehler im Format eines Makroaufrufs, die bereits bei der Verarbeitung durch den Assembler erkannt werden, sind durch MNOTE-Meldungen (siehe die Kapitel zur Makrosprache im Handbuch „ASSEMBH“ [2]) im Übersetzungsprotokoll gekennzeichnet.
Operandenformen
Stellungsoperanden
Stellungsoperanden werden vom Assembler anhand ihrer Stellung im Operandenfeld identifiziert, weshalb in ihrer Schreibweise eine bestimmte Reihenfolge eingehalten werden muss. Beispiel: MAKRO A,B,C
Soll der zweite Operand (B) entfallen, so muss dennoch das zweite Komma (unmittelbar hinter dem ersten Komma) geschrieben werden, um die Stellung des dritten Operanden (C) beizubehalten: MAKRO A,,C
Entfallen dagegen die letzten Stellungsoperanden, so müssen die trennenden Kommas nicht geschrieben werden. Im vorliegenden Beispiel bedeutet dies, dass beim Wegfall der Operanden B und C der Makroaufruf wie folgt geschrieben werden kann: MAKRO A
Schlüsselwortoperanden
Ein Schlüsselwortoperand wird vom Assembler durch das ihm eindeutig zugeordnete Schlüsselwort identifiziert. Deshalb ist auch die Reihenfolge dieser Operanden beliebig. Einem Schlüsselwortoperanden wird durch ein Gleichheitszeichen ein Operandenwert zugewiesen, welcher aus einem definierten Wertevorrat stammt.
Die Schreibfolge ist: <Schlüsselwort>=<gewünschter Wert>
Beispiel: MAKRO AREA=X,LENGTH=100
Gemischte Operanden
Ein Operandenfeld kann beide Arten, Stellungs- und Schlüsselwortoperanden, enthalten. Dabei müssen jedoch alle Stellungsoperanden den Schlüsselwortoperanden vorangehen. Beispiel: MAKRO A,B,C,AREA=X,LENGTH=100
Die Regeln für das Weglassen von Stellungs- und Schlüsselwortoperanden gelten entsprechend auch für gemischte Operandenfelder. Sollen z.B. die Operanden B, C und AREA entfallen, so lautet obiges Beispiel wie folgt: MAKRO A,LENGTH=100
Operanden-Unterlisten
Eine Unterliste besteht aus einem oder mehreren durch Kommas getrennten Stellungsoperanden, wobei die gesamte Liste in Klammern eingeschlossen ist. Sie wird als ein Operand betrachtet, d.h. sie besetzt entweder eine einzelne Stelle im Operandenfeld oder ist einem einzelnen Schlüsselwort zugeordnet. Die Verarbeitung des Inhalts einer Unterliste geschieht ähnlich wie bei Stellungsoperanden. Beispiel: (A,B,C)
oder (A)
Wenn die Unterliste aus nur einem Operanden besteht (wie im zweiten Beispiel), so müssen die einschließenden Klammern dennoch geschrieben werden, da hierdurch die Unterliste als solche gekennzeichnet ist.
Metasyntax
Bei der Darstellung des Makroaufruf-Formats werden bestimmte Metazeichen verwendet und Vereinbarungen vorausgesetzt, die im Folgenden erläutert werden.
Formale Darstellung | Erläuterung | Beispiel |
| Großbuchstaben bezeichnen Schlüsselwörter oder Konstanten, die in dieser Form vom Benutzer angegeben werden müssen. |
anzugeben ist |
Schlüsselwörter müssen mit * beginnen, falls alternativ sowohl Schlüsselwörter als auch Namen von Konstanten oder Variablen angegeben werden können. |
anzugeben ist | |
| Großbuchstaben in Halbfett kennzeichnen erlaubte Abkürzungen der Schlüsselwörter. |
|
| Kleinbuchstaben bezeichnen Variablen, die bei der Eingabe vom Benutzer durch aktuelle Werte ersetzt werden müssen, d.h. ihr Inhalt kann von Fall zu Fall verschieden sein. |
anzugeben ist z.B. |
< > | Spitze Klammern kennzeichnen Variablen, deren Wertevorrat durch die Datentypen beschrieben wird. | <var: pointer> |
{ } | Geschweifte Klammern schließen Alternativen ein, d.h. aus den eingeschlossenen Größen muss eine Angabe ausgewählt werden. Ausnahme: Standardwerte | {SINAME=name | } Anzugeben ist |
/ | Der Schrägstrich trennt alternativ zu verwendende Angaben (Operandenwerte). Siehe auch Anmerkung weiter unten. In komplizierten Strukturen können die alternativen Operandenwerte auch mit geschweiften Klammern gruppiert sein. Geschweifte Klammern dürfen nicht angegeben werden. |
Anzugeben ist |
| | Der senkrechte Strich trennt alternativ zu verwendende Angaben innerhalb von geschweiften Klammern. Siehe auch Anmerkung weiter unten. |
Anzugeben ist |
[ ] | Eckige Klammern schließen Wahlangaben ein, d.h. Angaben, die weggelassen werden können. Steht bei Wahlangaben das Komma innerhalb der Klammer, so muss es nur bei Verwendung dieser Wahlangabe geschrieben werden. Steht es hingegen außerhalb der Klammer, so muss es stets geschrieben werden, auch wenn die Wahlangabe nicht gemacht wird. |
Anzugeben ist z.B. |
ABC.. | Die Unterstreichung hebt den Standardwert hervor. Das ist der Wert, den das System einsetzt, wenn der Benutzer keine Angabe macht (= Voreinstellung). Hat ein Operand keinen Standardwert, so ist die Angabe dieses Operanden Pflicht. |
Anzugeben ist: (keine Angabe, impliziert |
| Aus den list-poss folgenden Operandenwerten kann eine Liste gebildet werden. n gibt die maximale Anzahl der Listenelemente an. Enthält die Liste mehr als ein Element, muss sie in runden Klammern eingeschlossen werden. | FLAG=list-poss(3): *SLI/*SKIP/*DC anzugeben ist: FLAG=*SKIP FLAG=(*SLI,*DC) |
... | Punkte bedeuten eine Wiederholung. Sie zeigen an, dass die davor stehende Einheit mehrmals hintereinander in Form einer Liste wiederholt werden kann. Punkte können auch darauf hinweisen, dass weitere Operanden angegeben werden können, die in einem früheren Abschnitt erläutert wurden. |
Anzugeben ist z.B. MF=(E,...) (siehe auch Typen von Makro-Aufrufen) |
Das Gleichheitszeichen weist den Operanden einen Operandenwert zu. |
| |
Dieses Zeichen kennzeichnet ein Leerzeichen (X'40') |
Anzugeben ist ' |
Tabelle 1: Makro-Syntax
Die Darstellung von Alternativen mittels Schrägstrich ( ACCESS=READ / WRITE) oder geschweiften Klammern mit senkrechtem Strich (ACCESS={ READ | WRITE }) ist gleichwertig. Die geschweiften Klammern werden in komplexeren Ausdrücken verwendet, um eine bessere Übersichtlichkeit zu gewährleisten oder Mehrdeutigkeiten zu vermeiden.
Beispiel 1:
...
,{
LIBNAM@=adr / (r) / label |
LIBNAM= *DBLOPT / datei / * |
LIBLINK=name
}
...
Die geschweiften Klammern beinhalten Alternativen, die mit senkrechten Strichen voneinander getrennt sind: die Operanden LIBNAM@, LIBNAM oder LIBLINK können alternativ verwendet werden. Beim Operanden LIBNAM@ können die Werte adr, (r) oder label alternativ verwendet werden; beim Operanden LIBNAM können die Werte *DBLOPT, datei oder "*" alternativ verwendet werden. Die alternativen Werte sind hier mit einen Schrägstrich getrennt.
Beispiel 2:
{ --------------------------------------------------- (1)
{ ------------------------------------------------- (2)
SINAME=name |
SINAMAD=adr / (r)[,SINAMLN=länge]
} ------------------------------------------------- (2')
,SCOPE=LOCAL / GROUP / USER_GROUP / GLOBAL |
SIID=adr / (r)
} --------------------------------------------------- (1')
Innerhalb der Klammern (2)/(2') können die Operanden SINAME=name bzw. SINAMAD=.. verwendet werden. Innerhalb des Operanden SINAMAD können die alternativen Werte adr oder (r),SINAMLN=länge angegeben werden, wobei die Angabe SINAMLN optional ist. Optionale Operanden/Werte werden in eckige Klammern gefasst.
Innerhalb der Klammern (1)/(1') kann entweder das Konstrukt der Klammern (2)/(2') mit der Angabe SCOPE= verwendet werden oder alternativ die Angabe SIID=
Alternative Operandenwerte für SCOPE sind LOCAL, GROUP, USER_GROUP oder GLOBAL. Alternative Operandenwerte für SIID sind adr oder (r).
Beispiel3:
{ -------------------------------------------------- (3)
INTR='messid' / adr / (r)[,AREA={adr | (r)}]
| (4)
FINISH='messid' / adr / (r),AREA={adr | (r)} (5)} -------------------------------------------------- (3')
Innerhalb der äußersten geschweiften Klammern (3)+(3') können alternativ die Operanden INTR oder FINISH angegeben werden. Die beiden Alternativen werden durch "|" am Ende von (4) getrennt.
Die Operandenwerte von INTR können alternativ 'messid', adr, (r), (r),AREA=adr oder (r),AREA=(r) sein. Die eckige Klammer um AREA... zeigt an, dass die Angabe optional ist. Beim Operanden FINISH verhält es sich ähnlich, nur, dass bei der Alternative (r),AREA= die Angabe von AREA verpflichtend ist. Die beiden Alternativen adr und (r) beim Operanden AREA wurden in geschweifte Klammern gefasst, um Mehrdeutigkeiten bei der Zuordnung der Alternativen zu den Operanden zu vermeiden.
Beispiel 4:
FCT=
{
DESTROY,SPID=spid_adr | --- (6)
INFORM,IDENT=NAME / SPID
[,SPID=spid_adr]
[,NAME='name' / name_adr]
,SCOPE={LOCAL / GROUP / USER_GROUP / GLOBAL} | --- (6)
EXTEND,SPID=spid_adr
,SIZE={zahl / (r)} | --- (6)
CLEAR,SPID=spid_adr
,AREA=area_adr / (r)
,SIZE=zahl / (r) }
Der Operand FCT erlaubt im Beispiel oben vier alternative Funktionen: DESTROY, INFORM, EXTEND, CLEAR. Die Alternativen sind durch "|" getrennt (6). Die Einrückungen verdeutlichen, welche weiteren Operanden zu den jeweiligen Funktionen gehören. Z.B. gehören zur Funktion INFORM die weiteren Operanden IDENT, SPID, NAME und SCOPE. Die Funktion EXTEND kennt nur die Operanden SPID und SIZE.
Datentypen der Operandenwerte
Datentyp | Zeichenvorrat | Anmerkungen |
| EBCDIC-Zeichen | ist in Hochkommata einzuschließen |
| [+-] 0..2147483647 | ist eine dezimale Zahl |
| leitet eine variable Angabe ein. |
|
| Register 0..15 |
|
Zusätze zu Datentypen
Zusatz | Bedeutung |
| für Datentyp |
für Datentyp | |
| bei Datentyp |
Die Operandenwerte können direkt als Zeichenkette oder Integer-Zahl (siehe Datentypen c-string
und integer
) eingegeben werden oder indirekt über eine Variable (siehe Datentyp var:
) bezeichnet werden. Die nachfolgende Tabelle enthält die Datentypen, die für Variablen möglich sind.
Datentypen der Variablen
Datentyp | Beschreibung | Definition im |
| Die Variable ist eine Zeichenkette von n Zeichen. |
|
| Die Variable ist eine Integer-Zahl, die |
|
| Die Variable ist die Aufzählung |
|
| Die Variable ist eine Adresse oder ein Adresswert. |
|