ASSEMBH V1.2A Beschreibung

ASSEMBH

Assembler

Cognitas GmbH on behalf of/im Auftrag von Fujitsu Technology Solutions

ASSEMBH V1.2A Beschreibung - Fujitsu

Instruction Length Code. preCCC. DS. X. Condition Code. preCPM. DS. X. Program Mask. preCSS. DS. X. Sprachschlüssel. Programmierhinweis.

PDF Viewing Options

Not Your Device? Search For Manuals or Datasheets below:


File Info : application/pdf, 496 Pages, 1.60MB

Document DEVICE REPORTassh bs
1

Einleitung

1.1

Kurzbeschreibung des Produkts

Der ASSEMBH ist ein Übersetzer für die Assembler- und die Makrosprache.
Der ASSEMBH bearbeitet jeweils ein Quellprogramm. Der Text eines Quellprogramms ist eine Folge von Instruktionen und Kommentaren, die jeweils eine oder mehrere Übersetzungseinheiten darstellen. Eine Übersetzungseinheit in einem Assembler-Quellprogramm fängt in der Regel mit einer START- oder CSECT-Anweisung an und endet mit einer END-Anweisung. Bei der strukturierten Programmierung (wird vom ASSEMBH-BC nicht unterstützt) werden diese Anweisungen durch die entsprechenden vordefinierten Makros generiert. Der ASSEMBH erzeugt für jede Übersetzungseinheit einen Objektmodul.
Instruktionen in einem Quellprogramm können sein:
Assembleranweisungen Sie veranlassen den Assembler, während der Übersetzung bestimmte Operationen durchzuführen.
Assemblerbefehle Sie veranlassen die Zentraleinheit, während des Programmlaufs bestimmte Operationen durchzuführen.
Makroaufrufe Sie veranlassen den Assembler, während der Übersetzung bereits codierte Quelltexte einzulesen. Entsprechend den im Makroaufruf angegebenen Informationen werden die Quelltexte modifiziert und die so erzeugten Instruktionen ins Quellprogramm eingefügt.
Makroanweisungen Sie ermöglichen es, den Text und die Anzahl der erzeugten Instruktionen entsprechend den bei der Übersetzung errechneten Bedingungen zu variieren.
Assembleranweisungen, Makroaufrufe und Makroanweisungen sowie die vordefinierten Makroaufrufe für die strukturierte Programmierung sind im folgenden beschrieben. Eine ausführliche Beschreibung der Assemblerbefehle finden Sie im Handbuch Assemblerbefehle, Beschreibung [3].

U5223-J-Z125-3

1

Einleitung

1.2

Zielgruppe

Voraussetzung für die Arbeit mit diesem Handbuch ist eine Grundausbildung in Assembler. Das Handbuch eignet sich sowohl als Nachschlagewerk, als auch dazu, neue Funktionen kennenzulernen oder Kenntnisse zu vertiefen.

1.3

Konzept des Handbuchs

Das Handbuch besteht aus drei Teilen:
Die Kapitel 2 bis 4 beschreiben die Struktur der Assemblersprache und die Assembleranweisungen.
Die Kapitel 5 bis 8 beschreiben die Struktur und die Elemente, sowie die Instruktionen der Makrosprache.
Die Kapitel 9 und 10 beschreiben den Aufbau eines Assembler-Programms nach den Regeln der strukturierten Programmierung und die vordefinierten Makros für die strukturierte Programmierung.

Die Handhabung des ASSEMBH im BS2000 ist im ASSEMBH, Benutzerhandbuch [1] beschrieben. Die Beschreibung des Testsystems AID finden Sie im Handbuch AID, Testen von ASSEMBH-Programmen [2].

Literaturhinweise werden im Text in Kurztiteln angegeben. Der vollständige Titel jeder Druckschrift, auf die verwiesen wird, ist im Literaturverzeichnis aufgeführt. Zusätzlich ist dort das entsprechende Taschenbuch aufgeführt.
Hinweise zur Bestellung von Druckschriften finden Sie nach dem Literaturverzeichnis.

2

U5223-J-Z125-3

Einleitung

1.4

Änderungen gegenüber der vorigen Ausgabe

Die über das ganze Handbuch verteilten Korrekturen sind nicht eigens aufgeführt. Wesentliche fachliche Neuerungen und Änderungen sind folgende:
Die Leistung der PUNCH- und REPRO-Anweisungen wird bei Moduln im LLM-Format nicht unterstützt (Kapitel 4.2).
Folgende @-Makros im Kapitel 10 sind erweitert oder geändert: Operandenbeschreibung im @CONEN-Makro ist verbessert Erweiterung des DROP-Operanden im @END-Makro Operanden reg1-reg3 im @ENTR-Makro entfallen Textergänzung des Operanden RC im @EXIT-Makro Texterweiterung im @ININ-Makro Einführung des Ereignisnamens 'INTR' im @STXEN-Makro
Die Auflistung im Anhang 11.2: 'Format der Assemblerbefehle' wurde um die ESABefehle erweitert.
Die Tabelle im Anhang 11.6: 'Unterschiede von ASSEMBH zum ASSEMB' wurde erweitert und aktualisiert.

Das Kapitel "Handbuchergänzungen" enthält gesammelt weitere Neuerungen.

U5223-J-Z125-3

3

Metasprache

1.5

Metasprache

Für die Formatdarstellung der Instruktionen wird folgende Metasprache verwendet:

KONSTANTE

Großbuchstaben bezeichnen metasprachliche Konstanten, die Sie in dieser Form eingeben müssen.

name

Kleinbuchstaben bezeichnen metasprachliche Variablen, für die Sie dem Zusammenhang entsprechende Werte einsetzen müssen.

YES

Unterstreichung eines Wertes bezeichnet einen Standardwert,

der vom Assembler oder vom Betriebssystem eingesetzt wird.

YES

Geschweifte Klammern schließen Alternativen ein. Aus

den angegebenen Größen müssen Sie eine auswählen.

NO

Die Alternativen stehen untereinander.

Ist eine der Alternativen ein Standardwert, dann ist keine

Angabe nötig, wenn Sie den Standardwert wünschen.

[]

Eckige Klammern schließen Wahlangaben ein, die

weggelassen werden können.

()

Runde Klammern sind metasprachliche Konstanten und

müssen mit eingegeben werden.

...

Drei Punkte bedeuten, daß die vorstehende Einheit

mehrmals wiederholt werden kann.

[,...]

Komma, drei Punkte bedeutet, daß die vorstehende Einheit mehrmals wiederholt werden kann, aber jeweils durch Komma getrennt werden muß. Die eckigen Klammern zeigen die Wahlfreiheit an.

{}[,...]

Die einzeilige geschweifte Klammer umschließt in diesem Fall die syntaktische Einheit, die wiederholt werden kann.

Ersatzdarstellung für Leerzeichen. Wird dort verwendet, wo ein Leerzeichen syntaktisch notwendig ist.

4

U5223-J-Z125-3

Metasprache

2

Struktur der Assemblersprache

Der Text eines Assembler-Quellprogramms besteht aus einer Folge von Instruktionen und Kommentaren. Instruktionen können hier Assembleranweisungen, Assemblerbefehle oder Makroaufrufe sein. Kommentare dienen der Programmdokumentation, sie haben keine Auswirkung auf das übersetzte Programm. Neben diesen Assembler-Sprachelementen, die im folgenden beschrieben werden, sind im Assembler-Quellprogramm verschiedene Makro-Sprachelemente erlaubt. Diese Möglichkeit wird in Kap. 8 beschrieben.

2.1

Zeichenvorrat

Folgende Zeichen können beim Schreiben von Instruktionen verwendet werden:

Buchstaben
A bis Z
a bis z jedoch nur wenn LOW-CASECONVERSION=YES gesetzt ist (siehe [1])
_ (Unterstrich)
$ Namen mit $ als erstem Zeichen sind für Applikationen des Betriebssystems reserviert (siehe [9])
#
@

Ziffern 0 bis 9

Sonderzeichen +-*= , . () / ' (Hochkomma) & (kommerzielles Und)
(Leerzeichen)

U5223-J-Z125-3

5

Struktur der Assemblersprache

Beispiele für die Verwendung des Zeichenvorrats

Zeichen

Verwendung

Alphanumerische in symbolischen Adressen

Ziffern

als dezimale selbstdefinierende Werte

Sonderzeichen als Operatoren:

+ * / + oder -

Addition Subtraktion Multiplikation Division unär

als Begrenzer:

Leerzeichen , Komma ' Hochkomma
( ) Klammern

zwischen Einträgen zwischen Operanden - um Datenkonstanten ein-
zuschließen, - bei der Bezugnahme auf
Merkmale um Ausdrücke und Adreßkonstanten einzuschließen

als Anzeiger für:

. Punkt
* Stern = &

- Folgesymbole, - Kommentar, der nicht ins
Übersetzungsprotokoll eingeht - Dezimalpunkt, - Verkettungen - Bezugnahme auf den Adreßpegel - Kommentar, der ins Übersetzungsprotokoll eingeht - Literale, - Kennwortoperanden Variable Parameter

Beispiel ADR100, AB_CD 4096 8192
AREA1+AREA2 OUT-20 3*ALPHA NEUN/3 +10, -4
ADR1 LR R5,R6 OPND1,OPND2 C'CONSTANT' L'AREA MVC AREA(12), (A+B*(C-D))
.LOOP .*THIS IS A COMMENT
DC F'3.7C2' &PARAM.SAVE *+100 *THIS IS A COMMENT MVC FELD,=C'SIEMENS' MACALL &PAR='ABC' &PARAM

6

U5223-J-Z125-3

Struktur der Assemblersprache
Groß- und Kleinbuchstaben im Quellprogrammtext
Der ASSEMBH erlaubt es, in Instruktionen und Kommentaren Groß- und Kleinbuchstaben zu verwenden, wenn die Option LOW-CASE-CONVERSION=YES gesetzt wurde (siehe ASSEMBH, Benutzerhandbuch [1]). Dabei ist folgendes zu beachten:
Kleinbuchstaben werden in Großbuchstaben umgeschlüsselt und entsprechend weiterverarbeitet
in symbolischen Adressen im Namens- und Operandeneintrag, im Operationseintrag und in Assembler-Schlüsselwörtern (z.B. READ, PRVLGD,...).
Kleinbuchstaben werden unverändert verarbeitet im Bemerkungseintrag, in Kommentarzeilen, in C-Konstanten, in selbstdefinierenden Zeichenwerten und in Zeichenwerten der Makrosprache.
Im Übersetzungsprotokoll wird die Originalzeile mit Groß- und Kleinbuchstaben ausgegeben. Quellprogrammzeilen, die durch einen Makroaufruf generiert wurden, werden jedoch nur in Großbuchstaben ausgegeben.
Referenzlisten werden nur in Großbuchstaben ausgegeben.

2.2

Instruktionen und Kommentare

Instruktionen
Instruktionen können aus fünf Einträgen bestehen:
dem Namenseintrag, dem Operationseintrag, dem Operandeneintrag, dem Bemerkungseintrag und dem Fortsetzungszeichen.
Diese Einträge müssen der obigen Reihenfolge entsprechen und bis auf das Fortsetzungszeichen durch mindestens ein Leerzeichen voneinander getrennt sein. Für eine Instruktion sind beliebig viele Fortsetzungszeilen erlaubt (siehe 2.7, Fortsetzungszeichen).
Die Voreinstellung für die Anfangs-, die End- und die Fortsetzungsspalte sind die Spalten 1, 71 und 16. Diese Voreinstellung kann durch eine Compiler-Option (siehe ASSEMBH, Benutzerhandbuch [1]) oder durch die ICTL-Anweisung geändert werden (siehe 4.2, ICTL-Anweisung).

U5223-J-Z125-3

7

Struktur der Assemblersprache

Namenseintrag
Operationseintrag
Operandeneintrag

Name

leer
mnemotechn. Op.code Makroaufruf

einer Ass.anweisung
eines Ass.befehls

Operanden Literale

Ausdrücke

leer

Name

Elemente von Ausdrücken

selbstdef. Wert
Bezugn. auf Adreßpegel

Bezugn. auf Längenmerkmal

Bemerkungseintrag

Bemerkung leer

Fortsetzungszeichen

Zeichen leer

Bild 2 - 1

Aufbau von Instruktionen in der Assemblersprache

8

U5223-J-Z125-3

Struktur der Assemblersprache

Kommentare
Kommentare werden zur Programmdokumentation verwendet. Sie haben keine Auswirkungen auf das übersetzte Programm.
Es gibt zwei Arten von Kommentarzeilen:
* Mit einem Stern in der Anfangsspalte; Diese Kommentarzeilen werden vom Assembler übernommen und im Übersetzungsprotokoll ausgedruckt.
.* Mit einem Punkt in der Anfangsspalte, dem ein Stern folgt; Diese Kommentarzeilen werden vom Assembler nicht übernommen und erscheinen daher auch nicht im Übersetzungsprotokoll.
Für Kommentare gibt es keine Fortsetzungszeilen. Ein trotzdem gesetztes Fortsetzungszeichen wird ignoriert. Längere Kommentare müssen mit Hilfe mehrerer Kommentarzeilen geschrieben werden.

Beispiele

Name

Operation Operand

* YOU NEED TWO LINES * FOR THIS COMMENT .* THIS COMMENT IS NOT PRINTED IN THE LISTING

Fortsetzungszeichen X (wird ignoriert)

U5223-J-Z125-3

9

Struktur der Assemblersprache

2.3

Namenseintrag

Im Namenseintrag steht ein Name aus maximal 64 Buchstaben und Ziffern, der dazu dient, eine Instruktion zu identifizieren.
Externe Namen in Moduln im OM-Format (Objektmodul-Format), die vom Binder TSOSLNK bearbeitet werden, (siehe 4.2, COM-, CSECT-, DXD-, ENTRY-, EXTRN-, WXTRN, und XDSEC-Anweisung), sind auf acht Zeichen beschränkt. Längere externe Namen werden auf acht Zeichen verkürzt weiterverarbeitet und mit einer Meldung versehen.
Externe Namen in Moduln, die mit der Option COMPILER-ACT(,MODULEFORMAT=LLM) erstellt wurden (siehe ASSEMBH, Benutzerhandbuch [1]), sind auf 32 Zeichen erweitert und werden vom Binder BINDER bearbeitet.
Der Namenseintrag kann wahlfrei sein. Wenn er vorhanden ist, muß er in der Anfangsspalte beginnen. Ist die Anfangsspalte leer, so nimmt der Assembler an, daß kein Namenseintrag vorhanden ist und interpretiert die folgenden Zeichen als Operationscode.

Der Assembler weist jedem Namen im Namenseintrag einen Adreßpegel zu. Der gleiche Name im Namenseintrag darf in einer Übersetzungseinheit nur einmal definiert sein. Namen von Programmabschnitten können mehrfach vorkommen, da Programmabschnitte unterbrochen und an anderer Stelle im Programm unter erneuter Nennung des Abschnittsnamens fortgesetzt werden können (siehe auch 4.2, CSECT-, DSECT-, AMODE- und RMODE-Anweisung).

Die Adreßpegel oder Namen sind in der Regel relativ. D.h., sie können zur Ablaufzeit einen anderen Wert haben als zur Übersetzungszeit. Wird einem Namen aber mit einer EQU-Anweisung ein absoluter Wert zugewiesen, dann ändert sich der Wert des Namens zur Ablaufzeit nicht und man spricht von einem Namen mit einem absoluten Wert.

Regeln
Das erste Zeichen eines Namens muß ein Buchstabe sein. Der Wert eines Namens muß zwischen -231 und 231-1 liegen. Unterstriche innerhalb des Namens sind zulässig (z.B. A_B), außer in Namen, die vom Binder bearbeitet werden. Leerzeichen innerhalb des Namens sind nicht zulässig. Die Sonderzeichen & (kommerzielles Und) und . (Punkt) haben eine Sonderfunktion (siehe Kap.5, Struktur der Makrosprache).

10

U5223-J-Z125-3

Struktur der Assemblersprache

Beispiele für zulässige Namen

LOOP

Field

A23456

@B4

X4F2

$A1

LOOP2

#56

LOOP_2

N

THIS_EXTREMLY_LONG_NAME_IS_REALLY_NOT_TOO_LONG_FOR_ASSEMBH

Beispiele für unzulässige Angaben im Namenseintrag

256B

(erstes Zeichen kein Buchstabe)

BCD*34

(enthält das Sonderzeichen *)

IN PUT

(enthält ein Leerzeichen)

BUT_NOW_THIS_EXTREMLY_GREAT_LONG_NAME_IS_TOO_LONG_EVEN_FOR_ASSEMBH

Definieren von Namen
Ein Name ist definiert, wenn er im Namenseintrag einer Assembleranweisung oder eines Assemblerbefehls auftritt oder als Operand einer EXTRN- oder WXTRN-Anweisung.
Die Definition von Namen beinhaltet die implizite Zuweisung eines Längenmerkmals. Das Längenmerkmal eines Namens ist die Länge des bezeichneten Speicherbereichs in Byte. So hat z.B. ein Name, der einen RX-Befehl bezeichnet, das Längenmerkmal 4.
Ausnahme Wenn ein Name gleichgesetzt wurde mit dem Adreßpegel oder mit einem selbstdefinierenden Wert, ist das Längenmerkmal des Namens 1 (siehe 4.2, EQU-Anweisung und 5.5.8, Merkmale).
Das Längenmerkmal eines Namens wird durch einen Wiederholungsfaktor nicht beeinflußt.

U5223-J-Z125-3

11

Struktur der Assemblersprache

2.4

Operationseintrag

Der Operationseintrag kann enthalten:
den mnemotechnischen Operationscode einer Assembleranweisung oder eines Assemblerbefehls oder
den Namen eines System- oder Benutzermakros (Makroaufruf).

Ein Operationseintrag muß angegeben werden. Er muß durch mindestens ein Leerzeichen vom Namenseintrag getrennt sein, bzw. bei fehlendem Namenseintrag mindestens eine Stelle rechts von der Anfangsspalte beginnen.
Ein zulässiger Operationseintrag besteht aus maximal fünf Zeichen für Assembleranweisungen und Assemblerbefehle. Falls der mnemotechnische Operationscode durch eine OPSYN-Anweisung umdefiniert wurde, sind maximal 64 Zeichen möglich. Für Makronamen sind ebenfalls maximal 64 Zeichen möglich.
Innerhalb des Operationseintrags dürfen keine Leerzeichen vorkommen.
Mit der OPSYN-Anweisung können die Standardeinstellung des Operationscodes geändert und neue mnemotechnische Operationscodes erzeugt werden (Siehe 4.2, Assembleranweisungen).

12

U5223-J-Z125-3

Struktur der Assemblersprache

2.5

Operandeneintrag

Der Operandeneintrag enthält die Operanden, die die zu verarbeitenden Speicherbereiche, Masken, Längen oder Datenarten beschreiben oder auf sie Bezug nehmen.
Wenn ein Operandeneintrag angegeben ist, muß er durch mindestens ein Leerzeichen vom Operationseintrag getrennt sein.
Der Operandeneintrag kann aus einem oder mehreren Operanden bestehen, die wiederum einen oder mehrere Ausdrücke enthalten können. Ausdrücke bestehen ihrerseits aus Elementen und Operatoren.
Die Operanden müssen durch Kommas getrennt sein. Zwischen den Operanden und den Trennkommas dürfen keine Leerzeichen stehen.
Ein Operand darf keine Leerzeichen enthalten.
Ausnahme Leerzeichen in Zeichenkonstanten, die als Literale, in einer Konstantendefinition oder als Direktoperanden verwendet werden.

U5223-J-Z125-3

13

Struktur der Assemblersprache

2.5.1

Ausdrücke
Ausdrücke sind die Grundbestandteile der Operanden von Instruktionen. Sie dienen der Ermittlung eines Wertes. Ausdrücke bestehen ihrerseits aus Elementen und Operatoren. In der Assemblersprache kommen einfache und arithmetische Ausdrücke vor.

2.5.1.1

Einfache Ausdrücke
Einfache Ausdrücke bestehen aus nur einem Element. Der Wert des Ausdrucks ist gleich dem Wert des Elements. Der Wert eines einfachen Ausdrucks muß zwischen -231 und 231-1 liegen.

2.5.1.2

Arithmetische Ausdrücke
Arithmetische Ausdrücke setzen sich zusammen aus Elementen und arithmetischen Operatoren.
Die folgenden arithmetischen Operatoren sind erlaubt: + Addition
Subtraktion * Multiplikation / Division + unäres Plus
unäres Minus
In einem arithmetischen Ausdruck kann man die Reihenfolge der Berechnung durch Klammern beeinflussen. Hierbei ist eine Schachtelung der Klammern möglich.

14

U5223-J-Z125-3

Struktur der Assemblersprache

Regeln

Ein arithmetischer Ausdruck darf nicht mit einem Operator, außer dem unären Plus und dem unären Minus beginnen.

Beispiel

richtig:

-7*(A+B)

falsch: *A+15

In einem arithmetischen Ausdruck dürfen zwei Elemente nicht unmittelbar aufeinanderfolgen.

Beispiele

richtig:

FIELD1*(A+B) 15*L'FIELD

falsch:

FIELD1(A+B) 15L'FIELD

Das unäre Plus und das unäre Minus dürfen allen anderen Operatoren direkt folgen.

Ein arithmetischer Ausdruck darf kein Literal enthalten.

Werte von arithmetischen Ausdrücken müssen zwischen -231 und 231-1 liegen.

Beispiele

Einfache Ausdrücke
FIELD C'FIELD' X'4040' L'FIELD *

arithmetische Ausdrücke
*+32 FIELD-35 FIELD*10 FIELD/2 FIELD1+FIELD2 (OUT-(IN*L'FIELD+1)+FIELD)

U5223-J-Z125-3

15

Struktur der Assemblersprache

Berechnung von arithmetischen Ausdrücken
Arithmetische Ausdrücke werden nach folgenden Regeln berechnet:
1. Jedem Element wird sein Wert zugeordnet.
2. Arithmetische Operationen werden von links nach rechts ausgeführt. Multiplikation und Division kommen vor Addition und Subtraktion.
3. Bei Ausdrücken, die Klammern enthalten, werden zuerst die Werte in den Klammern errechnet. Bei mehrstufigen Klammern wird zuerst der innere Klammerausdruck berechnet.
4. Jeder arithmetische Ausdruck wird auf 32 bit berechnet.
5. Divisionsreste werden vernachlässigt; daher ist das Ergebnis jeder Division ganzzahlig.
Beispiel

1/(2*10)

ergibt

0

-11/2

ergibt

-5

6. Division durch Null ist zugelassen und liefert das Ergebnis Null.

16

U5223-J-Z125-3

Struktur der Assemblersprache

2.5.1.3

Absolute und relative Ausdrücke
Ein Ausdruck wird absolut genannt, wenn sein Wert zur Ablaufzeit eines Programms gleich seinem Wert zur Übersetzungszeit ist.
Ein Ausdruck wird relativ genannt, wenn er zur Ablaufzeit eines Programms einen anderen Wert haben kann als zur Übersetzungszeit.
Ob ein Ausdruck relativ oder absolut ist, wird von den Elementen bestimmt, aus denen er gebildet ist.

Absolute Ausdrücke

Ein absoluter Ausdruck wird auf einen absoluten Wert zurückgeführt. Ein absoluter Ausdruck kann sein:

ein absoluter einfacher Ausdruck,

Beispiel

L'FIELD

ein arithmetischer Ausdruck mit nur absoluten Elementen,

Beispiel

L'FIELD+15

ein arithmetischer Ausdruck mit paarweise relativen Elementen mit entgegengesetzten Vorzeichen,

Beispiel

*-FIELD

ein arithmetischer Ausdruck mit relativen und absoluten Elementen.

Beispiel

(*-FIELD)*L'FIELD

Mit absoluten Elementen sind alle arithmetischen Operationen erlaubt.
Wenn ein absoluter arithmetischer Ausdruck relative Elemente enthalten soll, gelten folgende Bedingungen:
Der arithmetische Ausdruck muß eine gerade Zahl von relativen Elementen enthalten
Die relativen Elemente müssen paarweise auftreten. D.h., die zwei relativen Elemente, die zu einem Paar gehören, müssen im gleichen Programmabschnitt definiert sein und entgegengesetzte Vorzeichen haben. Sie müssen nicht unmittelbar hintereinander stehen.
Mit einem relativen Element darf nicht multipliziert oder dividiert werden.

U5223-J-Z125-3

17

Struktur der Assemblersprache

Durch das paarweise Auftreten von zwei relativen Elementen in einem absoluten Ausdruck wird die Wirkung der Programmverschiebung zur Ablaufzeit aufgehoben. Deshalb bleibt der Wert, der von den gepaarten relativen Elementen gebildet wird, konstant, unabhängig von einer Programmverschiebung.

Beispiel AA=AX+RY-RZ

AX

absolutes Element

RY

relatives Element

RZ

relatives Element

AA

absoluter Ausdruck

Wert zur Übersetzungszeit
50 10 25
35

Wert zur Ablaufzeit z.B.
50 110 125
35

Relative Ausdrücke

Der Wert eines relativen Ausdrucks ändert sich um n, wenn das Programm, in dem er auftritt, zur Ablaufzeit eine um n erhöhte Ladeadresse hat. Ein relativer Ausdruck kann sein:

ein relativer einfacher Ausdruck,

Beispiel

*

ein arithmetischer Ausdruck mit nur relativen Elementen,

Beispiel

*-FIELD1-TERM1

ein arithmetischer Ausdruck mit relativen und absoluten Elementen.

Beispiel

*-FIELD1-TERM1+L'FIELD

18

U5223-J-Z125-3

Struktur der Assemblersprache

Wenn ein relativer arithmetischer Ausdruck nur relative oder relative und absolute Elemente enthalten soll, gelten folgende Bedingungen:

erste Möglichkeit: Der arithmetische Ausdruck enthält eine ungerade Anzahl von relativen Elementen und diese Elemente treten, bis auf eines, paarweise auf (siehe oben).

Beispiel

*-FIELD1-TERM1

* und FIELD1 sollen paarweise auftreten, d.h., sie sind im gleichen Programmabschnitt definiert und haben entgegengesetzte Vorzeichen.

zweite Möglichkeit: Mehrere relative Elemente sind im gleichen Programmabschnitt definiert und haben keine entgegensetzten Vorzeichen. Dann muß das Ergebnis ihrer Berechnung ebenfalls im gleichen Programmabschnitt liegen. Der arithmetische Ausdruck kann zusätzlich zu diesen einzelnen relativen Elementen gepaarte relative Elemente enthalten.

Beispiel

TERM1+TERM2+TERM3+*-FIELD1

TERM1,TERM2 und TERM3 sind im gleichen Programmabschnitt definiert, treten aber nicht paarweise auf. Dann muß das Ergebnis ihrer Berechnung ebenfalls im gleichen Programmabschnitt liegen.

Mit keinem der relativen Elemente darf multipliziert oder dividiert werden.

Ein relativer Ausdruck wird auf einen relativen Wert zurückgeführt. Dieser wird errechnet aus dem Wert der ungepaarten relativen Elemente, verändert um den Wert der absoluten und gepaarten relativen Elemente.

Beispiel RA=RU-RV+RU-10

RU RV 10 RU-RV
RA

relatives Element relatives Element absolutes Element gepaarte rel. Elemente
relativer Ausdruck

Wert zur Übersetzungszeit
10 5
10 5
5

Wert zur Ablaufzeit z.B.
110 105
10 5
105

U5223-J-Z125-3

19

Struktur der Assemblersprache

2.5.2

Elemente von Ausdrücken
Ein Element eines Ausdrucks ist die kleinste Einheit der Assemblersprache, die einen Wert darstellt. Jedem Element entspricht ein Wert. Dieser Wert wird entweder durch den Assembler zugewiesen (Namen, Längenmerkmale, Adreßpegel) oder er ist in dem Element direkt enthalten (selbstdefinierender Wert). Jedes Element kann allein einen einfachen Ausdruck darstellen oder mit anderen zu einem arithmetischen Ausdruck kombiniert werden.
Ein Element wird absolut genannt, wenn sein Wert unabhängig von der Ladeadresse des Programms ist, d.h., daß sein Wert zur Ablaufzeit gleich seinem Wert zur Übersetzungszeit ist. Ein Element wird relativ genannt, wenn es relativ zum Programmanfang ist, d.h., daß es zur Ablaufzeit einen anderen Wert haben kann als zur Übersetzungszeit.
Wenn zwei relative Elemente in einem Ausdruck kombiniert werden, können sie paarweise auftreten. Das bedeutet, daß diese zwei Elemente im gleichen Programmabschnitt definiert sein müssen und entgegengesetzte Vorzeichen haben.
Folgende Elemente von Ausdrücken treten in der Assemblersprache auf: Namen (absolut oder relativ) Selbstdefinierende Werte (absolut) Bezugnahmen auf den Adreßpegel (relativ) Bezugnahmen auf das Längenmerkmal (absolut)
Im folgenden werden die Elemente von Ausdrücken und die Regeln für ihre Verwendung erörtert.

2.5.2.1

Namen
Für Namen im Operandeneintrag gelten dieselben Aussagen, die bereits im Abschnitt 2.3 für Namen im Namenseintrag gemacht wurden.

20

U5223-J-Z125-3

Struktur der Assemblersprache

2.5.2.2

Selbstdefinierende Werte
Selbstdefinierende Werte dienen zur direkten Darstellung von Werten. Sie werden benutzt, um Daten, Masken, Register und Adreßerhöhungen anzugeben. Selbstdefinierende Werte dürfen maximal ein Wort lang sein.
Selbstdefinierende Werte sind absolute Elemente, da ihr Wert zur Ablaufzeit gleich ihrem Wert zur Übersetzungszeit ist.
Zu den selbstdefinierenden Werten gehören:
dezimale, sedezimale, binäre und Zeichenwerte

Beispiele

Selbstdefinierender Wert
241 X'F1' X'101' B'1111' B'11110001' C'1' C'A'

DezimalWert
241 241 257
15 241 241 193

BinärWert
1111 0001 1111 0001 1 0000 0001 0000 1111 1111 0001 1111 0001 1100 0001

dezimal sedezimal sedezimal binär binär Zeichenwert Zeichenwert

U5223-J-Z125-3

21

Struktur der Assemblersprache

Selbstdefinierende Werte, Konstanten, Literale
Die Anwendung selbstdefinierender Werte unterscheidet sich von der Anwendung der Datenkonstanten und der Literale:
Wenn Datenkonstanten oder Literale im Operanden einer Instruktion spezifiziert werden, übernimmt der Assembler ihre Adressen in die Instruktion. Wenn dagegen ein selbstdefinierender Wert in einer Instruktion verwendet wird, übernimmt der Assembler seinen Wert in die Instruktion.

Beispiel

Name
FIELD CONST *

Operation
DS DC
MVI MVC MVC

Operanden
CL3 C'ABC'
FIELD,X'FF' FIELD,CONST FIELD,=C'ABC'

(01) (02) (03)

(01) Der Wert des Direktoperanden soll nach FIELD übertragen werden. Der Assembler übernimmt FF in den generierten Maschinenbefehl.
(02) Der Inhalt von CONST soll nach FIELD übertragen werden. Der Assembler übernimmt die Adresse von CONST in den generierten Maschinenbefehl.
(03) Das Literal C'ABC' soll nach FIELD übertragen werden. Der Assembler übernimmt die Adresse des Literals in den generierten Maschinenbefehl.

Dezimale selbstdefinierende Werte
Ein dezimaler selbstdefinierender Wert ist eine vorzeichenlose Dezimalzahl, dargestellt durch eine Folge von Dezimalziffern, in der auch führende Nullen vorkommen können.
Ein dezimaler selbstdefinierender Wert wird vom Assembler in sein binäres Äquivalent übersetzt.
Begrenzungen des Wertes hängen jeweils vom Verwendungszweck ab: Ein dezimaler selbstdefinierender Wert darf in keinem Fall aus mehr als zehn Ziffern bestehen oder den Wert 231-1 überschreiten. Ein dezimaler selbstdefinierender Wert, der ein Mehrzweckregister bezeichnen soll, muß einen Wert von 0 bis 15 haben; Ein Wert, der eine Distanz darstellt, darf die höchste Arbeitsspeicheradresse nicht überschreiten.

22

U5223-J-Z125-3

Struktur der Assemblersprache

Sedezimale selbstdefinierende Werte
Ein sedezimaler selbstdefinierender Wert ist eine vorzeichenlose Sedezimalzahl, dargestellt als Folge von Sedezimalziffern. Die Ziffernfolge muß in Hochkommas eingeschlossen sein und unmittelbar dem Buchstaben X folgen.
Jede Sedezimalziffer wird vom Assembler in einen Binärwert umgesetzt, der 4 Bits belegt. D.h., daß z.B. ein sedezimaler selbstdefinierender Wert, der eine Acht-bit-Maske darstellen soll, aus zwei Sedezimalziffern besteht.
Der größte zugelassene Sedezimalwert ist X'FFFFFFFF'.

Binäre selbstdefinierende Werte
Ein binärer selbstdefinierender Wert ist eine vorzeichenlose Folge von Binärziffern, die zur Darstellung beliebiger Binärmuster verwendet werden. Die Ziffernfolge muß in Hochkommas eingeschlossen sein und unmittelbar auf den Buchstaben B folgen.
Ein binärer selbstdefinierender Wert kann bis zu 32 Binärziffern enthalten. Der Wert wird auf ganze Bytes aufgefüllt, dazu wird das höchstwertige Byte links mit binären Nullen aufgefüllt.
Binäre selbstdefinierende Werte werden hauptsächlich zur Darstellung der Bitmuster von Masken oder in logischen Befehlen verwendet.

Beispiel

Name
MASK ALPHA

Operation
EQU TM

Operand
B'10101101' GAMMA,MASK

Der binäre selbstdefinierende Wert dient als Maske in einem TM-Befehl. Der Inhalt von GAMMA soll Bit für Bit mit dem Bitmuster der Maske verglichen werden.

U5223-J-Z125-3

23

Struktur der Assemblersprache

Selbstdefinierende Zeichenwerte
Mit einem selbstdefinierenden Zeichenwert kann man abdruckbare Zeichen darstellen. Ein selbstdefinierender Zeichenwert besteht aus ein bis vier Zeichen, die in Hochkommas eingeschlossen sind. Unmittelbar vorhergehen kann der Buchstabe C.
In selbstdefinierenden Zeichenwerten können alle Buchstaben, Ziffern und Sonderzeichen verwendet werden.

Bei der Verwendung von Hochkomma (') und kommerziellem Und (&) gilt: Das Hochkomma (') wird in der Assemblersprache und das kommerzielle Und (&) in der Makrosprache als syntaktisches Zeichen verwendet. Deshalb müssen für jedes Hochkomma oder jedes &-Zeichen, die in einem selbstdefinierenden Zeichenwert verwendet werden sollen, zwei Hochkommas bzw. zwei &-Zeichen geschrieben werden. Die beiden Hochkommas bzw. &-Zeichen werden als einzelnes Hochkomma, bzw. als einzelnes & übersetzt.

Beispiele

A'$

muß geschrieben werden als C'A''$'

'A'

muß geschrieben werden als C'''A'''

24

U5223-J-Z125-3

Struktur der Assemblersprache

2.5.2.3

Bezugnahme auf den Adreßpegel
Durch die Verwendung eines Sterns (*) als Element eines Ausdrucks kann man an jeder Stelle des Quellprogramms den aktuellen Adreßpegel ansprechen.
Dem Stern wird der Wert des aktuellen Adreßpegels zugewiesen, d.h., der Adreßpegel der Instruktion, in der der Stern verwendet wird.
Die Bezugnahme auf den Adreßpegel kann in allen Assemblerbefehlen verwendet werden und in den Assembleranweisungen DC, DS, EQU, ORG und USING, die den Stern im Operandeneintrag erlauben. Außerdem kann man sich in Adreßkonstanten auf den Adreßpegel beziehen und in Literalen, die als Adreßkonstanten spezifiziert sind (Zur Verwendung des Stern in Adreßkonstanten mit Wiederholungsfaktor siehe DC-Anweisung, 4.2). Ein Sonderfall ist die Verwendung des Sterns in Format 2 der USING-Anweisung (siehe 4.2). Hier bezeichnet er die Anfangsadresse des Speicherbereichs für den Pseudoregistervektor.
Der Maximalwert des Adreßpegels ist 224-1. Das entspricht einer Modulgröße von 16 MB.

Beispiele

Adreßpegel Quellprogrammanweisung (sedezimal)

LOCTN

SOURCE STATEMENT

000100 000104 000108 <

NAME

B

*+8

B

NAME+8

Zieladresse beider Sprungbef.

Wert von * NAME (=000100)

000120

CONSTANT DC A(*)

CONSTANT (=000120)

000134

ALPHA L

R5,=A(*)

ALPHA (=000134)

U5223-J-Z125-3

25

Struktur der Assemblersprache

2.5.2.4

Bezugnahme auf das Längenmerkmal
Auf das Längenmerkmal eines Namens bezieht man sich, indem man unmittelbar vor dem Namen ein L' einsetzt. Der Assembler ersetzt diesen Ausdruck durch die implizite Länge des Namens.
Das Längenmerkmal von * (L'*) ist gleich der Länge der Instruktion, in der die Bezugnahme vorkommt. Eine Ausnahme ist die Anweisung EQU * ohne Längenoperand (siehe 4.2, EQU-Anweisung). Hier ist das Längenmerkmal 1.

Beispiel
Im Beispiel wird unter Verwendung des Längenmerkmals eine Zeichenkonstante an die Stelle der höchst- bzw. niedrigstwertigen Bytes eines Feldes gebracht.

Name
A1 B2 * HIORD LOORD

Operation
DS DC
MVC MVC

Operand

CL8 CL2'AB'

(01) (02)

A1(L'B2),B2

(03)

A1+L'A1-L'B2(L'B2),B2 (04)

(01) A1 bezeichnet einen Speicherbereich von 8 byte Länge und hat das Längenmerkmal 8.
(02) B2 kennzeichnet eine Zeichenkonstante von 2 byte und hat das Längenmerkmal 2.
(03) Der Befehl mit der Adresse HIORD überträgt den Inhalt von B2 in die zwei höchstwertigen Bytes von A1. Der Wert L'B2 gibt die benötigte Länge an. Bei der Übersetzung des Befehls wird die Länge in das entsprechende Feld der Instruktion gebracht.
(04) Der Befehl mit der Adresse LOORD überträgt den Inhalt von B2 in die beiden niedrigstwertigen Bytes von A1. Der arithmetische Ausdruck A1+L'A1-L'B2 ergibt als Adresse das siebente Byte von A1. Zur Anfangsadresse von A1 wird die Länge von A1 addiert und davon die Länge von B2 subtrahiert. Der Inhalt von B2 wird also in das siebte und achte Byte vom Feld A1 übertragen. Auch hier liefert L'B2 die für den Befehl benötigte Längenangabe.

26

U5223-J-Z125-3

2.5.3

Struktur der Assemblersprache

Literale
Mit Literalen können Daten, z.B. Zahlenwerte, Adressen oder abdruckbare Zeichen, definiert werden, ohne daß dafür DC-Anweisungen angegeben werden. Literale können den zweiten Operanden von Assemblerbefehlen ersetzen.
Jedem Literal wird vom Assembler Speicherplatz im Literalbereich zugewiesen. Im generierten Assemblerbefehlscode wird für das Literal die Adresse im Literalbereich eingetragen.

Format eines Literals:

'chrcon' =[dup]typ[Ln1][Sn2][En3] 'datcon[,...]'
(adrcon[,...])

dup
typ
Ln1 Sn2 En3 chrcon datcon adrcon

Wiederholungsfaktor dezimaler selbstdefinierender Wert oder positiver absoluter Ausdruck in Klammern, Wertebereich: 0 bis 224-1

Literaltyp ein einzelner Buchstabe, kann für Zeichenkonstanten entfallen

mögliche Literaltypen:

C B P, Z X F, H E, D, L A, Y, V

Zeichenkonstante binäre Konstante dezimale Konstanten sedezimale Konstanten Festpunktkonstanten Gleitpunktkonstanten Adreßkonstanten

Längenfaktor;
n1 ist ein dezimaler selbstdefinierender Wert oder ein positiver absoluter Ausdruck in Klammern

Skalenfaktor
Exponentenfaktor
n2, bzw. n3 ist ein positiver oder negativer dezimaler selbstdefinierender Wert oder ein absoluter Ausdruck in Klammern

Wert der Zeichenkonstanten Wert der dezimalen, sedezimalen, binären, Festpunkt- und Gleitpunktkonstanten Wert der Adreßkonstanten

U5223-J-Z125-3

27

Struktur der Assemblersprache
Regeln Ein Literal beginnt mit einem Gleichheitszeichen (=). Für die Schreibweise eines Literals gelten die gleichen Regeln wie für einen Operanden der DC-Anweisung (siehe 4.2, insbesondere Modifizierfaktoren und Konstantentypen). Literale können in allen Assemblerbefehlen eingesetzt werden, bei denen der Operand ein relativer Ausdruck ist, der nur für Lesezugriffe verwendet wird. In Assemblerbefehlen, die als Operand einen relativen Ausdruck enthalten, der für Schreibzugriffe verwendet wird, dürfen Literale nicht verwendet werden. Literale dürfen nicht in Assembleranweisungen benutzt werden. Ein Literal darf nicht Element eines Ausdrucks sein. Der Wiederholungsfaktor in einem Literal darf nicht Null sein. Adreßkonstanten vom Typ Q und S dürfen nicht in Literalen verwendet werden.
Hinweis Der Typ eines in einem Assemblerbefehl angegebenen Literals wird nicht auf Übereinstimmung mit dem Operationscode des Befehls überprüft.

28

U5223-J-Z125-3

Struktur der Assemblersprache

Literalbereich
Der Assembler bestimmt den Wert der Literale und legt sie in einem bestimmten Bereich des Speichers, dem Literalbereich, ab.
Standardmäßig liegt der Literalbereich am Ende des ersten Programmabschnitts. Im Übersetzungsprotokoll wird der Literalbereich in diesem Fall nach der END-Anweisung protokolliert. Mit der Assembleranweisung LTORG (siehe 4.2) können mehrere Literalbereiche definiert und ihre Lage im Programm beliebig gewählt werden.
Gleiche Literale werden im Literalbereich nur einmal abgelegt, außer es handelt sich um Konstanten mit Bezug auf den Adreßpegel.

Beispiele

Name

Operation Operanden

AREA1 AREA2 HW

DS DS DS . . MVC UNPK MVC IC LM

3CL4 PL3 H
AREA1,=3CL4'ABCD' AREA2,=P'352' HW,=H'80' 5,=X'FF' 4,6,=A(AREA1,HW,*)

diese Definitionen gelten für alle folgenden Befehle
(01) (02) (03) (04) (05)

(01) In das Feld AREA1 wird übertragen: C1C2C3C4C1C2C3C4C1C2C3C4. (02) AREA2 enthält den entpackten Wert F3F5C2. (03) In das Feld HW wird der Wert 0050 übertragen. (04) Der IC-Befehl lädt den Wert FF in das niedrigstwertige Byte von Register 5. (05) Die Adressen von AREA1 und HW und der aktuelle Wert des Adreßpegels wer-
den in die Register 4,5, und 6 geladen.

U5223-J-Z125-3

29

Struktur der Assemblersprache

2.6

Bemerkungseintrag

Der Bemerkungseintrag enthält Erläuterungen zum Programm, die im Übersetzungsprotokoll enthalten sein sollen.
In Bemerkungen dürfen alle zulässigen Zeichen, einschließlich Leerzeichen, verwendet werden (siehe 2.1, Zeichenvorrat).
Der Bemerkungseintrag muß durch mindestens ein Leerzeichen vom Operandeneintrag getrennt sein. Soll der Eintrag in einer weiteren Zeile fortgesetzt werden, muß in der Fortsetzungszeichenspalte ein Fortsetzungszeichen stehen.
In Instruktionen, die keinen Operanden, jedoch Bemerkungen enthalten sollen, muß vor dem Bemerkungseintrag ein Leerzeichen-Komma-Leerzeichen stehen.

Beispiel
Name

Operation Operand

CSECT . . MVC . . END

, COMMENT FIELD1,FIELD2 COMMENT
, COMMENT

30

U5223-J-Z125-3

Struktur der Assemblersprache

2.7

Fortsetzungszeichen

Die erste Spalte nach der Endspalte ist die Fortsetzungszeichenspalte, in dieser steht das Fortsetzungszeichen. Die Voreinstellung für die Endspalte ist Spalte 71. Das Fortsetzungszeichen muß gesetzt werden, wenn eine Instruktion in einer weiteren Zeile fortgesetzt werden soll. Dazu kann man jedes Zeichen, außer dem Leerzeichen, verwenden.
Vor dem Fortsetzungszeichen muß kein Leerzeichen stehen.
Enthält die Fortsetzungszeichenspalte ein Leerzeichen, wird angenommen, daß die Instruktion abgeschlossen ist.

Die Instruktion muß in der Fortsetzungsspalte der nächsten Zeile fortgesetzt werden:
Beginnt der Text in der Fortsetzungsspalte mit einem Zeichen ungleich dem Leerzeichen, wird er als Fortsetzung des entsprechenden Eintrags interpretiert. Steht in der Fortsetzungsspalte ein Leerzeichen, dann wird der folgende Text als nächster Eintrag gewertet.
Für eine Instruktion sind beliebig viele Fortsetzungszeilen erlaubt.

U5223-J-Z125-3

31

Struktur der Assemblersprache

3

Adressierung, Programmunterteilung und

Programmverknüpfung

3.1

Adressierung

Die Adresse kennzeichnet einen Speicherplatz. Sie besteht aus dem Inhalt eines Basisadreßregisters und der Distanz, die dazu addiert wird (Basis/Distanz-Adressierung). Im Fall von RX-Befehlen kann zusätzlich der Inhalt eines Indexregisters addiert werden.
Für die Angabe von Adressen in einem Quellprogramm gibt es zwei Möglichkeiten:

Nicht-symbolische Adressen
In diesem Fall werden Basisadreßregister und Distanz direkt bezeichnet (siehe Assemblerbefehle, Beschreibung [3]).

Symbolische Adressen
Eine symbolische Adresse wird erst vom Assembler in die Basis/Distanz-Form umgesetzt. Eine symbolische Adresse ist ein Name oder wird über variable Parameter bzw. eine Verkettung von variablen Parametern und alphanumerischen Zeichen erzeugt.

U5223-J-Z125-3

33

Adressierung
Verwendung von symbolischen Adressen Damit symbolische Adressen vom Assembler in ihre nicht-symbolische Form umgesetzt werden können, muß der Programmierer
dem Assembler mit einer USING-Anweisung angeben, welche Mehrzweckregister als Basisadreßregister benutzt werden, in der USING-Anweisung angeben, welcher Wert jedem dieser Register als Basisadresse zuzuweisen ist und zur Programmlaufzeit jedes der Basisadreßregister mit dem angegebenen Wert laden. Bei der Übersetzung wird die symbolische Adresse vom Assembler in ihre nicht-symbolische Form umgesetzt und anschließend in den Objektcode übersetzt. Wenn symbolische Adressen verwendet werden, muß ein Programm für jeden Programmabschnitt eine eigene USING-Anweisung enthalten. Mit der USING-Anweisung zugewiesene Basisadreßregister können mit Hilfe der DROPAnweisung wieder für andere Zwecke freigegeben werden.

34

U5223-J-Z125-3

3.2

Programmunterteilung und Programmverknüpfung

Programmunterteilung
Der Text eines Assembler-Quellprogramms besteht aus einer oder mehreren Übersetzungseinheiten. Eine Übersetzungseinheit fängt in der Regel mit einer START- oder CSECT-Anweisung an und wird durch eine END-Anweisung abgeschlossen. Sie wird meist als "ein Programm" bezeichnet. Jede Übersetzungseinheit wird in einen Objektmodul übersetzt.
Eine Übersetzungseinheit kann aus einem oder mehreren Programmabschnitten bestehen, die als Teile eines Objektmoduls übersetzt werden.
Die entsprechenden Anweisungen an den Binder ermöglichen es, einen oder mehrere Objektmodule zu einem ablauffähigen Programm zu binden.

Beispiel

PROG1 A1 A2
PROG2

START : : : CSECT : : : CSECT : : : END : : START : : END

(01)
(02) eine Übersetzungseinheit mit drei Programmabschnitten (01 bis 03)
(03)
eine Übersetzungseinheit mit einem Programmabschnitt

Es ist im allgemeinen notwendig, sich auf Daten zu beziehen, die in einem anderen Programmteil definiert sind oder in einen anderen Programmteil verzweigen. Zu diesem Zweck muß man die Kommunikation zwischen den Programmteilen ermöglichen.
Jeder einzelne Programmabschnitt, der angesprochen wird, muß symbolisch adressierbar sein (siehe 3.1, Symbolische Adressen)
Die zwei oder mehr Übersetzungseinheiten, die verbunden werden sollen, müssen symbolisch verknüpft werden (siehe 3.4, symbolische Programmverknüpfung).

U5223-J-Z125-3

35

Programmabschnitte

3.3
3.3.1

Programmabschnitte
Ein Programmabschnitt ist der kleinste Programmteil, der unabhängig von den anderen beim Laden verschoben werden kann, ohne die Ablauflogik des Programms zu beeinflussen. Eine Übersetzungseinheit kann maximal 215-1 Programmabschnitte enthalten.
Es gibt ausführbare Programmabschnitte, die in den Objektcode übersetzt werden und Referenz-Programmabschnitte, die nicht in den Objektcode übersetzt werden. Sie werden benutzt, um Daten zu beschreiben, auf die man sich von ausführbaren Programmabschnitten aus beziehen kann.
Adreßpegel in Programmabschnitten
Teile verschiedener Programmabschnitte können in einer Übersetzungseinheit in vermischter Reihenfolge auftreten, da der Assembler für jeden Programmabschnitt einen eigenen Adreßpegel führt.
Der Adreßpegel von Referenzprogrammabschnitten hat den Anfangswert Null, d.h., daß die Adreßwerte innerhalb eines Programmabschnitts relativ zum Anfang des Programmabschnitts sind.
Den ausführbaren Programmabschnitten wird aufeinanderfolgender Speicherplatz zugewiesen, und zwar in der Reihenfolge, in der sie im Quellprogrammtext auftreten. Jeder nach dem ersten folgende Programmabschnitt beginnt an der nächsten freien Doppelwortgrenze, außer, wenn das Merkmal PAGE angegeben wurde (siehe 3.3.3, Merkmale von Programmabschnitten).
Der Maximalwert des Adreßpegels in einem Programmabschnitt, bzw. der Maximalwert des Gesamtadreßpegels aller Programmabschnitte ist 224-1.
Ausführbare Programmabschnitte
Ein ausführbarer Programmabschnitt (Code-Section) wird durch eine START- oder CSECT-Anweisung eingeleitet und in den Objektcode übersetzt.
Erster Programmabschnitt
Der erste Programmabschnitt in einer Übersetzungseinheit kann durch die STARTAnweisung gekennzeichnet werden, mit der eine vorläufige Startadresse des Programms angegeben werden kann (siehe 4.2, START-Anweisung).
Am Ende des ersten Programmabschnitts wird vom Assembler der Literalbereich angelegt, wenn dessen Lage nicht durch die LTORG-Anweisung anders festgelegt wurde.

36

U5223-J-Z125-3

3.3.2

Programmabschnitte
Falls der erste Programmabschnitt an anderer Stelle fortgesetzt werden soll, muß dazu eine CSECT-Anweisung mit dem gleichen Namenseintrag verwendet werden.
Weitere ausführbare Programmabschnitte Sollen in einer Übersetzungseinheit nach dem ersten weitere ausführbare Programmabschnitte auftreten, müssen diese mit einer CSECT-Anweisung eingeleitet werden. Diese Programmabschnitte können jeweils mit einer CSECT-Anweisung mit gleichem Namen an einer anderen Stelle fortgesetzt werden (siehe 4.2, CSECT-Anweisung).
Referenz-Programmabschnitte
Für Referenz-Programmabschnitte wird kein Objektcode erzeugt. Sie werden verwendet, um Daten zu beschreiben, die von ausführbaren Programmabschnitten angesprochen werden sollen. Sie werden durch eine DSECT-, XDSEC-, COM- oder DXD-Anweisung eingeleitet.
Pseudoabschnitt
Ein Pseudoabschnitt (Dummy-Section) beschreibt eine Datenstruktur, die wie eine "Schablone" auf einen Speicherbereich projiziert werden soll. Eine DSECT-Anweisung kennzeichnet den Beginn dieser Datenstruktur. Die Namen, die in einem Pseudoabschnitt definiert sind, entsprechen den Strukturelementen. Die Projektion der Datenstruktur auf einen Speicherbereich geschieht in folgender Weise:
Die Adresse des gewünschten Speicherbereichs muß während des Programmlaufs in ein Register geladen werden. Dieses Register muß im Programm mit einer USING-Anweisung als Basisadreßregister für den Pseudoabsabschnitt definiert werden. Dadurch wird die Datenstruktur immer auf den Speicherbereich projiziert, dessen Adresse im Basisadreßregister geladen ist. Werden nun in Assemblerbefehlen Namen verwendet, die in einem Pseudoabschnitt definiert sind, dann werden sie beim Programmlauf von den Daten aus dem Speicherbereich ersetzt, auf den die Datenstruktur projiziert wurde.

U5223-J-Z125-3

37

Programmabschnitte

Externer Pseudoabschnitt
Ein externer Pseudoabschnitt wird durch eine XDSEC-Anweisung gekennzeichnet. Für seine Verwendung gelten die gleichen Regeln wie für einen Pseudoabschnitt (siehe dort), bis auf folgende Ausnahme:
Für die Definition eines externen Pseudoabschnitts (XDSEC D) werden Externinformationen an den Binder übergeben, mit denen dieser die Externinformationen, die für Referenzen eines externen Pseudoabschnitts (XDSEC R) in einer anderen Übersetzungseinheit angegeben werden, zu befriedigen sucht. Der Adreßpegel wird in der Referenz eines externen Pseudoabschnitts (XDSEC R) auf Null gesetzt und bleibt Null für den gesamten Abschnitt. Der wirkliche Adreßpegel eines Namens in einer Referenz eines externen Pseudoabschnitts wird vom Binder in den Befehl, in dem dieser Name benutzt wird, eingetragen.
Somit ist die Auswertung der Adreßpegel für Namen einer XDSEC R von der Assemblerebene auf die Binderebene verlagert. Dies hat den Vorteil, daß die Änderung eines Symbols einer XDSEC D nicht eine Neuübersetzung sämtlicher Module, die diese XDSEC benutzen, nötig macht, sondern nur der Module, die den zu ändernden Namen benutzen.
Hinweis
Zur Zeit unterstützt der DLL (bis BS2000 V9.5) die Verwendung von externen Pseudoabschnitten nicht, d.h., daß Programme mit TSOSLNK gebunden werden müssen und kein Nachlademechanismus in Anspruch genommen werden kann. Ab BS2000 V10.0 unterstützt der DBL die Verwendung von externen Pseudoabschnitten sowie das dynamische Nachladen.

Gemeinsamer Hilfsabschnitt
Ein gemeinsamer Hilfsabschnitt ist ein Speicherbereich, der von mehreren unabhängig voneinander übersetzten Übersetzungseinheiten aus angesprochen werden kann, die gebunden und als ein Programm geladen wurden. Er wird durch eine COM-Anweisung gekennzeichnet.
Ein gemeinsamer Hilfsabschnitt kann durch DS- und DC-Anweisungen in Teilfelder zerlegt werden, die relativ zu seinem Anfang definiert sind. D.h., die Struktur des gemeinsamen Hilfsabschnitts ist bereits vorgegeben. Konstanten, die mit DC-Anweisungen in einem gemeinsamen Hilfsabschnitt definiert wurden, werden nicht übersetzt. Die Felder können erst beim Programmlauf mit Werten versorgt werden.
Ein gemeinsamer Hilfsabschnitt muß in jeder Übersetzungseinheit adressierbar sein, von der aus er angesprochen werden soll. Damit eine Kommunikation zwischen Übersetzungseinheiten mit einem gemeinsamen Hilfsabschnitt möglich ist, muß er in jeder identisch definiert sein.

38

U5223-J-Z125-3

Programmabschnitte
Pseudoregister
Pseudoregister sind Speicherbereiche, die von mehreren Übersetzungseinheiten aus angesprochen werden können. Sie dienen als Arbeitsbereiche und der Kommunikation verschiedener Übersetzungseinheiten untereinander. Die Pseudoregister können an beliebiger Stelle in einer Übersetzungseinheit definiert werden und müssen nicht in aufsteigender und/oder zusammenhängender Reihenfolge erscheinen.
Der Assembler berechnet Ausrichtung und Länge der Pseudoregister und gibt diese Informationen über ESD-Einträge an den Binder weiter. Während des Bindevorgangs werden alle Pseudoregister aus allen zusammenzubindenden Moduln zu einem "Pseudoregistervektor" zusammengefaßt. Hierbei wird vom Binder Ausrichtung, Länge und Ablage der einzelnen Pseudoregister bestimmt. Beim Binden werden die jeweils stärksten Attribute bei gleichen Pseudoregistern als letztendlich gültige Attribute verwendet. Wäre z.B. ein Pseudoregister in einer CSECT auf Halbwortgrenze, in einer anderen auf Wortgrenze ausgerichtet, so wäre dieses Pseudoregister nach dem Binden auf Wortgrenze ausgerichtet.
Der vom Binder zusammengestellte Pseudoregistervektor definiert nur die Struktur der Pseudoregister. Der Speicherbereich dafür muß explizit in einem ausführbaren Programmabschnitt bereitgestellt werden.
Die Länge dieses Pseudoregistervektors kann vom Binder in ein Wort eingetragen werden, das mit der CXD-Anweisung für diesen Zweck reserviert werden muß.
Die Verwendung von Pseudoregistern hat gegenüber dem Einsatz von gemeinsamen Hilfsabschnitten und externen Pseudoabschnitten folgende Vorteile:
1. Gegeben sei CSECT1 mit PSREG1 und PSREG2 CSECT2 mit PSREG3 und PSREG4.
Beide CSECTs sollen zu einem Programm zusammengebunden werden.
Man kann nun innerhalb einer CSECT nur auf die Pseudoregister zugreifen, die in eben dieser CSECT definiert sind. In CSECT1 also nur auf PSREG1 und PSREG2. Ein absichtliches oder versehentliches Überschreiben von PSREG3 und PSREG4 ist nicht möglich.
2. Ändert man in einem Modul die Anzahl oder die Datenbeschreibung der Pseudoregister, so braucht man nur diesen Modul neu zu übersetzen und das gesamte Programm neu zu binden. Ändert man dagegen die Datenbeschreibung eines gemeinsamen Hilfsabschnitts oder eines externen Pseudoabschnitts, so müssen alle Moduln, die von einer Veränderung seines Inhalts oder seiner Länge betroffen sind, geändert und neu übersetzt werden.

U5223-J-Z125-3

39

Programmabschnitte
Hinweis
Zur Zeit unterstützt der DLL (bis BS2000 V9.5) die Verwendung von Pseudoregistern nicht, d.h., daß Programme mit TSOSLNK gebunden werden müssen und kein Nachlademechanismus in Anspruch genommen werden kann. Ab BS2000 V10.0 unterstützt der BINDER die Verwendung von Pseudoregistern sowie das dynamische Nachladen.
Die Adressierung der Pseudoregister kann auf zwei Arten erfolgen:
über ein Basisadreßregister Die Anweisung USING *PRV,8 (siehe 4.2, USING-Anweisung, Format 2 und Anhang 11.4, Beispiel 2) bewirkt z.B., daß für alle Adressen, die Pseudoregister betreffen, das Register 8 als Basisregister verwendet wird, unabhängig vom sonst gültigen Basisregister. Register 8 muß dann noch mit der Anfangsadresse des Speicherbereichs für den Pseudoregistervektor geladen werden.
über Q-Konstanten (siehe Anhang 11.4, Beispiel 1) Hierbei steht zur Programmlaufzeit in der Q-Konstanten der Offset des Pseudoregisters zum Anfang des Pseudoregistervektors. D.h., daß dieser Wert zum Anfang des Speicherbereichs für den Pseudoregistervektor addiert werden muß, um das Pseudoregister ansprechen zu können.
Pseudoregister können auf zweierlei Weise definiert werden (siehe Anhang 11.4, Beispiele):
Mit der DXD-Anweisung;
Mit der DSECT-Anweisung unter Verwendung von Q-Konstanten; hierdurch wird der gesamte Pseudoabschnitt als Pseudoregister definiert. Die DSECT-Struktur kann für Zugriffe innerhalb dieses Pseudoregisters verwendet werden.

40

U5223-J-Z125-3

3.3.3

Programmabschnitte

Merkmale von Programmabschnitten

Um das dynamische Binden und Laden zu ermöglichen, ist es häufig notwendig, allen Daten und Instruktionen innerhalb eines Programmabschnitts bestimmte Eigenschaften mitzugeben. Die folgenden Merkmale können (in beliebiger Reihenfolge) im Operandenfeld von START-, CSECT- und COM-Anweisungen angegeben werden:

PUBLIC

Dieses Merkmal bedeutet, daß der Abschnitt gemeinschaftliche Daten oder Instruktionen (mehrfach benutzbar) enthält.

READ

Dieses Merkmal bedeutet, daß der Abschnitt nicht modifiziert werden kann, d.h., schreibgeschützt ist (read only).

PRVLGD

Dieses Merkmal bedeutet, daß dem Abschnitt ein Sicherheitsschlüssel zugewiesen wird, so daß nur privilegierte Systemroutinen Zugriff zu ihm haben.

PAGE

Dieses Merkmal zeigt an, daß der Abschnitt an einer Seitengrenze beginnen soll, die ein Vielfaches von 4096 ist.

RESIDENT

Dieses Merkmal zeigt an, daß der angegebene Abschnitt in den Speicher geladen und dort resident gehalten wird.

Merkmale können einzeln oder zu mehreren spezifiziert werden. Der endgültige Vorrat von Eigenschaften eines Programmabschnitts wird von der Kombination aller Merkmale bestimmt. Die Merkmale können in der Anweisung stehen, die den Beginn des Programmabschnittes definiert. Es ist nicht notwendig, Merkmale bei Anweisungen mit gleichem Namen zu wiederholen, es sei denn, aus Dokumentationsgründen.

Wenn keine Merkmale angegeben sind, wird der Programmabschnitt als privat, modifizierbar und an Doppelwortgrenze ausgerichtet betrachtet. Im Objektmodul sind für jeden Programmabschnitt Informationen über seine Eigenschaften abgelegt.

Adressierungsmodus und Ladeattribut

Diese zwei Merkmale werden einem Programmabschnitt mit der AMODE- bzw. RMODEAnweisung zugeordnet.

AMODE

Diese Anweisung ordnet einem Programmabschnitt einen SoftwareAdressierungsmodus zu, der seinerseits den Hardware-Adressierungsmodus bezeichnet, den der Programmabschnitt bei seiner Ausführung erwartet.

RMODE

Diese Anweisung ordnet einem Programmabschnitt ein Ladeattribut zu. Dieses gibt an, in welchen Bereich des Adreßraumes (oberhalb oder unterhalb von 16 Megabyte) das Programm geladen werden muß, bzw. kann.

U5223-J-Z125-3

41

Symbolische Programmverknüpfung

3.4

Symbolische Programmverknüpfung

Die symbolische Programmverknüpfung ermöglicht es, symbolische Adressen, die in einer Übersetzungseinheit definiert sind, von einer anderen aus anzusprechen. Der Assembler benötigt dafür entsprechende Informationen, die er über ESD-Einträge an den Binder weitergibt. Der Binder ersetzt diese symbolischen Bezugnahmen vor bzw. beim Laden durch aktuelle Adressen.
Eine symbolische Adresse, die von einer anderen Übersetzungseinheit aus angesprochen werden soll, muß dem Assembler und dem Binder durch die ENTRY-Anweisung kenntlich gemacht werden. Sie ist damit als symbolische Adresse einer Einsprungstelle definiert.
Wenn in einer Übersetzungseinheit symbolische Adressen verwendet werden, die in einer anderen Übersetzungseinheit definiert sind, müssen sie durch die EXTRN- oder WXTRN-Anweisung kenntlich gemacht werden. Da die Definition solcher symbolischen Adressen in einer anderen Übersetzungseinheit erfolgt, weist der Assembler vorläufig einen Wert 0 und ein Längenmerkmal 1 zu. In der Übersetzungseinheit, die die EXTRN-Adresse verwendet, muß ein Basisregister für Zugriffe auf diese Adresse bereitgestellt werden. Der Wert der Adresse muß über eine A-Konstante in das Basisregister geladen werden (siehe 4.2, DC-Anweisung).

Eine weitere Möglichkeit zur symbolischen Verknüpfung ist die Verwendung von V-Konstanten (siehe 4.2, DC-Anweisung). Diese Konstanten werden als indirekte Verknüpfungspunkte betrachtet, die aus einer extern definierten symbolischen Adresse erzeugt werden. In diesem Fall darf die symbolische Adresse nicht mit der EXTRN-Anweisung gekennzeichnet sein. V-Konstanten können für Sprünge in andere Übersetzungseinheiten verwendet werden; jedoch nicht für Bezugnahmen auf Daten in anderen Übersetzungseinheiten.
Ein Beispiel für die Verknüpfung von zwei unabhängigen Übersetzungseinheiten ist in der Beschreibung der EXTRN-Anweisung (siehe 4.2) zu finden.

42

U5223-J-Z125-3

Symbolische Programmverknüpfung

4

Assembleranweisungen

4.1

Allgemeines

Anders als Assemblerbefehle, die die Zentraleinheit veranlassen, während des Programmlaufs bestimmte Operationen auszuführen, veranlassen Assembleranweisungen den Assembler, während der Übersetzung bestimmte Operationen durchzuführen. Sie dienen der Steuerung des Übersetzungsvorgangs und übernehmen Hilfsfunktionen.

Programmierhinweise
1. In Assembleranweisungen dürfen keine Literale als Operanden verwendet werden.
2. Werden Assembleranweisungen als Modellanweisungen in einer Makrodefinition verwendet, können Namens-, Operations- und Operandeneintrag mit Hilfe von variablen Parametern generiert werden (siehe 5.1.2, Aufbau der Makrodefinition und Kap. 6, variable Parameter).
3. Bei einigen Anweisungen ist im Namenseintrag die Angabe eines Folgesymbols erlaubt. Ein Folgesymbol im Namenseintrag kennzeichnet die Anweisung als Sprungziel im Rahmen der Makrosprache (siehe 5.3.1, Folgesymbole). Ein Folgesymbol im Nameneintrag kann nicht mit variablen Parametern generiert werden.

Die Assembleranweisungen lassen sich in folgende Gruppen einteilen:

Zuweisen von Werten und Eigenschaften

EQU OPSYN

Gleichsetzen Mnemotechnischen Operationscode zuweisen

Definition von Datenbereichen

DC DS CXD

Konstante definieren Speicherbereich reservieren Speicherplatz für die Länge des Pseudoregistervektors reservieren

U5223-J-Z125-3

43

Assembleranweisungen

Basisregisteranweisungen

USING DROP STACK UNSTK

Basisadreßregister zuweisen Basisadreßregister freigeben USING- oder PRINT-Status sichern USING- oder PRINT-Status restaurieren

Programmunterteilung, Programmverknüpfung, Merkmale von Programmabschnitten

START CSECT DSECT XDSEC COM DXD END AMODE RMODE ENTRY EXTRN WXTRN

Programmanfang definieren Programmabschnitt definieren Pseudoabschnitt definieren Externen Pseudoabschnitt definieren Gemeinsamen Hilfsabschnitt definieren Pseudoregister definieren Übersetzungsende Adressierungsmodus zuordnen Ladeattribut zuordnen ENTRY-Adresse kennzeichnen EXTRN-Adresse kennzeichnen Bedingte EXTRN-Adresse kennzeichnen

Steuerung der Eingabe

ICTL COPY

Eingabeformat steuern Quellprogrammtext aus Bibliothekselement kopieren

Ausgabe in den Objektmodul

ORG LTORG CNOP PUNCH REPRO

Adreßpegel setzen Literalbereich definieren Nulloperation setzen Text in Objektmodul kopieren Folgezeile in Objektmodul kopieren

44

U5223-J-Z125-3

Assembleranweisungen

Steuerung der Protokollierung

Die Anweisungen zur Steuerung der Protokollierung kennzeichnen die Einzelheiten des Übersetzungsprotokolls. Sie wirken sich nur auf das Übersetzungsprotokoll aus und erzeugen keine Befehle oder Konstanten im Quellprogramm.

TITLE SPACE EJECT PRINT STACK UNSTK

Protokollüberschrift Zeilenvorschub Seitenvorschub Protokollinhalt steuern USING- oder PRINT-Status sichern USING- oder PRINT-Status restaurieren

Hinweis

Die Anzahl der Zeilen pro Seite auf dem Übersetzungsprotokoll kann nicht mit einer dieser Anweisungen beeinflußt werden. Sie muß mit der entsprechenden Option gesteuert werden (siehe ASSEMBH, Benutzerhandbuch [1]).

U5223-J-Z125-3

45

AMODE

4.2

Beschreibung der Anweisungen

Assembleranweisungen

AMODE Adressierungsmodus zuordnen
Funktion Die AMODE-Anweisung ordnet einem Programmabschnitt einen Adressierungsmodus zu.

Format

Name

name

[

]

.sym

name .sym

Operation AMODE

Operanden
24 31 ANY

Name Folgesymbol

Beschreibung

name

bezieht sich auf einen gleichnamigen Programmabschnitt und muß mit dem Namen einer START-, CSECT- oder COM-Anweisung übereinstimmen.

Bei leerem Namensfeld bezieht sich die AMODE-Anweisung auf einen unbenannten Programmabschnitt.

.sym

Ein Folgesymbol ist gleichbedeutend mit einem leeren Namensfeld.

24

Dem Programmabschnitt wird der 24-bit-Adressierungsmodus zugeordnet.

31

Dem Programmabschnitt wird der 31-bit-Adressierungsmodus zugeordnet.

ANY

Der Programmabschnitt ist sowohl im 24-bit- als auch im 31-bit-Adressierungsmodus ablauffähig.

Zu 'Adressierungsmodus' siehe Abschnitt 3.3.3 und das Handbuch Einführung in die XS-Programmierung [7].

Die Information über den Adressierungsmodus eines Programmabschnitts wird im ESDEintrag ausgegeben.

46

U5223-J-Z125-3

Assembleranweisungen

AMODE

Programmierhinweise
1. Die AMODE-Anweisung kann an beliebiger Stelle im Quellprogramm stehen. Das Quellprogramm darf beliebig viele AMODE-Anweisungen enthalten, wobei ein spezifizierter Namen nur einmal auftreten darf.
2. Für einen unbenannten gemeinsamen Hilfsabschnitt (siehe 4.2, COM-Anweisung) darf keine AMODE-Anweisung gesetzt werden.
3. Der Adressierungsmodus, der einem Programmabschnitt zugeordnet wird, überträgt sich auch auf die ENTRY-Namen dieses Programmabschnitts.
4. Falls keine Spezialfunktionen erbracht werden sollen, sollten einem Programmabschnitt die Attribute AMODE = ANY und RMODE = ANY zugewiesen werden.

Kombinationen von AMODE und RMODE
Wenn für einen Programmabschnitt die AMODE-Anweisung gesetzt wird, sind die folgenden Kombinationen mit der RMODE-Anweisung für den gleichen Programmabschnitt möglich:
AMODE 24 mit RMODE 24 AMODE 31 mit RMODE 24 oder RMODE ANY AMODE ANY mit RMODE 24 oder RMODE ANY
Voreinstellung
Folgende Voreinstellungen gelten, wenn für einen Programmabschnitt entweder AMODE oder RMODE oder beide nicht gesetzt wurden:

angegeben
weder AMODE noch RMODE AMODE 24 AMODE 31 AMODE ANY RMODE 24 RMODE ANY

Voreinstellung
AMODE 24 und RMODE 24 RMODE 24 RMODE 24 RMODE 24 AMODE 24 AMODE 31

Tabelle 4-1

Voreinstellung für AMODE, bzw. RMODE

>>>>> siehe auch RMODE-Anweisung

U5223-J-Z125-3

47

CNOP

Assembleranweisungen

CNOP Nulloperation setzen
Funktion Mit der CNOP-Anweisung kann der Adreßpegel für die folgende Instruktion auf bestimmte Bytes in einem Wort oder Doppelwort ausgerichtet werden.

Format

Name

name

[

]

.sym

name .sym b w

Operation CNOP

Operanden b,w

Name Folgesymbol absoluter Ausdruck, mögliche Werte: 0,2,4,6 absoluter Ausdruck, mögliche Werte: 4,8

Beschreibung

b

gibt an, auf welches Byte in einem Wort oder Doppelwort der Adreßpegel

gesetzt werden soll

w

gibt an, ob das in b angegebene Byte in einem Wort (w=4) oder Doppel-

wort (w=8) liegen soll.

Nachfolgende Tabelle zeigt die möglichen Kombinationen von b und w und ihre Bedeutung.

b,w
0,4 2,4 0,8 2,8 4,8 6,8
Tabelle 4-2

Bedeutung
Beginn eines Wortes Mitte eines Wortes (zweites Halbwort) Beginn eines Doppelwortes Zweites Halbwort eines Doppelwortes Mitte (drittes Halbwort bzw. zweites Wort) eines Doppelwortes Viertes Halbwort eines Doppelwortes
Zulässige Kombinationen der Operanden in der CNOP-Anweisung

48

U5223-J-Z125-3

Assembleranweisungen

CNOP

Die nächste Tabelle zeigt die Stelle eines Wortes, bzw. Doppelwortes, die jedes dieser Operandenpaare bezeichnet.

Doppelwort

Wort

Halbwort

Byte

Byte

0,4 0,8

Halbwort

Byte

Byte

2,4 2,8

Wort

Halbwort

Byte

Byte

0,4 4,8

Halbwort

Byte

Byte

2,4 6,8

Tabelle 4-3

Ausrichtung des Adreßpegels mit der CNOP-Anweisung

Programmierhinweise
1. Wenn die verlangte Ausrichtung eine Erhöhung des Adreßpegels erfordert, dann werden durch die CNOP-Anweisung ein bis drei Nulloperationen (siehe BCR und NOPR in Assemblerbefehle, Beschreibung [3]) erzeugt, die je zwei Bytes belegen.
2. Ist der Adreßpegel bereits entsprechend ausgerichtet, dann werden durch die CNOP-Anweisung keine Nulloperationen erzeugt.
3. Der Name einer CNOP-Anweisung erhält als Wert den Adreßpegel vor einer evtl. notwendigen Erhöhung durch Nulloperationen. Die CNOP-Anweisung selbst wird auf Halbwortgrenze ausgerichtet.

U5223-J-Z125-3

49

COM

Assembleranweisungen

COM Gemeinsamen Hilfsabschnitt definieren
Funktion Die COM-Anweisung kennzeichnet den Beginn oder die Fortsetzung eines gemeinsamen Hilfsabschnitts, der von mehreren Übersetzungseinheiten aus angesprochen werden kann, und reserviert Speicherplatz für ihn.
Format

Name

name

[

]

.sym

name .sym typ

Operation COM

Operanden [typ[,...]]

Name Folgesymbol Merkmalkennzeichnung für Programmabschnitte (siehe 3.3.3, Merkmale von Programmabschnitten)

Beschreibung
Der Namenseintrag kennzeichnet den Namen des gemeinsamen Hilfsabschnitts.
Eine COM-Anweisung ohne Namen kennzeichnet einen unbenannten gemeinsamen Hilfsabschnitt. Der Beginn eines unbenannten COM-Abschnitts wird im ESD- und XREF-Listing protokolliert (siehe ASSEMBH, Benutzerhandbuch [1]).
Die Anfangsadresse eines gemeinsamen Hilfsabschnitts ist immer auf Doppelwortgrenze ausgerichtet.
Ein gemeinsamer Hilfsabschnitt erhält einen eigenen Adreßpegel mit dem Anfangswert Null.

50

U5223-J-Z125-3

Assembleranweisungen

COM

Programmierhinweise
1. Ein gemeinsamer Hilfsabschnitt kann durch DS- oder DC-Anweisungen in Teilfelder zerlegt werden, die dann relativ zu seinem Beginn definiert sind.
2. Assemblerbefehle oder Konstanten, die in einem gemeinsamen Hilfsabschnitt angegeben sind, werden nicht übersetzt. Die Felder eines gemeinsamen Hilfsabschnitts können nur beim Programmablauf versorgt werden (siehe Beispiel).
3. Innerhalb eines Programms können mehrere COM-Anweisungen mit demselben Namen auftreten. Die erste bezeichnet den Beginn, die weiteren die Fortsetzung des gemeinsamen Hilfsabschnitts.
4. Ein gemeinsamer Hilfsabschnitt, der von 2 Übersetzungseinheiten aus angesprochen werden soll, muß in jeder der beiden identisch definiert und adressierbar sein.
5. Für einen unbenannten Hilfsabschnitt darf keine AMODE- und keine RMODE-Anweisung gesetzt werden.

Beispiel

Name PR0G R2
HCOM COM1 COM2

Operation
START EQU . . L USING MVC . . COM DS DS . .

Operanden
2
R2,=A(HCOM) HCOM,R2 COM2,=C'12345'
F CL5

(01) (02) (03)
(04)

(01) Lädt die Anfangsadresse von HCOM ins Register R2. (02) Gibt HCOM als Basisadresse für den gemeinsamen Hilfsabschnitt an und weist
Register R2 als sein Basisadreßregister zu. (03) Versorgt das Feld COM2 mit Daten. (04) Definition des gemeinsamen Hilfsabschnitts.

>>>>> siehe auch END-, START-, CSECT-, DSECT- und XDSEC-Anweisung

U5223-J-Z125-3

51

COPY

Assembleranweisungen

COPY Quellprogrammtext aus Bibliothekselement kopieren
Funktion Die COPY-Anweisung kopiert das genannte Element aus einer Bibliothek in ein Quellprogramm.

Format

Name

Operation COPY

Operanden name

Beschreibung
name ist der Name des zu kopierenden Bibliothekselementes.
Die COPY-Anweisung prüft nicht, ob name bezüglich der Bibliotheksverwaltung syntaktisch zulässig ist.
Die kopierten Anweisungen des Bibliothekselements werden hinter der COPY-Anweisung in das Quellprogramm eingefügt. Über eine Benutzersteuerung kann angegeben werden, in welcher Bibliothek, bzw. in welcher Abteilung einer Bibliothek gesucht werden soll (siehe LMS, Benutzerhandbuch [4] und ASSEMBH, Benutzerhandbuch [1]).
Existieren in einer Bibliothek mehrere Elemente mit gleichem Namen, dann wird das Element mit der höchsten Versionsbezeichnung verwendet.
Programmierhinweise
1. Die Schachtelungstiefe von COPY-Anweisungen kann über eine Option der //COMPILE-Anweisung angegeben werden (siehe ASSEMBH, Benutzerhandbuch [1]). Sie ist auf 5 voreingestellt und kann maximal 255 betragen.
2. COPY-Anweisungen können sowohl im Assembler-Quellprogramm als auch innerhalb von Makros stehen. COPY-Anweisungen innerhalb von inneren Makrodefinitionen werden erst bei der Definitionsbearbeitung des inneren Makros expandiert. Kopierte Anweisungen können ihrerseits Makrodefinitionen enthalten.
3. Der Name eines COPY-Elementes darf nicht generiert werden.
4. Der kopierte Text wird gemäß einer eventuell vorausgegangenen ICTL-Anweisung interpretiert. Da dies unbeabsichtigt sein kann, wird eine Warnung ausgegeben.

52

U5223-J-Z125-3

Assembleranweisungen

COPY

5. Der kopierte Text darf keine ICTL-Anweisung enthalten.
6. Das Protokollieren der kopierten Anweisungen kann über eine Option der //COMPILE-Anweisung (siehe ASSEMBH, Benutzerhandbuch [1]) oder mit PRINT COPY bzw. PRINT NOCOPY (siehe 4.2, PRINT-Anweisung) gesteuert werden.

U5223-J-Z125-3

53

CSECT

Assembleranweisungen

CSECT Programmabschnitt definieren
Funktion Die CSECT-Anweisung kennzeichnet den Beginn oder die Fortsetzung eines Programmabschnitts.

Format

Name

name

[

]

.sym

name .sym typ

Operation CSECT

Operanden [typ[,...]]

Name Folgesymbol Merkmalkennzeichnung für Programmabschnitte (siehe 3.3.3, Merkmale von Programmabschnitten)

Beschreibung
Der Namenseintrag kennzeichnet den Namen des Programmabschnitts, der mit der CSECT-Anweisung beginnt oder fortgesetzt wird.
Eine CSECT-Anweisung ohne Namen kennzeichnet einen unbenannten Programmabschnitt. Der Beginn einer unbenannten CSECT wird im ESD- und XREF-Listing protokolliert (siehe ASSEMBH, Benutzerhandbuch [1]).
Das Längenmerkmal von name ist 1.

54

U5223-J-Z125-3

Assembleranweisungen

CSECT

Programmierhinweise
1. Alle Instruktionen, die zwischen einer CSECT-Anweisung und der nächsten CSECTbzw. DSECT-Anweisung mit anderen Namen stehen, gehören zu einem Programmabschnitt.
2. Innerhalb eines Programms können mehrere CSECT-Anweisungen mit demselben Namen auftreten. Die erste bezeichnet den Beginn, die weiteren die Fortsetzung des Programmabschnitts. Eine zweite bzw. weitere CSECT-Anweisung ohne Namen kennzeichnet die Fortsetzung eines unbenannten Programmabschnitts.
3. Soll ein Assembler-Quellprogramm mit AID getestet werden, muß die CSECT-Anweisung, die den ersten Programmabschnitt bezeichnet, einen Namen haben. Für Assembler-Programme, deren erster Programmabschnitt unbenannt ist, wird keine LSDInformation abgelegt (siehe AID, Testen von ASSEMBH-Programmen [2]).

>>>>> siehe auch DSECT- und XDSEC-Anweisung

U5223-J-Z125-3

55

CXD

Assembleranweisungen

CXD Speicherplatz für die Länge des Pseudoregistervektors reservieren
Funktion Die CXD-Anweisung reserviert ein Wort, in das vom Binder die Gesamtlänge des Pseudoregistervektors eingetragen wird.

Format

Name

name

[

]

.sym

name .sym

Operation CXD

Operanden

Name Folgesymbol

Beschreibung
Der Wert des Namenseintrags ist die Adresse des Speicherbereichs, in den vom Binder die Länge des Pseudoregistervektors eingetragen wird.
Dieser Speicherbereich hat ein Längenmerkmal von 4 und muß an Wortgrenze ausgerichtet sein.

Programmierhinweis Die CXD-Anweisung kann an beliebiger Stelle im Quellprogramm auftreten.

>>>>> siehe auch DXD-Anweisung 56

U5223-J-Z125-3

Assembleranweisungen

DC

DC Konstante definieren
Funktion Die DC-Anweisung definiert Konstanten im Speicher.

Format

Name

name

[

]

.sym

Operation DC

Operanden
'chrcon' {[dup]typ[Ln1][Sn2][En3] 'datcon[,...]' }[,...]
(adrcon[,...])

name .sym dup
typ Ln1
Sn2 En3
chrcon datcon adrcon

Name Folgesymbol Wiederholungsfaktor
dezimaler selbstdefinierender Wert oder positiver absoluter Ausdruck in Klammern, Wertebereich: 0 bis 224-1 Konstantentyp ein einzelner Buchstabe, kann für Zeichenkonstanten entfallen Längenfaktor n1 ist ein dezimaler selbstdefinierender Wert oder ein positiver absoluter Ausdruck in Klammern Skalenfaktor Exponentenfaktor n2, bzw. n3 ist ein positiver oder negativer selbstdefinierender Wert oder ein absoluter Ausdruck in Klammern Wert der Zeichenkonstanten Wert der dezimalen, sedezimalen, binären, Festpunkt- und Gleitpunktkonstanten Wert der Adreßkonstanten

Für jeden einzelnen Operanden der DC-Anweisung bzw. für jeden definierten Wert innerhalb eines Operanden wird eine eigene Konstante generiert.

U5223-J-Z125-3

57

DC

Assembleranweisungen

Beschreibung

name

ist der Name der Konstanten, bzw. der Name der ersten von mehreren Konstanten. Der Wert des Namens ist die Adresse des höchstwertigen Bytes der ersten Konstanten.

Das Längenmerkmal des Namens ist gleich der explizit im Längenfaktor definierten Länge der Konstanten. Wenn kein Längenfaktor angegeben wurde, ist das Längenmerkmal gleich der impliziten Länge der Konstanten.

Gibt es mehr als einen Wert bzw. mehr als einen Operanden, dann ist das Längenmerkmal von name die Länge in Byte der ersten definierten Konstanten. Man muß dann die Länge der ersten Konstanten zu name addieren, um die weiteren Konstanten anzusprechen.

dup

gibt an, wie oft eine Konstante erzeugt werden soll.

Ein Wiederholungsfaktor mit dem Wert Null ist erlaubt und hat folgende Wirkung: Es wird kein Wert übersetzt, die Konstante wird aber entsprechend ihrem Typ ausgerichtet.

typ

bestimmt den Typ der definierten Konstanten. Wenn kein Längenfaktor ange-

geben ist, bestimmt der Typ die Ausrichtung der Konstanten im Speicher

und ihre Länge.

mögliche Konstantentypen:

C

Zeichenkonstante

B

binäre Konstante

P, Z

dezimale Konstanten

X

sedezimale Konstanten

F, H

Festpunktkonstanten

E, D, L

Gleitpunktkonstanten

A, Y, S, V, Q Adreßkonstanten

(siehe Konstantentypen).

Ln1, Sn2, En3 siehe "Modifizierfaktoren" in der DC-Anweisung

chrcon, datcon, adrcon chrcon, datcon und adrcon sind die Werte der Konstanten.

Bei Angabe von mehreren Werten gelten die beschriebenen Merkmale für jeden einzelnen Wert.

58

U5223-J-Z125-3

Assembleranweisungen

DC

Ausrichtung von Konstanten
Die Ausrichtung von Konstanten, also die Erhöhung des Adreßpegels auf eine bestimmte Grenze, ist abhängig vom Konstantentyp. Wenn ein Längenfaktor angegeben wurde, erfolgt in keinem Fall eine Ausrichtung.
Enthält der Operand mehr als eine Konstante, dann wird nur die erste Konstante ausgerichtet.

Typ Ausrichtung auf
C Byte-Grenze X Byte-Grenze B Byte-Grenze P Byte-Grenze Z Byte-Grenze F Wort-Grenze H Halbwort-Grenze E Wort-Grenze D Doppelwort-Grenze L Doppelwort-Grenze A Wort-Grenze Y Halbwort-Grenze S Halbwort-Grenze V Wort-Grenze Q Wort-Grenze

Tabelle 4-4

Ausrichtung von DC-Konstanten

U5223-J-Z125-3

59

DC

Assembleranweisungen

Auffüllen und Abschneiden von Konstanten
Ist für eine Konstante mehr Platz vorgesehen, als für ihren Wert nötig ist, dann wird der zusätzliche Platz aufgefüllt.
Ist für eine Konstante zuwenig Platz vorgesehen, wird sie abgeschnitten und ein Teil der Konstante geht verloren.

Typ Auffüllen

Abschneiden

C rechts mit Leerzeichen (X'40') rechts

X links mit binären Nullen

links

B links mit binären Nullen

links

P links mit binären Nullen

links

Z links mit EBCDIC-Nullen (X'F0') links

F links gemäß Vorzeichenbit

links

H links gemäß Vorzeichenbit

links

E rechts mit binären Nullen

nicht anwendbar

D rechts mit binären Nullen

nicht anwendbar (01)

L rechts mit binären Nullen

nicht anwendbar

A links mit binären Nullen

links

Y links mit binären Nullen

links

S links mit binären Nullen

links

V links mit binären Nullen

links

Q links mit binären Nullen

links

(01) Gleitpunktkonstanten werden nicht abgeschnitten, sondern als Fehler gemeldet und nicht übersetzt.

Tabelle 4-5

Auffüllen und Abschneiden von DC-Konstanten

Speicherplatz
Der Speicherplatz, der pro Operand einer DC-Anweisung reserviert wird, ergibt sich nach folgendem Schema:
Längenfaktor x Anzahl der Werte x Wiederholungsfaktor + alle Bytes, die zur Ausrichtung übersprungen wurden.
Ist mehr als ein Operand angegeben, dann ergibt sich der benötigte Speicherplatz aus der Summe des Speicherplatzbedarfs für die einzelnen Operanden.

60

U5223-J-Z125-3

Assembleranweisungen

DC

Bezugnahme auf den Adreßpegel
Bei der Ausrichtung einer Konstanten wird der Adreßpegel auf die entsprechende Grenze erhöht.
Bezieht sich eine Adreßkonstante auf den Adreßpegel, dann wird als Wert die Speicheradresse des ersten Bytes der Konstanten benutzt. D.h., der Wert des Adreßpegels ändert sich von einer Konstanten zur nächsten um die Länge der Konstanten, wenn sich in einer DC-Anweisung mehrere Adreßkonstanten auf den Adreßpegel beziehen.
Wenn man eine Konstante, die sich auf den Adreßpegel bezieht, mit einem Wiederholungsfaktor angibt, dann wird die Konstante mit dem jeweils neuen Wert des Adreßpegels wiederholt.

U5223-J-Z125-3

61

DC

Assembleranweisungen

Beispiele
Name DUP
CHRCON1 CHRCON2 CHRCON3
HEXCON1 HEXCON2 HEXCON3
ADRCON1 ADRCON2 ADRCON3

Operation
EQU . . DC DC DC . . DC DC DC . . DC DC DC

Operanden
2
C'ABC' 2CL5'ABC' (DUP)CL5'ABC'
X'99' X'99,F7D5,0' XL3'A6F4E'
A(CHRCON1) A(*+4096) A(*+4096,*)

(01) (02) gleiche Bedeutung wie CHRCON2
(03) (04) (05)
(06) (07) (08)

erzeugte Konstanten

Erklärung

(01) C1C2C3

Länge: 3 byte

(02) C1C2C34040C1C2C34040 2 Konstanten, beide auf Länge 5 aufgefüllt

(03) 99

Länge: 1 byte

(04) 99F7D500

3 Konstanten, Länge: 1 byte, 2 byte, 1 byte, Adresse der 2., bzw. 3. Konstanten: HEXCON2+1, bzw. HEXCON2+3

(05) 0A6F4E

Länge: 3 byte, die Konstante ist links aufgefüllt

(06) Adresse von CHRCON1

Länge: 4 byte

(07) Adresse des ersten Bytes von ADRCON2 + 4096

Länge: 4 byte

(08) Wert der ersten Konstanten: Adresse des ersten Bytes von ADRCON3 + 4096,
Wert der zweiten Konstanten: Adresse des ersten Bytes von ADRCON3 + 4, beide Konstanten haben eine Länge von 4 byte.

62

U5223-J-Z125-3

Assembleranweisungen

DC

Modifizierfaktoren
Die Modifizierfaktoren einer Konstanten sind die Länge in byte, die eine Konstante erhalten soll, der Skalenfaktor und der Exponentenfaktor.
Längenfaktor
Der Längenfaktor überschreibt die implizite Länge einer Konstanten. Er gibt die Anzahl von Bytes an, die für eine Konstante reserviert werden. Er bestimmt daher, ob eine Konstante aufgefüllt oder ihr Wert abgeschnitten wird. Bei Angabe eines Längenfaktors wird die Konstante nicht ausgerichtet.
Format des Längenfaktors Ln1
n1 ist ein dezimaler selbstdefinierender Wert oder ein positiver absoluter Ausdruck in Klammern. n1 darf den Maximalwert nicht überschreiten, der für die verschiedenen Konstantentypen zulässig ist.

Typ implizite mögliche Werte

Länge

für n1 (byte)

C

X

B

(01)

P

Z

F4

H2

E4

D8

L 16

A4

Y2

S2

V4

Q4

1 bis 256 1 bis 256 1 bis 256 1 bis 16 1 bis 16 1 bis 8 1 bis 8 1 bis 8 1 bis 8 1 bis 16 1 bis 4 1 oder 2 2 3 oder 4 1 bis 4

(01) Die implizite Länge wird, je nach Länge der definierten Konstanten, berechnet

Tabelle 4-6

Längenfaktoren bei DC-Konstanten

U5223-J-Z125-3

63

DC

Assembleranweisungen

Skalenfaktor
Der Skalenfaktor kann nur bei Festpunkt- und Gleitpunktkonstanten verwendet werden. Er definiert die interne Stellenverschiebung für eine Konstante, und zwar die Anzahl von Binärstellen bei Festpunktkonstanten und die Anzahl von Sedezimalstellen bei Gleitpunktkonstanten.
Format des Skalenfaktors Sn2
n2 ist ein positiver oder negativer selbstdefinierender Wert oder ein absoluter Ausdruck in Klammern.
n2 kann ein Vorzeichen enthalten. Wenn kein Vorzeichen angegeben ist, dann wird ein Pluszeichen angenommen.

Typ mögliche Werte für n2
F -187 bis +346 H -187 bis +346 E 0 bis +14 D 0 bis +14 L 0 bis +28

Tabelle 4-7

Höchstwerte der Skalenfaktoren bei Festpunkt- und Gleitpunktkonstanten

64

U5223-J-Z125-3

Assembleranweisungen

DC

Skalenfaktor in Festpunktkonstanten

Der Skalenfaktor gibt hier die Zweierpotenz an, mit der eine Konstante multipliziert werden soll, nachdem ihr Wert in die interne binäre Darstellung umgewandelt wurde, aber bevor er in stellengerechte Position übersetzt wurde.

Die Multiplikation einer Binärzahl mit einer Zweierpotenz bewirkt die Verschiebung des Binärpunktes weg von seiner ursprünglich angenommenen Lage rechts hinter der letzten Stelle.

Deshalb gibt der Skalenfaktor folgendes an:

Wenn n2 positiv ist Wenn n2 negativ ist

die Anzahl von binären Stellen, die der Bruchteil der Binärzahl belegen soll. Hier wird der ganzzahlige Teil der Konstanten also nach links verschoben. die Anzahl der binären Stellen, die vom ganzzahligen Teil der Binärzahl gestrichen werden sollen. Hier wird der ganzzahlige Teil der Konstanten also nach rechts verschoben.

Falls wegen des Skalenfaktors oder wegen seines Fehlens Stellen verloren gehen, wird die am weitesten rechts stehende Stelle der Binärzahl gerundet (bei einer Zahl > 5 wird aufgerundet, bei einer Zahl < 5 wird abgerundet).
Wird bei einer Festpunktkonstanten, die Kommastellen enthält, kein Skalenfaktor angegeben, dann gehen die Stellen hinter dem Komma verloren.

Skalenfaktor in Gleitpunktkonstanten
n2 gibt hier die Anzahl der Sedezimalstellen an, um die die Mantisse in der binären Darstellung einer Gleitpunktkonstanten nach rechts verschoben werden soll. Die erste Stelle der Mantisse wird ursprünglich direkt hinter dem sedezimalen Punkt angenommen (normalisierte Gleitpunktkonstante).
Durch den Skalenfaktor wird eine nicht normalisierte Gleitpunktkonstante erzeugt, d.h., daß die am weitesten links stehenden Stellen der Mantisse sedezimale Nullen enthalten.
n2 muß hier positiv sein.
Wenn durch den Skalenfaktor die Mantisse verschoben wird, dann wird die Charakteristik der Gleitpunktkonstanten entsprechend korrigiert.
Gehen auf Grund der Angabe eines Skalenfaktors Stellen verloren, dann wird entsprechend der am weitesten links stehenden Stelle des verlorenen Teils gerundet.

U5223-J-Z125-3

65

DC

Assembleranweisungen

Exponentenfaktor
Der Exponentenfaktor kann nur bei Festpunkt- und Gleitpunktkonstanten verwendet werden. Er definiert die Zehnerpotenz, mit der der Wert einer Konstanten multipliziert werden soll, bevor er in seine interne binäre Darstellung umgewandelt wird.
Format des Exponentenfaktors En3
n3 ist ein positiver oder negativer selbstdefinierender Wert oder ein absoluter Ausdruck in Klammern
n3 kann ein Vorzeichen enthalten. Wenn kein Vorzeichen angegeben ist, wird ein Pluszeichen angenommen.
Der mögliche Bereich für n3 ist -85 bis +75.
Hinweis En3 darf nicht mit dem Exponenten verwechselt werden, der im Feld datcon für einen Wert definiert werden kann. Gibt es in einem Operanden beide Arten von Exponentendefinitionen, werden ihre Werte zusammengerechnet, bevor der Wert in das binäre Format umgewandelt wird. Diese Exponentensumme muß auch noch im erlaubten Bereich von -85 bis +75 liegen.

66

U5223-J-Z125-3

Assembleranweisungen

DC

Konstantentypen
Die Angabe typ in der DC-Anweisung bestimmt den Typ der definierten Konstanten (siehe Tab.4-7). Davon ausgehend kann der Assembler die Konstante interpretieren und in das entsprechende Maschinenformat übersetzen. Wenn kein Längenfaktor angegeben ist, bestimmt der Typ die Ausrichtung der Konstanten im Speicher und den Speicherplatz, den die Konstante belegt.

Code
C X B F
H
E
D
L
P Z A
Y
S
V
Q

Konstantentyp
Zeichenkonstante Sedezimale Konstante Binäre Konstante Festpunktkonstante
Festpunktkonstante
Gleitpunktkonstante
Gleitpunktkonstante
Gleitpunktkonstante
Dezimale Konstante Dezimale Konstante Adreßkonstante
Adreßkonstante
Adreßkonstante
Adreßkonstante
Adreßkonstante

Tabelle 4-8

Konstantentypen

Maschinenformat
8-bit-Code für jedes Zeichen 4-bit-Code für jedes Sedezimalzeichen Binärformat Binäres Festpunktformat mit Vorzeichen, ein Wort Binäres Festpunktformat mit Vorzeichen, ein Halbwort Kurzes Gleitpunktformat, ein Wort Langes Gleitpunktformat, ein Doppelwort erweitertes Gleitpunktformat, zwei Doppelworte Gepacktes Dezimalformat Ungepacktes Dezimalformat Adreßwert, ein Wort Adreßwert, ein Halbwort Basisregister und Distanzwert, ein Halbwort Reservierter Speicherplatz für externe symbolische Adressen; jede Adresse ein Wort Reservierter Speicherplatz für den Offset eines Pseudoregisters bezüglich des Anfangs des Pseudoregistervektor

Im folgenden werden die Konstantentypen einzeln beschrieben.

U5223-J-Z125-3

67

DC

Assembleranweisungen

Zeichenkonstanten C
Mit der Zeichenkonstante kann man Zeichenfolgen definieren. Zeichenkonstanten können mit jedem abdruckbaren Zeichen gebildet werden. Jedes Zeichen, das im Feld chrcon angegeben wurde, wird in ein Byte übersetzt.
Es erfolgt keine Ausrichtung im Speicher.
Der größte erlaubte Längenfaktor ist 256. Ist kein Längenfaktor angegeben, dann entspricht die Länge der Konstanten der Anzahl der Zeichen in chrcon. Ist ein Längenfaktor angegeben, dann wird der Wert der Konstanten
rechts abgeschnitten, wenn der Längenfaktor zu klein ist und rechts mit Leerzeichen (X'40') aufgefüllt, wenn der Längenfaktor größer als die Anzahl der Zeichen ist.

Für die Darstellung von Hochkomma (') und kommerziellem Und (&) gilt: Das Hochkomma (') wird in der Assemblersprache und das kommerzielle Und (&) in der Makrosprache als syntaktisches Zeichen verwendet. Deshalb müssen für jedes Hochkomma oder jedes &-Zeichen, die in einer Zeichenkonstanten verwendet werden sollen, zwei Hochkommas bzw. zwei &-Zeichen geschrieben werden. Die beiden Hochkommas bzw. &-Zeichen werden als einzelnes Hochkomma, bzw. als einzelnes & übersetzt.

Beispiele
Name
CHRCON1 CHRCON2 CHRCON3

Operation
DC DC DC

Operanden
C'ABC,DEF' C'&& ABC,DEF' 3CL4'12345'

(01) (02) (03)

erzeugte Konstanten

Erklärung

(01) C1C2C36BC4C5C6

Länge: 7 byte, das Komma wird als Zeichen interpretiert.

(02) 5040C1C2C36BC4C5C6

Länge: 9 byte, die zwei &-Zeichen gelten als ein Zeichen.

(03) F1F2F3F4F1F2F3F4F1F2F3F4 Konstante mit Wiederholungs- und Längenfaktor; die Länge ist zu kurz definiert, die Konstante wird rechts abgeschnitten.

68

U5223-J-Z125-3

Assembleranweisungen

DC

Sedezimalkonstanten X
Eine sedezimale Konstante besteht aus einer oder mehreren Sedezimalziffern. Jede Sedezimalstelle, die in datcon definiert ist, wird in vier Bits übersetzt. Bei einer ungeraden Anzahl von Stellen werden die linken vier Bits des höchstwertigen Bytes mit einer sedezimalen Null aufgefüllt.
Der größte Längenfaktor ist 256 (byte). Ist kein Längenfaktor angegeben, dann ist die implizite Länge der Konstanten gleich der Anzahl der Bytes in datcon. Ist ein Längenfaktor angegeben, dann wird die Konstante
links abgeschnitten, wenn der Längenfaktor zu klein ist und links mit sedezimalen Nullen aufgefüllt, wenn der Längenfaktor größer ist, als die Hälfte der Anzahl der sedezimalen Stellen.

Beispiele
Name
HEXCON1 HEXCON2 HEXCON3

Operation
DC DC DC

Operanden
X'FF00FFFF' 3XL2'BD8E7' 3X'BD8E7'

(01) (02) (03)

erzeugte Konstanten (01) FF00FFFF
(02) D8E7D8E7D8E7
(03) 0BD8E70BD8E70BD8E7

Erklärung
Die Konstante erzeugt das Bitmuster eines Wortes. HEXCON1 setzt das erste, dritte und vierte Byte eines Wortes auf 1.
Konstante mit Wiederholungs- und Längenfaktor, die Länge ist zu kurz definiert, daher wird links abgeschnitten
Die Länge wird implizit berechnet, links wird mit einer sedezimalen Null aufgefüllt

U5223-J-Z125-3

69

DC

Assembleranweisungen

Binärkonstanten B
Mit einer Binärkonstante kann man beliebige Bitmuster definieren. Sie besteht aus einer Folge der Binärziffern 0 und 1.
Der größtmögliche Längenfaktor ist 256 byte. Ist kein Längenfaktor angegeben, dann ist die implizite Länge der Konstanten die Anzahl von Bytes, die von der Konstanten belegt werden. Dabei wird jeweils links mit binären Nullen aufgefüllt, wenn der Wert der Konstanten keine ganzzahlige Anzahl von Bytes belegt. Ist ein Längenfaktor angegeben, dann wird der Wert der Konstanten
links abgeschnitten, wenn der Längenfaktor zu klein ist und links mit binären Nullen aufgefüllt, wenn der Längenfaktor grösser angegeben ist, als für die Aufnahme der definierten Bits notwendig ist.

Beispiele
Name
BCON BSHORT BLONG1 BLONG2

Operation
DC DC DC DC

Operanden
B'10101101' BL1'111100011' BL1'110' B'110'

(01) (02) (03) (04)

erzeugte Konstanten (01) AD (02) E3 (03) 06
(04) 06

Erklärung
Länge: 1 byte
Die Konstante wird links abgeschnitten
Die Konstante wird links mit binären Nullen aufgefüllt
Gleiche Wirkung wie BLONG1, die Länge wird implizit berechnet

70

U5223-J-Z125-3

Assembleranweisungen

DC

Festpunktkonstanten F und H
Festpunktkonstanten definieren Daten, die in Festpunktbefehlen verwendet werden können.
Der Wert einer Festpunktkonstanten wird als Dezimalzahl geschrieben, der ein Dezimalexponent folgen kann:
Die Dezimalzahl kann ganzzahlig, gebrochen oder gemischt sein und ein positives oder negatives Vorzeichen haben. Fehlt das Vorzeichen, wird sie als positiv interpretiert. Fehlt der Dezimalpunkt, dann wird die Dezimalzahl als ganzzahlig interpretiert. Wird für den Wert der Konstanten ein Dezimalexponent angegeben, dann muß er direkt auf die Zahl folgen. Er wird als En geschrieben, wobei n eine Dezimalzahl sein muß, die ein Vorzeichen haben kann. En wird als Exponent zur Basis 10 aufgefasst. Die Summe aus Exponent und Exponentenfaktor darf den zulässigen Bereich von -85 bis +75 nicht überschreiten.
Übersetzung von Festpunktkonstanten
1. Die definierte Zahl, multipliziert mit 10 hoch dem Exponenten, wird in eine binäre Zahl mit Vorzeichen umgewandelt. Das Vorzeichen wird im höchstwertigen Bit verschlüsselt. Eine negative Zahl wird als Zweierkomplement mit einem auf 1 gesetzten Vorzeichenbit dargestellt.
2. Diese Zahl wird entsprechend dem angegebenen Skalenfaktor ausgerichtet. Wird eine gebrochene oder eine gemischte Zahl ohne Skalenfaktor angegeben, dann geht der gebrochene Teil verloren.
3. Der binäre Wert wird, wenn nötig, gerundet. 4. Nachdem die Konstante übersetzt ist, wird der Wiederholungsfaktor ausgewertet.

U5223-J-Z125-3

71

DC

Assembleranweisungen

Ausrichtung, Länge, Wertebereich
Die Konstante wird auf Wort- bzw. Halbwortgrenze ausgerichtet, wenn kein Längenfaktor angegeben ist.
Die implizite Länge für Wortkonstanten (F) beträgt vier byte, für Halbwortkonstanten (H) zwei byte. Mit einem Längenfaktor können jedoch für beide Konstantentypen Längen bis zu acht byte angegeben werden. Dadurch ergibt sich für Festpunktkonstanten folgender darstellbarer Wertebereich:

Länge
8 4 2 1

darstellbarer Wertebereich
-263 bis 263-1 -231 bis 231-1 -215 bis 215-1 -27 bis 27-1

Tabelle 4-9

Darstellbarer Wertebereich für Festpunktkonstanten

Der Wertebereich hängt ab von der implizit oder explizit definierten Länge. Ist die Konstante kleiner als ihre definierte Länge, wird sie links gemäß Vorzeichenbit aufgefüllt. Überschreitet die Konstante den Wertebereich, der auf Grund ihrer definierten Länge möglich ist, dann geht das Vorzeichen verloren, die Konstante wird links abgeschnitten.

72

U5223-J-Z125-3

Assembleranweisungen

DC

Beispiele
Name
HCON1 HCON2 FCON1 FCON2 FCON3

Operation
DC DC DC DC DC

Operanden
H'+12' H'-12' F'12.3' FS8'12.3' FS8'123'

(01) (02) (03) (04) (05)

erzeugte Konstanten (01) 000C (02) FFF4 (03) 0000000C (04) 00000C4D
(05) 00007B00

Erklärung
Länge: 2 byte
Der negative Wert wird als Zweierkomplement dargestellt, das Vorzeichenbit steht auf 1.
Wortkonstante; weil kein Skalenfaktor angegeben ist, geht der Bruchteil verloren; es wird abgerundet.
Der Skalenfaktor reserviert 1 byte für den Bruchteil, der ganzzahlige Teil der Konstante wird nach links verschoben; es wird aufgerundet.
Der Skalenfaktor reserviert 1 byte für den Bruchteil, auch wenn der Wert keinen enthält.

U5223-J-Z125-3

73

DC

Assembleranweisungen

Gleitpunktkonstanten E, D und L
Gleitpunktkonstanten definieren Daten, die in Gleitpunktbefehlen verwendet werden können.
Der Wert einer Gleitpunktkonstanten wird als Dezimalzahl geschrieben, der ein Exponent folgen kann:
Die Dezimalzahl kann ganzzahlig, gebrochen oder gemischt sein und ein positives oder negatives Vorzeichen haben. Fehlt das Vorzeichen, wird die Zahl als positiv aufgefaßt. Fehlt der Dezimalpunkt, wird die Zahl als ganzzahlig interpretiert. Wird für die Zahl ein Exponent angegeben, dann muß er direkt folgen und in der Form En geschrieben sein. n muß eine Dezimalzahl sein, die ein Vorzeichen haben kann. En wird als Exponent zur Basis 10 aufgefasst. Die Summe aus Exponent und Exponentenfaktor darf den zulässigen Bereich von -85 bis +75 nicht überschreiten.

Maschinenformat von Gleitpunktkonstanten
Das Maschinenformat für eine Gleitpunktkonstante besteht aus zwei Teilen: dem Exponententeil (Charakteristik), gefolgt von dem gebrochenen Teil (Mantisse). Ein Vorzeichen-Bit zeigt an, ob eine positive oder negative Zahl definiert wurde (siehe Assemblerbefehle, Beschreibung [3]).

kurzes Gleitpunktformat: (4 byte)

))

V Charakteristik Mantisse

))

01

8

31

))

langes Gleitpunktformat: V Charakteristik Mantisse

(8 byte)

))

01

8

63

01

8

64

))

erweitertes Gleitpunktf.: V Charakter. 1

Mantisse (0 bis 55)

(16 byte)

))

V Charakter. 2

Mantisse (56 bis 111)

))

64

72

127

- Das Vorzeichen im zweiten Doppelwort ist gleich dem im ersten
- Charakteristik 2 = (Charakteristik 1 - 14)

74

U5223-J-Z125-3

Assembleranweisungen

DC

Übersetzung von Gleitpunktkonstanten
Eine Gleitpunktkonstante muß vor der Umwandlung in das Maschinenformat erst in einen Bruch konvertiert werden. Der Exponent wird dann in sein Binäräquivalent umgesetzt und der Bruch in eine Binärzahl konvertiert.

Der Assembler übersetzt eine Gleitpunktkonstante in ihre binäre Darstellung wie es an folgendem Beispiel erklärt wird:
Die Gleitpunktkonstante KON wurde folgendermaßen definiert:

Name KON

Operation DC

Operanden E'-167.0'

1. -167.010 = -A716 Umwandlung des Bruchs in eine Binärzahl

2. -A716 = (-0.A7*162)16

Normalisierung

3. Charakteristik = (Exponent + 64 = 66)10 = 4216

4. Wegen des negativen Vorzeichen wird das höchstwertige Bit auf 1 gesetzt, das entspricht einer Addition von 8016:

8016 +4216 = C216

5. Eine E-Konstante hat eine implizite Länge von 4 byte, d.h. das erste Byte enthält Charakteristik und Vorzeichen, die rechten 3 Bytes enthalten die Mantisse:

C2 A7 00 00

d.h. C2 = Vorzeichen + Charakteristik A7 00 00 = Mantisse

6. Wurde ein Skalenfaktor definiert, dann werden links an den normalisierten gebrochenen Teil sedezimale Nullen angehängt und die Charakteristik entsprechend angeglichen.
7. Der gebrochene Teil wird entsprechend der impliziten, bzw. expliziten Länge der Konstanten gerundet.
8. Ein negativer gebrochener Teil wird nicht als Zweierkomplement dargestellt, sondern in direkter Form mit Vorzeichen.
9. Nachdem die Konstante übersetzt ist, wird der Wiederholungsfaktor ausgewertet.

U5223-J-Z125-3

75

DC

Assembleranweisungen

Ausrichtung, Länge, Wertebereich
E-Konstanten werden an Wort-Grenzen ausgerichtet, D- und L-Konstanten an Doppelwortgrenzen. Wenn ein Längenfaktor definiert ist, erfolgt keine Ausrichtung.
Die implizite Länge beträgt für E-Konstanten 4 byte, für D-Konstanten 8 byte und für L-Konstanten 16 byte. Mit einem Längenfaktor kann für E- und D-Konstanten jede Länge bis zu 8 byte angegeben werden, für L-Konstanten bis zu 16 byte. Dadurch ergibt sich für die Mantisse von Gleitpunktkonstanten ein Wertebereich, der übersetzt werden kann:

Typ Wertebereich der Mantisse (exakt) Wertebereich (annähernd)

E

16-65 bis (1-16-6)*1663

D

16-65 bis (1-16-14)*1663

L

16-65 bis (1-16-28)*1663

5,4*10-75 bis 7,2*1075

Tabelle 4-10

Darstellbarer Wertebereich der Mantisse in Gleitpunktkonstanten

Liegt der Wert, der für eine Konstante definiert wurde, nicht innerhalb dieser Grenzen, dann wird die Konstante nicht übersetzt und mit einer Fehlermeldung versehen.

76

U5223-J-Z125-3

Assembleranweisungen

DC

Beispiele

Name
ECON1 ECON2 ECON3 ECON4 ECON5

Operation
DC DC DC DC DC

Operanden
E'167' E'16.7' ES2'16.7' EE10'16.7' E'16.7E10'

(01) (02) (03) (04) (05)

erzeugte Konstanten (01) 42A70000 (02) 4210B33 (03) 440010B33
(04) 4A26E1FA (05) 4A26E1FA

Erklärung
Gleitpunktkonstante der Länge 4 byte, das erste Byte enthält Charakteristik und Vorzeichen, die rechten 3 Bytes enthalten die Mantisse.
Die Charakteristik bleibt gleich, durch die Angabe von Kommastellen ändert sich die Mantisse.
Der Skalenfaktor bewirkt eine Verschiebung des gebrochenen Teils um zwei Sedezimalstellen nach rechts. Die Charakteristik wird geändert weil sich durch die Verschiebung der Wert des Exponenten ändert.
Wegen des Exponentenfaktors wird der Wert 16.7 mit 1010 multipliziert, bevor er umgewandelt wird.
hat das gleiche Ergebnis wie ECON4. Übersetzt wird 16.7*1010.

U5223-J-Z125-3

77

DC

Assembleranweisungen

Dezimalkonstanten P und Z
Die Dezimalkonstanten definieren Daten, die in Dezimalbefehlen verwendet werden können.
Der Wert einer Dezimalkonstanten wird als Dezimalzahl geschrieben, die ein Vorzeichen haben kann. Ist kein Vorzeichen angegeben, wird die Zahl als positiv interpretiert. Die Dezimalzahl kann einen Dezimalpunkt enthalten. Er wird jedoch bei der Übersetzung der Konstanten in das interne Format nicht berücksichtigt.
Der größte Längenfaktor ist 16 byte. Ist kein Längenfaktor angegeben, dann entspricht die implizite Länge der Konstanten der Anzahl von Bytes, die sie belegt. Ist ein Längenfaktor angegeben, dann wird der Wert der Konstanten
links abgeschnitten, wenn die Konstante mehr Bytes erfordert, als der Längenfaktor angibt und links aufgefüllt, wenn der Längenfaktor grösser ist als nötig. Bei Z-Konstanten wird mit einer dezimalen Null aufgefüllt, bei P-Konstanten werden die Bits jedes angefügten Bytes auf Null gesetzt.
Übersetzung von Dezimalkonstanten
Bei gepackten Dezimalkonstanten (P) wird jede Ziffer in ihr 4 bit langes binäres Äquivalent übersetzt. Das Vorzeichen kommt in die am weitesten rechts stehenden 4 Bits der Konstanten. Wird eine gerade Anzahl von gepackten Dezimalstellen definiert, werden die linken 4 Bits des am weitesten links stehenden Bytes auf Null gesetzt, und die rechten 4 Bits enthalten die erste Stelle der Dezimalzahl.
Bei ungepackten Dezimalkonstanten (Z) wird jede Ziffer in ihre 8 bit lange EBCDIC-Darstellung umgewandelt. Das Vorzeichen steht in den ersten 4 Bits des am weitesten rechts stehenden Bytes der Konstanten.
Bei beiden Konstantentypen wird ein Plus als C, ein Minus als D abgelegt.

78

U5223-J-Z125-3

Assembleranweisungen

DC

Beispiele
Name
PCON1 PCON2 ZCON1 ZCON2

Operation
DC DC DC DC

Operanden
P'+153' P'-153' Z'-153' Z'-1.53'

(01) (02) (03) (04)

erzeugte Konstanten (01) 153C (02) 153D (03) F1F5D3 (04) F1F5D3

Erklärung Länge: 2 byte Länge: 2 byte Länge: 3 byte Länge: 3 byte, der Dezimalpunkt wird ignoriert.

U5223-J-Z125-3

79

DC

Assembleranweisungen

Adreßkonstanten
Adreßkonstanten enthalten Speicheradressen. Man kann Adreßkonstanten verwenden, um z.B. Basisregister zu initialisieren oder zur Verknüpfung von Programmabschnitten.
Adreßkonstanten vom Typ A und Y
Der Wert einer A- oder Y-Konstanten, der in adrcon definiert wird, kann ein absoluter oder ein relativer Ausdruck sein. A-Konstanten werden auf Wortgrenze und Y-Konstanten auf Halbwortgrenze ausgerichtet, wenn kein Längenfaktor angegeben ist. Die implizite Länge von A-Konstanten beträgt 4 byte, von Y-Konstanten 2 byte. Mit dem Längenfaktor können für A-Konstanten Längen von 1 bis 4 byte angegeben werden, für Y-Konstanten 1 bis 2 byte.
Übersetzung von A- und Y-Konstanten adrcon ist ein absoluter Ausdruck: Der Wert in adrcon wird auf 32 bit berechnet und dann links abgeschnitten oder links aufgefüllt, wenn die Länge der Konstanten es erfordert. adrcon ist ein relativer Ausdruck: Der Assembler verwendet den Adreßpegel als vorläufigen Wert. Der endgültige Wert der Konstanten wird erst beim Laden des Programms in die Konstante eingesetzt.
Programmierhinweise 1. Für 31-bit-Adressierung dürfen nur 4 byte lange A-Konstanten verwendet werden. 2. Ein relativer Ausdruck in einer A- oder Y-Konstanten kann externe Namen enthalten
und dadurch eine Adresse in einem unabhängig übersetzten Programm bezeichnen. In diese Adreßkonstante trägt der Assembler den vorläufigen Wert Null ein (siehe Beispiel 03). 3. Y-Konstanten werden häufig verwendet bei Offset-Adressierung innerhalb von Tabellen oder innerhalb von Datenbereichen, die über den Ablaufteil-Makro REQM bereitgestellt wurden (siehe Makroaufrufe an den Ablaufteil, Beschreibung [6]).

80

U5223-J-Z125-3

Assembleranweisungen

DC

Beispiele
Name ACON1 ACON2 PROGRA
ACON
PROGRB
MARK

Operation
DC DC . . START . EXTRN . L . DC . END . . START . ENTRY . EQU . END

Operanden A(*+4096) A(ACON1)
MARK 15,ACON A(MARK)
MARK *

(01) (02)
(03)

Wert der Konstanten (01) Adreßpegel von ACON1
+ 4096
(02) Adreßpegel von ACON1 (03) Null

Erklärung
Der relative Ausdruck in der Konstanten enthält einen Verweis auf den Adreßpegel. Der Wert von * ist der Adreßpegel von ACON1.
Mögliche Verknüpfung von zwei Programmen. Die A-Konstante in PROGRA ist als EXTRN-Adresse (Sprungdresse) gekennzeichnet, in PROGRB als ENTRY-Adresse (Einsprungadresse). Das Sprungziel liegt in PROGRB.

U5223-J-Z125-3

81

DC

Assembleranweisungen

Adreßkonstanten vom Typ S
S-Konstanten ermöglichen es, Adressen in Basis-Distanz-Form abzulegen.
Der Wert einer S-Konstanten kann als symbolische oder als nicht-symbolische Adresse angegeben werden. Eine symbolische Adresse wird vom Assembler in Basisregister und Distanzwert zerlegt, eine nicht-symbolische Adresse muß in der Form (Distanz(Basisregister)) angegeben werden.
Eine S-Konstante wird auf Halbwortgrenze ausgerichtet, ihre implizite Länge ist 2 byte. Die am weitesten links stehenden 4 Bits der übersetzten Konstanten enthalten die Nummer des Basisregisters und die restlichen 12 Bits den Distanzwert.
S-Konstanten dürfen nicht in Literalen verwendet werden.
Programmierhinweis
S-Konstanten werden in erster Linie verwendet, wenn ein Maschinen-Befehlscode nicht über einen mnemotechnischen Operationscode erzeugt werden soll, sondern über DCKonstanten.

82

U5223-J-Z125-3

Assembleranweisungen

DC

Beispiel
Name R0 R1 R11
ADR

Operation
. . EQU EQU EQU . . BALR USING . . L . . DC DC DC TERM . . DC END

Operanden
0 1 11
R11,R0 *,R11
R1,ADR
X'58' X'10' S(ADR)
C'ABCD'

(01) (02)

erzeugter Objektcode
(01) 58 10 B026 (02) 58
10 B026

Erklärung
Die Folge von DC-Konstanten erzeugt einen Objektcode, der dem des L-Befehls entspricht.

U5223-J-Z125-3

83

DC

Assembleranweisungen

Adreßkonstanten vom Typ V
Mit V-Konstanten kann man Speicherplatz für Einsprungadressen in ein anderes Programm reservieren. Man darf V-Konstanten nur als Sprungadressen verwenden, nicht zur Adressierung externer Daten.
Der Wert der Konstanten wird als Name angegeben. Dieser Name darf nicht durch eine EXTRN-Anweisung gekennzeichnet sein, da er vom Assembler automatisch als externe Adresse interpretiert wird (falls doch, wird jedoch aus Kompatibilitätsgründen kein Flag ausgegeben). Es ist zu beachten, daß die Angabe eines Namens in einer V-Konstanten nicht gleichzeitig die Definition des Namens als externes Symbol für dieses Programm bedeutet.
Der Wert einer V-Konstanten ist Null, bis das Programm geladen ist. Der korrekte Wert der Adresse wird durch den Lader eingefügt.
V-Konstanten werden auf Wortgrenze ausgerichtet, wenn kein Längenfaktor angegeben ist. Die implizite Länge einer V-Konstanten ist 4 byte. Mit dem Längenfaktor kann eine Länge von 3 oder 4 byte angegeben werden. In diesem Fall kann der relative Wert der Konstanten abgeschnitten werden.
Programmierhinweis
Für 31-bit-Adressierung dürfen nur V-Konstanten mit der Länge 4 byte verwendet werden.

84

U5223-J-Z125-3

Assembleranweisungen

DC

Beispiel

Name PROGRA
VCON
PROGRB MARK

Operation
START . L BALR . DC . END . . START ENTRY . USING LA . . BR . END

Operanden
15,VCON 14,15 V(MARK)
MARK MARK,15 ... 14

(01)

(01) Dieses Beispiel zeigt eine Programmverknüpfung, die über eine V-Konstante realisiert ist. Der Name MARK darf im gleichen Programm nicht durch eine EXTRNAnweisung gekennzeichnet werden.

U5223-J-Z125-3

85

DC

Assembleranweisungen

Adreßkonstanten vom Typ Q
Mit Q-Konstanten kann Speicherplatz reserviert werden, in dem der Offset eines Pseudoregisters innerhalb des Pseudoregistervektors abgelegt werden soll. Im Pseudoregistervektor liegen die Pseudoregister in einer vom Binder bestimmten Reihenfolge hintereinander. Die Q-Konstante enthält also den Abstand des Pseudoregisters zum Anfang des Pseudoregistervektors.
Der Wert, der in einer Q-Konstanten definiert wird, ist der Name eines über DXD definierten Pseudoregisters oder einer DSECT, die durch die Referenzierung in einer Q-Konstanten zusätzlich als Pseudoregister eingetragen wird. Diese Adresse wird erst vom Binder eingetragen.
Beschreibung der Verwendung von Q-Konstanten siehe 3.3.2, Pseudoregister.
Hinweis Literale dürfen keine Q-Konstanten enthalten.

Beispiel

Name

Operation Operanden

DNAME D1 D2
CNAME
QCON

DSECT DS DS . . CSECT . . DC END

3F CL15
Q(DNAME)

(01)

(01) DNAME definiert eine DSECT. QCON enthält die Distanz von DNAME zum Anfang des Pseudoregistervektors.

86

U5223-J-Z125-3

Assembleranweisungen

DS

DS Speicherplatz reservieren
Funktion Die DS-Anweisung reserviert Speicherbereiche und ordnet ihnen Namen zu.

Format

Name

name

[

]

.sym

Operation DS

Operanden

'chrcon'

[dup]typ[Ln][

]

'datcon'

name .sym dup
typ Ln
chrcon datcon

Name Folgesymbol Wiederholungsfaktor
dezimaler selbstdefinierender Wert oder positiver absoluter Ausdruck in Klammern, Wertebereich: 0 bis 224-1 Typ des reservierten Speicherbereichs, ein einzelner Buchstabe Längenfaktor n ist ein dezimaler selbstdefinierender Wert oder ein positiver absoluter Ausdruck in Klammern Wertangabe für einen Zeichenbereich Wertangabe für dezimale, sedezimale, binäre, Festpunkt- und Gleitpunktbereiche

Die Werte, die in den Operanden der DS-Anweisung angegeben werden, werden nicht in Objektcode übersetzt. Sie werden ggf. nur zur Bestimmung impliziter Längenfaktoren herangezogen.

Hinweis
Es ist möglich, im Operanden der DS-Anweisung das ganze Format der DC-Anweisung anzugeben. Diese zusätzlichen Angaben haben aber keine Auswirkung auf den reservierten Bereich.

U5223-J-Z125-3

87

DS

Assembleranweisungen

Beschreibung

name

ist der Name des reservierten Speicherbereichs. Der Wert des Namens ist die Adresse des am weitesten links stehenden Bytes des reservierten Bereichs.

Das Längenmerkmal des Namens ist gleich der explizit im Längenfaktor definierten Länge des Bereichs. Wenn kein Längenfaktor angegeben wurde, ist das Längenmerkmal gleich der impliziten Länge des Bereichs, die abhängig ist vom angegebenen Typ.

dup

gibt an, wie oft ein Bereich reserviert werden soll. Wenn für dup ein Aus-

druck angegeben wird, müssen die in diesem Ausdruck verwendeten Namen

nicht vorher definiert sein.

Ein Wiederholungsfaktor mit dem Wert Null ist erlaubt und hat folgende Wirkung: Es wird kein Speicherplatz reserviert, der Bereich wird aber entsprechend seinem Typ ausgerichtet und erhält ein Längenmerkmal.

typ

Wenn kein Längenfaktor angegeben ist, bestimmt der Typ die Ausrichtung

des Bereichs im Speicher und seine Länge.

mögliche Typangaben:

C B P, Z X F, H E, D, L A, Y, S, V, Q

Zeichenbereiche binäre Bereiche dezimale Bereiche sedezimale Bereiche Festpunktbereiche Gleitpunktbereiche Adreßbereiche

88

U5223-J-Z125-3

Assembleranweisungen

DS

Ln

gibt die Länge des Bereichs in byte an, der reserviert werden soll und über-

schreibt die implizite Länge.

Wenn für n ein Ausdruck angegeben wird, müssen die verwendeten Namen

nicht vorher definiert sein.

Bei Angabe eines Längenfaktors wird der entsprechende Bereich nicht ausgerichtet.

Typ implizite mögliche Werte

Länge

für n (byte)

C1 X1 B1 P1 Z1 F4 H2 E4 D8 L 16 A4 Y2 S2 V4 Q4

1 bis 224-1 1 bis 224-1 1 bis 256 1 bis 16 1 bis 16 1 bis 8 1 bis 8 1 bis 8 1 bis 8 1 bis 16 1 bis 4 1 oder 2 2 3 oder 4 1 bis 4

Tabelle 4-11

Längenfaktoren in der DS-Anweisung

chrcon,datcon chrcon, und datcon sind die Werte, die in den Operanden angegeben werden können.

Wenn bei den Typen C, B, P, Z und X kein Längenfaktor angegeben ist, berechnet der Assembler an Hand des angegeben Wertes die Länge des zu reservierenden Bereichs.

Wenn für einen Bereich ein Wert angegeben wird, dann muß er für den Typ des entsprechenden Bereichs zulässig sein (siehe Beschreibung der Konstantentypen).

U5223-J-Z125-3

89

DS

Assembleranweisungen

Ausrichtung von Speicherbereichen
Die Ausrichtung von Speicherbereichen, also die Erhöhung des Adreßpegels auf eine bestimmte Grenze, ist abhängig vom Typ des Bereichs. Wenn ein Längenfaktor angegeben wurde, erfolgt in keinem Fall eine Ausrichtung.
Enthält der Operand mehr als eine Wertangabe, dann wird nur der erste Wert ausgerichtet.

Typ Ausrichtung auf
C Byte-Grenze X Byte-Grenze B Byte-Grenze P Byte-Grenze Z Byte-Grenze F Wort-Grenze H Halbwort-Grenze E Wort-Grenze D Doppelwort-Grenze L Doppelwort-Grenze A Wort-Grenze Y Halbwort-Grenze S Halbwort-Grenze V Wort-Grenze Q Wort-Grenze

Tabelle 4-12

Ausrichtung von Speicherbereichen in der DS-Anweisung

90

U5223-J-Z125-3

Assembleranweisungen

DS

Programmierhinweise
1. Erzwungene Ausrichtung: Mit Hilfe einer DS-Anweisung können Speicherbereiche oder Konstanten, die normalerweise nicht ausgerichtet werden, auf Halbwort-, Wort- oder Doppelwortgrenze ausgerichtet werden. Dazu muß der jeweiligen DC- oder DS-Anweisung eine DS-Anweisung vorangestellt werden mit dem Wiederholungsfaktor Null und der entsprechenden Typangabe (z.B. H, F oder D).
2. Redefinieren von Speicherbereichen: Mit einer DS-Anweisung mit dem Wiederholungsfaktor Null wird einem Speicherbereich ein Name und ein Längenmerkmal zugeordnet. Mit weiteren folgenden DSoder DC-Anweisungen kann dieser Bereich redefiniert werden, d.h., Felder, bzw. Konstanten innerhalb definiert und einzeln angesprochen werden (siehe Beispiele, (02)). Felder, die in einem solchen Bereich nicht definiert werden sollen, müssen mit einer DS-Anweisung mit Längenangabe oder mit einer ORG-Anweisung übersprungen werden.
3. Längenberechnung: Für Speicherbereiche, deren implizite Länge 1 byte beträgt (siehe Tabelle 4-8), kann man den Assembler das Längenmerkmal berechnen lassen, wenn man die entsprechenden Werte im Feld chrcon, bzw. datcon angibt. In diesem Fall darf kein Längenfaktor angegeben werden. Der Assembler berechnet an Hand der Werte die benötigte Länge.
4. Die DS-Anweisung reserviert einen Speicherbereich, belegt ihn jedoch nicht mit Nullen. Der Inhalt des reservierten Bereichs kann nicht vorhergesagt werden.

U5223-J-Z125-3

91

DS

Assembleranweisungen

Beispiele

Name
FIELD1 FIELD2 FIELD3 FIELD4
AREA
RDAREA
PERSNUM NAME
DATE DAY MON YEA

Operation
DS DS DS DS . . DS DS . . DS DS DS DS DS DS DS DS DS ORG

Operanden
CL80 4CL20 4C F
0F XL20
0CL50 CL4 CL6 CL20 CL4 0CL6 CL2 CL2 CL2 RDAREA+L'RDAREA

1 Feld, Längenmerkmal 80 4 Felder, Längenmerkmal je 20 4 Felder, Längenmerkmal je 1 1 Feld, ausgerichtet auf Wortgrenze, Längenmerkmal 4
(01)
(02)
(03)

(01) Durch die vorangestellte DS-Anweisung mit Wiederholungsfaktor Null und der Typangabe F wird der Bereich AREA auf Wortgrenze ausgerichtet.
(02) Für den Bereich RDAREA wird kein Speicherplatz reserviert, er erhält aber ein Längenmerkmal. Die folgenden Anweisungen redefinieren den Bereich, wobei das Feld DATE nochmals unterteilt wird. Man kann sowohl die einzelnen Felder, als auch den Bereich als Ganzes ansprechen.
(03) Die ORG-Anweisung am Ende der Anweisungsfolge erhöht den Adreßpegel auf das Ende des Bereichs RDAREA, damit der gesamte Bereich reserviert ist.

>>>>> siehe auch DC-Anweisung 92

U5223-J-Z125-3

Assembleranweisungen

DXD

DXD Pseudoregister definieren
Funktion Die DXD-Anweisung definiert ein Pseudoregister.

Format

Name name
name dup
typ Ln
val

Operation DXD

Operanden [dup]typ[Ln]['val']

Name Wiederholungsfaktor
dezimaler selbstdefinierender Wert oder positiver absoluter Ausdruck in Klammern Typ des Pseudoregisters, ein einzelner Buchstabe Längenfaktor n ist ein dezimaler selbstdefinierender Wert oder ein positiver absoluter Ausdruck in Klammern, Maximalwert: dup*n 4095 Wertangabe für das Pseudoregister

Hinweis
Es ist möglich, im Operanden der DXD-Anweisung das ganze Format eines Operanden der DC-Anweisung anzugeben. Diese zusätzlichen Angaben haben aber keine Auswirkung auf das Pseudoregister selbst.

Beschreibung

name

ist der Name des Pseudoregisters. Der Wert des Namens ist die niedrigstwertige Adresse des Pseudoregisters. Dieser Wert wird erst beim Laden eingetragen. Bis dahin hat der Name einen vorläufigen Wert von Null.

dup

gibt an, wie oft der im Operanden angegebene Bereich reserviert werden

soll.

Ein Wiederholungsfaktor mit dem Wert Null ist erlaubt und hat folgende Wirkung: Es wird ein Pseudoregister mit der Länge Null definiert, das entsprechend seinem Typ ausgerichtet ist.

U5223-J-Z125-3

93

DXD

Assembleranweisungen

typ

Wenn kein Längenfaktor angegeben ist, bestimmt der Typ die Ausrichtung

des Pseudoregisters und seine Länge.

mögliche Typangaben:

C B P, Z X F, H E, D, L A, Y, S, V, Q

Zeichenbereiche binäre Bereiche dezimale Bereiche sedezimale Bereiche Festpunktbereiche Gleitpunktbereiche Adreßbereiche

Ln

gibt die Länge des Pseudoregisters an und überschreibt die implizite Län-

ge.

Bei Angabe eines Längenfaktors wird das Pseudoregister nicht ausgerich-

tet.

Mögliche Werte für den Längenfaktor und implizite Längen siehe DS-

Anweisung.

val

Wert, der im Operanden angegeben werden kann.

Wenn kein Längenfaktor angegeben ist, berechnet der Assembler an Hand

des angegebenen Wertes die benötigte Länge des Pseudoregisters.

Der angegebene Wert muß für den Typ des Pseudoregisters zulässig sein

(siehe Beschreibung der Konstantentypen).

Programmierhinweise
1. Der Binder bestimmt die Reihenfolge, in der alle Pseudoregister aus allen zusammenzubindenden Moduln zu einem Psudoregistervektor zusammengefaßt werden.
2. Wenn ein Pseudoregister in mehreren Übersetzungseinheiten mit unterschiedlicher Länge und Ausrichtung definert ist, verwendet der Binder die jeweils stärksten Attribute als letztendlich gültige.
3. Die Pseudoregister können an beliebiger Stelle im Programm definiert werden. Es ist nicht nötig, daß die Definitionen aller Pseudoregister hintereinander aufgeführt sind.
4. Zur Zeit unterstützt der DLL die Verwendung von Pseudoregistern nicht, d.h., daß solche Programme mit TSOSLNK gebunden werden müssen und kein Nachlademechanismus in Anspruch genommen werden kann (siehe Bindelader-Starter Benutzerhandbuch [8]).

Beispiel

siehe Anhang 11.4

>>>>> siehe auch DC-, DSECT- und CXD-Anweisung

94

U5223-J-Z125-3

Assembleranweisungen

DROP

DROP Basisadreßregister freigeben
Funktion Die DROP-Anweisung bewirkt, daß ein bisher zugewiesenes Basisadreßregister wieder zur allgemeinen Verwendung zur Verfügung steht.

Format

Name [.sym]
.sym reg

Operation DROP

Operanden [reg[,...]]

Folgesymbol Mehrzweckregister; positive absolute Ausdrücke, entweder
Namen, denen ein absoluter Wert von 0 bis 15 zugewiesen wurde oder dezimale selbstdefinierende Werte von 0 bis 15

Beschreibung
reg bezeichnet die Basisadreßregister, die in einer USING-Anweisung zugewiesen wurden und jetzt wieder freigegeben werden. D.h., daß sie nicht mehr als Basisregister zur Verfügung stehen.
DROP mit leerem Operandenfeld gibt alle Basisadreßregister frei.

Programmierhinweise
1. Ein Register, das mit einer DROP-Anweisung gesperrt wurde, kann später wieder mit einer neuen USING-Anweisung für die Adressierung verfügbar gemacht werden.
2. Es ist nicht notwendig, eine DROP-Anweisung zu verwenden, wenn die Basisadresse mit einer USING-Anweisung geändert werden soll.

>>>>> siehe auch USING-Anweisung

U5223-J-Z125-3

95

DSECT

Assembleranweisungen

DSECT Pseudoabschnitt definieren
Funktion Die DSECT-Anweisung kennzeichnet den Beginn oder die Fortsetzung eines Pseudoabschnitts.

Format

Name name
name

Operation DSECT

Operanden

Name

Beschreibung name kennzeichnet den Namen des Pseudoabschnitts. Eine weitere DSECT-Anweisung mit demselben Namen kennzeichnet die Fortsetzung des Pseudoabschnitts. Das Längenmerkmal von name, bzw. &par ist 1. Durch die DSECT-Anweisung, die den Beginn des Pseudoabschnitts kennzeichnet, wird ein neuer Adreßpegel aufgebaut und ihm der Anfangswert Null zugewiesen. Durch die Definition eines Pseudoabschnitts wird kein Speicherplatz reserviert.

96

U5223-J-Z125-3

Assembleranweisungen

DSECT

Programmierhinweise
1. Nach der DSECT-Anweisung werden die Felder beschrieben, die durch den Pseudoabschnitt auf einen Hauptspeicherbereich projiziert werden sollen.
2. Die Namen, die in einem Pseudoabschnitt definiert sind, können als Operanden in Assemblerbefehlen benutzt werden. Dazu ist folgendes notwendig (siehe Beispiel): Dem Assembler muß mit einer USING-Anweisung ein Basisadreßregister zur Verfügung gestellt werden, das ab der Anfangsadresse des Pseudoabschnitts wirksam sein soll. Es muß sichergestellt sein, daß das Basisadreßregister beim Programmablauf mit der aktuellen Adresse des Speicherbereichs geladen ist, auf den der Pseudoabschnitt projiziert werden soll.
3. Ein Name, der in einem Pseudoabschnitt definiert ist, darf in einer Adreßkonstanten vom Typ A nur verwendet werden, wenn er mit einem anderen mit entgegengesetztem Vorzeichen im selben Pseudoabschnitt gepaart ist.
4. Mit der DSECT-Anweisung kann ein Pseudoregister definiert werden. Der Name der DSECT-Anweisung muß dann als Operand einer Adreßkonstanten vom Typ Q auftreten.
Beispiele
Das folgende Beispiel zeigt zwei getrennt übersetzte Programme, PROG1 und PROG2. PROG1 soll einen Satz einlesen, PROG2 soll Teile aus diesem Satz verarbeiten. Die Übergabe der Daten von PROG1 nach PROG2 erfolgt über einen mit einer DSECT spezifizierten Speicherbereich. In diesem Beispiel bleibt das Basisadreßregister gleich und der Speicherinhalt ändert sich. Es wird also eine Eingabe gelesen und mit überlagerter DSECT-Struktur verarbeitet.

U5223-J-Z125-3

97

DSECT

Name PROG1 R0 R2 R3 R4 R14 R15
READNEXT
ERR IN SEN
PROG2
BEG NR NAME STREET

Operation
START EQU EQU EQU EQU EQU EQU . . BALR USING . . RDATA . . LA L BALR . . B TERM . DS DS DS . . END . . . START . . BALR USING USING . . DSECT DS DS DS . . END

Operanden
0 2 3 4 14 15
R3,0 *,R3
IN,ERR
R4,SEN R15,=V(PROG2) R14,R15
READNEXT
0CL84 CL4 CL80
R2,R0 *,R2 BEG,R4
CL2 CL2 CL18

(01)
(02) (03) (04)

Assembleranweisungen

98

U5223-J-Z125-3

Assembleranweisungen

DSECT

(01) Die Anfangsadresse von SEN wird ins Register 4 geladen. (02) Register 4 wird als Basisadreßregister für den Pseudoabschnitt zugewiesen und
die Anfangsadresse des Pseudoabschnitts angegeben. (03) Definition des Pseudoabschnitts. (04) "Schablone", die über den Bereich SEN gelegt wird.

Im zweiten Beispiel soll eine Tabelle gelesen werden. Voraussetzung ist, daß die Tabelle vorher gefüllt worden ist und jedes Tabellenelement eine feste Satzstruktur hat. Der Pseudoabschnitt entspricht einem Tabellenelement. die Tabelle wird gelesen durch Weiterschalten des Basisadreßregisters um die Elementlänge bis zum Tabellenende. In diesem Beispiel wird also das Basisadreßregister verändert, um andere Speicherbereiche zu adressieren.

Name R1 R2 R15
LOOP
TABELE NR NAME STREET LTABELE

Operation
CSECT EQU EQU EQU . . EXTRN EXTRN USING USING LA LA MVC . . LA CR BL . . DSECT DS DS DS EQU . .

Operanden
1 2 15
TABEND TAB *,R15 TABELE,R1 R1,TAB R2,TABEND OUT,STREET
R1,LTABELE(0,R1) R1,R2 LOOP
CL2 CL2 CL18 *-TABELE

>>>>> siehe auch CSECT- und XDSEC-Anweisung

U5223-J-Z125-3

99

EJECT

Assembleranweisungen

EJECT Seitenvorschub
Funktion Die EJECT-Anweisung bewirkt einen Seitenvorschub auf dem Übersetzungsprotokoll.

Format

Name [.sym]
.sym

Operation EJECT

Operanden

Folgesymbol

Beschreibung
Die der EJECT-Anweisung folgende Instruktion im Programm erscheint im Übersetzungsprotokoll auf einer neuen Seite. Steht eine solche Anweisung bereits am Beginn einer neuen Seite, wird die EJECT-Anweisung ignoriert.
Zwei EJECT-Anweisungen erzeugen eine Leerseite, etc.

>>>>> siehe auch SPACE-, TITLE- und PRINT-Anweisung 100

U5223-J-Z125-3

Assembleranweisungen

END

END Übersetzungsende
Funktion Die END-Anweisung kennzeichnet das Ende einer Übersetzungseinheit und kann die Adresse des ersten auszuführenden Befehls des Programms angeben.

Format

Name [.sym]
.sym ausdr

Operation END

Operanden [ausdr]

Folgesymbol positiver relativer Ausdruck

Beschreibung
Der Operand ausdr in der END-Anweisung gibt die Adresse des Befehls an, mit dem nach dem Laden des Programms die Ausführung beginnen soll.

Programmierhinweise
1. Die END-Anweisung muß immer die letzte Instruktion in einem Programm sein.
2. ausdr kann eine Adresse in einem getrennt übersetzten Programm bezeichnen. In diesem Fall muß ausdr in einer Adreßkonstante vom Typ V oder in einer EXTRNAnweisung gekennzeichnet sein (siehe zweites Beispiel).
3. Wird eine END-Anweisung durch einen Makro generiert, so wird der Rest des Quellprogramms übersprungen, d.h. dieser Rest wird nicht mehr übersetzt (auf diese Weise ist damit auch keine Mehrfachübersetzung möglich).

U5223-J-Z125-3

101

END

Assembleranweisungen

Beispiele

Name PROG R0 R3
BEGIN

Operation
CSECT EQU EQU . . BALR USING . . . END

Operanden
0 3
R3,R0 *,R3
BEGIN

Das folgende Beispiel zeigt eine END-Anweisung mit einer externen Adresse, die als V-Konstante gekennzeichnet ist.

Name PROG

Operation
CSECT . . DC . . END

Operanden
V(STARTMO) STARTMO

>>>>> siehe auch START-, CSECT-, DSECT- und XDSEC-Anweisung

102

U5223-J-Z125-3

Assembleranweisungen

ENTRY

ENTRY ENTRY-Adresse kennzeichnen
Funktion Die ENTRY-Anweisung kennzeichnet eine symbolische Adresse, die in einer Übersetzungseinheit definiert ist und von einer anderen aus angesprochen werden soll.

Format

Name [.sym]
.sym name

Operation ENTRY

Operanden name[,...]

Folgesymbol Name

Beschreibung
name kennzeichnet eine Adresse, die eine andere Übersetzungseinheit als Sprungziel oder als Datenadresse benutzen kann.
name ist durch die ENTRY-Anweisung noch nicht definiert. Das Längenmerkmal von name wird daher von der Instruktion festgelegt, die name definiert.

Programmierhinweise
1. Der Name eines Programmabschnitts muß nicht durch eine ENTRY-Anweisung gekennzeichnet sein, damit ein anderes Programm darauf Bezug nehmen kann.
2. Eine ENTRY-Anweisung darf keine Namen enthalten, die in einem Pseudoabschnitt definiert sind.

Beispiel

siehe EXTRN-Anweisung

>>>>> siehe auch EXTRN- und WXTRN-Anweisung

U5223-J-Z125-3

103

EXTRN

Assembleranweisungen

EXTRN EXTRN-Adresse kennzeichnen
Funktion Die EXTRN-Anweisung kennzeichnet eine symbolische Adresse, die in einer Übersetzungseinheit angesprochen wird und in einer anderen definiert ist.

Format

Name [.sym]
.sym name

Operation EXTRN

Operanden name[,...]

Folgesymbol Name

Beschreibung
name kennzeichnet eine Adresse, die in einer anderen Übersetzungseinheit als Einsprungstelle definiert ist.
Aufgrund der EXTRN-Anweisung wird für den Binder Information über den EXTRN-Verweis abgesetzt.
name ist durch die EXTRN-Anweisung für diese Übersetzungseinheit definiert. Der Assembler weist ein Längenmerkmal 1 und einen Wert 0 zu.

Programmierhinweise
1. Namen, die in einer EXTRN-Anweisung definiert sind, dürfen nicht als Namen von Instruktionen im gleichen Programm auftreten.
2. Wenn Namen, die als EXTRN definiert wurden, in arithmetischen Ausdrücken verwendet werden, dürfen sie nicht paarweise auftreten.

104

U5223-J-Z125-3

Assembleranweisungen

EXTRN

Beispiel zu EXTRN und ENTRY
Das folgende Beispiel zeigt die Verknüpfung von zwei unabhängigen Übersetzungseinheiten mit Hilfe der ENTRY- und EXTRN-Anweisung. In PROG1 ist die Adresse IN als extern gekennzeichnet. PROG2 enthält IN als Sprungziel.

Name PROG1 R0 R3 R4 R10 R15
PROG2 R0 R3 R4 R15
IN

Operation
START EQU EQU EQU EQU EQU . . EXTRN BALR USING . . L BALR . . END . . . START EQU EQU EQU EQU ENTRY . . EQU USING . . BR END

Operanden
0 3 4 10 15
IN R10,R0 *,R10
R15,=A(IN) R14,R15
PROG1
0 3 4 15 IN
* *,R15
R14 PROG2

>>>>> siehe auch ENTRY- und WXTRN-Anweisung

U5223-J-Z125-3

105

EQU 106

Assembleranweisungen

EQU Gleichsetzen
Funktion Die EQU-Anweisung weist einem Namen den Wert und die Eigenschaften des Ausdrucks zu, der im Operandeneintrag steht.

Format

Name
name
name ausdr len typ

Operation EQU

Operanden ausdr[,[len][,typ]]

Name absoluter oder relativer Ausdruck positiver absoluter Ausdruck, Wertebereich 0 bis 224-1 selbstdefinierender Wert, maximal 1 Byte lang

Beschreibung

name

Dem so bezeichneten Feld wird der Wert von ausdr zugewiesen. Der Wert des Namens ist relativ oder absolut, je nachdem, ob ausdr einen relativen oder absoluten Wert hat.

name erhält das gleiche Längenmerkmal wie ausdr.

Wenn ausdr ein arithmetischer Ausdruck ist, erhält name das Längenmerkmal und das Typenmerkmal des am weitesten links stehenden Namen im Operanden. Besteht der Ausdruck im Operandenfeld aus einem Stern (*) oder aus einem selbstdefinierenden Wert, ist das Längenmerkmal von name 1, und das Typenmerkmal U.

ausdr

In ausdr verwendete Namen müssen nicht vorher definiert sein.

len

Wenn man len angibt, wird name dieser Wert als Längenmerkmal zugewie-

sen.

Wenn das Längenmerkmal in der Makrosprache ausgewertet werden soll,

darf len nur ein selbstdefinierender Wert sein. Bei Angabe eines Ausdrucks

oder eines symbolischen Parameters für len wird während der Makroauflö-

sung der Standardwert 1 zugewiesen.

typ

Wenn typ kein selbstdefinierender Wert ist, hat der Name das Typenmerk-

mal U (undefiniert). Das Typenmerkmal kann nur in der Makroverarbeitung

ausgewertet werden.

Die Angabe kann als selbstdefinierender dezimaler, sedezimaler, binärer

oder als Zeichenwert erfolgen.

U5223-J-Z125-3

Assembleranweisungen

EQU

Programmierhinweise
1. Die EQU-Anweisung wird häufig als Hilfsmittel für die strukturierte Programmierung eingesetzt,z.B. durch Zuweisen von Namen für Registernummern, Trennen von Sprungadressen und Befehlen durch Zuweisen des Sprungziels zum aktuellen Adreßpegel und Zuweisen von Namen für häufig verwendete Ausdrücke.
Beispiele

Name
REG1 MARK TERM1 TERM2 TERM3

Operation
EQU EQU EQU EQU EQU

Operanden
1 * A-B*C/2 B'101011111' -10

(01) (02)
(03)

(01) Dem Namen REG1 wird der Wert 1 zugewiesen. REG1 kann dann als Registerbezeichnung verwendet werden.
(02) Dem Namen MARK wird der Wert des aktuellen Adreßpegels zugewiesen. (03) Den Namen TERM1, TERM2 und TERM3 wird der Wert des Ausdrucks im
Operanden zugewiesen.

2. Ausdrücke, deren Wert man bei der Programmerstellung noch nicht kennt, können ebenfalls Namen zugeordnet werden. Dem Namen wird dann der vom Assembler berechnete Wert des Ausdrucks im Operanden zugewiesen.

3. Bei der Makroauflösung durch den Assembler ist die EQU-Anweisung noch nicht wirksam.
Beispiel

Name REG1

Operation
EQU MAC

Operanden
1 REG1

Diese Folge von EQU-Anweisung und Makroaufruf bewirkt eine Generierung des Makro MAC mit der Zeichenfolge REG1 als Operand und nicht mit Register 1.

U5223-J-Z125-3

107

EQU

Assembleranweisungen

4. Die explizite Längenangabe in der EQU-Anweisung wird häufig verwendet, um beim Zugriff einen größeren Bereich ansprechen zu können.
Beispiele

Name
LOOP1 LOOP2 LOOP3

Operation
EQU EQU EQU

Operanden
* *,4 *,L'LOOP2

(01) (02) (03)

(01) LOOP1 hat den Wert des aktuellen Adreßpegels und das Längenmerkmal 1. (02), (03)
Bei LOOP2 und LOOP3 wird das Längenmerkmal auf 4 byte gesetzt.

5. Mit der expliziten Typangabe wird das ursprüngliche Typenmerkmal verändert. Beispiel

Name
TERM1 TERM2

Operation
EQU EQU

Operanden
*,,C'A' *,,X'C1'

Beiden Namen wird der Typ A (Adreßkonstante) zugewiesen

108

U5223-J-Z125-3

Assembleranweisungen

ICTL

ICTL Eingabeformat steuern
Funktion Mit der ICTL-Anweisung kann die Voreinstellung für die Anfangs-, End- und Fortsetzungsspalte von Quellenprogrammanweisungen geändert werden.

Format

Name
a e f

Operation ICTL

Operanden a[,e[,f]]

dezimaler selbstdefinierender Wert von 1 bis 40 dezimaler selbstdefinierender Wert von 41 bis 80 dezimaler selbstdefinierender Wert von 1 bis 40

Beschreibung

a

legt die Anfangsspalte der Quellprogrammanweisungen fest.

e

legt die Endspalte der Quellprogrammanweisung fest. Wird e nicht angege-

ben, dann gilt die Voreinstellung.

Ein Wert von 80 für e bedeutet, daß keine Fortsetzungszeilen auftreten.

f

legt die Fortsetzungsspalte für die Quellprogrammanweisungen fest. f muß

gleich oder größer als a sein.

Weglassen von f bedeutet, daß keine Fortsetzungszeilen auftreten.

Programmierhinweise
1. Die Voreinstellung der Anfangs-, End- und Fortsetzungsspalte sind die Spalten 1, 71 und 16 (siehe 2.2, Instruktionen).
2. Die ICTL-Anweisung darf in einer Übersetzungseinheit nur einmal vorkommen und muß die erste Anweisung im Programm sein.
3. Die ICTL-Anweisung hat keine Auswirkung auf eingelesene Makros.
4. Der Operationscode der ICTL-Anweisung darf nicht mit Hilfe von variablen Parametern generiert werden.
5. Statt über die ICTL-Anweisung kann das Eingabeformat auch über eine SDF-Option gesteuert werden (siehe ASSEMBH, Benutzerhandbuch [1]).

U5223-J-Z125-3

109

LTORG

Assembleranweisungen

LTORG Literalbereich definieren
Funktion Die LTORG-Anweisung definiert einen Literalbereich und legt seine Lage fest.

Format

Name

name

[

]

.sym

name .sym

Operation LTORG

Operanden

Name Folgesymbol

Beschreibung
Die LTORG-Anweisung bewirkt, daß ab der nächsten Doppelwortgrenze ein Literalbereich angelegt wird.
In diesem Literalbereich werden alle fehlerfreien Literale abgelegt, die seit der vorherigen LTORG-Anweisung oder seit Programmanfang aufgetreten sind.
Die Literale werden innerhalb des Literalbereichs entsprechend ihrem Typ und ihrer Länge ausgerichtet. Sie werden in der Reihenfolge Doppelwort, Wort, Halbwort, Byte abgelegt.
Alle Literale, die nach der letzten LTORG-Anweisung folgen, werden am Ende des ersten Programmabschnitts abgelegt.
Der Wert von name bzw. .sym ist die Adresse des ersten Bytes des Literalbereichs. name erhält ein Längenmerkmal von 1.

110

U5223-J-Z125-3

Assembleranweisungen

LTORG

Programmierhinweise
1. Enthält ein Programm keine LTORG-Anweisung, dann werden alle Literale in einen Literalbereich am Ende des ersten Programmabschnitts abgelegt. In diesem Fall muß der erste Programmabschnitt immer adressierbar sein.
Der Literalbereich wird dann im Übersetzungsprotokoll nach der END-Anweisung aufgeführt.
2. Eine LTORG-Anweisung am Ende jedes Programmabschnitts sorgt dafür, daß alle Literale des jeweiligen Abschnitts immer adressierbar sind.
3. Literale, die im Bereich einer LTORG-Anweisung mehrfach vorkommen, werden nur einmal abgelegt. Eine Ausnahme sind hier Literale, die einen Verweis auf den Adreßpegel enthalten. Diese Literale werden mit dem jeweils aktuellen Wert des Adreßpegels einzeln abgelegt.

U5223-J-Z125-3

111

OPSYN

Assembleranweisungen

OPSYN Mnemotechnischen Operationscode zuweisen
Funktion Die OPSYN-Anweisung weist einem Namen die Eigenschaften des mnemotechnischen Operationscodes oder des Makronamens im Operanden zu oder sorgt dafür, daß er diese Eigenschaften verliert.
Format

Name name
name
code

Operation OPSYN

Operanden [code]

Name oder mnemotechnischer Operationscode einer Assembleranweisung, eines Assemblerbefehls oder einer Makroanweisung oder Makroname
mnemotechnischer Operationscode einer Assembleranweisung, eines Assemblerbefehls oder einer Makroanweisung, Makroname oder Name

Beschreibung
Dem Namenseintrag werden die Eigenschaften des Eintrags im Operandenfeld zugewiesen. Die Eigenschaften des Operandeneintrags bleiben unverändert.
Ein leeres Operandenfeld bewirkt, daß name die Eigenschaften eines mnemotechnischen Operationscodes verliert (siehe Beispiel (02)/(03)).
Der gleiche Eintrag im Namensfeld und im Operandenfeld bewirkt, daß name wieder seine ursprünglichen Eigenschaften annimmt. Ein gleicher Eintrag im Namens- und im Operandenfeld ist nur für mnemotechnische Operationscodes von Assembleranweisungen und Assemblerbefehlen erlaubt.

112

U5223-J-Z125-3

Assembleranweisungen

OPSYN

Programmierhinweise
1. Die OPSYN-Anweisung kann an jeder Stelle im Quellprogrammtext, auch innerhalb von Makros, stehen.
2. Es gilt immer die zuletzt durchlaufene OPSYN-Anweisung bis zur nächsten OPSYNAnweisung. Eine OPSYN-Anweisung, die in einem Makro generiert wurde, gilt nicht nur für den Makro selbst, sondern auch für alle folgenden Instruktionen. Wird der Makro oder die OPSYN-Anweisung übersprungen und nicht durchlaufen, dann tritt die OPSYN-Anweisung auch nicht in Kraft.
3. Wenn name der mnemotechnische Operationscode eines Assemblerbefehls oder einer Assembleranweisung ist, dann wird dieser Operationscode umdefiniert. Ist das Operandenfeld leer, dann wird dieser Operationscode im folgenden nicht mehr als Assemblerbefehl oder -anweisung erkannt und wie ein Makroaufruf behandelt.
4. Bei der Bearbeitung von Operationscodes, die in einer Makrodefinition liegen, ist folgendes zu beachten: Bei Bibliotheksmakros werden alle Makroanweisungen, sowie die COPY- und die REPRO-Anweisung entsprechend der OPSYN-Anweisung bearbeitet, die beim ersten Aufruf des Makro gültig war. Bei einer Makrodefinition im Quellprogramm werden alle Makroanweisungen, sowie die COPY- und die REPRO-Anweisung entsprechend der OPSYN-Anweisung bearbeitet, die beim Lesen der Makrodefinition gültig war. Alle übrigen Instruktionen werden bei Bibliotheksmakros und bei Makros im Quellprogramm entsprechend der OPSYN-Anweisung bearbeitet, die direkt vor der jeweiligen Instruktion durchlaufen wird.

U5223-J-Z125-3

113

OPSYN

Assembleranweisungen

Beispiel

Name EOP
STORE STH ABC
STORE STH

Operation
OPSYN . . EOP . . OPSYN OPSYN OPSYN . . OPSYN OPSYN

Operanden TERM
STH STORE STH

(01)
(02) (03) (04)
(05) (06)

(01) Der Zeichenfolge EOP werden die Eigenschaften des TERM-Makro zugewiesen. EOP im Operationsfeld bedeutet im folgenden den Aufruf des Makro TERM.
(02) Redefiniert den Assemblerbefehl STH, STORE wird im folgenden als STH interpretiert.
(03) STH wird ab sofort nicht mehr als Assemblerbefehl erkannt. (04) ABC wird zusätzlich und mit gleicher Wirkung wie STORE eingeführt. (05) STORE verliert ab sofort seine Eigenschaften als Assemblerbefehl, ABC definiert
aber weiterhin den Assemblerbefehl STH. (06) Läßt den Assemblerbefehl STH wieder in seiner ursprünglichen Bedeutung zu.

114

U5223-J-Z125-3

Assembleranweisungen

ORG

ORG Adreßpegel setzen
Funktion Mit der ORG-Anweisung kann der augenblickliche Wert des Adreßpegels verändert werden.

Format

Name

name

[

]

.sym

name .sym ausdr

Operation ORG

Operanden [ausdr]

Name Folgesymbol relativer Ausdruck

Beschreibung
ausdr bezeichnet den Wert, auf den der Adreßpegel gesetzt werden soll. Die ORGAnweisung ohne Operand setzt den Adreßpegel hinter die höchste bisher angesprochene Speicherstelle des Programmabschnitts.
Die Namen, die in ausdr verwendet werden, müssen vorher definiert sein.
Der Wert von ausdr muß eine relative Adresse im aktuellen Programmabschnitt sein, d.h., ausdr darf keine Namen enthalten, die in einem anderen Programmabschnitt definiert sind.
Der Endwert der Berechnung von ausdr darf maximal 224-1 sein.

Programmierhinweise
1. ausdr darf keinen Wert annehmen, der vor dem Beginn des Programmabschnitts liegt, in dem die ORG-Anweisung steht.
2. Wenn vorhergehende ORG-Anweisungen den Adreßpegel zurückgesetzt haben, kann eine ORG-Anweisung ohne Operand verwendet werden, um den Adreßpegel wieder hinter die höchste bisher angesprochene Speicherstelle zu setzen.
3. Beim Zurücksetzen des Adreßpegels dürfen keine EXTRN-Verweise, keine CXDAnweisungen und keine A-, Q-,V-und Y-Konstanten überschrieben werden (also keine Instruktionen, die dazu führen, daß RLD-Informationen abgelegt werden).

U5223-J-Z125-3

115

ORG

Assembleranweisungen

Beispiel
Das folgende Beispiel zeigt die Anwendung der ORG-Anweisung bei der Definition eines Speicherbereichs. Die ORG-Anweisung am Ende der Anweisungsfolge erhöht den Adreßpegel auf das Ende des Bereichs RDAREA.

Name RDAREA
NAME PERSN

Operation
DS ORG DS DS DS DS . . ORG

Operanden
CL30 RDAREA CL4 CL10 CL4 CL10

116

U5223-J-Z125-3

Assembleranweisungen

PRINT

PRINT Protokollinhalt steuern
Funktion Die PRINT-Anweisung bestimmt, welche Teile des Übersetzungsprotokolls ausgedruckt werden sollen.

Format

Name [.sym]

Operation PRINT

Operanden
BASE NOBASE
CODE NOCODE
COPY NOCOPY
DATA NODATA
GEN NOGEN
ON OFF
SINGLE DOUBLE

.sym

Folgesymbol

Operanden 1 bis 7 Operanden in beliebiger Reihenfolge; wenn mehr als ein Operand

angegeben wird, müssen sie durch Komma getrennt werden.

Beschreibung

BASE

Nach jeder USING- oder DROP-Anweisung wird der adressierbare Bereich für die Register ausgedruckt, die mit USING als Basisregister eingeführt wurden. Zusätzlich wird der Bemerkungseintrag aus der USING-Anweisung 19 Zeichen lang ausgegeben.

NOBASE Die adressierbaren Bereiche für die Basisregister werden nicht ausgedruckt.

U5223-J-Z125-3

117

PRINT

Assembleranweisungen

CODE NOCODE

Bei Instruktionen, die durch Makros generiert wurden, wird die Wirkung von PRINT NOGEN eingeschränkt: Der Text der Quellzeile wird unterdrückt, der generierte Code wird jedoch ausgedruckt.
Die volle Wirkung von PRINT NOGEN bleibt erhalten.

COPY NOCOPY

Kopierte Anweisungen werden protokolliert Kopierte Anweisungen werden nicht protokolliert.

DATA NODATA

Konstanten werden im Übersetzungsprotokoll vollständig ausgedruckt.
Nur die ersten 8 Bytes von Konstanten werden im Übersetzungsprotokoll ausgedruckt.

GEN NOGEN

Alle Instruktionen, die durch Makroaufrufe generiert werden, werden protokolliert.
Durch Makroaufrufe generierte Instruktionen werden nicht protokolliert. Meldungen, die von MNOTE-Anweisungen erzeugt werden, werden jedoch ausgedruckt.

ON OFF

Das Protokoll wird ab hier ausgedruckt. PRINT ON ist die letzte Instruktion, die nicht protokolliert wird.
Das Protokoll wird ab hier nicht ausgedruckt. PRINT OFF ist die letzte Instruktion, die protokolliert wird.

SINGLE DOUBLE

Einfacher Zeilenabstand im Übersetzungsprotokoll Doppelter Zeilenabstand im Übersetzungsprotokoll

Programmierhinweis
Ein Programm kann beliebig viele PRINT-Anweisungen enthalten. Die Bedingungen, die von einer PRINT-Anweisung gesetzt wurden, gelten solange, bis sie durch eine weitere PRINT-Anweisung geändert werden. Bis zur ersten PRINT-Anweisung gelten die Standardwerte.

>>>>> siehe auch SPACE-, EJECT-, TITLE-, STACK- und UNSTCK-Anweisung

118

U5223-J-Z125-3

Assembleranweisungen

PUNCH

PUNCH Text in Objektmodul kopieren
Funktion Die PUNCH-Anweisung gibt die Zeichen, die im Operanden angegeben sind, unverarbeitet in den Objektmodul aus.

Format

Name [.sym]
.sym text

Operation PUNCH

Operanden 'text'

Folgesymbol 1 bis 80 Zeichen

Beschreibung
Der Assembler legt die Daten, die in text dargestellt sind, unverarbeitet im Objektmodul ab.
Das erste Zeichen von text steht in der ersten Spalte des Ausgabeformates.
In den Objektmodul wird weder eine laufende Nummer noch eine Identifikation ausgegeben.

Programmierhinweise
1. Für jedes Hochkomma und jedes &-Zeichen, das im Objektmodul stehen soll, müssen zwei entsprechende Zeichen in text angegeben werden. Die beiden Zeichen werden jeweils nur als eines gezählt.
2. PUNCH-Anweisungen können an beliebiger Stelle im Programm oder in der Makrodefinition stehen.
3. Durch die PUNCH-Anweisung kann der Objektmodul unbrauchbar werden.
4. Die Leistung der PUNCH-Anweisung wird bei der Modulausgabe im LLM-Format nicht mehr unterstützt. Dies wird durch eine Fehlermeldung mit dem Gewicht 'Warnung' angezeigt.

>>>>> siehe auch REPRO-Anweisung

U5223-J-Z125-3

119

REPRO

Assembleranweisungen

REPRO Folgezeile in Objektmodul kopieren
Funktion Die REPRO-Anweisung gibt die nachfolgende Quellprogrammzeile unverarbeitet in den Objektmodul aus.

Format

Name [.sym]
.sym

Operation REPRO

Operanden

Folgesymbol

Beschreibung
Der Assembler legt die Quellprogrammzeile, die auf die REPRO-Anweisung folgt, unverändert im Objektmodul ab.
Das erste Zeichen in dieser Zeile steht in der ersten Spalte des Ausgabeformats.
In den Objektmodul wird weder eine laufende Nummer noch eine Identifikation ausgegeben.
Jede REPRO-Anweisung erzeugt eine Zeile im Objektmodul.

Programmierhinweise
1. Der Operationscode der REPRO-Anweisung darf nicht mit Hilfe von variablen Parametern generiert werden.
2. Durch die REPRO-Anweisung kann der Objektmodul unbrauchbar werden.
3. Die Leistung der REPRO-Anweisung wird bei der Modulausgabe im LLM-Format nicht mehr unterstützt. Dies wird durch eine Fehlermeldung mit dem Gewicht 'Warnung' angezeigt.

>>>>> siehe auch PUNCH-Anweisung 120

U5223-J-Z125-3

Assembleranweisungen

RMODE

RMODE Ladeattribut zuordnen
Funktion Die RMODE-Anweisung ordnet einem Programmabschnitt ein Ladeattribut zu.

Format

Name

name

[

]

.sym

name .sym

Operation RMODE

Operanden 24 ANY

Name Folgesymbol

Beschreibung

name

bezieht sich auf einen gleichnamigen Programmabschnitt und muß mit dem Namen einer START-, CSECT- oder COM-Anweisung übereinstimmen.

Bei leerem Namensfeld bezieht sich die RMODE-Anweisung auf einen unbenannten Programmabschnitt.

.sym

Ein Folgesymbol ist gleichbedeutend mit einem leeren Namensfeld.

24

Dem Programmabschnitt wird das Ladeattribut 24 zugeordnet. D.h., daß

dieser Abschnitt nur unterhalb von 16 MB geladen werden darf.

ANY

Das Ladeattribut des Programmabschnitts kann 24 oder 31 sein. D.h., daß dieser Abschnitt sowohl unterhalb als auch oberhalb von 16 MB geladen werden darf.

Zu 'Ladeattribut' siehe Abschnitt 3.3.3, sowie das Handbuch Einführung in die XS-Programmierung [7].

Falls ein Lademodul mehrere Abschnitte mit verschiedenen Ladeattributen enthält, trifft das Binder-Lader-System die Auswahl eines gemeinsamen Ladeattributs für den gesamten Lademodul (siehe Binder und Lader, Beschreibung [8]).

Die Information über das Ladeattribut eines Programmabschnitts wird in den ESD-Satz des Objektmoduls übergeben.

U5223-J-Z125-3

121

RMODE

Assembleranweisungen

Programmierhinweise 1. Die RMODE-Anweisung kann an beliebiger Stelle im Quellprogramm stehen. Das
Quellprogramm darf beliebig viele RMODE-Anweisungen enthalten, wobei aber ein spezifizierter Name nur einmal auftreten darf. 2. Für einen unbenannten gemeinsamen Hilfsabschnitt (siehe COM-Anweisung) darf keine RMODE-Anweisung gesetzt werden. 3. Falls keine Spezialfunktionen erbracht werden sollen, sollten einem Programmabschnitt die Attribute AMODE = ANY und RMODE = ANY zugewiesen werden.
Kombinationen von AMODE und RMODE Wenn für einen Programmabschnitt die AMODE-Anweisung gesetzt wurde, sind die folgenden Kombinationen mit der RMODE-Anweisung für den gleichen Programmabschnitt möglich: AMODE 24 mit RMODE 24 AMODE 31 mit RMODE 24 oder RMODE ANY AMODE ANY mit RMODE 24 oder RMODE ANY
Voreinstellung Folgende Voreinstellungen gelten, wenn für einen Programmabschnitt entweder AMODE oder RMODE oder beide nicht gesetzt wurden:

angegeben
weder AMODE noch RMODE AMODE 24 AMODE 31 AMODE ANY RMODE 24 RMODE ANY

Voreinstellung
AMODE 24 und RMODE 24 RMODE 24 RMODE 24 RMODE 24 AMODE 24 AMODE 31

Tabelle 4-13

Voreinstellung für AMODE, bzw. RMODE

>>>>> siehe auch AMODE-Anweisung 122

U5223-J-Z125-3

Assembleranweisungen

SPACE

SPACE Zeilenvorschub
Funktion Mit der SPACE-Anweisung können Leerzeilen in das Übersetzungsprotokoll eingefügt werden.

Format

Name [.sym]
.sym nr

Operation SPACE

Operanden [nr]

Folgesymbol dezimaler selbstdefinierender Wert

Beschreibung
nr gibt die Anzahl der Leerzeilen an, die nach der SPACE-Anweisung im Übersetzungsprotokoll erscheinen sollen. Ein leerer Operandeneintrag bewirkt einen Vorschub um eine Zeile.
Ist nr größer als die Zahl der auf dieser Seite noch verbleibenden Zeilen, dann bewirkt die SPACE-Anweisung einen Seitenvorschub.

>>>>> siehe auch EJECT-, PRINT- und TITLE-Anweisung

U5223-J-Z125-3

123

STACK

Assembleranweisungen

STACK USING- oder PRINT-Status sichern
Funktion Mit der STACK-Anweisung kann der aktuelle USING-Status (d.h., die Basisregister und der zugehörige Adreßbereich) und/oder der aktuelle Stand der PRINT-Parameter gesichert werden.
Format

Name [.sym]
.sym

Operation STACK

Operanden
PRINT[,...][,USING[,...]] USING[,...][,PRINT[,...]]

Folgesymbol

Programmierhinweise
1. Die STACK-Anweisung verändert weder den aktuellen USING-Status, noch die aktuellen PRINT-Parameter.
2. Die PRINT-Parameter, bzw. der USING-Status wird in einem "last-in-firstout-Verfahren" gespeichert. D.h., die letzte gespeicherte Information wird von der ersten entsprechenden UNSTK-Anweisung als erste wieder abgerufen.
3. In STACK-Anweisungen darf der Operand PRINT, bzw. USING maximal viermal nacheinander auftreten, bevor die erste UNSTK-Anweisung mit dem Operanden PRINT, bzw. USING folgen muß.

124

U5223-J-Z125-3

Assembleranweisungen

STACK

Beispiel
Das folgende Beispiel zeigt eine mögliche Anwendung der STACK USING-Anweisung. Die STACK-Anweisung am Beginn des Unterprogramms macht es möglich, innerhalb des Unterprogramms das Register 3 anders zu verwenden, ohne daß zuvor eine DROPAnweisung nötig war. UNSTK am Ende des Unterprogramms setzt den USING-Status zurück auf die alten Werte, d.h., Register 3 ist wieder als Basisregister bekannt, Register 5 entsprechend dem vorherigen Status unbekannt.

Name PROG1 R0 R3 R4 R5
PROG2
NUM VAL NUM2 SAFE

Operation
START EQU EQU EQU EQU . . BALR USING . . BAL . . TERM . . EQU ST STACK BALR USING L AR ST L UNSTK BR . . DC DC DS DS . .

Operanden
0 3 4 5
R3,0 *,R3
R4,PROG2
* R3,SAFE USING R5,0 *,R5 R3,NUM R3,VAL R3,NUM2 R3,SAFE USING R4
F'1234' F'55' F F

>>>>> siehe auch UNSTK-Anweisung

U5223-J-Z125-3

125

START

Assembleranweisungen

START Programmanfang definieren
Funktion Die START-Anweisung kennzeichnet den Beginn einer Übersetzungseinheit, ordnet dem Programm bzw. dem ersten Programmabschnitt eines Programms, einen Namen zu und setzt den Adreßpegel auf einen Anfangswert.
Format

Name

name

[

]

.sym

name .sym dec

typ

Operation START

Operanden [dec[,typ][,...]]

Name Folgesymbol selbstdefinierender Wert, der durch 8 teilbar sein sollte; Maximalwert: FFFFF8 Merkmalkennzeichnung für Programmabschnitte (siehe 3.3.3, Merkmale von Programmabschnitten)

Beschreibung

name

kennzeichnet den Namen des Programms, bzw. den Namen des ersten Programmabschnitts.

Eine CSECT-Anweisung mit demselben Namen kennzeichnet die Fortsetzung des ersten Programmabschnitts.

Eine START-Anweisung ohne Namen kennzeichnet einen unbenannten Programmabschnitt.

Das Längenmerkmal des Namens ist 1.

dec

dec bezeichnet den Anfangswert für den Adreßpegel des Programms.

Ist dec nicht durch 8 teilbar, dann wird der Adreßpegel auf die nächste Doppelwortgrenze gesetzt.

Ist dec nicht angegeben, setzt der Assembler den Anfangswert des Adreßpegels auf Null.

typ

Bezeichnet Merkmale, die für das Programm, bzw. den ersten Programm-

abschnitt gelten sollen (siehe 3.3.3).

126

U5223-J-Z125-3

Assembleranweisungen

START

Programmierhinweise
1. Der START-Anweisung darf keine Instruktion vorausgehen, die den Adreßpegel benutzt oder verändert.
2. Die START-Anweisung kann durch die CSECT-Anweisung zur Bezeichnung des ersten Programmabschnitts ersetzt werden.
3. Alle Instruktionen, die zwischen der START-Anweisung und der nächsten CSECT-, bzw. DSECT-Anweisung stehen, gehören zum ersten Programmabschnitt. Der erste Programmabschnitt kann an anderer Stelle im Programm durch eine CSECT-Anweisung mit demselben Namen fortgesetzt werden.
4. Wenn eine oder mehrere Merkmalkennzeichnungen angegeben werden, darf der Operand dec nicht weggelassen werden.
5. Soll ein Assembler-Quellprogramm mit AID getestet werden, muß die START-Anweisung einen Namen haben. Für Assembler-Programme mit einem unbenannten ersten Programmabschnitt wird keine LSD-Information abgelegt (siehe AID, Testen von ASSEMBH-Programmen [2]).

>>>>> siehe auch END- und CSECT-Anweisung

U5223-J-Z125-3

127

TITLE

Assembleranweisungen

TITLE Protokollüberschrift
Funktion Die TITLE-Anweisung erzeugt die Seitenüberschriften des Übersetzungsprotokolls.

Format

Name

name

[

]

.sym

name .sym text

Operation TITLE

Operanden 'text'

Name, maximal vier alphanumerische Zeichen Folgesymbol 1 bis 97 Zeichen

Beschreibung
text bildet die Seitenüberschrift des Übersetzungsprotokolls. Jede neue TITLE-Anweisung in einem Programm bewirkt einen Seitenvorschub und die Ausgabe der neuen Überschrift am Kopf der folgenden Seiten.

Programmierhinweise
1. Wenn eine Seitenüberschrift ein &-Zeichen oder ein Hochkomma enthalten soll, müssen sie im text-Feld durch zwei &-Zeichen bzw. zwei Hochkommas dargestellt werden. Die zwei Zeichen werden jeweils als ein Zeichen gezählt und ausgedruckt.
2. Nur jeweils die erste TITLE-Anweisung in einer Übersetzungseinheit darf einen Namen haben.
3. Der Namenseintrag wird bei Ausgabe in die EAM-Datei (nicht bei Ausgabe in eine Bibliothek) als Identifikation in jeden Satz des Objektmoduls ausgegeben.

>>>>> siehe auch PRINT-, EJECT- und SPACE-Anweisung 128

U5223-J-Z125-3

Assembleranweisungen

UNSTK

UNSTK USING- oder PRINT-Status restaurieren
Funktion Die UNSTK-Anweisung setzt den USING-Status, bzw. die PRINT-Parameter, die zuvor mit STACK gesichert wurden, wieder als aktuell ein.

Format

Name [.sym]
.sym

Operation UNSTK

Operanden
PRINT[,...][,USING[,...]] USING[,...][,PRINT[,...]]

Folgesymbol

U5223-J-Z125-3

129

UNSTK

Assembleranweisungen

Programmierhinweis
Die UNSTK PRINT- bzw. UNSTK USING-Anweisung ruft jeweils diejenigen Werte ab, die mit der letzten vorhergehenden STACK PRINT- bzw. STACK USING-Anweisung gesichert wurden. Die nächste UNSTK-Anweisung ruft die Werte ab, die von der entsprechenden STACK-Anweisung zuvor gesichert wurden, usw.

Beispiel
Name .A .B .P .C
(01) - (04)

Operation Operanden

. . STACK . STACK . STACK . STACK . . UNSTK . UNSTK . UNSTK . UNSTK

USING USING PRINT USING
USING USING PRINT USING

(01) (02) (03) (04)
(04) (02) (03) (01)

Die UNSTK-Anweisungen setzen jeweils den USING- bzw. PRINT-Status der STACK-Anweisung mit der gleichen Nummer als aktuell wieder ein.

>>>>> siehe auch STACK-Anweisung 130

U5223-J-Z125-3

Assembleranweisungen

USING

USING Basisadreßregister zuweisen
Funktion Die USING-Anweisung gibt eine Basisadresse an und weist dem Assembler ein oder mehrere Mehrzweckregister als Basisadreßregister zu.

Format 1

Name
[.sym]
.sym adr reg

Operation USING

Operanden adr,reg[[,reg][,...]]

Folgesymbol positiver absoluter oder relativer Ausdruck Mehrzweckregister; positive absolute Ausdrücke, entweder
Namen, denen ein absoluter Wert von 0 bis 15 zugewiesen wurde oder dezimale selbstdefinierende Werte von 0 bis 15

Beschreibung

adr

gibt den Adreßwert an, den der Assembler für die Bildung von Distanz-

adressen benötigt.

reg

gibt die Mehrzweckregister an, die als Basisadreßregister verwendet wer-

den sollen.

U5223-J-Z125-3

131

USING

Assembleranweisungen

Programmierhinweise

1. Die USING-Anweisung muß vor der ersten Verwendung von symbolischen Namen im Operanden einer Instruktion codiert werden. Sie wird vom Assembler zur Ablage der Adressen in Basis/Distanz-Form benötigt.

2. Die USING-Anweisung lädt keine Register. Damit zur Programmlaufzeit die Adreßzugriffe richtig ablaufen können, müssen die Basisregister mit den Basisadreßwerten geladen werden. Das erste wird mit dem BALR- bzw. BASR-Befehl geladen, die weiteren mit dem L- bzw. LM-Befehl (siehe Beispiel (02) und Assemblerbefehle, Beschreibung [3]). Der LA-Befehl ist hierfür ungeeignet.

3. Bei fehlender USING-Anweisung wird Register 0 als Basisregister verwendet.

4. Die Register 0 und 1 sollten nicht als Basisadreßregister benutzt werden, da sie von verschiedenen Assemblerbefehlen und Systemmakros verändert werden können.

5. Wenn für adr ein Stern (*) eingesetzt wird, muß die USING-Anweisung direkt nach dem BALR-Befehl folgen, damit BALR und USING dieselbe Adresse bezeichnen. Wenn für adr ein Name steht, muß dieser Name die Adresse des Befehls enthalten, bei dem die Distanzrechnung beginnen soll (siehe Beispiele (01) und (02)).

6. Wenn ein Basisadreßregister für die Adreßrechnung nicht ausreicht, müssen in der USING-Anweisung weitere Register als Basisadreßregister zugewiesen werden. Diese sollten mit den folgenden Basisadreßwerten geladen werden (siehe Beispiel (02)):

reg1 reg2 reg3
. .

adr adr+4096 adr+8192
. .

7. Soll der Wert in einem augenblicklich benutzten Basisadreßregister geändert werden und die Distanzrechnung mit diesem neuen Wert fortgesetzt werden, so muß dieser neue Wert mit einer weiteren USING-Anweisung zugewiesen werden (siehe Beispiel (03)).

8. Wurden für einen Bereich mehrere Register als Basisadreßregister zugewiesen, dann verwendet der Assembler das Register, das die kleinste Distanzadresse liefert. Enthalten mehrere Register denselben Wert, dann wir das Register mit der höchsten Nummer verwendet.

9. Ist in einer vorangegangenen PRINT-Anweisung der Operand BASE gesetzt, wird nach jeder USING-Anweisung im Übersetzungsprotokoll der adressierbare Bereich ausgedruckt. Zusätzlich wird 19 Zeichen lang der Bemerkungseintrag der USINGAnweisung ausgegeben.

132

U5223-J-Z125-3

Assembleranweisungen

USING

Beispiele

Name PROG R0 R1 R3 R4 R5
BEG1
BEG2
ACON

Operation
START EQU EQU EQU EQU EQU . . USING BALR EQU . . BALR USING EQU LM . . DC . . USING . DROP .

Operanden
0 1 3 4 5
BEG1,R3 R3,0 *
R3,0 *,R3,R4,R5 * R4,R5,ACON
A(BEG2+4096,BEG2+2*4096)
BEG2+1000,R3

gelten für alle folgenden Beispiele
(01)
(02)
(03)

(01) Die USING-Anweisung enthält den Adreßpegel des Befehls, mit dem die Distanzrechnung beginnen soll.
(02) R3 soll den aktuellen Adreßpegel erhalten, daher ist die USING-Anweisung direkt nach dem BALR-Befehl codiert. Die Register R4 und R5 werden durch den LM-Befehl mit den in ACON definierten Basisadreßwerten geladen.
(03) Ab dieser USING-Anweisung wird die Distanzrechnung mit dem Wert BEG2+1000 fortgesetzt.

U5223-J-Z125-3

133

USING

Assembleranweisungen

Das folgende Beispiel berücksichtigt die Standard-Verknüpfungskonventionen und den Anschluß anderer Programmiersprachen (siehe ASSEMBH, Benutzerhandbuch [1]).

Name

Operation Operanden

UPRO2

. . BALR USING . . LA BALR . DROP . CSECT USING . . BR DROP .

R10,0 *,R10
R15,=A(UPRO2) R14,R15 R10
UPRO2,R15
R14 R15

(01)

(01) Ein Laden des Registers R15 ist hier nicht nötig, da die Adresse vom Aufruf des Unterprogramms UPRO2 her vorhanden ist. Allerdings würde ein "BALR R15,0" vor allen Eventualitäten sichern.

>>>>> siehe auch DROP-Anweisung 134

U5223-J-Z125-3

Assembleranweisungen

USING

Format 2

Name
reg

Operation USING

Operanden *PRV,reg

Mehrzweckregister; positiver absoluter Ausdruck, entweder ein Name, dem ein absoluter Wert von 0 bis 15 zugewiesen wurde oder ein dezimaler selbstdefinierender Wert von 0 bis 15.

Beschreibung
Format 2 der USING-Anweisung bewirkt, daß für alle Befehle, die Pseudoregister betreffen, das in reg angegebene Register als Basisadreßregister verwendet wird.

Programmierhinweis
Das in reg angegebene Register muß zusätzlich mit der Anfangsadresse des Speicherbereichs für den Pseudoregistervektor geladen werden.

Beispiel zu Format 2

siehe Anhang 11.4

>>>>> siehe auch CXD- und DXD-Anweisung

U5223-J-Z125-3

135

WXTRN

Assembleranweisungen

WXTRN Bedingte EXTRN-Adresse kennzeichnen
Funktion Die WXTRN-Anweisung kennzeichnet eine symbolische Adresse, die in einer Übersetzungseinheit verwendet wird, jedoch in einer anderen definiert ist. Die WXTRN-Anweisung entspricht der EXTRN-Anweisung, wird jedoch vom Binder anders verarbeitet.
Format

Name [.sym]
.sym name

Operation WXTRN

Operanden name[,...]

Folgesymbol Name

Beschreibung
Die WXTRN-Anweisung unterdrückt die Autolink-Funktion des Binders. Der Binder kann diese Externadresse nur befriedigen, wenn er den passenden Modul aufgrund eines anderen Steuermechanismus finden kann. .
Weitere Regeln siehe EXTRN-Anweisung.

>>>>> siehe auch EXTRN- und ENTRY-Anweisung 136

U5223-J-Z125-3

Assembleranweisungen

XDSEC

XDSEC Externen Pseudoabschnitt definieren
Funktion Die XDSEC-Anweisung definiert einen externen Pseudoabschnitt oder eine Referenz auf einen externen Pseudoabschnitt.

Format

Name name

Operation XDSEC

Operanden

D[EFINITION]

[

]

R[EFERENCE]

Beschreibung

name

kennzeichnet den Namen eines externen Pseudoabschnitts.

Das Längenmerkmal des Namens ist 1.

DEFINITION oder D muß bei der Definition eines externen Pseudoabschnitts angegeben werden.

Mit der XDSEC D-Anweisung wird Speicherplatz für den externen Pseudoabschnitt reserviert.

Für die Definition eines externen Pseudoabschnitts wird ein neuer Adreßpegel aufgebaut und der Anfangswert Null zugewiesen.

Die XDSEC D-Anweisung übergibt Externinformationen an den Binder, damit dieser die Zugriffe auf den externen Pseudoabschnitt aus anderen Programmen befriedigen kann.

REFERENCE oder R kennzeichnet die Referenz eines externen Pseudoabschnitts, damit Zugriffe auf diesen Pseudoabschnitt möglich sind.

Durch die Anweisung XDSEC R wird der Adreßpegel auf Null gesetzt und bleibt für den gesamten Abschnitt auf Null.

Der tatsächliche Adreßwert eines Zugriffs auf einen externen Pseudoabschnitt wird vom Binder in den entsprechenden Befehl eingetragen.

U5223-J-Z125-3

137

XDSEC

Assembleranweisungen

Programmierhinweise
1. In externen Pseudoabschnitten dürfen keine EQU-Anweisungen eingesetzt werden.
2. Arithmetische Ausdrücke im Operanden einer EQU-Anweisung dürfen keine Differenz von XDSEC-Elementen sein.
3. Für eine XDSEC-Anweisung ohne Operandenangabe, bzw. mit fehlerhafter Operandenangabe, wird Typ R angenommen. Ist bereits ein gleichnamiger externer Pseudoabschnitt definiert, wird dessen Typ übernommen.
4. In einer Übersetzungseinheit kann eine XDSEC-Anweisung jeweils nur als Typ R oder als Typ D vorliegen, nie für beide Typen gleichzeitig.

138

U5223-J-Z125-3

Assembleranweisungen

XDSEC

Beispiel
Im folgenden Beispiel wird in PROG1 ein Eingabesatz initialisiert und seine Struktur definiert. PROG2 und PROG3 verarbeiten Teilinformationen aus dem Eingabesatz.

Name PROG1 R0 R1 R2 R13 R14 R15
* IN VPROG2 VPROG3 * INXD VORNAME NAME
PROG2

Operation
START EQU EQU EQU EQU EQU EQU . . BALR USING USING LA L BALR L BALR TERM DROP
DC DC DC
XDSEC DS DS END . . . CSECT . . USING USING MVC BR DROP

Operanden
0 1 2 13 14 15
R2,0 *,R2 INXD,R13 R13,IN R15,VPROG2 R14,R15 R15,VPROG3 R14,R15
R2
CL30'ANTON V(PROG2) V(PROG3)
D CL10 CL20
*,R15 INXD,R13 OVN,VORNAME R14 R15,R13

gelten für alle 3 Programme im Beispiel
MUELLER' (01)
(03)

U5223-J-Z125-3

139

XDSEC

Assembleranweisungen

* OVN * INXD VORNAME
PROG3
* ONAME * INXD NAME

DS
XDSEC DS END . . . CSECT USING USING MVC BR DROP
DS
XDSEC DS END

CL10 R CL10
*,R15 INXD,R13 ONAME,NAME R14
CL20 R CL20

(01) Definition des externen Pseudoabschnitts. (02) Referenz des externen Pseudoabschnitts. (03) Zugriff auf den externen Pseudoabschnitt.

(02) (03) (02)

>>>>> siehe auch CSECT- und DSECT-Anweisung 140

U5223-J-Z125-3

Assembleranweisungen

XDSEC

5

Struktur der Makrosprache

Die Makrosprache kann als zusätzliche Sprache aufgefaßt werden, die ebenfalls vom Assembler bearbeitet wird. Die folgenden Kapitel beschreiben die Sprachelemente und Anweisungen, die in der Makrosprache zusätzlich zu denen der Assemblersprache eingesetzt werden können.
Die Makrosprache ermöglicht es, häufig gebrauchte Folgen von Instruktionen nur einmal in Form einer Makrodefinition zu schreiben und sie dann mit nur jeweils einer Instruktion, dem Makroaufruf, ins Programm einzufügen. Durch Steuerung über Parameter können die eingefügten Instruktionen bei jedem Makroaufruf variieren. In der Makrodefinition kann mit Hilfe von Bedingungsanweisungen das Einfügen von Instruktionsfolgen von bestimmten Bedingungen abhängig gemacht werden. Außerdem kann durch variable Parameter der Text der erzeugten Instruktionen und Kommentare veränderlich gestaltet werden.

U5223-J-Z125-3

141

Struktur der Makrosprache

5.1

Aufruf und Definition von Makros

Der Makroaufruf ist eine Instruktion im Text des Assembler-Quellprogramms. Das Resultat der Verarbeitung eines Makroaufrufs ist die Makrogenerierung. Sie besteht aus den Assembleranweisungen, Assemblerbefehlen, Makroanweisungen und Makroaufrufen, die zusammen die Funktion ausführen, die vom Makroaufruf erwartet wird.
Der Operationseintrag des Makroaufrufs bezeichnet den Namen des aufgerufenen Makros. Dieser Name steht in der Makrodefinition im Operationseintrag der Musteranweisung. Das Format der Operanden des Makroaufrufs muß dem Format der Operanden der Musteranweisung entsprechen (siehe 7.1, Makroaufruf und Musteranweisung).
Die Makrogenerierung wird vom Assembler mit Hilfe der Makrodefinition durchgeführt. Die Makrodefinition wird gemäß den Operandenangaben im Makroaufruf modifiziert. Makrodefinitionen können vom Benutzer geschrieben werden oder sie werden als Teil des Betriebssystems als Systemmakros dem Benutzer zur Verfügung gestellt.
Die aufgelösten Makros werden im Assemblerprotokoll nicht mehr auf Stelle 10 und 16 ausgerichtet. Wegen der 64 Zeichen langen Namens- und Opcodefelder wird die ersetzte Makroanweisung möglichst der Originalanweisung im Makro nachgebildet.
Die folgende Beschreibung der Makrosprache bezieht sich nur auf Makros, die vom Benutzer selbst geschrieben werden. Die Systemmakros und ihre Verwendung sind in den BS2000-Handbüchern Makroaufrufe an den Ablaufteil, Beschreibung [6] und DVS, Einführung und Kommandoschnittstelle [5] zu finden.

142

U5223-J-Z125-3

5.1.1

Struktur der Makrosprache
Ablage der Makrodefinition
Die Definition eines Makro kann entweder im Quellprogramm selbst vorliegen oder in einer Makrobibliothek abgelegt sein.
Hat eine Makrodefinition im Quellprogramm denselben Namen, wie eine Makrodefinition in einer Bibliothek, dann wird die Makrodefinition im Quellprogramm benutzt. Stehen Makrodefinitionen in mehreren Bibliotheken mit demselben Namen, so wird die zuerst gefundene Makrodefiniton benutzt (Suchhierarchie siehe ASSEMBH, Benutzerhandbuch [1]).
Makrodefinition im Quellprogramm
Eine Makrodefinition im Quellprogramm muß in jedem Fall vor dem ersten Aufruf dieses Makros spezifiziert und durchlaufen werden. Wird die Makrodefinition mit Hilfe von Bedingungsanweisungen übersprungen, dann wird sie auch nicht eingelesen. Der Makro gilt dann als nicht bekannt im Quellprogramm. Wird ein solcher Makro aufgerufen, so wird noch in den Makrobibliotheken nach der Definition gesucht und, falls diese dort ebenfalls nicht vorliegt, wird der Makroaufruf als Fehler (unbekannter Operationscode; siehe ASSEMBH, Benutzerhandbuch [1]) gemeldet.
Falls für verschiedene Makrodefinitionen im Quellprogramm derselbe Name verwendet wird, gilt die zuletzt eingelesene Makrodefinition bis zum Auftreten der nächsten Definition desselben Namens. Der Assembler gibt in diesem Fall eine Warnung aus. Durch Bedingungsanweisungen übersprungene Makrodefinitionen werden auch hier nicht berücksichtigt.
Makrodefinition innerhalb einer Makrodefinition
Es ist auch möglich, daß eine Makrodefinition innerhalb einer anderen vorliegt (innere Makrodefinition). D.h., daß eine Makrodefinition abhängig von einer Makrogenerierung eingelesen wird (siehe auch 5.1.2, Aufbau der Makrodefinition).
Auch diese innere Makrodefinition muß vor ihrem ersten Aufruf durchlaufen werden. Erst danach ist sie auch im äußeren Makro bekannt.
Nachdem die innere Makrodefinition das erste Mal durchlaufen wurde, kann sie auch unabhängig von der äußeren aufgerufen werden.
Die äußere Makrodefinition kann im Quellprogramm liegen oder in einer Bibliothek abgelegt sein. Die innere Makrodefinition wird abgelegt, als wäre sie aus einer Bibliothek eingelesen worden.
Die Schachtelungstiefe für innere Makrodefinitionen ist, abhängig von der Speicherkapazität, beliebig.

U5223-J-Z125-3

143

Struktur der Makrosprache

5.1.2

Makrodefinition in einer Bibliothek
Eine Makrodefinition kann für viele Programme zugänglich gemacht werden, wenn sie in einer Bibliothek abgelegt wird. Damit der Assembler die Makrodefinition auffinden kann, muß ihm die entsprechende Bibliothek vor der Übersetzung zugewiesen werden (siehe ASSEMBH, Benutzerhandbuch [1]).
Wenn eine Makrodefinition in einer Bibliothek vorliegt, wird sie nur dann eingelesen, wenn ihr Aufruf durchlaufen wird. Wird der Aufruf übersprungen und nicht durchlaufen, dann wird die Makrodefinition auch nicht eingelesen.
Aufbau der Makrodefinition
Eine Makrodefinition besteht aus den folgenden vier Teilen in der aufgeführten Reihenfolge:
der Anfangsanweisung MACRO; Sie kennzeichnet den Anfang einer Makrodefinition und muß jeweils die erste Anweisung in der Definition sein (siehe 7.2, MACRO-Anweisung).
der Musteranweisung; Sie gibt den Namen des Makro an und die symbolischen Parameter, die in dieser Makrodefiniton vorkommen. Das Operandenformat der Musteranweisung bestimmt das Operandenformat des zugehörigen Makroaufrufs (siehe 7.1, Makroaufruf und Musteranweisung).
keiner, einer oder mehreren Modellanweisungen; Sie ergeben nach der Übersetzung die gewünschte Folge von Instruktionen. Modellanweisungen können sein:
alle Assembleranweisungen, außer der ICTL-Anweisung, alle Assemblerbefehle, alle Makroaufrufe und alle Makroanweisungen.
der Endanweisung MEND; Sie kennzeichnet das Ende einer Makrodefinition und muß die jeweils letzte Anweisung in der Definition sein (siehe 7.2, MEND-Anweisung).
Zusätzlich zu den genannten Bestandteilen sind Kommentarzeilen möglich, die an jeder beliebigen Stelle innerhalb der Makrodefinition stehen können (siehe 5.2, Kommentare).

144

U5223-J-Z125-3

Struktur der Makrosprache

Beispiel Das Beispiel zeigt in einfacher Form die mögliche Logik einer Makrodefinition.

Name &LABEL &LABEL &C
.ONE .TWO

Operation
MACRO VARPAR LCLC MVC . . SETC . . AIF AIF . . AGO . . ANOP . . ANOP . . MEND

Operanden
&A,&B &C &A,&B
'WORK'
('&C' EQ 'WORK').ONE ('&C' EQ '').TWO
.TWO

(01) (02) (03) (04)
(05)
(06) (07)
(08)
(09)
(10)
(11)

(01) Anfangsanweisung (02) Musteranweisung mit dem Makronamen VARPAR und den symbolischen Parame-
tern &LABEL, &A und &B (03) bis (10) Modellanweisungen: (03) Definition des lokalen SET-Parameters &C (04) Der symbolische Parameter &LABEL repräsentiert über die Ersetzung in der
Musteranweisung die symbolische Adresse des Makroaufrufs (05) Wertzuweisung für &C (06) und (07)
bedingte Verzweigungen, das Sprungziel ist abhängig vom Inhalt von &C (08) unbedingte Verzweigung (09) und (10)
Definitionen der Sprungziele .ONE und .TWO (11) Endanweisung

U5223-J-Z125-3

145

Struktur der Makrosprache

5.1.3

Aufbau der inneren Makrodefinition
Eine Makrodefinition, die innerhalb einer anderen liegt, wird als innere Makrodefinition bezeichnet.
Diese innere Makrodefinition kann nicht mit variablen Parametern generiert werden. D.h., es wird keine textuelle Ersetzung (siehe 5.3.2, Variable Parameter) durchgeführt, während die Makrodefinition eingelesen wird. Über den äußeren Makro kann nur gesteuert werden, ob die innere Makrodefinition eingelesen werden soll oder nicht.

Eine Makrodefinition, die eine innere Makrodefinition enthält, kann nur nach dem folgenden Schema aufgebaut werden.

Name Operation

Operanden

MACRO Musteranweisung 1 . . MACRO Musteranweisung 2 . . MEND . . MACRO Musteranweisung 3 . . MEND . . MEND

(01) (01)

(01) Hier können weitere innere Makrodefinitionen geschachtelt sein.

146

U5223-J-Z125-3

Struktur der Makrosprache

5.2

Instruktionen und Kommentare

Der Text eines Assembler-Makro besteht, ebenso wie der eines Assembler-Quellprogramms aus einer Folge von Instruktionen und Kommentaren. Die zusätzlichen Möglichkeiten, die die Makrosprache für Instruktionen und Kommentare bietet, werden im folgenden beschrieben. Die Aussagen über die Struktur der Assemblersprache, die im Kapitel 2 gemacht wurden, gelten hier nach wie vor.

Instruktionen
Im einzelnen können Instruktionen der Makrosprache aus fünf Einträgen bestehen: dem Namenseintrag, dem Operationseintrag, dem Operandeneintrag, dem Bemerkungseintrag und dem Fortsetzungszeichen.
Diese Einträge müssen der obigen Reihenfolge entsprechen und, bis auf das Fortsetzungszeichen, durch mindestens ein Leerzeichen voneinander getrennt sein.
Namens-, Operations- und Operandeneintrag verschiedener Instruktionen, auch von Assembleranweisungen und Assemblerbefehlen, können bei entsprechenden Voraussetzungen mit Hilfe von variablen Parametern generiert werden.
Für eine Instruktion der Makrosprache sind neun Fortsetzungszeilen erlaubt. Eine Sonderstellung haben hier der Makroaufruf, die Musteranweisung, die Anweisungen GBLx und LCLx, sowie Format 2 von AIF und AGO; für sie gibt es eine alternative Formatdarstellung (siehe 7.1.4, Alternatives Anweisungsformat)

Kommentare
Kommentare können innerhalb der Makrodefiniton an beliebiger Stelle auftreten. In der Makrosprache gibt es, wie in der Assemblersprache, zwei Möglichkeiten, Kommentare zu kennzeichnen:
* Mit einem Stern in der Anfangsspalte; Diese Kommentarzeilen werden bei der Makroauflösung vom Assembler übernommen und im Übersetzungsprotokoll ausgedruckt.
.* Mit einem Punkt in der Anfangsspalte, dem ein Stern folgt; Diese Kommentarzeilen dienen nur zur Dokumentation der Makrodefinition. Sie werden vom Assembler bei der Makroauflösung nur bei Makrodefinitionen im Quellprogramm übernommen und ausgedruckt, bei Makrodefinitionen in Bibliotheken nicht.

U5223-J-Z125-3

147

Struktur der Makrosprache
Wie im Bemerkungseintrag von Instruktionen werden variable Parameter in Kommentarzeilen nicht ersetzt. Eine Generierung von variablen Kommentarzeilen ist nur über die Anweisung MNOTE *,... möglich (siehe 7.2)
Ausschalten der Funktion von Instruktionen Sind im Namenseintrag von Instruktionen symbolische Parameter, bzw. SETC-Parameter zugelassen, kann man aus Instruktionen in der Makrodefinition bzw. im Quellprogramm Kommentare erzeugen, d.h., man kann ihre Funktion ausschalten. In diesem Fall wird dem symbolischen Parameter oder SETC-Parameter für die Makrogenerierung ein * zugewiesen (.* ist nicht zulässig). Dadurch wird die Instruktion als Kommentar interpretiert.

148

U5223-J-Z125-3

Struktur der Makrosprache

5.3
5.3.1

Namenseintrag
Im Namenseintrag steht eine Folge von maximal 64 Buchstaben und Ziffern, die dazu dient, eine Instruktion zu identifizieren.
Der Namenseintrag kann wahlfrei sein. Wenn er vorhanden ist, muß er in der Anfangsspalte beginnen. Ist die Anfangsspalte leer, so nimmt der Assembler an, daß kein Namenseintrag vorhanden ist und interpretiert die folgenden Zeichen als Operationscode.
Im Namenseintrag einer Instruktion kann stehen: ein Name (siehe 2.3), ein Folgesymbol, ein variabler Parameter oder eine Verkettung von variablen Parametern und alphanumerischen Zeichen.
Folgesymbole
Ein Folgesymbol im Namenseintrag ermöglicht es, sich in den Operanden der Bedingungsanweisungen AIF und AGO auf diese Instruktion zu beziehen, d.h., sie als Sprungziel zu kennzeichnen. Dadurch wird es möglich, die Reihenfolge zu variieren, in der die Instruktionen verarbeitet werden.
Folgesymbole sind lokale Symbole, d.h., sie sind nur innerhalb der jeweiligen Makrodefinition bekannt, in der sie definiert wurden. Wird dasselbe Folgesymbol innerhalb und außerhalb einer Makrodefinition verwendet oder in zwei verschiedenen Makrodefinitionen, dann gilt es in jedem Fall als eigenes Symbol.
Ein Folgesymbol im Namenseintrag einer generierten Instruktion wird im Übersetzungsprotokoll nicht ausgedruckt.
Regeln
Folgesymbole dürfen maximal aus 65 Zeichen bestehen. Das erste Zeichen eines Folgesymbols muß ein Punkt (.) sein, das zweite Zeichen ein Buchstabe. Diesem können bis zu 63 weitere Buchstaben und/oder Ziffern folgen. Im Namenseintrag von Instruktionen dürfen Folgesymbole nur in diesem Standardformat geschrieben werden. Folgesymbole im Operandeneintrag können zusätzlich im generierten Format geschrieben werden. Folgesymbole im generierten Format bestehen aus einem Punkt, dem ein variabler Parameter folgt oder eine Verkettung von variablen Parametern und alphanumerischen Zeichen (siehe 5.5, Operandeneintrag).

U5223-J-Z125-3

149

Struktur der Makrosprache

Leerzeichen innerhalb eines Folgesymbols sind nicht zulässig. Pro Makro sind maximal 215-1 Folgesymbole erlaubt.

Beispiele für zulässige Folgesymbole

.LOOP .LOOP_2 .Loop

.A123456789 .A@B4 .$ABC .ABC&PARAM

Beispiele für unzulässige Folgesymbole

AREA .1ABC .LOOP* .LOOP 1

(erstes Zeichen kein Punkt) (zweites Zeichen kein Buchstabe) (enthält das Sonderzeichen *) (enthält ein Leerzeichen)

150

U5223-J-Z125-3

5.3.2

Struktur der Makrosprache
Variable Parameter
Variable Parameter werden für textuelle Ersetzungen im Namens-, Operations- und Operandeneintrag einer Instruktion verwendet. Über Makroanweisungen oder direkt durch den Assembler können ihnen Werte zugewiesen werden. Die textuelle Ersetzung erfolgt dann mit dem augenblicklich aktuellen Wert. Textuelle Ersetzungen im Bemerkungseintrag erfolgen nicht. Bei Verwendung in Bedingungsanweisungen können variable Parameter zur Steuerung der Assemblierung verwendet werden. Bei welchen Instruktionen der Assembler-, bzw. Makrosprache variable Parameter im Namenseintrag erlaubt sind, ist aus den jeweiligen Formatbeschreibungen ersichtlich. Bei den Assemblerbefehlen sind variable Parameter im Namenseintrag grundsätzlich möglich. Pro Makrodefinition sind maximal 215-1 variable Parameter erlaubt.
Regeln Ein variabler Parameter darf aus maximal 64 Zeichen bestehen. Das erste Zeichen muß ein kaufmännisches Und (&) sein. Leerzeichen innerhalb eines variablen Parameters sind nicht zulässig.
Die Zeichen, die bei der textuellen Ersetzung einen variablen Parameter ersetzen, müssen mit den Syntaxregeln des Eintrags übereinstimmen, in dem der variable Parameter auftritt. Beispiel
&PAR im Namenseintrag kann nicht ersetzt werden durch NAME BALR
Innerhalb des Operandeneintrags, außer beim Makroaufruf, ist es dagegen möglich, aus einem variablen Parameter zwei oder mehrere Operanden zu generieren. Beispiel
&PAR im Operandeneintrag kann ersetzt werden durch FIELD1,FIELD2

U5223-J-Z125-3

151

Struktur der Makrosprache
Zu den variablen Parametern gehören: symbolische Parameter; Sie werden in der Musteranweisung definiert und der Programmierer weist ihnen bei jedem Makroaufruf neue Werte zu. variable Systemparameter; Sie beginnen mit der Zeichenfolge &SYS... und haben festgelegte Bedeutungen. Der Assembler weist ihnen einen Wert zu, wenn er eine Makrodefinition verarbeitet oder bei Beginn einer Übersetzung. SET-Parameter; Sie sind variable Hilfsfelder, denen der Programmierer innerhalb oder außerhalb einer Makrodefinition über Makroanweisungen einen Wert zuweisen kann.
Symbolische Parameter und ein Teil der variablen Systemparameter sind lokale Symbole. D.h., ihre Werte werden jeweils beim Beginn der Verarbeitung eines Makros zurückgesetzt. Sie sind also nur innerhalb eines Makros bekannt. SET-Parameter können lokale oder globale Symbole sein. Wenn sie als global definiert wurden, kann man sie zur Weitergabe von Werten zwischen Makros oder zwischen Makro und Assembler-Quellprogramm verwenden.
Hinweis Eine genaue Erörterung der variablen Parameter und ihrer Verwendung erfolgt in Kapitel 6, Variable Parameter.

152

U5223-J-Z125-3

5.3.3

Struktur der Makrosprache

Generierte variable Parameter
Es ist generell möglich, den Namen eines variablen Parameters mit Hilfe eines oder mehrerer weiterer variabler Parameter zu generieren.
Dabei müssen die Zeichen, die das Ergebnis der textuellen Ersetzung darstellen, den Syntaxregeln des Eintrags entsprechen, in dem der generierte variable Parameter verwendet wird.

Format von generierten variablen Parametern:
&(ele)[(d)]
ele kann sein: variabler Parameter: &par indizierter SET-Parameter (siehe 6.2): &par(d) generierter variabler Parameter: &(ele) generierter indizierter SET-Parameter: &(ele)(d) alphanumerische Zeichen: val Verkettung der o.g. Grundelemente (siehe 5.3.4)
d kann sein: Index, arithmetischer Makroausdruck: arexp Operandenunterliste mit arithmetischen Makroausdrücken (siehe 7.1.2): arexp,arexp[,...]

Beispiele
&(&PAR1.&(&PAR2(D1)).AB) ergibt &A1AB

&(&(&(AB)(D1))(D2))

ergibt &PAR2

wenn gilt wenn gilt

&PAR1

SETC 'A'

&PAR2(D1) SETC 'B'

&B

SETA 1

&AB(D1) SETC 'PAR1' &PAR1(D2) SETC 'PAR2'

U5223-J-Z125-3

153

Struktur der Makrosprache

5.3.4

Verkettung von variablen Parametern und alphanumerischen Zeichen

Variable Parameter können miteinander oder mit alpanumerischen Zeichen verkettet werden. Die Zeichenfolge, die sich auf Grund der Verkettung im generierten Text ergibt, muß mit den Syntaxregeln des Eintrags übereinstimmen, in dem die Verkettung vorkommt.

Sollen alphanumerische Zeichen auf einen variablen Parameter folgen, müssen sie durch einen Punkt getrennt werden. Soll der Punkt im generierten Text erscheinen, müssen in der Makrodefinition zwei Punkte geschrieben werden.

Beispiel

(Der aktuelle Wert von &PARAM ist NAME)

&PARAM.ABC &PARAM..ABC

ergibt ergibt

NAMEABC NAME.ABC

Soll ein variabler Parameter auf alphanumerische Zeichen folgen, dann ist kein Punkt erlaubt. Soll im generierten Text ein Punkt erscheinen, darf in der Makrodefinition nur ein Punkt geschrieben werden.

Beispiel

ABC&PARAM ABC.&PARAM

ergibt ergibt

ABCNAME ABC.NAME

Sollen variable Parameter miteinander verkettet werden, können sie durch Aneinanderreihen oder durch einen Punkt getrennt verkettet werden. Soll der Punkt im generierten Text erscheinen, müssen auch hier in der Makrodefinition zwei Punkte geschrieben werden.

Beispiel

(Der aktuelle Wert von &PARAM1 ist NAME1 und von &PARAM2 NAME2)

&PARAM1&PARAM2 &PARAM1.&PARAM2 &PARAM1..&PARAM2

ergibt ergibt ergibt

NAME1NAME2 NAME1NAME2 NAME1.NAME2

Im Namenseintrag darf eine Verkettung von variablen Parametern und alphanumerischen Zeichen nur bei Assembleranweisungen und Assemblerbefehlen verwendet werden, nicht bei Makroanweisungen. Für Operations- und Operandeneintrag ist die Verwendung einer solchen Verkettung abhängig vom Format der Instruktion.

154

U5223-J-Z125-3

Struktur der Makrosprache

5.4

Operationseintrag

Der Operationseintrag kann enthalten: Den mnemotechnischen Operationscode einer Makroanweisung, einer Assembleranweisung, oder eines Assemblerbefehls oder den Namen eines System- oder Benutzermakros (Makroaufruf) oder einen variablen Parameter oder eine Verkettung von variablen Parametern und alphanumerischen Zeichen.
Ein Operationseintrag muß angegeben werden. Er muß durch mindestens ein Leerzeichen vom Namenseintrag getrennt sein, bzw. bei fehlendem Namenseintrag, mindestens eine Stelle rechts von der Anfangsspalte beginnen.
Ein zulässiger Operationseintrag besteht aus dem mnemotechnischen Operationscode einer Assembleranweisung, eines Assemblerbefehls oder einer Makroanweisung. Namen von Benutzermakros müssen nach den Regeln von Namen (siehe 2.3, Namenseintrag) gebildet werden.

Variable Parameter im Operationseintrag
Der Operationseintrag kann mit Hilfe von variablen Parametern oder durch Verkettung von variablen Parametern und alphanumerischen Zeichen generiert werden. Die Zeichen, die einen variablen Parameter ersetzen, müssen mit den Syntaxregeln des Operationseintrags übereinstimmen.
Folgende Instruktionen dürfen nicht mit variablen Parametern generiert werden: alle Makroanweisungen, die COPY-Anweisung, die ICTL-Anweisung, die MNOTE-Anweisung und die REPRO-Anweisung.
Alle anderen Instruktionen der Assemblersprache, sowie Namen von System- und Benutzermakros können mit Hilfe von variablen Parametern generiert werden.
Für variable Parameter im Operationseintrag gelten die gleichen Aussagen, die bereits für variable Parameter im Namenseintrag gemacht wurden (siehe 5.2.1.2 bzw. 6, Variable Parameter).

U5223-J-Z125-3

155

Struktur der Makrosprache

Beispiel

Name

Operation Operanden

* Makrodefinition MACRO EXOP . . &OP USING . . MEND

&OP,&BASREG
&BASREG,0 *,&BASREG

* Makroaufruf 1 EXOP

BASR,2

* Generierte Instruktionen

BASR

2,0

USING

*,2

* Makroaufruf 2 EXOP

BALR,2

* Generierte Instruktionen

BALR

2,0

USING

*,2

156

U5223-J-Z125-3

Struktur der Makrosprache

5.5
5.5.1

Operandeneintrag
Der Operandeneintrag von Instruktionen in der Makrosprache kann aus einem oder mehreren Operanden bestehen, die ihrerseits einen oder mehrere Ausdrücke enthalten können.
Die Operanden müssen durch Kommas getrennt sein. Zwischen den Operanden und den Trennkommas dürfen, außer beim alternativen Anweisungsformat (siehe 7.1.4), keine Leerzeichen stehen.
Der Operandeneintrag kann wahlfrei sein. Wenn er angegeben ist, muß er durch mindestens ein Leerzeichen vom Operationseintrag getrennt sein.

Variable Parameter im Operandeneintrag
Variable Parameter können im Operandeneintrag von Assemblerinstruktionen und von Makroinstruktionen eingesetzt werden. Bei den Assemblerinstruktionen werden sie zur textuellen Ersetzung verwendet. Bei den Makroinstruktionen ist aus der jeweiligen Formatbeschreibung ersichtlich, ob ein variabler Parameter möglich ist und wie er ausgewertet wird.
Für variable Parameter im Operandeneintrag gelten ansonsten die gleichen Aussagen, die bereits für variable Parameter im Nameneintrag gemacht wurden (siehe 5.3.2, bzw. Kapitel 6, Variable Parameter).

Beispiel

Name

Operation Operanden

* Makrodefinition MACRO EX1 MVC . . MEND

&PAR1,&PAR2 &PAR1,&PAR2

* Makroaufruf EX1

FIELD1,FIELD2

* Generierte Instruktionen

MVC

FIELD1,FIELD2

.

.

FIELD1

DS

CL4

FIELD2

DC

C'ABCD'

U5223-J-Z125-3

157

Struktur der Makrosprache

5.5.2

Folgesymbole im Operandeneintrag
Zusätzlich zu den Makroausdrücken kann der Operandeneintrag der AIF- und AGOAnweisung Folgesymbole enthalten. Die Folgesymbole im Operandeneintrag geben die Instruktionen an, zu denen nach der Verarbeitung der AIF- und AGO-Anweisung verzweigt werden soll.
Folgesymbole können im Operandeneintrag im Standardformat (siehe 5.3.1) oder im generierten Format geschrieben werden. Ein Folgesymbol im Standardformat beginnt mit einem Punkt (.), das zweite Zeichen muß ein Buchstabe sein, und diesem können noch 63 weitere Buchstaben und Ziffern folgen.
Ein Folgesymbol im generierten Format beginnt ebenfalls mit einem Punkt. Diesem folgt ein variabler Parameter oder ein Name, der mit einem variablen Parameter verkettet ist.
Beispiele für Folgesymbole im generierten Format
.&LOOP .LOOP&NAME .&Loop .NAME123&LOOP .&LOOP.NAME

158

U5223-J-Z125-3

5.5.3

Struktur der Makrosprache
Makroausdrücke
Ausdrücke sind auch in der Makrosprache die Grundbestandteile der Operanden von Instruktionen. Sie sind aus Elementen und Operatoren aufgebaut. In der Makrosprache gibt es arithmetische Makroausdrücke, Zeichenausdrücke, Vergleichsausdrücke und logische Ausdrücke. Die Art des Ausdrucks und damit seine Berechnung wird bestimmt durch die Operatoren. Eine Zusammenfassung dieses Sachverhalts für die verschiedenen Ausdrücke und die jeweils möglichen Elemente der Ausdrücke sind in Bild 5-1 zu finden.
Arithmetische Makroausdrücke und logische Ausdrücke können aus jeweils nur einem Element ohne Operatoren bestehen. Der Assembler interpretiert solche einfachen Ausdrücke abhängig von ihrer jeweiligen Verwendung als arithmetisch oder logisch. Zeichenausdrücke bestehen aus nur einem Element, sie enthalten keine Operatoren. Vergleichsausdrücke dagegen müssen aus zwei Elementen und einem Operator aufgebaut sein.

U5223-J-Z125-3

159

Struktur der Makrosprache

logische Ausdrücke
AND OR NOT
Elemente: Vergleichsausdrücke SETB-Parameter Bezugnahme auf das Definitionsmerkmal

arithmetische Makroausdr.

+ * / unäres + unäres -

Elemente:
selbstdef. Werte - binäre - dezimale - sedezimale
SETA-Parameter SETB-Parameter symbol. Parameter mit arithm. Wert var. Systemparameter mit arithm. Wert Bezugnahme auf Merkmale mit arithm. Wert Bezugnahme auf das Definitionsmerkmal

Bild 5-1

Makroausdrücke

160

Vergleichsausdrücke
EQ NE LT GT LE GE Elemente: arithmetische Makroausdrücke Zeichenausdrücke Bezugnahme auf das Definitionsmerkmal
Zeichenausdrücke
Elemente: Zeichenwerte (1) Teilzeichenfolgen (2) Verkettungen von (1) und (2) Bezugnahme auf das Typenmerkmal
U5223-J-Z125-3

Zeichenausdrücke

5.5.4

Zeichenausdrücke
Ein Zeichenausdruck kann sein: ein Zeichenwert, eine Teilzeichenfolge, eine Verkettung von Zeichenwerten und Teilzeichenfolgen oder eine Bezugnahme auf das Typenmerkmal (siehe 5.5.8.1).
Ein Zeichenausdruck enthält keine Operatoren.

5.5.4.1

Zeichenwert
Ein Zeichenwert besteht aus einer beliebigen Kombination von Zeichen, die in Hochkommas eingeschlossen ist.

Format von Zeichenwerten

'val'

val

Zeichenfolge oder

variabler Parameter oder

Verkettung von variablen Parametern und alphanumerischen Zeichen

Ein variabler Parameter innerhalb eines Zeichenwertes wird durch seinen aktuellen Wert ersetzt.

Wird ein variabler Parameter, der einen Zeichenwert darstellt, als Element in einem Vergleichsausdruck verwendet, dann können die beiden Hochkommas wegfallen.

Wird ein SETA- oder SETB-Parameter verwendet, dann ist das Ergebnis die Zeichendarstellung des dezimalen oder booleschen Wertes, ohne Vorzeichen (Absolutbetrag) und ohne führende Nullen.

Ein Zeichenwert darf aus maximal 1020 Zeichen bestehen. Ebenso darf die Auflösung eines variablen Parameters nur eine Zeichenfolge von maximal 1020 Zeichen ergeben.

U5223-J-Z125-3

161

Zeichenausdrücke

Hochkomma in Zeichenwerten
Soll die Auflösung eines Zeichenwertes nach der Generierung ein Hochkomma enthalten, dann müssen im Zeichenwert selbst zwei Hochkommas geschrieben werden.

Beispiele
'NUM''ONE' 'L''SYMBOL' ''''

ergibt ergibt ergibt

NUM'ONE L'SYMBOL '

&-Zeichen in Zeichenwerten
Ein &-Zeichen in einem Zeichenwert wird vom Assembler als Beginn eines variablen Parameters interpretiert. Anders als bei der Auflösung von zwei Hochkommas werden zwei &-Zeichen in einem Zeichenwert dagegen auch als zwei &-Zeichen abgelegt. Stehen also in einem Zeichenwert zwei &-Zeichen hintereinander, dann werden sie auch bei der textuellen Ersetzung durch diesen Zeichenwert abgelegt.
Nur ein &-Zeichen in der Auflösung eines Zeichenwertes kann nur mit Hilfe einer Teilzeichenfolge erreicht werden (siehe unten).

Beispiel

Name

Operation Operanden

&FIRMA

SETC DC

'NAME && CO' C'&FIRMA'

* generierte Instruktion

DC

C'NAME && CO'

*erzeugte Konstante NAME & CO

(01) (02)
(03)

(01) Dem variablen Parameter &FIRMA wird der Wert NAME && CO zugewiesen. (02) Die C-Konstante wird mit dem variablen Parameter definiert. (03) Nach der Makroauflösung hat die C-Konstante den Inhalt NAME && CO. Dieser
Wert entspricht der Assembler-Syntax und wird als NAME & CO übersetzt.

162

U5223-J-Z125-3

Zeichenausdrücke

5.5.4.2

Teilzeichenfolge
Teilzeichenfolgen ermöglichen es, einen Ausschnitt aus einem Zeichenwert anzusprechen.

Format von Teilzeichenfolgen

[(dup)]'val'(a,b)

dup

Wiederholungsfaktor; arithmetischer Makroausdruck

Der Wiederholungsfaktor ist nur für Teilzeichenfolgen im Operandeneintrag von SETC-Anweisungen zugelassen. Teilzeichenfolgen in Vergleichsausdrücken dürfen keinen Wiederholungsfaktor haben.

val

Zeichenwert

a

Nummer des Zeichens, bei dem der Ausschnitt aus dem Zeichenwert

beginnen soll;

dezimaler, selbstdefinierender Wert oder arithmetischer Makroausdruck

b

Zahl der Zeichen, die der Ausschnitt aus dem Zeichenwert enthalten soll;

dezimaler selbstdefinierender Wert oder arithmetischer Makroausdruck

Bei der Auflösung einer Teilzeichenfolge wird zuerst der Ausschnitt aus dem Zeichenwert hergestellt und anschließend der Wiederholungsfaktor ausgewertet.
Eine Teilzeichenfolge darf, ebenso wie ihre Auflösung, nach der Auswertung des Wiederholungsfaktors nur aus maximal 1020 Zeichen bestehen.
Wenn in einer Teilzeichenfolge der Wert a größer ist als die Zahl der Zeichen im Zeichenwert, erhält man als Ergebnis eine leere Zeichenfolge. Ist der Wert b größer als die Zahl der Zeichen, dann werden nur die vorhandenen Zeichen im Zeichenwert als Ergebnis eingesetzt (siehe Beispiele).

Beispiele
(3)'TEXT'(2,2) 'VAL &&'(1,5) (3)'&PAR'(1,&A) '&PAR.%4'(1,4) 'ABCD'(12,4) 'ABCD'(1,10)

ergibt ergibt ergibt ergibt ergibt ergibt

EXEXEX

VAL &

ABABAB wenn &PAR den aktuellen Wert ABC

ABC%

und &A den aktuellen Wert 2 hat.

leere Zeichenfolge

ABCD

U5223-J-Z125-3

163

Zeichenausdrücke

5.5.4.3

Verkettung von Zeichenwerten und Teilzeichenfolgen
Zeichenwerte und Teilzeichenfolgen können in beliebiger Reihenfolge miteinander verkettet werden:

Für alle Verkettungen gilt:

Zwischen Hochkomma und Hochkomma muß ein Punkt stehen.

Beispiele
'ABC'.'DEF' 'ABC'.'DEF'(2,1)

ergibt ergibt

ABCDEF ABCE

Zwischen Hochkomma und linker Klammer muß ein Punkt stehen (Wiederholungsfaktor).

Beispiele
'ABC'.(2)'XY' 'BIN'.(2)'XY'(1,1)

ergibt ergibt

ABCXYXY BINXX

Zwischen rechter Klammer und Hochkomma kann ein Punkt stehen (Teilzeichenfolge).

Beispiele
'PAR123'(1,3).'AB' 'PAR123'(1,3)'AB'

ergibt ergibt

PARAB PARAB

Zwischen rechter und linker Klammer kann ein Punkt stehen.

Beispiele
'PAR123'(1,3).(2)'AB' 'PAR123'(1,3)(2)'AB'

ergibt ergibt

PARABAB PARABAB

Hinweis
Auch hier gilt, daß Teilzeichenfolgen in Vergleichsausdrücken keinen Wiederholungsfaktor haben dürfen.

164

U5223-J-Z125-3

5.5.5

Arithmetische Makroausdrücke
Arithmetische Makroausdrücke
Ein arithmetischer Makroausdruck setzt sich zusammen aus Elementen und arithmetischen Operatoren (siehe 2.5.1) oder er besteht aus nur einem Element ohne Operatoren.
Folgende Elemente sind in einem arithmetischen Makroausdruck erlaubt:
binäre, dezimale und sedezimale selbstdefinierende Werte (siehe 2.5.2), SETA-Parameter (siehe 6.2), SETB-Parameter (siehe 6.2), SETC-Parameter, symbolische Parameter und variable Systemparameter, sofern sie einen dezimalen, binären oder sedezimalen Wert haben (siehe 6.1 bis 6.3) und Bezugnahmen auf Merkmale mit einem arithmetischen Wert (Längenmerkmal, Zählermerkmal, Anzahlmerkmal, Skalenfaktormerkmal und Ganzzahligkeitsmerkmal, siehe 5.5.8), Bezugnahmen auf das Definitionsmerkmal (siehe 5.5.8.7).
Die aufgeführten Elemente sind in den jeweiligen Abschnitten dieses Handbuchs beschrieben.
In einem arithmetischen Makroausdruck kann man die Reihenfolge der Bearbeitung durch Klammern verändern. Eine Schachtelung der Klammern ist möglich.
Regeln
Ein arithmetischer Makroausdruck darf nicht mit einem Operator, außer dem unären Plus und dem unären Minus beginnen. In einem arithmetischen Makroausdruck dürfen zwei Elemente nicht unmittelbar aufeinander folgen. Das unäre Plus und das unäre Minus dürfen allen anderen Operatoren direkt folgen. Die Endwerte der Berechnung von arithmetischen Makroausdrücken müssen zwischen -231 und +231-1 liegen.
Beispiele für zulässige arithmetische Makroausdrücke
&AREA+X'2D' &EXIT-S'&ENTRY+1 &AREA+X'2D'/(&EXIT-S'&ENTRY+1) I'&N/25 50

U5223-J-Z125-3

165

Arithmetische Makroausdrücke
Berechnung von arithmetischen Makroausdrücken 1. Jedem Element wird sein numerischer Wert zugeordnet. 2. Arithmetische Operationen werden von links nach rechts ausgeführt. Multiplikation
und Division kommen vor Addition und Subtraktion. 3. Bei Ausdrücken, die Klammern enthalten, werden zuerst die Werte in den Klammern
errechnet. Bei mehrstufigen Klammern wird zuerst der innere Klammerausdruck berechnet. 4. Division durch Null ist zugelassen und liefert das Ergebnis Null.
Hinweis Haben SETC-Parameter, symbolische Parameter und variable Systemparameter keinen arithmetischen Wert, kommt es zu einem Flag (nicht im F-ASSEMB-COMPATIBLE Modus) und der Ersatzwert 0 wird verwendet.

166

U5223-J-Z125-3

5.5.6

Vergleichsausdrücke
Vergleichsausdrücke
Ein Vergleichsausdruck setzt sich zusammen aus zwei Elementen und einem Vergleichsoperator. Das Ergebnis eines Vergleichsausdrucks kann 0 oder 1 (falsch oder wahr) sein.
Die folgenden Vergleichsoperatoren sind erlaubt: EQ gleich NE ungleich LT kleiner als GT größer als LE kleiner gleich GE größer gleich
Die Elemente des Vergleichsausdrucks bestimmen, ob es sich um einen arithmetischen Vergleich oder einen Zeichenvergleich handelt. Bei einem arithmetischen Vergleich muß mindestens ein Element ein arithmetischer Makroausdruck sein. Bei einem Zeichenvergleich sind beide Elemente Zeichenausdrücke.
Regeln Die Vergleichsoperatoren müssen von den Elementen durch jeweils ein Leerzeichen getrennt sein. Ein Vergleichsausdruck kann in Klammern gesetzt werden. Werden in einem Vergleichsausdruck variable Parameter als Zeichenwerte verwendet, können die Hochkommas wegfallen, die in allen anderen Fällen einen Zeichenwert kennzeichnen. In einem Zeichenvergleich können Elemente bis zu einer Länge von 1020 Zeichen verglichen werden. Sind in einem Zeichenvergleich die Elemente ungleich lang, dann wird stets das kürzere Element als das kleinere betrachtet.

U5223-J-Z125-3

167

Vergleichsausdrücke

Beispiele für zulässige Vergleichsausdrücke

&CHAR1 und &CHAR2 sollen SETC-Parameter sein und &AR1 und &AR2 SETA-Parameter. &PAR1 sei ein symbolischer Parameter, dem eine Zeichenfolge zugewiesen wurde und &PAR2 ein symbolischer Parameter, dem ein arithmetischer Wert zugewiesen wurde.

'FIELD' NE '&CHAR1' 'FIELD' NE &CHAR1 &PAR1 EQ &CHAR1 &AR1 GT &AR2 &AR1 GT 16*&AR2+4 &AR1 GT 20 &PAR2 EQ &CHAR1 &PAR2 EQ &AR1

Zeichenvergleich Zeichenvergleich Zeichenvergleich arithmetischer Vergleich arithmetischer Vergleich arithmetischer Vergleich Zeichenvergleich arithmetischer Vergleich

168

U5223-J-Z125-3

5.5.7

Logische Ausdrücke

Logische Ausdrücke

Logische Ausdrücke setzen sich zusammen aus Elementen und logischen Operatoren oder sie bestehen aus nur einem Element ohne Operatoren. Sie können als Ergebnis nur die logischen Werte 0 (falsch) oder 1 (wahr) erhalten.

Elemente eines logischen Ausdrucks können sein:

SETB-Parameter (siehe 6.2), Vergleichsausdrücke (siehe 5.5.6) und Bezugnahmen auf das Definitonsmerkmal (siehe 5.5.8.7).

Die folgenden logischen Operatoren sind erlaubt:

AND OR NOT

logisches Und inclusives Oder Verneinung

In einem logischen Ausdruck kann man die Reihenfolge der Bearbeitung durch Klammern beeinflussen. Hierbei ist eine Schachtelung der Klammern möglich.

Regeln
Die logischen Operatoren müssen jeweils durch ein Leerzeichen von den Elementen getrennt sein. Ein logischer Ausdruck darf nicht mit AND oder OR beginnen. In einem logischen Ausdruck dürfen nicht zwei Elemente direkt aufeinander folgen. Jedes Element eines logischen Ausdrucks kann in Klammern gesetzt werden. In diesem Fall ist zwischen Operator und eingeklammertem Element kein Leerzeichen notwendig. Die Operatoren AND und OR dürfen nicht miteinander kombiniert werden. Die Kombination mit NOT ist nur als AND NOT, bzw. OR NOT möglich.

Beispiele für zulässige logische Ausdrücke
&PAR1 AND &PAR2 &PARA OR &PARB NOT &B AND &C NOT(&BIN1 AND &BIN2) (&BINA AND NOT &BINB)OR(&BINB AND NOT &BINA)
Die folgenden Beispiele zeigen zulässige logische Ausdrücke, in denen Zeichenvergleiche und arithmetische Vergleiche als Elemente verwendet werden.
&AREA+2 GT 29 OR &AR1 (&AREA+2 GT 20)OR(&AR1) NOT &AR1 AND &AREA+2 GT 20 NOT &AR1 AND(&AREA+2 GT 20)

U5223-J-Z125-3

169

Logische Ausdrücke
Berechnung von logischen Ausdrücken Logische Ausdrücke werden nach folgenden Regeln auf einen Einzelwert zurückgeführt: 1. Jedes Element des logischen Ausdrucks wird berechnet und erhält seinen logischen
Wert 0 oder 1 (falsch oder wahr). 2. Logische Operationen werden von links nach rechts ausgeführt. NOT wird jedoch
vor AND und AND wird vor OR bearbeitet. 3. Bei Ausdrücken, die Klammern enthalten, werden die Klammern von innen nach
außen aufgelöst.

170

U5223-J-Z125-3

5.5.8

Bezugnahme auf Merkmale

Bezugnahme auf Merkmale
Der Assembler weist Namen und variablen Parametern Merkmale zu. Auf diese Merkmale kann man sich beziehen, um z.B. das Durchlaufen bestimmter Instruktionen vom Wert des entsprechenden Merkmals abhängig zu machen.

Format der Bezugnahme auf ein Merkmal
attr Merkmalsbezeichnung (s.u.) par Name oder
variabler Parameter

attr'par

Jedes Merkmal hat eine bestimmte Bezeichnung, mit der es angesprochen wird.

Typenmerkmal

T

Längenmerkmal

L

Skalenfaktormerkmal

S

Ganzzahligkeitsmerkmal

I

Zählermerkmal

K

Anzahlmerkmal

N

Definitionsmerkmal

D

Die folgende Tabelle zeigt, auf welche Merkmale man sich für Namen und die verschiedenen variablen Parameter beziehen kann.

Namen

T

X

L

X

S

X

I

X

K

N

D

X

symbolische Parameter
X X X* X X X
X*

SET-Parameter
X X nur &SETC* nur &SETC* X X
nur &SETC*

variable Systemparameter
X
X nur &SYSLIST(n)* nur &SYSLIST(n)*
X
nur &SYSLIST(n) und &SYSLIST nur &SYSLIST(n)*

* nur zulässig, wenn der Wert ein Name ist

Tabelle 5-1

Bezugnahmen auf Merkmale von Namen und variablen Parametern

U5223-J-Z125-3

171

Bezugnahme auf Merkmale
Merkmale von Namen Der Wert des Merkmals wird an Hand der Daten berechnet, die der Name repräsentiert. Dazu muß der Name definiert sein, d.h., er muß im Namenseintrag einer Assembleranweisung, bzw. eines Assemblerbefehls vorliegen oder im Operandeneintrag einer EXTRN- bzw. WXTRN-Anweisung. Die Instruktion, in der der Name definiert ist, muß im Assembler-Quellprogramm stehen. Der Name kann auch erst später im Quellprogramm definiert sein (siehe ASSEMBH, Benutzerhandbuch [1]; 'Lookahead-Mechanismus'). Eine Ausnahme ist hier die Bezugnahme auf das Definitionsmerkmal. Mit ihr wird abgefragt, ob ein Name zum Abfragezeitpunkt definiert ist.

172

U5223-J-Z125-3

Bezugnahme auf Merkmale
Merkmale von variablen Parametern Der Wert der Merkmale von variablen Parametern wird an Hand des aktuellen Wertes berechnet, der dem variablen Parameter zugewiesen wurde.
Die Merkmale von SET-Parametern und variablen Systemparametern, außer &SYSLIST, werden jeweils aus dem aktuellen Wert berechnet.
Die Merkmale von symbolischen Parametern und dem variablen Systemparameter &SYSLIST werden an Hand der Operanden des entsprechenden Makroaufrufs berechnet. Werden symbolische Parameter oder &SYSLIST(n) über eine SETC-Anweisung im Makro neue Werte zugewiesen, so werden die Merkmale ebenfalls gemäß dieser aktuellen Werte berechnet. Ist der Operand des Makroaufrufs ein Makroausdruck, dann erhält der entsprechende symbolische Parameter die Merkmale einer Zeichenkonstanten. Ist der Operand eines inneren Makroaufrufs eine Operandenunterliste, können entweder die Merkmale der Unterliste oder jedes einzelnen Operanden der Unterliste bezeichnet werden. Das Typen-, Längen-, Ganzzahligkeits- und Skalenfaktormerkmal einer Unterliste ist dasselbe wie das entsprechende Merkmal des ersten Elementes aus der Unterliste.

U5223-J-Z125-3

173

Bezugnahme auf Merkmale

5.5.8.1

T' Bezugnahme auf das Typenmerkmal
Das Typenmerkmal eines Namens oder eines variablen Parameters ist ein einzelner Buchstabe. Die Bezugnahme auf das Typenmerkmal kann nur als Element von Zeichenausdrücken verwendet werden. Es muß stets alleine stehen.

Beispiele
Name
&A &B .C

Operation
SETC SETB AIF

Operanden
T'&PAR (T'&X NE T'&Y) (T'&PAR NE 'F').D

· Die folgenden Typenmerkmale gelten für Namen und symbolische Parameter, die DC-, DS-, DXD- und CXD-Anweisungen bezeichnen. Den symbolischen Parametern muß hierbei im Makroaufruf ein entsprechender Name als Wert zugewiesen werden.
A Adreßkonstante vom Typ A, implizite Länge, auf Wortgrenze ausgerichtet, CXDAnweisung
B Binärkonstante C Zeichenkonstante D Gleitpunktkonstante doppelter Genauigkeit, implizite Länge, auf Doppelwortgrenze
ausgerichtet E Gleitpunktkonstante einfacher Genauigkeit, implizite Länge, ausgerichtet F Festpunktkonstante von Wortlänge, implizite Länge, auf Wortgrenze ausgerichtet G Festpunktkonstante, explizite Länge H Festpunktkonstante von Halbwortlänge, implizite Länge, auf Halbwortgrenze aus-
gerichtet K Gleitpunktkonstante, explizite Länge L Gleitpunktkonstante erweiterter Genauigkeit, implizite Länge, ausgerichtet P Dezimalkonstante, gepackt Q Relativadresse in einem externen Pseudoabschnitt R Adreßkonstante vom Typ A, S, V oder Y, explizite Länge S Adreßkonstante vom Typ S, implizite Länge, ausgerichtet V Adreßkonstante vom Typ V, implizite Länge, ausgerichtet X Sedezimalkonstante Y Adreßkonstante vom Typ Y, implizite Länge, ausgerichtet Z Dezimalkonstante, ungepackt

174

U5223-J-Z125-3

Bezugnahme auf Merkmale

Beispiel

Name

Operation Operanden

* Makrodefinition

MACRO

EXTYP1

AIF

.

.

.FCON

DC

MEND

&PAR (T'&PAR EQ 'F').FCON
...

* Programm mit Makroaufruf

CONST

DC

F'3'

.

.

EXTYP1

CONST

.

.

Dem symbolischen Parameter &PAR wird der Wert CONST zugewiesen.
Typ von CONST: C Typ von &PAR: C

U5223-J-Z125-3

175

Bezugnahme auf Merkmale

· Die folgenden Typenmerkmale gelten für Namen und symbolische Parameter, die andere Instruktionen als DC-, DS-, DXD- und CXD-Anweisungen bezeichnen oder die im Operandeneintrag einer EXTRN- oder WXTRN-Anweisung definiert sind.
Auch in diesem Fall muß den symbolischen Parametern im Makroaufruf ein Name als Wert zugewiesen werden.
I Assemblerbefehl J Name eines Programmabschnitts M Makroaufruf T Externer Name

Beispiel

Name

Operation Operanden

* Makrodefinition

MACRO

EXTYP2

.

.

&PAR

MVC

MEND

&PAR ...

* Programmabschnitt mit Makroaufruf

PROG2

START

EXTRN

EXNAME

.

.

EXTYP2

MNAME

* Generierte Instruktionen

PROG2

START

EXTRN

EXNAME

.

.

MNAME

MVC

...

Typ von MNAME: I Typ von &PAR: I Typ von PROG2: J Typ von EXNAME: T

Hinweis
Für alle bisher genannten Typenmerkmale gilt: Namen, die mehrfach definiert sind, werden als Fehler gemeldet und erhalten das Typenmerkmal der ersten Definition.

176

U5223-J-Z125-3

Bezugnahme auf Merkmale

· Die folgenden Typenmerkmale können nur symbolische Parameter haben, die im Makroaufruf nicht durch den Namen einer Instruktion ersetzt werden.
N dem symbolischen Parameter wird im Makroaufruf zugewiesen: ein selbstdefinierender Wert, ein SETA-Parameter oder ein SETB-Parameter
O dem symbolischen Parameter wird im Makroaufruf kein Wert zugewiesen, der entsprechende Operand fehlt.

Beispiel

Name

Operation Operanden

* Makrodefinition 1

MACRO

EXTYPO

&A

SETA

AIF

.

.

.SYMO

ANOP

EXTYPI

MEND

&PAR1,&PAR2 2 (&PAR1 EQ 5).SYMO

&A

(01)

* Makrodefinition 2

MACRO

EXTYPI

AIF

.

.

.SYMI

ANOP

MEND

&PARIN

(02)

(T'&PARIN EQ 'N').SYMI

* Makroaufruf

EXTYPO

5

(03)

(01) Aufruf von EXTYPI, dem symbolischen Parameter &PARIN aus der Musteranweisung des inneren Makro (02) wird der SETA-Parameter &A als Wert zugewiesen.
(03) Dem symbolischen Parameter &PAR1 wird der dezimale selbstdefinierende Wert 5 zugewiesen.

Typ von &PAR1: N Typ von &PARIN: N Typ von &PAR2: O, fehlender Operand

U5223-J-Z125-3

177

Bezugnahme auf Merkmale
· Das Typenmerkmal U (undefiniert) erhalten Namen oder variable Parameter, die zum Abfragezeitpunkt noch nicht definiert sind, bzw. die keinem der oben genannten Typen zugeordnet werden können.
Speziell haben das Typenmerkmal U:
Namen, die eine LTROG-Anweisung kennzeichnen oder die eine EQU-Anweisung ohne dritten Operanden kennzeichnen,
SETC-Parameter, deren Wert kein Name ist, variable Systemparameter, außer &SYSLIST(n), Literale als Operanden von Makroaufrufen.

178

U5223-J-Z125-3

Bezugnahme auf Merkmale

5.5.8.2

L' Bezugnahme auf das Längenmerkmal
Das Längenmerkmal eines Namens oder eines variablen Parameters ist ein numerischer Wert, der die Länge des bezeichneten Speicherbereichs in byte wiedergibt (Beispiele siehe auch bei I' Bezugnahme auf das Ganzzahligkeitsmerkmal).
Die Bezugnahme auf das Längenmerkmal kann nur als Element von arithmetischen Makroausdrücken verwendet werden.

Das Längenmerkmal ist 1 bei Namen oder variablen Parametern, die eine EQU-Anweisung ohne Längenangabe bezeichnen (siehe 4.2, EQU-Anweisung) und Namen oder variablen Parametern, deren Typenmerkmal J, T oder N ist. Verwendung von L'* in DC- und DS-Anweisungen, sowie in Literalen.
Das Längenmerkmal ist 0 bei Namen oder variablen Parametern, deren Typenmerkmal M, O oder U ist.
Das Längenmerkmal von * (L'*) ist gleich der Länge der Instruktion, in der die Bezugnahme vorkommt.

Beispiele
Name
&A &C

Operation
SETB SETA

Operanden
(L'&B EQ 4) L'&X+30

U5223-J-Z125-3

179

Bezugnahme auf Merkmale

5.5.8.3

S' Bezugnahme auf das Skalenfaktormerkmal
Das Skalenfaktormerkmal eines Namens oder variablen Parameters ist ein numerischer Wert, der die Zahl der Stellen angibt, die der gebrochene Teil von Festpunkt-, Gleitpunkt- und Dezimalkonstanten hat (Beispiele siehe bei I' Bezugnahme auf das Ganzzahligkeitsmerkmal).
Das Skalenfaktormerkmal kann nur für Namen abgefragt werden, die die genannten Konstantentypen bezeichnen und für symbolische Parameter oder SETC-Parameter, deren Wert der Name einer entsprechenden Konstanten ist.
Die Bezugnahme auf das Skalenfaktormerkmal darf nur als Element von arithmetischen Makroausdrücken vorkommen.
Das Skalenfaktormerkmal einer Festpunkt- oder Gleitpunktzahl entspricht dem Wert des Skalenfaktors.
Das Skalenfaktormerkmal einer Dezimalzahl ist die Anzahl der Ziffern rechts vom Dezimalpunkt.

180

U5223-J-Z125-3

Bezugnahme auf Merkmale

5.5.8.4

I' Bezugnahme auf das Ganzzahligkeitsmerkmal
Das Ganzzahligkeitsmerkmal eines Namens oder variablen Parameters ist ein numerischer Wert, der sich auf den ganzzahligen Teil von Festpunkt-, Gleitpunkt- und Dezimalzahlen im Objektcode bezieht. Es wird errechnet aus Längen- und Skalenfaktormerkmal.
Die Bezugnahme auf das Ganzzahligkeitsmerkmal kann nur für Namen und symbolische Parameter abgefragt werden, die die genannten Konstantentypen bezeichnen und für SETC-Parameter, deren Wert der Name einer entsprechenden Konstanten ist.
Die Bezugnahme auf das Ganzzahligkeitsmerkmal darf nur als Element von arithmetischen Makroausdrücken vorkommen.

Berechnung des Ganzzahligkeitsmerkmals

Typenmerkmal Ganzzahligkeitsmerkmal

H

F

I = 8*L-S-1

G

D

E

L

I = 2*(L-1)-S

K

P

I = 2*L-S-1

Z

I = L-S

für alle Formeln gilt

L = Längenmerkmal S = Skalenfaktormerkmal

Beispiele
Name
CONF1 CONF2 * CONFL1 CONFL2 * COND1 COND2 COND3 COND4

Operation
DC DC
DC DC
DC DC DC DC

Operanden
HS6'-15.75' FS8'100.3E-2'
ES2'46.415' DS5'-3.729'
P'+1.25' P'79.68' Z'-543' Z'79.68'

L = 2, S = 6, I = 9 L = 4, S = 8, I = 23
L = 4, S = 2, I = 4 L = 8, S = 5, I = 9
L = 2, S = 2, I = 1 L = 3, S = 2, I = 3 L = 3, S = 0, I = 3 L = 4, S = 2, I = 2

U5223-J-Z125-3

181

Bezugnahme auf Merkmale

5.5.8.5

K' Bezugnahme auf das Zählermerkmal
Das Zählermerkmal eines variablen Parameters ist ein numerischer Wert. Die Bezugnahme auf das Zählermerkmal kann nur als Element von arithmetischen Makroausdrücken verwendet werden.

Zählermerkmal von symbolischen Parametern
Das Zählermerkmal eines symbolischen Parameters entspricht der Anzahl der Zeichen des entsprechenden Operanden aus dem Makroaufruf. Das Zählermerkmal eines fehlenden Operanden ist 0.
Ist der Operand eine Unterliste, dann schließt das Zählermerkmal die Klammern und Kommas der Unterliste mit ein. Man kann sich auf das Zählermerkmal jedes Suboperanden, unabhängig von der Schachtelungstiefe, beziehen (Beispiel siehe N' Bezugnahme auf das Anzahlmerkmal).
Enthält der Operand eines Makroaufrufs variable Parameter, dann entspricht das Zählermerkmal der Anzahl der Zeichen, nachdem die variablen Parameter durch ihre aktuellen Werte ersetzt wurden.

Zählermerkmal von SET-Parametern und variablen Systemparametern

SETA-Parameter

Anzahl der Zeichen, die benötigt werden, um den aktuellen Wert als Dezimalzahl ohne führende Nullen anzugeben.

Beispiele

SETB-Parameter SETC-Parameter
&SYSDATE &SYSECT &SYSLIST(n[,m]) &SYSLIST &SYSMOD &SYSNDX &SYSPARM &SYSTEM &SYSTIME &SYSTSEC &SYSVERM &SYSVERS

&A1 SETA 111 &A2 SETA X'FF' &A3 SETB (K'&A2 EQ 3)
1 Anzahl der Zeichen

K von &A1 = 3 K von &A2 = 3 Wert von &A3 = 1

9 Anzahl der Zeichen Anzahl der Zeichen unzulässig 2 4 Anzahl der Zeichen 4 6 Anzahl der Zeichen 6 6

182

U5223-J-Z125-3

Bezugnahme auf Merkmale

5.5.8.6

N' Bezugnahme auf das Anzahlmerkmal
Das Anzahlmerkmal ist ein numerischer Wert und kann abgefragt werden für einen symbolischen Parameter, für einen SET-Parameter, oder für den gesamten Operandeneintrag eines Makroaufrufs. Die Bezugnahme auf das Anzahlmerkmal kann nur als Element von arithmetischen Makroausdrücken verwendet werden.
Anzahlmerkmal eines symbolischen Parameters Das Anzahlmerkmal eines symbolischen Parameters entspricht der Zahl der Suboperanden der entsprechenden Operandenunterliste aus dem Makroaufruf. Es ist möglich, sich auf das Anzahlmerkmal jedes Suboperanden der Operandenunterliste zu beziehen. Über den variablen Systemparameter &SYSLIST können auch Stellungsoperanden eines Makroaufrufs angesprochen werden, die keinen entsprechenden symbolischen Parameter in der Musteranweisung haben. Entspricht dem angesprochenen symbolischen Parameter keine Unterliste, sondern nur ein einzelner Operand, dann ist das Anzahlmerkmal 1. Fehlt der Operand im Makroaufruf, ist das Anzahlmerkmal 0.
Anzahlmerkmal von SET-Parametern Das Anzahlmerkmal eines SET-Parameters entspricht seiner aktuellen Dimension (siehe 6.2, Indizierte SET-Parameter).
Anzahlmerkmal von &SYSLIST Das Anzahlmerkmal des variablen Systemparameter &SYSLIST entspricht der Anzahl der Stellungsoperanden im Operandeneintrag eines Makroaufrufs.

U5223-J-Z125-3

183

Bezugnahme auf Merkmale

Beispiele

Name

Operation

* Musteranweisung MAC

* Makroaufruf MAC

Operanden &P1,&P2,&P3,&P4 15,'NAME',ADR,(X,(Y,Z))

Bezugnahme auf (K'.., N'..) Wert

KN

&SYSLIST

-4

&SYSLIST(1)

&P1

15

21

&SYSLIST(1,2)

&P1(2)

''

00

&SYSLIST(2)

&P2

'NAME'

61

&SYSLIST(3)

&P3

ADR

31

&SYSLIST(4)

&P4

(X,(Y,Z)) 9 2

&SYSLIST(4,1)

&P4(1)

X

11

&SYSLIST(4,2)

&P4(2)

(Y,Z)

52

&SYSLIST(4,2,1) &P4(2,1) Y

11

184

U5223-J-Z125-3

Bezugnahme auf Merkmale

5.5.8.7

D' Bezugnahme auf das Definitionsmerkmal
Das Definitionsmerkmal zeigt an, ob ein Name, der auch durch Ersetzung eines symbolischen Parameters entstanden sein kann, schon definiert ist oder noch nicht.
Die Bezugnahme auf das Definitionsmerkmal kann als Element in Vergleichsausdrücken, in logischen Ausdrücken und in arithmetischen Makroausdrücken verwendet werden.
Das Definitionsmerkmal hat den Wert 1 oder 0.
1 Der angesprochene Name oder symbolische Parameter ist definiert. 0 Der angesprochene Name oder symbolische Parameter ist noch nicht definiert.
Bei der Verwendung der Bezugnahme auf das Definitionsmerkmal in einem arithmetischen Makroausdruck werden die arithmetischen Werte +1 oder +0 eingesetzt.
Mit Hilfe der Bezugnahme auf das Definitionsmerkmal ist es z.B. möglich, in einer Schleifenverarbeitung abzufragen, ob ein Name schon definiert wurde und entsprechend die Definition zu durchlaufen oder nicht (siehe Beispiele, Makrodefinition 1); abzufragen, ob ein Name schon definiert wurde und davon abhängig, ob schon Bezug auf die Merkmale genommen werden kann (siehe Beispiele, Makrodefinition 2).

U5223-J-Z125-3

185

Bezugnahme auf Merkmale

Beispiele

Name

Operation

* Makrodefinition 1

MACRO

.

.

AIF

NAME

DC

.

.

.SYM1

SR

AIF

IC

AGO

HCONST

ANOP

LH

AGO

FCONST

ANOP

L

.END

MEND

* Makrodefinition 2

MACRO

.

.

AIF

&TYP

SETC

AGO

.

.

.SYM1

ANOP

&TYP

SETC

.SYM2

ANOP

.

.

MEND

Operanden
(D'NAME).SYM1 F'0'
R1,R1 (T'NAME EQ 'F').FCONST,(T'NAME EQ 'H').HCONST R1,NAME .END R1,NAME .END R1,NAME
(D'NAME).SYM1 'U' .SYM2
T'NAME

186

U5223-J-Z125-3

Bezugnahme auf Merkmale

6

Variable Parameter

6.1

Symbolische Parameter

Symbolische Parameter werden in der Musteranweisung definiert und können dann im Namens-, Operations- und Operandeneintrag der Modellanweisungen einer Makrodefinition verwendet werden. Beim Aufruf des Makros müssen den symbolischen Parametern dann die jeweils aktuellen Werte zugewiesen werden. Ein symbolischer Parameter kann, außer in der Musteranweisung, mit Hilfe eines oder mehrerer variabler Parameter generiert werden (siehe 5.5.4, generierte variable Parameter).
Symbolische Parameter sind lokale Symbole. D.h., sie sind nur innerhalb einer Makrogenerierung bekannt, da ihnen jeweils im Makroaufruf neue Werte zugewiesen werden.

Kennwort- und Stellungsoperanden
Die symbolischen Parameter werden in der Musteranweisung im Namenseintrag und im Operandeneintrag definiert. Die Art des Operandeneintrags in der Musteranweisung bestimmt, ob es sich um Kennwort- oder Stellungsoperanden handelt (siehe Beispiel und 7.1.1, Stellungs- und Kennwortoperanden).
Kennwortoperanden sind in der Musteranweisung durch das Gleichheitszeichen (=) kenntlich gemacht. Ihnen kann in der Musteranweisung ein Anfangswert zugewiesen werden. Im Makroaufruf werden die aktuellen Werte über das Kennwort zugewiesen. Die Reihenfolge der Kennwortoperanden im Makroaufruf ist beliebig.
Das Kennwort im Makroaufruf ist der Name des variablen Parameters aus der Musteranweisung ohne das &-Zeichen, oder ein variabler Parameter, aus dem das Kennwort generiert wird.
Stellungsoperanden werden auf Grund ihrer Stellung im Operandeneintrag beim Makroaufruf die aktuellen Werte zugewiesen. D.h., symbolische Parameter und die zugewiesenen aktuellen Werte müssen in der Musteranweisung und im Makroaufruf in der gleichen Reihenfolge stehen.

U5223-J-Z125-3

187

Symbolische Parameter

Regeln
Ein symbolischer Parameter darf maximal aus 64 Zeichen bestehen. Das erste Zeichen muß ein kaufmännisches Und (&) sein. Symbolische Parameter dürfen nicht mit der Zeichenfolge &SYS beginnen (siehe auch 6.3, variable Systemparameter). Leerzeichen innerhalb eines symbolischen Parameters sind nicht zulässig. Derselbe variable Parameter darf nicht in derselben Makrodefinition als symbolischer Parameter und als SET-Symbol definiert werden.

Beispiel

Name

Operation Operanden

* Makrodefinition

MACRO

&NAME

MSYM

&NAME

EQU

MVC

B

.

.

&PAR1

EQU

MEND

&PAR1,&PARA=,&PARB= * &PARB,&PARA &PAR1
*

(01)

* Makroaufruf

BEGIN

MSYM

STOP,PARA=CONST,PARB=FIELD (02)

* Generierte Instruktionen

BEGIN

EQU

*

MVC

FIELD,CONST

B

STOP

.

.

STOP

EQU

*

(03) (04)
(05)

(01) Musteranweisung; &PAR1 ist ein Stellungsoperand, &PARA und &PARB sind Kennwortoperanden.
(02) Makroaufruf; &PAR1 wird der aktuelle Wert STOP zugewiesen, &PARA über das Kennwort PARA der Wert CONST und &PARB über das Kennwort PARB der Wert FIELD.
(03), (04), (05) In diesen Instruktionen werden die symbolischen Parameter durch die zugewiesenen aktuellen Werte ersetzt.

188

U5223-J-Z125-3

SET-Parameter

6.2

SET-Parameter

SET-Parameter sind variable Hilfsfelder, denen zur Übersetzungszeit mit Hilfe von SETAnweisungen (siehe 7.2) Werte zugewiesen werden können. Sie werden entweder explizit mit einer GBLx- oder LCLx-Anweisung (siehe 7.2) definiert oder, bei lokalen SETParametern, implizit durch eine SET-Anweisung (siehe 7.2). Sie können im Namens-, Operations- und Operandeneintrag von Modellanweisungen verwendet werden. Durch die explizite Definition erhalten SET-Parameter den Anfangswert Null, bzw. leere Zeichenfolge. Diesen kann man mit Hilfe der SET-Anweisungen verändern und den SET-Parametern neue Feldinhalte zuweisen. Die SET-Parameter in den Modellanweisungen werden dann jeweils durch ihren aktuellen Wert ersetzt.
SET-Parameter können mit Hilfe eines oder mehrerer weiterer variabler Parameter generiert werden (siehe 5.3.3, generierte variable Parameter). Die Verwendung von SETParametern ist nicht auf Makros beschränkt. Die lokale oder globale Definition und der Einsatz solcher Hilfsfelder ist im ganzen Quellprogramm möglich (siehe Kap. 8).
Werden SET-Parameter explizit definiert, muß die Definition jeweils vor der ersten Verwendung durchlaufen werden. Wegen der Übersichtlichkeit empfiehlt es sich, alle Definitionen direkt nach der jeweiligen Musteranweisung aufzuführen.

Sowohl globale, als auch lokale SET-Parameter können einen arithmetischen, einen binären oder einen Zeichenwert als Feldinhalt haben. Diese Unterscheidung wird bereits in der GBLx-, bzw. LCLx-Anweisung festgelegt.
Das x in beiden Anweisungen kann durch folgende Zeichen ersetzt werden (siehe 7.2, GBLx- und LCLx-Anweisung):
A SET-Parameter mit einem arithmetischen Wert (SETA-Parameter) B SET-Parameter mit einem binären Wert (SETB-Parameter) C SET-Paramter mit einer Zeichenfolge als Wert (SETC-Parameter)

Regeln
Ein SET-Parameter darf maximal aus 64 Zeichen bestehen. Das erste Zeichen muß ein kaufmännisches Und (&) sein. SET-Parameter dürfen nicht mit der Zeichenfolge &SYS beginnen (siehe auch 6.3, variable Systemparameter). Leerzeichen innerhalb von SET-Parametern sind nicht zulässig.

U5223-J-Z125-3

189

SET-Parameter
Programmierhinweis Verwendet man in einer SET-Anweisung den Namen einer Variablen, die im Quellprogramm mit name DS CL(A-B) definiert ist, so meldet der ASSEMBH einen SEMANTIC ERROR (E35), wenn diese Definition nach dem Makroaufruf steht. Steht diese Definition vor dem Makroaufruf oder wird statt dem geklammerten Ausdruck für CL der errechnete Wert eingesetzt, so akzeptiert der ASSMEMBH die SET-Anweisung.
Vordefinierte SET-Parameter Den vordefinierten SET-Parametern können ohne vorherige Vereinbarung Werte zugewiesen werden. SETA-Parameter, global: &AGm
lokal: &ALm mit 0 m 99 SETB-Parameter, global: &BGn
lokal: &BLn mit 0 n 999 SETC-Parameter, nur global: &CGm mit 0 m 99 Hinweis
Vordefinierte SET-Parameter werden von verschiedenen Tools benützt und vom ASSEMBH nur noch aus Kompatibilitätsgründen unterstützt. Für die Erstellung neuer Programme ist daher von ihrer Verwendung abzuraten.

190

U5223-J-Z125-3

SET-Parameter
Globale und lokale SET-Parameter
Globale SET-Parameter werden mit der GBLx-Anweisung definiert. Sie können zur Weitergabe von Werten zwischen Makrodefinitionen, bzw. Makrodefinition und Quellprogramm verwendet werden. Im zweiten Fall muß der Parameter auch im Quellprogramm definiert werden. Ein globaler SET-Parameter mit seinem Wert ist dann in jeder Makrodefinition, bzw. im Quellprogramm bekannt, wenn er dort auch definiert worden ist. Durch die erneute Definition wird jedoch sein Anfangswert nicht wieder auf Null gesetzt.
Lokale SET-Parameter können mit der LCLx-Anweisung definiert werden. Sie sind dann nur in der jeweiligen Makrodefinition, bzw. im Quellprogramm, bekannt. Wird der gleiche SET-Parameter in einer weiteren Makrodefinition ebenfalls als lokal definiert, dann gilt er in jeder Makrodefinition als eigener SET-Parameter. Sein jeweiliger Wert ist in anderen Makrodefinitionen, auch in einer inneren, nicht bekannt.
Bei lokalen SET-Parametern gibt es die Möglichkeit der impliziten Vereinbarung. Hier ist dann keine LCLx-Anweisung notwendig (siehe unten).

U5223-J-Z125-3

191

SET-Parameter

Beispiele

Name

Operation Operanden

* Makrodefinition 1

MACRO

&NAME

LOAD1

GBLA

*

&NAME

LR

&A

SETA

MEND

&A
15,&A &A+1

* Makrodefinition 2

MACRO

LOAD2

GBLA

*

LR

&A

SETA

MEND

&A
15,&A &A+1

* Makroaufrufe

BEGIN

LOAD1

LOAD2

LOAD1

LOAD2

* Generierte Instruktionen

.

.

BEGIN

LR

15,0

LR

15,1

LR

15,2

LR

15,3

.

.

(01) (02)
(01) (02)

(01) Definition des globalen SETA-Parameters &A; &A muß in jeder Makrodefinition definiert werden, in der der SETA-Parameter verwendet werden soll.
(02) Da &A als global definiert wurde, setzt die Addition nicht jedesmal auf dem Anfangswert 0 auf, sondern auf dem Ergebnis der vorangegangenen Addition, unabhängig davon, in welcher Makrodefinition diese vorkam.

192

U5223-J-Z125-3

SET-Parameter

Im folgenden Beispiel ist &A in beiden Makrodefinitionen als lokal definiert. Die übrigen Instruktionen sind dieselben wie im ersten Beispiel. Hier weist die Definition des SETAParameters bei jedem Aufruf des Makro den Anfangswert 0 zu, daher beeinflußt die SET-Anweisung den Wert von &A im LR-Befehl nicht mehr.

Name

Operation Operanden

* Makrodefinition 1

MACRO

&NAME

LOAD1

LCLA

*

&NAME

LR

&A

SETA

MEND

&A
15,&A &A+1

* Makrodefinition 2

MACRO

LOAD2

LCLA

*

LR

&A

SETA

MEND

&A
15,&A &A+1

* Makroaufrufe

BEGIN

LOAD1

LOAD2

LOAD1

LOAD2

* Generierte Instruktionen

.

.

BEGIN

LR

15,0

LR

15,0

LR

15,0

LR

15,0

.

.

U5223-J-Z125-3

193

SET-Parameter

Implizit vereinbarte lokale SET-Parameter
Lokale SET-Parameter gelten bereits als vereinbart, wenn sie im Namenseintrag einer SET-Anweisung auftreten. Der Assembler interpretiert jeden nicht vereinbarten SET-Parameter im Namenseintrag einer SET-Anweisung als lokalen SET-Parameter.
Implizit vereinbarte lokale SET-Parameter erhalten als Anfangswert den Wert, der im Operandeneintrag der SET-Anweisung spezifiziert ist. In diesem Fall muß im Operationseintrag der SET-Anweisung angegeben werden, um welche Art von SET-Parameter es sich handelt (siehe 7.2, SETA-, SETB- und SETC-Anweisung).

Indizierte SET-Parameter Globale und lokale SET-Parameter können als indizierte SET-Parameter definiert werden.

Format von indizierten SET-Parametern

&par(d)

&par ist der Name des SET-Parameters, unter dem die d Felder hintereinander angesprochen werden.

d

Dimension; 1 d 231-1

In der Definition des SET-Parameters (GBLx oder LCLx) gibt d die Anzahl der Felder an, die unter dem Namen &par hintereinander stehen sollen. Hier kann d nur ein dezimaler selbstdefinierender Wert sein.

Mit den SET-Anweisungen können den einzelnen Feldern Werte zugewiesen werden. Im Namenseintrag der SET-Anweisungen und bei der Verwendung in weiteren Modellanweisungen bezeichnet d das jeweilige Feld, das angesprochen werden soll. In den SET-Anweisungen kann ein Wert für d angegeben werden, der größer ist als der Wert von d aus der Definition. In diesem Fall wird der Wert von d aus der Definition durch den höheren Wert ersetzt und dieser gilt dann als Dimension des SET-Parameters. Hier ist d ein arithmetischer Makroausdruck.

Die Dimension eines SET-Parameters kann mit Hilfe des Anzahlmerkmals abgefragt werden:
N'&par ergibt die jeweils aktuelle Dimension.

Indizierte SET-Parameter können ebenso wie andere variable Parameter mit variablen Parametern oder mit alphanumerischen Zeichen verkettet werden.

194

U5223-J-Z125-3

Beispiel

Name

Operation

* Definition LCLC

* Zuweisung &PARAM(1) &PARAM(2)

SETC SETC . .

Operanden
&PARAM(20)
'FIRST' 'SECOND'

SET-Parameter

U5223-J-Z125-3

195

Variable Systemparameter

6.3

Variable Systemparameter

Variablen Systemparametern werden vom Assembler Werte zugewiesen. Der Programmierer kann sie im Namens- Operations- und Operandeneintrag von Instruktionen verwenden, kann ihnen jedoch, außer bei &SYSMOD und &SYSLIST(n), keine neuen Werte zuweisen. Die variablen Systemparameter können mit Hilfe eines oder mehrerer variabler Parameter generiert werden (siehe 5.3.3, generierte variable Parameter).
Variable Systemparameter können mit alphanumerischen Zeichen verkettet werden. Bei ihrer Verwendung müssen die Syntaxregeln der entsprechenden Einträge eingehalten werden.

Es gibt variable Systemparameter mit lokalem oder mit globalem Charakter:
Lokale variable Systemparameter werden bei jedem Makroaufruf neu zugewiesen, sie sind also auf die einzelne Makrodefinition begrenzt. Sie können nur innerhalb von Makrodefinitionen verwendet werden.
Lokale variable Systemparameter sind: &SYSECT, &SYSLIST, &SYSNDX, &SYSTSEC und &SYSVERM.
Globale variable Systemparameter werden bei Beginn der Übersetzung zugewiesen und ihr Wert bleibt während der Übersetzung konstant.
Globale variable Systemparameter sind: &SYSDATE, &SYSPARM, &SYSTEM, &SYSTIME und &SYSVERS.
Der variable Systemparameter &SYSMOD hat hier eine Sonderstellung. Sein Standardwert wird bei Beginn der Übersetzung zugewiesen, er kann aber während des Programmablaufs geändert werden.

196

U5223-J-Z125-3

Variable Systemparameter

&SYSDATE
Der Wert von &SYSDATE ist das Datum der Übersetzung. Dieser Wert wird zu Beginn der Übersetzung berechnet und bleibt dann konstant.

Wert von &SYSDATE

mmttjjddd

mm Monat

tt

Tag

jj

Jahr

ddd Tagesnummer innerhalb des Jahres

Das Typenmerkmal von &SYSDATE ist U, das Zählermerkmal ist 9.

Beispiel Im Beispiel ist das Datum der Übersetzung der 20. Oktober 1989.

Name

Operation Operanden

* Makrodefinition

MACRO

MDATE

.

.

B

DC

DS

&ENDE

EQU

MEND

&ENDE
&ENDE C'&SYSDATE' 0H *

* Makroaufruf MDATE

ENDE

* Generierte Instruktionen

.

.

B

ENDE

DC

C'102089293'

DS

0H

ENDE

EQU

*

.

.

U5223-J-Z125-3

197

Variable Systemparameter
&SYSECT
Der Wert von &SYSECT ist der Name des jeweils aktuellen Programmabschnitts zum Zeitpunkt des Makroaufrufs. Eine Zusatzinformation zu &SYSECT bietet der variable Systemparameter &SYSTSEC, der jeweils den Typ des entsprechenden Programmabschnitts enthält (siehe Beschreibung von &SYSTSEC).
Tritt &SYSECT in einer Makrodefinition auf, dann ist sein Wert der Name der letzten START-, CSECT-, DSECT-, XDSEC- oder COM-Anweisung, die vor dem Makroaufruf verarbeitet wurde. Hierbei wird nicht berücksichtigt, ob die Anweisung korrekt war, falls der Fehler nicht dazu geführt hat, daß der Programmabschnitt nicht definiert wurde. Für die jeweilige Makrostufe ist der Wert von &SYSECT während der Verarbeitung einer Makrodefinition konstant, unabhängig von CSECT-, DSECT-, XDSEC- oder COM-Anweisungen oder von inneren Makroaufrufen.
Wenn dagegen innerhalb einer Makrodefinition CSECT-, DSECT-, XDSEC- oder COMAnweisungen auftreten, beeinflussen sie den Wert von &SYSECT für alle folgenden inneren Makroaufrufe in dieser Makrodefinition und für alle folgenden Makroaufrufe einer anderen Makrostufe.
Das Typenmerkmal von &SYSECT ist U, das Zählermerkmal entspricht jeweils der Zahl der Zeichen, die den Wert von &SYSECT darstellen.

198

U5223-J-Z125-3

Variable Systemparameter

Beispiel

Name

Operation Operanden

* Makrodefinition, äußerer Makro

MACRO

MACA

&NAME,&CSECT

&NAME

DC

C'&SYSECT'

&CSECT

CSECT

DC

C'&SYSECT'

MACI

MEND

* Makrodefinition, innerer Makro

MACRO

MACI

DC

C'&SYSECT'

MEND

* Programmabschnitt mit Makroaufrufen

PROG

START

.

.

MACA

FIRST,ACSECT

***************************************

MACA

SECOND,BCSECT

* Generierte Instruktionen

FIRST

DC

C'PROG'

ACSECT

CSECT

DC

C'PROG'

DC

C'ACSECT'

***************************************

SECOND

DC

C'ACSECT'

BCSECT

CSECT

DC

C'ACSECT'

DC

C'BCSECT'

(01)
(01) (02)
(03)
(03) (04)

(01) Die beiden Anweisungen stehen in der gleichen Makrostufe, der Makro wurde in PROG aufgerufen.
(02) Die DC-Anweisung stammt aus dem Aufruf des inneren Makro MACI. Der Aufruf von MACI wird erst nach der CSECT-Anweisung ACSECT verarbeitet, daher ist der Wert von &SYSECT dann ACSECT.
(03) Die beiden Anweisungen stehen wieder in der gleichen Makrostufe, die letzte vorhergehende CSECT-Anweisung war aber ACSECT. Daher ist der Wert von &SYSECT in beiden Anweisungen ACSECT.
(04) Die Anweisung kommt wieder aus dem inneren Makroaufruf MACI. Das ist eine andere Makrostufe und daher nimmt &SYSECT den Namen der vorhergehenden CSECT-Anweisung BCSECT an.

U5223-J-Z125-3

199

Variable Systemparameter

&SYSLIST
Mit &SYSLIST kann man sich anstelle von symbolischen Parametern auf Stellungsoperanden von Makroaufrufen beziehen. Mit Hilfe des Index von &SYSLIST kann jeder Stellungsoperand, insbesondere jede Unterliste, in einem Makroaufruf angesprochen werden, auch wenn kein entsprechender symbolischer Parameter in der Musteranweisung definiert ist.
Auf diese Weise können auch die Merkmale der Operanden eines Makroaufrufs angesprochen werden.

Format von &SYSLIST

&SYSLIST(n[,m[,...]])

n

bezeichnet den n-ten Stellungsoperanden eines Makroaufrufs.

Bei n = 0 erhält man den Namenseintrag des Makroaufrufs als Ergebnis.

m

bezeichnet den m-ten Operanden derjenigen Operandenunterliste, die der n-te

Operand eines Makroaufrufs ist.

Das Indizieren kann weiter ausgedehnt werden, um sich auf jeden Suboperanden einer Operandenunterliste zu beziehen (siehe 7.1.2, Operandenunterlisten).

n bzw. m kann jeder positive arithmetische Ausdruck sein, der als Operand einer SETAAnweisung möglich ist.

Wenn für einen Wert von n oder m kein Operand vorliegt, erhält man als Ergebnis eine leere Zeichenfolge.

Nur bei der Bezugnahme auf das Anzahlmerkmal des Operandeneintrags in einem Makroaufruf (N'&SYSLIST, siehe 5.5.8, Bezugnahme auf Merkmale) kann &SYSLIST ohne den Index n, bzw. m verwendet werden. In diesem Fall erhält man als Ergebnis die Anzahl der Stellungsoperanden im Makroaufruf.
Die Bezugnahme auf das Typenmerkmal (T'&SYSLIST(n)) liefert den Typ des jeweils angesprochenen Operanden.

200

U5223-J-Z125-3

Variable Systemparameter

Beispiel

Name

Operation Operanden

* Makrodefinition

MACRO

MLIST

&PAR

DC

DC

DC

DC

DC

MEND

&PAR C'&SYSLIST(2)' C'&SYSLIST(3,2)' C'&SYSLIST(4)' C'&SYSLIST(2,1)' C'&SYSLIST(3)'

* Makroaufruf MLIST

AAA,BBB,(C,D,,F),,H

* Generierte Instruktionen

AAA

DC

C'BBB'

DC

C'D'

DC

C''

DC

C'BBB'

DC

C'(C,D,,F)'

leere Zeichenfolge

U5223-J-Z125-3

201

Variable Systemparameter
&SYSMOD
Mit &SYSMOD kann die Auflösung eines modusabhängigen Systemmakros abhängig vom Adressierungsmodus (siehe 3.3.3) gesteuert werden. Bei Beginn der Übersetzung wird &SYSMOD der Standardwert 24 zugewiesen. Über den Systemmakro GPARMOD (siehe Einführung in die XS-Programmierung, Beschreibung [7]) kann der Wert von &SYSMOD geändert werden. Für SYSMOD sind nur die Werte 24 und 31 zugelassen. Das Typenmerkmal von &SYSMOD ist U, das Zählermerkmal ist 2. Bei der Auflösung von modusabhängigen Systemmakros wird der Wert von &SYSMOD als Voreinstellung des globalen Parametermodus verwendet (siehe PARMOD und GPARMOD, Einführung in die XS-Programmierung, Beschreibung).

202

U5223-J-Z125-3

Variable Systemparameter
&SYSNDX
Der Wert von &SYSNDX ist ein Zähler, der bei jedem verarbeiteten inneren oder äußeren Makroaufruf innerhalb einer Übersetzungseinheit um 1 erhöht wird. Der Zähler hat vier Stellen, beim ersten Makroaufruf wird er auf 0001 gesetzt, beim zweiten auf 0002, usw.
Da der Wert von &SYSNDX keinen zulässigen Namen darstellt, muß &SYSNDX mit einem gültigen Namen verkettet werden, wenn &SYSNDX zur Generierung von Namen verwendet werden soll.
Der Wert von &SYSNDX ist während der Verarbeitung einer Makrodefinition konstant, unabhängig von eventuellen inneren Makroaufrufen. Man kann &SYSNDX deshalb z.B. dazu verwenden, eindeutige Namen für Instruktionsfolgen zu erzeugen, die durch mehrfache Aufrufe der gleichen Makrodefinition generiert wurden.
Steht &SYNDX als Element in einem arithmetischen Ausdruck, dann wird sein Wert arithmetisch interpretiert.
Das Typenmerkmal von &SYSNDX ist U, das Zählermerkmal ist 4.

U5223-J-Z125-3

203

Variable Systemparameter

Beispiel

Name

Operation Operanden

* Makrodefinition, innerer Makro

MACRO

MACI

&PARAM

A&SYSNDX

SR

2,5

CR

2,5

BE

B&PARAM

B

A&SYSNDX

MEND

* Makrodefinition, äußerer Makro

MACRO

&NAME

MACA

&PARAM

&NAME

SR

2,4

B&SYSNDX

AR

2,6

MACI

&PARAM

B&PARAM

S

2,=F'1000'

A&SYSNDX

ST

2,WORT

MEND

* 1. Aufruf von MACA

ALPHA

MACA

XXX

* Generierte Instruktionen

ALPHA

SR

2,4

B0106

AR

2,6

MACI

XXX

A0107

SR

2,5

CR

2,5

BE

BXXX

B

A0107

BXXX

S

2,=F'1000'

A0106

ST

2,WORT

* 2. Aufruf von MACA

BETA

MACA

YYY

* Generierte Instruktionen

BETA

SR

2,4

B0108

AR

2,6

MACI

YYY

A0109

SR

2,5

CR

2,5

BE

BYYY

B

A0109

BYYY

S

2,=F'1000'

A0108

ST

2,WORT

(01)
(02) (04) (05)
(06) (03)
(07)
(08) (10) (11)
(12) (09)

204

U5223-J-Z125-3

Variable Systemparameter
(01) Diese Instruktion soll der 106. Makroaufruf in dieser Übersetzungseinheit sein. A&SYSNDX wird ersetzt durch A0106 und B&SYSNDX durch B0106 in den Instruktionen (02) und (03).
(04) 107. Makroaufruf, A&SYSNDX wird ersetzt durch A0107, siehe Instruktionen (05) und (06).
(07) 108. Makroaufruf, A&SYSNDX und B&SYSNDX werden ersetzt durch A0108 und B0108, siehe Instruktionen (08) und (09).
(10) 109. Makroaufruf, A&SYSNDX wird ersetzt durch A0109, siehe Instruktionen (11) und (12).

U5223-J-Z125-3

205

Variable Systemparameter
&SYSPARM
Der Wert von &SYSPARM ist eine Folge von maximal 255 Zeichen. Diese wird in einer SDF-Option definiert (siehe ASSEMBH, Benutzerhandbuch [1]) und in der Makroauflösung ausgewertet. D.h., daß z.B. über eine Option, die von außen eingegeben wird, die Verarbeitung bestimmter Instruktionsfolgen gesteuert werden kann. Das Typenmerkmal von &SYSPARM ist U, das Zählermerkmal entspricht der Anzahl der definierten Zeichen.

&SYSTEM

Der Wert von &SYSTEM ist die Betriebssystemversion unter der die Übersetzung läuft.

Wert von &SYSTEM

2vvv

2

steht für BS2000

vvv

Versionsbezeichnung des BS2000

Das Typenmerkmal von &SYSTEM ist U, das Zählermerkmal ist 4.

&SYSTIME

Der Wert von &SYSTIME ist die Tageszeit der Übersetzung. Dieser Wert wird zu Beginn der Übersetzung berechnet und bleibt dann konstant.

Wert von &SYSTIME

hhmmss

hh Stunde

mm Minute

ss

Sekunde

Das Typenmerkmal von &SYSTIME ist U, das Zählermerkmal ist 6.

206

U5223-J-Z125-3

Variable Systemparameter

&SYSTSEC
Der Wert von &SYSTSEC ist der Typ des jeweils aktuellen Programmabschnitts zum Zeitpunkt des Makroaufrufs. D.h., &SYSTSEC enthält jeweils den Typ des Programmabschnitts, dessen Name in &SYSECT abgelegt ist (siehe Beschreibung von &SYSECT).

Programmabschnitt
START CSECT DSECT COM XDSEC

Wert von &SYSTSEC
CSECT CSECT DSECT COM XDSEC

Tritt &SYSTSEC in einer Makrodefintion auf, dann ist sein Wert der Typ der letzten START-, CSECT-, DSECT-, COM- oder XDSEC-Anweisung, die vor dem Makroaufruf verarbeitet wurde. Hierbei wird nicht berücksichtigt, ob die Anweisung korrekt war, falls der Fehler nicht dazu geführt hat, daß der Programmabschnitt nicht definiert wurde.
Das Typenmerkmal von &SYSTSEC ist U, das Zählermerkmal entspricht jeweils der Zahl der Zeichen, die den Wert von &SYSTSEC bilden.

Beispiel

Name

Operation Operanden

*Makrodefinition

MACRO

MACDSECT

&NAME

DSECT

DS

&SYSECT

&SYSTSEC

MEND

&NAME 4F

*Programmabschnitt mit Makroaufruf

PROG

START

.

.

MACDSECT ADSECT

.

.

*Generierte Instruktionen

ADSECT

DSECT

DS

4F

PROG

CSECT

.

.

Zurückstellen auf den ursprünglichen Programmabschnitt
Fortsetzung des 1. Programmabschnitts

U5223-J-Z125-3

207

Variable Systemparameter

&SYSVERM
Der Wert von &SYSVERM ist die Versionsbezeichnung des Bibliotheksmakros in dem dieser Parameter verwendet wird.
Makrodefinitionen, die im Quellprogramm stehen, haben keine Versionsbezeichnung, daher ist hier die Verwendung von &SYSVERM nicht sinnvoll. Die Versionsbezeichnung wird in diesem Fall durch Leerzeichen ersetzt (VER ).

Wert von &SYSVERM

VERvvv

vvv

Versionsbezeichnung

Eine zu lange Versionsbezeichnung wird rechts abgeschnitten, eine zu kurze rechts mit Unterstrichen (_) aufgefüllt.

Das Typenmerkmal von &SYSVERM ist U, das Zählermerkmal ist 6.

Beispiele
Versionsbezeichnung Versionsbezeichnung Versionsbezeichnung

002 2 1234

ergibt ergibt ergibt

VER002 VER2__ VER123

&SYSVERS
Der Wert von &SYSVERS ist die Versionsbezeichnung des Quellprogramms, sofern dieses in einer Bibliothek steht.
Quellprogramme, die nicht aus einer Bibliothek eingelesen werden, haben keine Versionsbezeichnung, daher ist hier die Verwendung von &SYSVERS nicht sinnvoll. Die Versionsbezeichnung wird in diesem Fall durch Leerzeichen ersetzt (VER ).

Wert von &SYSVERS

VERvvv

vvv

Versionsbezeicnung

Eine zu lange Versionsbezeichnung wird rechts abgeschnitten, eine zu kurze rechts mit Unterstrichen (_) aufgefüllt (Beispiele siehe &SYSVERM).

Das Typenmerkmal von SYSVERS ist U, das Zählermerkmal ist 6.

208

U5223-J-Z125-3

Variable Systemparameter

7

Instruktionen der Makrosprache

7.1

Musteranweisung und Makroaufruf

Funktion
Die Musteranweisung gibt den Namen des Makro an und die symbolischen Parameter, die in dieser Makrodefinition vorkommen.
Der Makroaufruf ist eine Instruktion im Assembler-Quellprogramm. Durch die Verarbeitung des Makroaufrufs wird die Makrogenerierung angestoßen. Hierdurch werden die Instruktionen, die durch die Makrodefinition vorgegeben sind, unter Verwendung variabler Parameter in das Assembler-Programm eingefügt. Der Makroaufruf weist den symbolischen Parametern aus der Musteranweisung die jeweiligen aktuellen Werte zu.

Format der Musteranweisung

Name [&par]

Operation name

Operanden

pos_oper[,...]

[ keyw_oper[,...]

]

pos_oper[,...],keyw_oper[,...]

&par name

symbolischer Parameter Name des Makro

pos_oper Stellungsoperand, Format: &par

&par

symbolischer Parameter

keyw_oper Kennwortoperand, Format: &par=[vala]

&par

symbolischer Parameter

vala

Anfangswert

In einer Musteranweisung können mehrere Stellungs- und Kennwortoperanden gemischt auftreten. Ihre Reihenfolge ist beliebig.

U5223-J-Z125-3

209

Musteranweisung/Makroaufruf

Format des Makroaufrufs

Name
valn [ .sym ]
&par1

Operation name &par2

Operanden

pos_oper[,...]

[ keyw_oper[,...]

]

pos_oper[,...],keyw_oper[,...]

valn
.sym &par1

Name, der dem symbolischen Parameter im Namenseintrag der Musteranweisung zugewiesen werden soll Folgesymbol variabler Parameter oder Verkettung von variablen Parametern und alphanumerischen Zeichen; hieraus muß der Namenseintrag generiert werden. Der Wert von &par1 wird dem symbolischen Parameter &par im Namenseintrag der Musteranweisung zugewiesen.

name &par2

Name des Makro variabler Parameter oder Verkettung von variablen Parametern und alphanumerischen Zeichen; der Wert entspricht dem Makronamen.

pos_oper

Stellungsoperand, Format: val

val

Wert, der dem symbolischen Parameter aus der Musteranwei-

sung zugewiesen werden soll

oder variabler Parameter

keyw_oper

Kennwortoperand, Format: par=val

par

Kennwort, Name des symbolischen Parameters aus der

Musteranweisung (ohne &-Zeichen)

var

Wert, der dem symbolischen Parameter zugewiesen werden

soll

oder variabler Parameter

Im Makroaufruf können mehrere Stellungs- und Kennwortoperanden gemischt auftreten. Die Reihenfolge der Kennwortoperanden ist beliebig, die der Stellungsoperanden muß der Reihenfolge der Stellungsoperanden in der Musteranweisung entsprechen (Beispiel siehe 7.1.1).

210

U5223-J-Z125-3

Musteranweisung/Makroaufruf
Namenseintrag
Dem symbolischen Parameter im Namenseintrag der Musteranweisung wird der Namenseintrag des Makroaufrufs zugewiesen.
Enthält der Namenseintrag des Makroaufrufs einen variablen Parameter, muß dieser im Quellprogramm definiert sein, wenn der Makroaufruf im Quellprogramm steht, bzw. in der Makrodefinition definiert sein, in der der Makroaufruf steht.
Operationseintrag
Der Operationseintrag der Musteranweisung gibt den Namen an, mit dem der Makro aufgerufen werden muß. Dieser muß nach den Regeln für Namen gebildet sein (siehe 2.3, Namenseintrag). Bei einer Makrodefinition, die in einer Bibliothek vorliegt, muß er sich zusätzlich nach der LMS-Syntax richten (siehe LMS, Benutzerhandbuch [4]).
Liegen in einem Quellprogramm zwei oder mehr Makrodefinitionen mit demselben Namen im Operationseintrag vor, dann gilt die zuletzt eingelesene Makrodefinition als gültig bis zum Auftreten der nächsten Makrodefinition mit dem gleichen Namen.
Bei einer Makrodefinition im Quellprogramm ist es möglich, im Operationseintrag der Musteranweisung den mnemotechnischen Operationscode einer Assemblerinstruktion zu verwenden, ohne die Instruktion mit der OPSYN-Anweisung außer Kraft zu setzen. Die Definition des Makro muß vor seinem ersten Aufruf durchlaufen werden. In diesem Fall ist die ursprüngliche Funktion der Instruktion ausgeschaltet und jedes Auftreten dieser Instruktion gilt als Aufruf des entsprechenden Makros. Man beachte, daß nach der Bearbeitung einer Makrodefinition im Quellprogramm mit dem Operationscode 'MACRO' in der Musteranweisung keine weiteren Makros mehr eingelesen werden.
Soll eine Makrodefinition in einer Bibliothek den mnemotechnischen Operationscode einer Assemblerinstruktion als Namen erhalten, muß der entsprechende Operationscode vorher mit der OPSYN-Anweisung außer Kraft gesetzt werden.
Enthält der Operationseintrag des Makroaufrufs einen variablen Parameter, muß dieser im Quellprogramm definiert sein, wenn der Makroaufruf im Quellprogramm steht, bzw. in der Makrodefintion definiert sein, in welcher der Makroaufruf vorkommt.

U5223-J-Z125-3

211

Musteranweisung/Makroaufruf
Operandeneintrag
Der Operandeneintrag der Musteranweisung bestimmt das Format und den Aufbau des Operandeneintrags vom zugehörigen Makroaufruf. Der Makroaufruf weist den symbolischen Parametern aus der Musteranweisung aktuelle Werte zu.
Wird im Makroaufruf ein Operand weggelassen, dann wird dem entsprechenden symbolischen Parameter als Zeichenwert der Nullstring (kein Zeichen) zugeordnet, bzw. der arithmetische Wert Null. Eine Ausnahme sind hier Kennwortoperanden, denen in der Musteranweisung ein Anfangswert zugewiesen wurde.
Regeln für Operanden von Makroaufrufen
Ein Operand eines Makroaufrufs darf maximal 1020 Zeichen lang sein, auch nachdem eventuelle variable Parameter ersetzt wurden. Auch bei einem Kennwortoperanden darf der Wert 1020 Zeichen lang sein. Das Kennwort und das Gleichheitszeichen werden hier nicht mitgezählt.
Hochkommas in einem Operanden müssen paarweise auftreten.
Ein einzelnes Hochkomma innerhalb einer Zeichenfolge muß durch zwei Hochkommas dargestellt werden.
Eine Bezugnahme auf das Längenmerkmal (L') eines Namens ist als Operand erlaubt.
Linke und rechte Klammern müssen paarweise auftreten, außer sie stehen zwischen Hochkommas.
Beginnt ein Operand mit einer linken Klammer, dann wird er als Unterliste interpretiert. Folgt auf die schließende rechte Klammer kein Leerzeichen oder Komma, wird der gesamte Operand als Zeichenfolge und nicht als Unterliste interpretiert.
Stehen mehrere &-Zeichen hintereinander, muß ihre Anzahl geradzahlig sein, außer wenn ein &-Zeichen einen variablen Parameter kennzeichnet.
Ein Komma bezeichnet das Ende eines Operanden oder eines Unterlisten-Elementes, außer es steht zwischen Hochkommas.
Ist der Operand des Makroaufrufs ein Makroausdruck, dann erhält der entsprechende symbolische Parameter die Merkmale einer Zeichenkonstanten.
Enthält ein Operand eines Makroaufrufs einen variablen Parameter als Wert, dann muß dieser
im Quellprogramm definiert sein, wenn der Makroaufruf im Quellprogramm steht, bzw. in der Makrodefinition definiert sein, in der der Makroaufruf vorkommt.

212

U5223-J-Z125-3

7.1.1

Musteranweisung/Makroaufruf
Kennwort- und Stellungsoperanden
Kennwortoperanden sind in der Musteranweisung durch das Gleichheitszeichen (=) kenntlich gemacht. Ihnen kann in der Musteranweisung ein Anfangswert zugewiesen werden. Im Makroaufruf werden Kennwortoperanden Werte über das Kennwort zugewiesen. Die Reihenfolge der Kennwortoperanden im Makroaufruf ist beliebig. Es darf kein Komma angegeben werden, wenn ein Kennwortoperand im Makroaufruf weggelassen wird. Bei einem Kennwortoperanden im Makroaufruf kann der Wert, der zugewiesen werden soll, durch einen weiteren variablen Parameter generiert werden.
Stellungsoperanden werden auf Grund ihrer Stellung im Operandeneintrag zugewiesen. Die symbolischen Parameter und die zugewiesenen aktuellen Werte müssen in der Musteranweisung und im Makroaufruf in der gleichen Reihenfolge stehen. Soll einem Stellungsoperanden im Makroaufruf kein Wert zugewiesen werden, so wird er weggelassen und das folgende Trennkomma geschrieben. Werden die letzten Stellungsoperanden im Makroaufruf weggelassen, können auch die entsprechenden Kommas wegfallen. Der Wert, der einem Stellungsoperanden im Makroaufruf zugewiesen werden soll, kann durch einen variablen Parameter generiert werden. Im Makroaufruf können mehr Stellungsoperanden stehen als in der Musteranweisung angegeben wurden. In diesem Fall kann man sich nur über den variablen Systemparameter &SYSLIST auf die zusätzlichen Operanden beziehen (siehe 6.3).
Kennwort- und Stellungsoperanden können in der Musteranweisung und im Makroaufruf gemischt auftreten. Innerhalb der Stellungsoperanden muß aber die Reihenfolge in der Musteranweisung und im Makroaufruf übereinstimmen.

U5223-J-Z125-3

213

Musteranweisung/Makroaufruf

Beispiele

Name

Operation

* Musteranweisung

&NAME

MAC

* Makroaufruf 1

VAL

MAC

Operanden &P1,&P2=VAL2,&P3,&P4=,&P5 P4=VAL4,VAL1,VAL3,VAL5

&P1,&P3 und &P5 Stellungsoperanden; ihnen werden die Werte VAL1, VAL3 und VAL5

zugewiesen.

&P2

Kennwortoperand mit dem Anfangswert VAL2

&P4

Kennwortoperand; der Wert VAL4 wird über den Makroaufruf zuge-

wiesen.

* Makroaufruf 2

VAL

MAC

P4=VAL4,VAL1,,VAL5

In diesem Fall soll dem Stellungsoperanden &P3 kein Wert zugewiesen werden. Er ist im Makroaufruf durch das Komma ersetzt und erhält den Wert "leere Zeichenfolge".

214

U5223-J-Z125-3

7.1.2

Musteranweisung/Makroaufruf

Operandenunterlisten
Der Wert eines Stellungsoperanden beim Makroaufruf, bzw. der Wert eines Kennwortoperanden beim Makroaufruf oder in der Musteranweisung kann eine Operandenunterliste sein. Dabei gilt die gesamte Unterliste als ein Operand des Makroaufrufs und wird einem symbolischen Parameter aus der Musteranweisung zugeordnet.

Format der Operandenunterliste

val

Wert oder

neue Operandenunterliste

(val,val[,...])

Bezugnahme auf Suboperanden der Operandenunterliste

&P(n[,m[,...]])

&P

symbolischer Parameter aus der Musteranweisung, dem die Operandenun-

terliste zugeordnet wurde

n

bezeichnet den n-ten Suboperanden der Operandenunterliste und ist ein

positiver arithmetischer Makroausdruck

m

bezeichnet den m-ten Suboperanden der Unterliste, die ihrerseits den

n-ten Suboperanden einer Unterliste darstellt und ist ein positiver arithmeti-

scher Makroausdruck

Das Indizieren kann weiter ausgedehnt werden, um sich auf jeden Suboperanden innerhalb eines beliebigen Niveaus der Unterlisten zu beziehen.

U5223-J-Z125-3

215

Musteranweisung/Makroaufruf
Regeln
Unterlisten müssen mit "(" beginnen und mit ")" enden; andernfalls wird der Operand (bzw. das Unterlistenelement) als Zeichenkette interpretiert.
Operandenunterlisten können beliebig tief ineinander geschachtelt werden, wobei die Begrenzung nur durch die maximale Länge von Operanden gegeben ist.
Die maximale Länge von 1020 Zeichen für Operanden von Makroaufrufen bezieht sich hier auf die gesamte Unterliste, einschließlich Suboperanden, Kommas und Klammern.
Fehlende Suboperanden können ebenso wie bei den Stellungsoperanden durch ein Komma ersetzt werden und erhalten den Wert Null.
Wird in einer Instruktion ein Operand eines Makroaufrufs, der keine Unterliste ist, als Unterliste angesprochen, dann bezieht sich &P(1) auf den ganzen Operanden. &P(n) mit n > 1 hat dann den Wert Null, bzw. leere Zeichenfolge.
Die Suboperanden von Operandenunterlisten kann man bei Stellungsoperanden auch mit dem variablen Systemparameter &SYSLIST ansprechen (siehe 6.3).
Enthält eine Operandenunterliste einen variablen Parameter im Suboperanden, muß dieser
im Quellprogramm definiert sein, wenn der Makroaufruf im Quellprogramm steht, bzw. in der Makrodefinition definiert sein, in der der Makroaufruf vorkommt.
Leerzeichen sind in Operandenunterlisten zulässig und werden als Bestandteil eines Suboperanden erkannt. z.B. hat die Unterliste (1 ,2, 3) drei Suboperanden:
Sub1 = 1 Sub2 = 2 Sub3 = 3

216

U5223-J-Z125-3

Musteranweisung/Makroaufruf

Beispiel

Name

Operation

* Makrodefinition MACRO SUBEX AIF . . MEND

* Makroaufruf SUBEX

Operanden &P (&P(3,2,1) EQ 'F' OR &P(5) EQ '').SYM
(A,(B,C),(D,(E,F)),G,)

Operand im Aufruf Suboperanden

(A,(B,C),(D,(E,F)),G,)

&P(1) = A

&P(2) = (B,C)

&P(2,1) = B &P(2,2) = C

&P(3) = (D,(E,F)) &P(3,1) = D &P(3,2) = (E,F)

&P(4) = G &P(5) = ''

&P(3,2,1) = E &P(3,2,2) = F

In der AIF-Anweisung wird ersetzt &P(3,2,1) durch E

und &P(5)

durch '' (leere Zeichenfolge)

U5223-J-Z125-3

217

Musteranweisung/Makroaufruf

7.1.3

Äußere und innere Makroaufrufe
Ein Makroaufruf, der innerhalb einer Makrodefinition als Modellanweisung verwendet wird, ist ein innerer Makroaufruf. Der Aufruf der entsprechenden Makrodefinition, die den inneren Aufruf enthält, wird als äußerer Makroaufruf bezeichnet. Der äußere Makroaufruf kann im Quellprogramm stehen oder seinerseits innerer Makroaufruf in einer weiteren Makrodefinition sein.
Ein Makroaufruf im Quellprogramm wird auch als 1. Stufe bezeichnet. Der innere Makroaufruf in der zugehörigen Makrodefinition als 2. Stufe. Die zum Aufruf der 2. Stufe gehörende Makrodefinition kann wieder einen inneren Makroaufruf enthalten, der dann der 3. Stufe entspricht, usw.
Auf diese Weise können maximal 255 Stufen geschachtelt werden. Die mögliche Schachtelungstiefe hängt zusätzlich von der Komplexität der Makrodefinitionen und vom verfügbaren Speicherplatz ab.
Weitergabe von Werten über innere Makroaufrufe
Die Werte im Operandeneintrag des inneren Makroaufrufs ersetzen die symbolischen Parameter der zugehörigen Musteranweisung.
Es ist möglich, Werte von einem äußeren Makro über einen inneren Makroaufruf an die entsprechende zugehörige Makrodefinition weiterzugeben.
Dazu müssen entweder die symbolischen Parameter des äußeren Makro oder im äußeren Makro definierte SET-Parameter
als Operanden des inneren Makroaufrufs verwendet werden.
Die Werte, die im äußeren Makroaufruf als Operanden angegeben werden, ersetzen dann jeweils die entsprechenden symbolischen Parameter.

218

U5223-J-Z125-3

Musteranweisung/Makroaufruf

Beispiel

Name

Operation Operanden

* Makrodefinition 1

MACRO

&NAME

MADD

.

.

&NAME

MPACK

.

.

&NAME

AP

AP

AP

MEND

&ART,&F1,&F2,&F3,&F4
&F1,&F2,&F3,&F4
&F1,&F2 &F1,&F3 &F1,&F4

* Makrodefinition 2

MACRO

&NAME

MPACK

&NAME

PACK

PACK

PACK

PACK

MEND

&A1,&A2,&A3,&A4 &A1,&A1 &A2,&A2 &A3,&A3 &A4,&A4

* äußerer Makroaufruf

UNP

MADD

U,FIELD1,FIELD2,FIELD3,FIELD4

* Generierter innerer Makroaufruf

UNP

MPACK

FIELD1,FIELD2,FIELD3,FIELD4

* Generierte Instruktionen

.

.

UNP

AP

FIELD1,FIELD2

AP

FIELD1,FIELD3

AP

FIELD1,FIELD4

.

.

FIELD1

DC

CL6'000010'

.

.

(02) (03)
(04) (01)

(01) Äußerer Makroaufruf; (02) Musteranweisung von Makrodefinition 1; die symbolischen Parameter werden von
den Werten aus dem Makroaufruf ersetzt. (03) Innerer Makroaufruf; an die symbolischen Parameter in diesem Makroaufruf wer-
den die Werte des äußeren Makroaufrufs übergeben. (04) Musteranweisung von Makrodefinition 2; diese symbolischen Parameter werden
ersetzt von denen aus dem Makroaufruf (03) und damit von den übergebenen Werten.

U5223-J-Z125-3

219

Musteranweisung/Makroaufruf

7.1.4

Alternatives Anweisungsformat
Das alternative Anweisungsformat ist eine zusätzliche Möglichkeit der Formatdarstellung von Musteranweisung und Makroaufruf. Es kann außerdem für die LCLx- und GBLxAnweisung, sowie für Format 2 der AIF- und AGO-Anweisung eingesetzt werden.

Format

Name [&par]

Operation name

Operanden
operand, operand[, ...]

Fortsetzungszeichen
x x

Namenseintrag Operationseintrag operand
x

siehe Beschreibung des normalen Formats siehe Beschreibung des normalen Formats Stellungs- oder Kennwortoperand(en) bzw. Suboperanden bei Operandenunterlisten. irgendein Zeichen ungleich dem Leerzeichen

Beschreibung
Das alternative Anweisungsformat ermöglicht es, in jeder Zeile einen oder mehrere Operanden zu schreiben und in der nächsten Zeile mit dem nächsten Operanden fortzusetzen. Entsprechendes gilt für Suboperanden bei Operandenunterlisten.

Für den Operandeneintrag gilt:
Damit der Operandeneintrag in der nächsten Zeile, beginnend in der Fortsetzungsspalte, fortgesetzt werden kann, muß dem vorangehenden Operanden ein Komma folgen. Die Fortsetzungszeichenspalte muß dann ein Zeichen ungleich dem Leerzeichen enthalten.
Nach dem Komma und einem Leerzeichen können Bemerkungen bis einschließlich zur Endspalte geschrieben werden.
Ein Leerzeichen nach einem Operanden (kein Suboperand) zeigt das Ende des Operandeneintrags an.
Auch nach dem Ende des Operandeneintrags können Bemerkungen folgen. Steht hier in der Fortsetzungszeichenspalte ein Zeichen ungleich dem Leerzeichen, wird der Bemerkungseintrag in der nächsten Zeile, beginnend in der Fortsetzungsspalte, fortgesetzt.

220

U5223-J-Z125-3

Musteranweisung/Makroaufruf

Beispiel
Name * * * *

Operation OP1 OP2A
OP2B
OP3
OP4

Operanden
OPER1,OPER2,OPER3
OPER1, OPER2, OPER3
OPER1, OPER2,OPER3,OPER4, OPER5
OPER1, OPER2 COMMENT
OPER1,OPER2 (SUBOPER31, SUBOPER32)

COMMENT
COMMENT COMMENT COMMENT
COMMENT COMMENT COMMENT
COMMENT COMMENT

Fortsetzungszeichen
(01)
X X
(02) X X

X

X

(03)

COMMENT X COMMENT X

(04)

(01) Normales Format (02) Alternatives Anweisungsformat mit Bemerkungseintrag (03) Alternatives Anweisungsformat mit Bemerkungseintrag, der in der nächsten Zeile
fortgesetzt wird. (04) Alternatives Anweisungsformat mit Operandenunterlisten

U5223-J-Z125-3

221

ACTR

7.2

Beschreibung der Makroanweisungen

Makroanweisungen

ACTR Verzweigungen zählen
Funktion Die ACTR-Anweisung dient zur Begrenzung der AGO- und AIF-Verzweigungen, die in einer Makrodefinition oder im Assembler-Quellprogramm verarbeitet werden. Hierdurch können z.B. Endlosschleifen bei der Makrogenerierung vermieden werden.

Format

Name [.sym]
.sym arexp

Operation ACTR

Operanden arexp

Folgesymbol positiver arithmetischer Makroausdruck

Beschreibung
Die ACTR-Anweisung setzt einen Zähler auf den Wert, den arexp angibt. Bei jeder AGOoder AIF-Verzweigung wird der Zähler um 1 vermindert.
Die ACTR-Anweisung kann für jede Makrodefinition und für das Assembler-Quellprogramm gesetzt werden. Die verschiedenen Zähler sind voneinander unabhängig.
Ist der Zähler vor der Verzweigung Null, geschieht folgendes:
Bei einem Zähler, der für eine Makrodefinition gilt, wird die Verarbeitung dieser Makrodefinition und evtl. enthaltenen innerer Makrodefinitionen abgebrochen und die nächste Instruktion nach dem Makroaufruf verarbeitet.
Bei einem Zähler, der für das Assembler-Quellprogramm gilt, wird die Übersetzung abgebrochen und nur die bisher gefundenen Fehler gemeldet.

Programmierhinweis
Ist keine ACTR-Anweisung angegeben, nimmt der Assembler als Wert des Zählers 4096 an.
Beispiel siehe AGO-Anweisung

222

U5223-J-Z125-3

Makroanweisungen

AIF

AIF Bedingt verzweigen
Funktion Die AIF-Anweisung ermöglicht eine Verzweigung abhängig von Bedingungen.

Format 1

Name
[.sym1]
.sym1 .sym2 logexp

Operation AIF

Operanden (logexp).sym2

Folgesymbol im Standardformat Folgesymbol im Standardformat oder generiert logischer Ausdruck

Hinweis
Der Operationscode AIFB, der wie AIF verwendet werden kann, wird nur noch aus Kompatibilitätsgründen unterstützt.

Beschreibung
logexp wird nach den Regeln für logische Ausdrücke berechnet, das Ergebnis kann wahr oder falsch sein:
Ist logexp wahr, dann wird zu der Instruktion verzweigt, die durch .sym2 bezeichnet ist. Ist logexp falsch, dann wird die der AIF-Anweisung folgende Instruktion bearbeitet.

Programmierhinweise
1. Mit der AIF-Anweisung kann vorwärts oder rückwärts verzweigt werden. Durch die Verzweigung übersprungene Instruktionen werden dabei nicht generiert.
2. Mit der AIF-Anweisung kann nicht von einer Makrodefinition in eine andere oder vom Quellprogramm in eine Makrodefinition, bzw. umgekehrt, verzweigt werden.

U5223-J-Z125-3

223

AIF

Makroanweisungen

Beispiel
Das Beispiel zeigt einen Makro, in dem die symbolischen Parameter aus dem Makroaufruf nach bestimmten Bedingungen abgefragt werden. Nur, wenn alle geforderten Bedingungen erfüllt sind, wird die Bearbeitung durchgeführt.

Name
&NAME
&ERRIN .OK1 &ERRIN .OK2 &ERRIN .OK3
.MEND

Operation
MACRO TAIF LCLB . . AIF MNOTE SETB AIF MNOTE SETB AIF MNOTE SETB ANOP AIF . . MEND

Operanden
&REG,&ADR,&NR &ERRIN
(&REG GE 2 AND &REG LE 13).OK1 0,'INCORRECT REG &REG' 1 (&ADR NE '').OK2 0,'MISSING ADR' 1 (&NR GE 1 AND &NR LE 4).OK3 0,'INCORRECT NR &NR' 1
(&ERRIN).MEND

(01) (02)
(03)
(04)

(01) Musteranweisung mit symbolischen Parametern &REG, &ADR und &NR (02) Definition eines "Fehlerindikators" &ERRIN (03) Die 3 AIF-Abfragen prüfen, ob die symbolischen Parameter entsprechend den
geforderten Bedingungen im Makroaufruf angegeben wurden. Ist der Parameter richtig, wird zur nächsten Abfrage verzweigt. Im Fehlerfall wird die MNOTE-Anweisung durchlaufen, die die entsprechende Erklärung ausgibt, und der Fehlerindikator gesetzt. (04) Abfrage, ob an irgendeiner Stelle der Fehlerindikator gesetzt wurde. Falls ja, wird zum Ende verzweigt, falls nicht, bearbeitet der Assembler die folgenden Instruktionen.

224

U5223-J-Z125-3

Makroanweisungen

AIF

Format 2

Name
[.sym]
.sym logexp .sym1

Operation AIF

Operanden {(logexp).sym1}[,...]

Folgesymbol im Standardformat logischer Ausdruck Folgesymbol im Standardformat oder generiert

Beschreibung
Format 2 der AIF-Anweisung entspricht n AIF-Anweisungen hintereinander. Die logischen Ausdrücke werden nacheinander berechnet und zum ersten Folgesymbol verzweigt, dessen zugehöriger logischer Ausdruck wahr ist.

Programmierhinweis
Für Format 2 der AIF-Anweisung ist das alternative Anweisungsformat möglich (siehe 7.1.4).

Beispiel
Name

Operation AIF
. .

Operanden
('&S' EQ '+').PLUS, ('&S' EQ '-').MINUS, ('&S' EQ '=').EQ

Fortsetzungszeichen
X X

Das Beispiel ist im alternativen Anweisungsformat geschrieben. Abhängig vom Inhalt von &S wird zum jeweiligen Folgesymbol verzweigt.

U5223-J-Z125-3

225

AGO

Makroanweisungen

AGO Unbedingt verzweigen
Funktion Die AGO-Anweisung ermöglicht eine Verzweigung unabhängig von Bedingungen.

Format 1

Name [.sym1]
.sym1 .sym2

Operation AGO

Operanden .sym2

Folgesymbol im Standardformat Folgesymbol im Standardformat oder generiert.

Hinweis
Der Operationscode AGOB, der wie AGO verwendet werden kann, wird nur noch aus Kompatibilitätsgründen unterstützt.

Beschreibung .sym2 bezeichnet die nächste Instruktion, die vom Assembler verarbeitet werden soll.

Programmierhinweise
1. Mit der AGO-Anweisung kann vorwärts oder rückwärts verzweigt werden. Durch die Verzweigung übersprungene Instruktionen werden dann nicht generiert.
2. Mit der AGO-Anweisung kann nicht von einer Makrodefinition in eine andere oder vom Quellprogramm in eine Makrodefinition bzw. umgekehrt, verzweigt werden.

226

U5223-J-Z125-3

Makroanweisungen

AGO

Beispiel
Das Beispiel zeigt die Verwendung von AGO in einer Schleife in Zusammenhang mit einer AIF-Abfrage.

Name

Operation Operanden

* Makrodefinition

MACRO

REG

LCLA

.

.

ACTR

.LOOP

ANOP

&PRE&R

EQU

&R

SETA

AIF

AGO

.

.

.END

MEND

&PRE &R
100
&R &R+1 (&R GT 15).END .LOOP

* Makroaufruf

REG

REG

* Generierte Instruktionen

REG0

EQU

0

REG1

EQU

1

REG2

EQU

2

.

.

(01) (02)
(03) (04)

(01) "Notbremse", falls das Schleifenendekriterium nicht erreicht wird (02) Schleifenanfang (03) Abfrage auf das Endekriterium und Sprung aus der Schleife (04) Schleifenende und Rücksprung zum Anfang

U5223-J-Z125-3

227

AGO

Makroanweisungen

Format 2

Name
[.sym]
.sym arexp .sym1

Operation AGO

Operanden (arexp){.sym1}[,...]

Folgesymbol im Standardformat positiver arithmetischer Makroausdruck Folgesymbol im Standardformat oder generiert

Beschreibung
arexp gibt die Nummer des Folgesymbols im Operandeneintrag an, zu dem verzweigt werden soll.
Ist das Ergebnis von arexp größer als die Anzahl der Folgesymbole oder kleiner als 1, dann wird keine Verzweigung durchgeführt.

Programmierhinweis
In Format 2 der AGO-Anweisung ist das alternative Anweisungsformat möglich (siehe 7.1.4).

Beispiel

Name

Operation Operanden

AGO

(&EX).LOOP1,.LOOP2,.LOOP3

.

.

Hier wird zu .LOOP2 verzweigt, wenn &EX den Wert 2 annimmt. Hat &EX einen Wert, der größer ist, als 3, dann wird die Instruktion ausgeführt, die auf die AGO-Anweisung folgt.

Im alternativen Anweisungsformat wird das gleiche Beispiel folgendermaßen codiert:

Name

Operation AGO
. .

Operanden
(&EX).LOOP1, .LOOP2, .LOOP3

Fortsetzungszeichen
X X

228

U5223-J-Z125-3

Makroanweisungen

ANOP

ANOP Nulloperation
Funktion Mit der ANOP-Anweisung können Folgesymbole als Sprungziel für eine Verzweigung definiert werden. Sie bewirkt keine Funktionsausführung.

Format

Name [.sym]
.sym

Operation ANOP

Operanden

Folgesymbol

Beschreibung
Die ANOP-Anweisung bewirkt selbst keine Operation, sondern dient nur als Ziel für Verzweigungen in der Makrosprache. Der Assembler generiert jeweils die nächste folgende Instruktion.

Programmierhinweise
1. Die ANOP-Anweisung wird vor allem eingesetzt, wenn zu einer Instruktion verzweigt werden soll, die kein Folgesymbol im Namensfeld erlaubt. In diesem Fall muß vor der entsprechenden Instruktion die ANOP-Anweisung eingefügt werden.
2. Durch Verwendung von ANOP bei Sprungzielen kann ohne Probleme ein weiterer Befehl als erster eingefügt oder gestrichen werden.

Beispiel
Name
.SYM RDEF

Operation
AGO . . ANOP
DC
AIF . .

Operanden .SYM

einfügen

<

F'123'

<

.SYM1

(&A EQ 0).SYM2

AIF (D'RDEF).SYM1 ANOP

U5223-J-Z125-3

229

GBLx

Makroanweisungen

GBLx Globalen SET-Parameter definieren
Funktion Die GBLx-Anweisung definiert einen oder mehrere globale SET-Parameter.

Format

Name
&par &par(d) d GBLA GBLB GBLC

Operation
A GBL B
C

Operanden
&par [,...]
&par(d)

globaler SET-Parameter indizierter globaler SET-Parameter Dimension; dezimaler selbstdefinierender Wert
Definition eines SETA-Parameters Definition eines SETB-Parameters Definition eines SETC-Parameters

Beschreibung
Die GBLx-Anweisung definiert den, bzw. die globalen SET-Parameter im Operandeneintrag und weist ihnen ggf. einen Anfangswert zu. Die definierten SET-Parameter haben alle den Typ, der im Operationseintrag angegeben ist.

Anfangswerte: SETA-Parameter SETB-Parameter SETC-Parameter

0 0 leere Zeichenkette

Programmierhinweise
1. Einem globalen SET-Parameter wird nur von der ersten verarbeiteten GBLx-Anweisung ein Anfangswert zugewiesen. Nachfolgende GBLx-Anweisungen in einer anderen Makrodefiniton oder im Quellprogramm bedeuten nur die Definiton des SET-Paramters und weisen nicht wieder den Anfangswert zu.
2. SET-Parameter dürfen nicht mit der Zeichenfolge &SYS beginnen (siehe 6.3, Variable Systemparameter).
3. Für die GBLx-Anweisung ist das alternative Anweisungsformat möglich (siehe 7.1.4).

230

U5223-J-Z125-3

Makroanweisungen

GBLx

Beispiel

Name

Operation GBLA

Operanden &(&AR1),&AR2(20),&AR3,&AR4

&(&AR1) globaler SETA-Parameter, dessen Name mit Hilfe von &AR1 generiert werden soll
&AR2(20) indizierter globaler SETA-Parameter mit der Dimension 20 &AR3, &AR4 globale SETA-Parameter

Im alternativen Anweisungsformat kann das gleiche Beispiel folgendermaßen codiert werden:

Name

Operation GBLA

Operanden
&(&AR1), &AR2(20), &AR3, &AR4

Fortsetzungszeichen
X X X

U5223-J-Z125-3

231

LCLx

Makroanweisungen

LCLx Lokalen SET-Parameter definieren
Funktion Die LCLx-Anweisung definiert einen oder mehrere lokale SET-Parameter.

Format

Name
&par &par(d) d LCLA LCLB LCLC

Operation
A LCL B
C

Operanden
&par [,...]
&par(d)

lokaler SET-Parameter indizierter lokaler SET-Parameter; Dimension; dezimaler selbstdefinierender Wert
Definition eines SETA-Parameters Definition eines SETB-Parameters Definition eines SETC-Parameters

Beschreibung

Die LCLx-Anweisung definiert den, bzw. die lokalen SET-Parameter im Operandeneintrag und weist ihnen einen Anfangswert zu.

Die definierten SET-Parameter haben alle den Typ, der im Operationseintrag angegeben ist.

Anfangswerte: SETA-Parameter SETB-Parameter SETC-Parameter

0 0 leere Zeichenkette

Programmierhinweise
1. Wird derselbe SET-Parameter sowohl im Quellprogramm als auch in einer oder mehreren Makrodefinitionen als lokal definiert, so gilt er jeweils als neuer SET-Parameter mit dem Anfangswert.
2. SET-Parameter dürfen nicht mit der Zeichenfolge &SYS beginnen (siehe 6.3, Variable Systemparameter).
3. Für die LCLx-Anweisung ist das alternative Anweisungsformat möglich (siehe 7.1.4).

232

U5223-J-Z125-3

Makroanweisungen

LCLx

Beispiel

Name

Operation LCLA

Operanden &(&AR1),&AR2(20),&AR3,&AR4

&(&AR1) lokaler SETA-Parameter, dessen Name mit Hilfe von &AR1 generiert werden soll
&AR2(20) indizierter lokaler SETA-Parameter mit der Dimension 20 &AR3, &AR4 lokale SETA-Parameter

Im alternativen Anweisungsformat kann das gleiche Beispiel folgendermaßen codiert werden:

Name

Operation LCLA

Operanden
&(&AR1), &AR2(20), &AR3, &AR4

Fortsetzungszeichen
X X X

U5223-J-Z125-3

233

MACRO/MEND

Makroanweisungen

MACRO Anfangsanweisung
Format

Name

Operation MACRO

Operanden

Beschreibung
Die MACRO-Anweisung kennzeichnet den Anfang einer Makrodefinition. Sie muß die erste Instruktion in jeder Makrodefinition sein.

MEND Endanweisung
Format

Name [.sym]
.sym

Operation MEND

Operanden

Folgesymbol

Beschreibung
Die MEND-Anweisung kennzeichnet das Ende einer Makrodefinition. Sie muß die letzte Instruktion in jeder Makrodefinition sein.
Das Folgesymbol .sym dient als Sprungziel für AIF- oder AGO-Anweisungen.

234

U5223-J-Z125-3

Makroanweisungen

MEXIT

MEXIT Ausgang aus einer Makrodefinition definieren
Funktion Die MEXIT-Anweisung definiert einen Ausgang aus einer Makrodefinition. Bei der Generierung wird dadurch die aktuelle Makrogenerierung beendet.

Format

Name [.sym]
.sym

Operation MEXIT

Operanden

Folgesymbol

Beschreibung
Auf Grund der MEXIT-Anweisung beendet der Assembler die aktuelle Makrogenerierung und verarbeitet die Instruktion, die unmittelbar auf den entsprechenden Makroaufruf folgt. Steht der Makroaufruf im Quellprogramm, wird die nächstfolgende Quellprogramm-Instruktion verarbeitet. Ist der Makroaufruf Modellanweisung in einer äußeren Makrodefinition, dann wird die nächstfolgende Modellanweisung verarbeitet.
Das Folgesymbol .sym dient als Sprungziel für AIF- oder AGO-Anweisungen.

U5223-J-Z125-3

235

MEXIT

Makroanweisungen

Programmierhinweise
1. Die MEXIT-Anweisung darf nur innerhalb von Makrodefinitionen verwendet werden.
2. Die MEXIT-Anweisung darf nicht mit der MEND-Anweisung verwechselt werden. Die MEND-Anweisung muß immer die letzte Anweisung einer Makrodefinition sein, auch wenn diese eine oder mehrere MEXIT-Anweisungen enthält.

Beispiel
Name
.OK1

Operation
MACRO . . LCLB . . AIF MNOTE MEXIT AIF MNOTE MEXIT . . MEND

Operanden
&OKIN1,&OKIN2
(&OKIN1).OK1 'NO OKIN1' (&OKIN2).OK2 'NO OKIN2'

(01)
(02) (01)
(02)

(01) Abfrage, ob z.B. ein bestimmter Schalter gesetzt ist, und Verzweigung zur nächsten Abfrage
(02) Steht OKIN noch auf Null, dann wird die entsprechende Meldung ausgegeben und die Generierung beendet.

236

U5223-J-Z125-3

Makroanweisungen

MNOTE

MNOTE Meldungen absetzen
Funktion Die MNOTE-Anweisung erzeugt eine durch variable Parameter veränderliche Meldung mit einer Zeilennummer im Übersetzungsprotokoll.

Format

Name [.sym]
.sym n text

Operation MNOTE

Operanden
* [ ,]'text'
n

Folgesymbol Fehlercode, positiver arithmetischer Makroausdruck; 0 n 255 Text der Meldung, maximal 256 Zeichen

U5223-J-Z125-3

237

MNOTE

Makroanweisungen

Beschreibung

Abhängig vom Fehlercode in der MNOTE-Anweisung können im Übersetzungsprotokoll eigene Warnungen oder Fehlermeldungen ausgegeben werden. Eine Fehlermeldung, die aufgrund einer MNOTE ausgegeben wurde, wird analog den Assembler-Flags behandelt und das Fehlergewicht entsprechend erhöht.

Entsprechend der Fehler-Referenzliste kann eine Mnote-Referenzliste erstellt werden (siehe ASSEMBH, Benutzerhandbuch [1]).

*

Wird als Fehlercode ein Stern angegeben, dann erscheint text als Kommen-

tarzeile im generierten Code, auch wenn die Anweisung PRINT NOGEN

gesetzt wurde. Die Meldung ist reiner Kommentartext, es werden keine Feh-

lercodes mitgezählt. Eine Ausgabe im MNOTE-XREF erfolgt nicht.

n

Der Fehlercode der MNOTE-Anweisung und die Fehlerklassen der Assem-

bler-Flags hängen wie folgt zusammen:

Warnung Fehler schwerer Fehler Abbruchfehler

n = 0 1 n 150 151 n 254 n = 255

Wird n weggelassen oder ist n > 255, nimmt der Assembler n = 0 an. Bei n > 255 wird zusätzlich eine Warnung ausgegeben.

Ist n nicht ganzzahlig, dann gilt die MNOTE-Anweisung als fehlerhafte Modellanweisung.

Programmierhinweise
1. Variable Parameter im Operandeneintrag der MNOTE-Anweisung werden durch ihren aktuellen Wert ersetzt. Durch MNOTE *,... können in diesem Fall Kommentare generiert werden.
2. Durch eine MNOTE-Anweisung mit dem Fehlercode n = 255 kann die Übersetzung vorzeitig abgebrochen werden, wenn bei der Option-Angabe die entsprechende Abbruchbedingung gesetzt ist (siehe ASSEMBH, Benutzerhandbuch [1]).

238

U5223-J-Z125-3

Makroanweisungen

MTRAC

MTRAC Macro trace
Funktion Die MTRAC-Anweisung dient der Überwachung von bedingten Verzweigungen und der Kontrolle der Inhalte von SET-Parametern.

Format

Name [.sym]
.sym

Operation MTRAC

Operanden

Folgesymbol

Beschreibung
Die MTRAC-Anweisung bewirkt, daß nach ihrem Auftreten folgende Makroanweisungen im Übersetzungsprotokoll ausgedruckt werden:
Die MTRAC-, NTRAC-, ANOP-, LCLx- und GBLx-Anweisung; Diese Anweisungen werden ohne weitere Angaben protokolliert.
Die AIF- und AGO-Anweisung; Bei diesen beiden Anweisungen wird im Übersetzungsprotokoll durch ein "Y" oder "N" angezeigt, ob verzweigt wurde oder nicht.

einfaches AIF
Y N

erweitertes AIF
Y: <n> N

einfaches AGO Y

computed AGO Y: <n>

Y es wurde verzweigt N es wurde nicht verzweigt n ist die Nummer des logischen Ausdrucks, der zur Verzweigung führt

U5223-J-Z125-3

239

MTRAC

Makroanweisungen

Die SETA-, SETB-, SETC- und die ACTR-Anweisung; Hier wird im Übersetzungsprotokoll der augenblickliche Wert der SET-Parameter, bzw. des ACTR-Operanden ausgedruckt.

SETA-Parameter und ACTR-Operand werden als Dezimalzahlen mit führenden Nullen dargestellt. Negative Werte der SETA-Parameter werden mit Vorzeichen ausgedruckt. Zahlen mit mehr als 8 Stellen werden rechts abgeschnitten.

Der Wert eines SETB-Parameters erscheint als einzelnes Zeichen:

T wahr (true), bzw. 1 F falsch (false), bzw. 0

SETC-Parameter oder symbolische Parameter in SETC-Anweisungen werden dargestellt als Zeichenfolge von maximal 8 Zeichen.

Für einen SETC-Parameter, der auf den Anfangswert zurückgesetzt wurde, steht die

Zeichenfolge 'NULL

'.

Ist der Wert des SETC-Parameters länger als 8 Zeichen, werden nur die ersten 7 Zeichen und ein Stern (*) ausgedruckt.

Programmierhinweise
1. Wenn für die Steuerung des Protokollinhalts PRINT NOGEN angegeben wurde, dann wird auch keine MTRAC-Information ausgegeben.
2. Steht die MTRAC-Anweisung im Quellprogramm oder in einem äußeren Makro, dann muß sie durchlaufen werden, damit sie für die folgenden inneren Makroaufrufe gültig ist.
3. Die MTRAC-Eigenschaft wird durch die Aufrufhierarchie, abhängig von der Makroverschachtelungstiefe, nach unten weitervererbt (siehe Beispiel bei NTRAC).

240

U5223-J-Z125-3

Makroanweisungen

NTRAC

NTRAC Macro trace beenden
Funktion Die NTRAC-Anweisung setzt die MTRAC-Funktion außer Kraft.

Format

Name [.sym]
.sym

Operation NTRAC

Operanden

Folgesymbol

Programmierhinweise
1. Ist keine MTRAC-Anweisung angegeben, sind alle verarbeiteten NTRAC-Anweisungen wirkungslos.
2. NTRAC setzt die MTRAC-Anweisung in der entsprechenden Makroverschachtelungsstufe zurück. NTRAC gilt auch für alle folgenden inneren Makroaufrufe.

U5223-J-Z125-3

241

NTRAC

Makroanweisungen

Beispiel
Das Beispiel zeigt die Vererbung der MTRAC-, bzw. NTRAC-Eigensschaft in einem Quellprogramm, das mehrere Makroaufrufe ineinander verschachtelt enthält.
Das Quellprogramm ruft den Makro MAC1 auf, dieser den Makro MAC2, und dieser den Makro MAC3.

CSECT

.

.

MTRAC

.

.

MACRO

MAC1 > MAC1

.

.

MACRO

MAC2 > MAC2

.

.

NTRAC

.

.

MACRO

MAC3 > MAC3

.

.

<.

.

MEND

.

<.

.

MEND

.

<.

.

MEND

.

END

MTRAC gilt
in MAC1 keine Angabe von MTRAC oder NTRAC; d.h., MTRAC gilt weiter
MAC2 enthält NTRAC; d.h., MTRAC gilt nur bis zur NTRAC-Anweisung, ab hier gilt NTRAC
in MAC3 keine Angabe von MTRAC oder NTRAC; d.h., NTRAC gilt weiterhin
Rückkehr in MAC2; wie zuletzt in dieser Stufe: NTRAC gilt
Rückkehr in MAC1; wie bisher in dieser Stufe: MTRAC gilt
Rückkehr ins Quellprogramm; wie bisher: MTRAC gilt

242

U5223-J-Z125-3

Makroanweisungen

SETA

SETA SETA-Parameter setzen
Funktion Die SETA-Anweisung weist einem SETA-Parameter den arithmetischen Wert aus dem Operandeneintrag zu.

Format

Name
&par &par(d)
&par &par(d) d arexp &par_c

Operation SET[A]

Operanden
arexp &par_c

SETA-Parameter indizierter SETA-Parameter; Dimension; arithmetischer Makroausdruck arithmetischer Makroausdruck SETC-Parameter

Beschreibung

&par, bzw. &par(d) lokaler oder globaler SETA-Parameter, der in einer LCLA- oder GBLAAnweisung definiert wurde.

Wurde der SETA-Parameter nicht vor der SETA-Anweisung definiert, dann interpretiert der Assembler ihn als impliziert vereinbarten lokalen SETAParameter und weist als Anfangswert den Wert von arexp zu. In diesem Fall muß man den mnemotechnischen Operationscode SETA verwenden.

Mehrere aufeinander folgende SETA-Anweisungen mit dem gleichen SETAParameter im Namenseintrag weisen diesem jeweils einen neuen Wert zu.

arexp

Der Wert des Ausdrucks im Operandeneintrag wird nach den Regeln für arithmetische Makroausdrücke berechnet und dann dem SETA-Parameter zugewiesen.

Dieser Wert wird an Stelle des SETA-Parameters eingesetzt, wenn der Parameter in einem arithmetischen Ausdruck verwendet wird.

&par_c

Ein SETC-Parameter als Operandeneintrag ist nur zulässig, wenn er einen arithmetischen Wert hat.

Eine leere Zeichenfolge wird in eine 0 konvertiert.

U5223-J-Z125-3

243

SETA

Makroanweisungen

Programmierhinweis
Wird der SETA-Parameter in einem nicht-arithmetischen Makroausdruck verwendet, dann wird der Wert von arexp in eine ganze Zahl ohne führende Nullen umgewandelt.

Beispiel

Name

Operation Operanden

* Makrodefinition

MACRO

&NAME

SETAEX

LCLA

.*

&P1

SETA

&P2

SETA

&P3

SETA

&P4

SETA

.*

&NAME

ST

L

ST

L

MEND

&PART,&PARF &P1,&P2,&P3,&P4
10 12 &P1-&P2 &P1+&P3
2,SAVAREA 2,&PARF&P3 2,&PART&P4 2,SAVAREA

* Makroaufruf

BEGIN

SETAEX

FIELDX,FIELDY

* Generierte Instruktionen

.

.

BEGIN

ST

2,SAVAREA

L

2,FIELDY2

ST

2,FIELDX8

L

2,SAVAREA

.

.

(01) (02) (03) (04)
(05) (06)

(01) und (02) (03) und (04) (05) und (06)

ordnen den SETA-Parametern &P1 und &P2 die arithmetischen Werte 10 und 12 zu.
Verwendung der SETA-Parameter in arithmetischen Makroausdrücken, &P3 und &P4 erhalten die Werte -2, bzw +8.
Verwendung der SETA-Paramter in nicht-arithmetischen Makroausdrükken, deshalb werden &P3, bzw. &P4 hier durch 2, bzw. 8 ersetzt.

244

U5223-J-Z125-3

Makroanweisungen

SETB

SETB SETB-Parameter setzen
Funktion Die SETB-Anweisung weist einem SETB-Parameter den logischen Wert 1 oder 0 (wahr oder falsch) zu.

Format

Name &par &par(d)
&par &par(d) d logexp &par_c

Operation SET[B]

Operanden
0 1 (0) (1) (logexp) &par_c

SETB-Parameter indizierter SETB-Parameter Dimension; arithmetischer Makroausdruck logischer Ausdruck SETC-Parameter

Beschreibung
&par, bzw. &par(d) lokaler oder globaler SETB-Parameter, der in einer LCLB- oder GBLBAnweisung definiert wurde.
Wurde der SETB-Parameter nicht vor der SETB-Anweisung definiert, dann interpretiert ihn der Assembler als implizit vereinbarten lokalen SETB-Parameter und weist als Anfangswert 0 oder 1, je nach Wert des Operandeneintrags, zu. In diesem Fall muß der mnemotechnische Operationscode SETB verwendet werden.
Mehrere aufeinanderfolgende SETB-Anweisungen mit dem gleichen SETBParameter im Namenseintrag weisen diesem jeweils einen neuen Wert zu.
0, 1, (0) oder (1) Diese Werte werden dem SETB-Parameter zugewiesen und an seiner Stelle eingesetzt, wenn er in einem logischen Ausdruck verwendet wird.

U5223-J-Z125-3

245

SETB

Makroanweisungen

logexp &par_c

Der logische Wert des Ausdrucks im Operandeneintrag wird nach den Regeln für logische Ausdrücke berechnet und dann dem SETB-Parameter zugewiesen.
Dieser Wert wird an Stelle des SETB-Parameters eingesetzt, wenn dieser in einem logischen Ausdruck verwendet wird.
Ein SETC-Parameter als Operandeneintrag ist nur zugelassen, wenn er einen Wert von 0 oder 1 hat.
Eine leere Zeichenfolge wird in eine 0 konvertiert.

Programmierhinweis
Wird ein SETB-Parameter in einem arithmetischen Makroausdruck verwendet, dann werden die logischen Werte 1 (wahr) oder 0 (falsch) in die entsprechenden arithmetischen Werte +1 oder +0 umgewandelt.

Beispiel

Name

Operation Operanden

* Makrodefinition

MACRO

&NAME

SETBEX

LCLB

.

.

&B1

SETB

&B2

SETB

.

.

MEND

&P1,&P2 &B1,&B2
(L'&P1 EQ 4) (S'&P2 EQ 0)

* Makroaufruf

BEGIN

SETBEX

FIELDA,FIELDB

* Definitionen im Quellprogramm

FIELDA

DC

F'01'

FIELDB

DC

DS3'12'

.

.

(01) (02)

(01) Der logische Ausdruck ist wahr, daher wird &B1 der Wert 1 zugewiesen. (02) Der logische Ausdruck ist falsch, daher wird &B2 der Wert 0 zugewiesen.

246

U5223-J-Z125-3

Makroanweisungen

SETC

SETC SETC-Parameter setzen
Funktion Die SETC-Anweisung weist einem SETC-Parameter oder einem symbolischen Parameter den Wert des Zeichenausdrucks im Operandeneintrag zu.

Format

Name
&par &par(d) &spar &SYSLIST(n)
&par &par(d) d &spar &SYSLIST(n) charexp

Operation SET[C]

Operanden charexp

SETC-Parameter indizierter SETC-Parameter Dimension; arithmetischer Makroausdruck symbolischer Parameter variabler Systemparameter Zeichenausdruck

Beschreibung

&par, bzw. &par(d) lokaler oder globaler SETC-Parameter, der in einer LCLC- oder GBLCAnweisung definiert wurde.

Wurde der SETC-Parameter nicht vor der SETC-Anweisung definiert, dann interpretiert der Assembler ihn als impliziten lokalen SETC-Parameter und weist als Anfangswert den Wert von charexp zu. In diesem Fall muß der mnemotechnische Operationscode SETC verwendet werden.

Mehrere aufeinander folgende SETC-Anweisungen mit dem gleichen SETCParameter im Namenseintrag weisen diesem jeweils einen neuen Wert zu.

&spar, bzw. &SYSLIST(n) symbolischer Parameter, dem der Wert im Operandeneintrag zugewiesen werden soll. Bei Verwendung von &SYSLIST(n) darf n nur den symbolischen Parameter selbst bezeichnen. Einem Element einer Operandenunterliste kann mit SETC kein neuer Wert zugewiesen werden.

charexp

Der Wert des Zeichenausdrucks wird an Stelle des SETC-Parameters eingesetzt, wenn dieser in einer Instruktion verwendet wird.

U5223-J-Z125-3

247

SETC

Makroanweisungen

Programmierhinweis
Bei der SETC-Bearbeitung wird der Wert des Operanden immer als String interpretiert und nicht in Unterlisten zerlegt; z.B. bei &PAR SETC '(1,2)' ist der Wert von &PAR(1) = (1,2) und nicht 1.

Beispiel

Name

Operation Operanden

* Makrodefinition

MACRO

&NAME

SETCEX

LCLC

*

&PRE

SETC

*

&NAME

ST

L

ST

L

MEND

&IN,&OUT &PRE
'&IN'(1,5)
2,SAVAREA 2,&PRE&OUT 2,&IN 2,SAVAREA

* Makroaufruf

BEGIN

SETCEX

FIELDA,B

* Generierte Instruktionen

.

.

BEGIN

ST

2,SAVAREA

L

2,FIELDB

ST

2,FIELDA

L

2,SAVAREA

.

.

(01) (02)

(01) Die SETC-Anweisung ordnet &PRE den Wert der Teilzeichenfolge (FIELD) zu. (02) &PRE wird ersetzt durch FIELD und &OUT wird ersetzt durch B, d.h.,
&PRE&OUT erhält den Wert FIELDB

248

U5223-J-Z125-3

Makroanweisungen

SETC

8

Makrosprachelemente im

Assembler-Quellprogrammtext

Verschiedene Elemente der Makrosprache können außerhalb von Makrodefinitionen im Text des Assembler-Quellprogramms verwendet werden. In diesem Fall ist das Assembler-Quellprogramm wie eine große Makrodefinition zu betrachten, nur ohne MACRO-, MEND- und Musteranweisung.
Im Übersetzungsprotokoll stehen die Instruktionen, die mit Hilfe der Makrosprache generiert wurden, jeweils direkt hinter den entsprechenden Makro-Instruktionen und sind durch ein Pluszeichen (+) in der Spalte für die Makrostufe gekennzeichnet.
Die Makrosprachelemente, die im Assembler-Quellprogramm eingesetzt werden können, sind im folgenden aufgeführt.

· Makroanweisungen

ACTR AIF AGO ANOP GBLx LCLx MACRO MEND MEXIT MNOTE MTRAC NTRAC SETA SETB SETC

Verwendung außerhalb von Makrodefinitionen
ja ja ja ja ja ja nein nein nein ja ja ja ja ja ja

U5223-J-Z125-3

249

Makrosprachelemente im Quellprogramm

Programmierhinweise
1. Durch AIF oder AGO übersprungene Instruktionen werden nicht gelesen und daher auch nicht übersetzt. In übersprungenen Instruktionen definierte Namen gelten daher für den Assembler als nicht definiert. Auf ihre Merkmale kann aber auf Grund der Lookahead-Funktion des ASSEMBH zugegriffen werden (siehe ASSEMBH, Benutzerhandbuch [1]).
2. Instruktionen, die in einer Schleife mehrfach durchlaufen werden, werden auch mehrfach hintereinander eingelesen und übersetzt.
3. Eine Überschreitung des ACTR-Zählers (siehe 7.2, ACTR-Anweisung) führt hier zu einem Abbruch der Übersetzung.

· Variable Parameter

Symbolische Par.
SET-Parameter
Variable Systempar. &SYSDATE &SYSECT &SYSLIST &SYSMOD &SYSNDX &SYSPARM &SYSTEM &SYSTIME &SYSTSEC &SYSVERM &SYSVERS

Verwendung außerhalb von Makrodefinitionen
nein
ja, wenn sie vor ihrer ersten Verwendung definiert sind
Ausnahme: implizit vereinbarte lokale SET-Parameter müssen nicht vorher definiert werden.
ja nein nein ja nein ja ja ja nein nein ja

Programmierhinweis
Auch im Assembler-Quellprogramm können variable Parameter verwendet werden, um den Namens-, Operations- und Operandeneintrag von Assembler-Instruktionen zu generieren.

250

U5223-J-Z125-3

Makrosprachelemente im Quellprogramm

· Folgesymbole

Standardformat generiertes Format

Verwendung außerhalb von Makrodefinitionen
ja, das Folgesymbol wird protokolliert ja, im Operandeneintrag

Programmierhinweis Folgesymbole im Operandeneintrag von AIF- und AGO-Anweisungen müssen auch im Namenseintrag einer Instruktion im Quellprogramm definiert sein.
· Bezugnahmen auf Merkmale

Verwendung außerhalb von Makrodefinitionen

Typenmerkmal Längenmerkmal Skalenfaktormerkmal Ganzzahligkeitsmerk. Zählermerkmal
Anzahlmerkmal Definitionsmerkmal

ja, in Makroanweisungen ja ja, in Makroanweisungen ja, in Makroanweisungen ja, in Makroanweisungen für SET-Parameter und
variable Systemparameter nein ja, in Makroanweisungen

U5223-J-Z125-3

251

Makrosprachelemente im Quellprogramm

9

Strukturierte Programmierung mit ASSEMBH

9.1

Einführung

Die Strukturierte Programmierung wird vom ASSEMBH-BC nicht unterstützt !
Die strukturierte Programmierung enthält Regeln für die Konstruktion von Programmen. Das Ziel ist ein klarer, gut verständlicher Programm-Steuerfluß.
Jedes Programm hat einen statischen und einen dynamischen Aspekt. Der statische Aspekt drückt sich aus in der Niederschrift des Programms, dem Quellprogramm-Text. Der dynamische Aspekt besteht aus der Folge von Aktionen, die das Programm im Rechner auslöst. Im Text eines Quellprogramms liegen Instruktionen vor, die festlegen, welche Aktion als nächste ausgeführt werden soll. Diese Instruktionen legen den Steuerfluß des Programms fest.
Die strukturierte Programmierung geht davon aus, daß der Steuerfluß eines Programms nur aus bestimmten Grundmustern bestehen darf. Hierfür wird auf den folgenden Grundkonzepten aufgebaut:
· Blockkonzept
Das Blockkonzept besteht in der Forderung, daß ein Programm nur durch Aneinanderreihen oder Schachteln von Strukturblöcken gebildet werden darf, die jeweils genau einen Eingang und einen Ausgang besitzen. Der Steuerfluß eines Programms darf nur aus einigen wenigen Grundmustern dieser Art mit einer einfachen inneren Struktur aufgebaut werden.
· Prozedurkonzept
Im Prozedurkonzept wird der Kontrollfluß zwischen Hauptprogrammen und Unterprogrammen geregelt. Eine Prozedur im Sinne der strukturierten Programmierung ist eine Programmeinheit mit einem Eingang und einem Ausgang, die unter einem Namen, ggf. mit aktuellen Parameterwerten, aufgerufen werden kann. Eine Prozedur ist aus Strukturblöcken aufgebaut.

U5223-J-Z125-3

253

Strukturierte Programmierung
· Datenkonzept
Das Datenkonzept verhilft dem Anwender zur rationellen Speichernutzung und nimmt ihm die Speicherverwaltung ab, die für die Erzeugung reentrant-fähiger Prozeduren notwendig ist. Das Datenkonzept regelt den Gültigkeitsbereich aller Daten und sorgt für Übersichtlichkeit. Es verlangt, daß jede Prozedur über alle verwendeten Daten Auskunft gibt.
Der ASSEMBH stellt dem Anwender Hilfsmittel zur Verfügung, um Assembler-Programme den Anforderungen der strukturierten Programmierung anzupassen. Dies geschieht mit Hilfe eines Satzes von vordefinierten Makros, mit denen sich die genannten Grundkonzepte realisieren lassen.
Beim Ablauf eines Programms mit vordefinierten Makros arbeitet der ASSEMBH mit dynamischer Speicherverwaltung. Für Speicherzugriff und -anforderung, automatische Registersicherung und Parameterverwaltung sorgt hierbei das Laufzeitsystem des ASSEMBH. Das Laufzeitsystem wird realisiert durch ein Modulpaket, das in der zugehörigen Modulbibliothek vorliegt.
Neben dem Makrosatz und dem Laufzeitsystem gehören zur Strukturierten Programmierung mit ASSEMBH die Dienstprogramme zur Fehlersuche und Listenaufbereitung.
Der folgende Text beschreibt das Block-, das Prozedur- und das Datenkonzept im ASSEMBH, sowie die vordefinierten Makros und ihre Verwendung. Die Handhabung der Dienstprogramme und der Makrobibliothek, sowie das Einbinden des Laufzeitsystems sind im ASSEMBH, Benutzerhandbuch [1] beschrieben.
Verwendung der Strukturierten Programmierung für den Programmentwurf
Die Grundkonzepte der strukturierten Programmierung schaffen die Voraussetzung für ein schrittweise verfeinerndes Vorgehen beim Programmentwurf.
Für die Formulierung der Ablauflogik eines Programms bietet sich die Verwendung von Pseudocode an. Pseudocode besteht aus formalisierten Teilen und aus Texten in natürlicher Sprache. Dabei können für die formalisierten Teile die vordefinierten Makros des ASSEMBH verwendet werden. Der Steuerfluß eines Programms wird mit den vordefinierten Makros formuliert, die Funktion der einzelnen Blöcke in natürlicher Sprache umschrieben. Im nächsten Schritt kann die Funktion der Einzelblöcke detailliert ausgearbeitet oder einzelne Blöcke als eigene Prozeduren ausgelagert werden.

254

U5223-J-Z125-3

Strukturierte Programmierung
Beispiel
Das Beispiel zeigt eine Entscheidung (siehe 9.2.2, Auswahlstrukturblöcke), in der bisher nur die Makros angegeben sind, die den Strukturblock darstellen.
@IF Bedingung @THEN Operationen, falls Bedingung zutrifft @ELSE Operationen, falls Bedingung nicht zutrifft @BEND
Die Dienstprogramme des ASSEMBH werten die vordefinierten Makros zu übersichtlichen Darstellungen aus, die auf dem Drucker ausgegeben werden können, und prüfen den Entwurf auf Strukturfehler. Da die zwischen den Makros stehenden Texte von den Dienstprogrammen nicht bearbeitet werden, läßt sich mit diesem Pseudocode bereits der Programmentwurf strukturiert darstellen, ohne daß Codierung in Assembler vorliegt.
Soll dann aus dem in Pseudocode vorliegenden Entwurf ein Assembler-Programm erarbeitet werden, so genügt es, die Funktionen der einzelnen Blöcke in Assembler-Instruktionen auszudrücken. Dabei empfiehlt es sich, die Text-Teile des Pseudocode als Kommentare im Quellprogramm-Text zu belassen. Die vordefinierten Makros bilden nach wie vor den Steuerfluß des implementierten Moduls.
Der ASSEMBH setzt die vordefinierten Makros in Assembler-Instruktionen um und übersetzt sie zusammen mit den übrigen Instruktionen in den entsprechenden Objektmodul.

U5223-J-Z125-3

255

Blockkonzept

9.2

Blockkonzept

Das Blockkonzept setzt voraus, daß die Beschreibung des Programmablaufs und der Aufbau einer Prozedur durch wenige Grundmuster, die "Strukturblöcke" erfolgt. Eine Prozedur darf nur aus aneinandergereihten oder geschachtelten Strukturblöcken bestehen.
Jeder Strukturblock hat einen einfachen Steuerfluß, der die Reihenfolge der in ihm enthaltenen Arbeitsschritte festlegt. Grundsätzlich gibt es nur drei Formen des Steuerflusses in einem Strukturblock:
die Sequenz (mehrere Schritte folgen aufeinander); Abschnitt 9.2.1 die Auswahl (einer von mehreren möglichen Schritten wird ausgeführt); Abschnitt 9.2.2 die Schleife (ein Schritt wird mehrmals wiederholt); Abschnitt 9.2.3
Dadurch hat der Steuerfluß in einem Strukturblock nur je einen Eingang und einen Ausgang.
Mehrere Strukturblöcke können aneinandergereiht werden und ergeben somit wieder eine Sequenz, also einen übergeordneten Strukturblock. Außerdem kann man Strukturblöcke schachteln; d.h. ein Schritt in einer Sequenz, eine Alternative eines Auswahlstrukturblocks oder der wiederholte Teil einer Schleife kann selbst aus einem Strukturblock bestehen.

In den Strukturblöcken Entscheidung, Schleife mit Vorabprüfung, Schleife mit freier Endebedingung und Zählschleife mit freier Endebedingung ist für die Makroaufrufe @IF, @WHIL und @WHEN die Angabe einer Bedingung erforderlich. Es gibt:
einfache Bedingungen; Abschnitt 9.2.4 zusammengesetzte Bedingungen; Abschnitt 9.2.5

Für die grafische Darstellung der Strukturblöcke werden im allgemeinen Nassi-Shneiderman-Diagramme (Struktogramme) verwendet. Der ASSEMBH bietet dem Anwender einen Satz vordefinierter Makros, mit denen jedes Struktogramm 1:1 codiert werden kann.
Alle Verzweigungen in einem Programm werden mit Hilfe dieser Makros realisiert, deshalb sollten Sprungbefehle (B, BAL, BALR, ...) grundsätzlich nicht verwendet werden.

256

U5223-J-Z125-3

Strukturblöcke

Sequenz

9.2.1

Sequenz
Der Sequenz-Strukturblock faßt Programmteile zu einer logischen Einheit zusammen. Er ist beliebig einsetzbar, dient vor allem der übersichtlichen Gliederung und ermöglicht die Vergabe von Namen an Folgen von Instruktionen und Strukturblöcken. Der Sequenz-Strukturblock ist vorgeschrieben für die Abgrenzung der Unterblöcke der Fallunterscheidung durch Nummer (@CASE).
Darstellung nach Nassi-Shneiderman

Format des Strukturblocks

Name [name]
[name]

Operation Operanden
@BEGI
Instruktion [,...]
Strukturblock
@BEND

U5223-J-Z125-3

257

Entscheidung

Strukturblöcke

9.2.2

Auswahlstrukturblöcke
Ein Auswahlstrukturblock besteht aus einer Reihe von Unterblöcken und einem Kriterium, das aus den Unterblöcken genau einen auswählt.

9.2.2.1

Entscheidung
Bei der Entscheidung wird von zwei Unterblöcken einer ausgewählt. Das Auswahlkriterium besteht in einer Bedingung, die sich zusammensetzt aus einem Bedingungssymbol und einem Anzeige-setzenden Assemblerbefehl (siehe 9.2.2, Bedingungen).
Darstellung nach Nassi-Shneiderman

JA Ja-Unterblock

Bedingung Nein-Unterblock

NEIN

Format des Strukturblocks

Name [name] [name] [[name] [name]

Operation Operanden

@IF

cond_sym

[Anzeige-setzender Assemblerbefehl]

@THEN Ja-Unterblock

@ELSE Nein-Unterblock]

@BEND

cond_sym Unterblock

vordefiniertes oder benutzereigenes Bedingungssymbol; gibt an, worauf die Bedingung abgefragt werden soll.
Folge von Instruktionen oder weiteren geschachtelten Strukturblöcken

258

U5223-J-Z125-3

Strukturblöcke

Entscheidung

Beschreibung
Der Ja-Unterblock wird durch den @THEN-Makro eingeleitet, der Nein-Unterblock durch @ELSE. @BEND schließt den Strukturblock ab.
Ist die Bedingung (siehe 9.2.4 und 9.2.5) wahr, werden die Instruktionen, bzw. Strukturblöcke im Ja-Unterblock ausgeführt, andernfalls der Nein-Unterblock. Fehlt der NeinUnterblock wird bei nicht zutreffender Bedingung die Instruktion ausgeführt, die auf den @BEND-Makro folgt.

Beispiel

Name

Operation Operanden

@IF CR @THEN MVI @ELSE MVI @BEND

LE R1,R2
FIELD,TRUE
FIELD,FALSE

Wenn der Inhalt von Register 1 kleiner oder gleich dem von Register 2 ist, wird der JaUnterblock ausgeführt, sonst der Nein-Unterblock.

U5223-J-Z125-3

259

Fallunterscheidung durch Nummer

Strukturblöcke

9.2.2.2

Fallunterscheidung durch Nummer
Bei der Fallunterscheidung durch Nummer wird von mehreren Unterblöcken einer ausgewählt. Das Auswahlkriterium ist die Nummer des entsprechenden Unterblocks. Diese Nummer wird im @CASE-Register angegeben.
Darstellung nach Nassi-Shneiderman

Nummer 1.Unterblock 2.Unterblock .......... n.Unterblock

Format des Strukturblocks

Name [name] [name] [name]
[name] [name] [name]

Operation Operanden

@CASE

(reg)

@BEGI 1. Unterblock @BEND . . . @BEGI n. Unterblock @BEND

@BEND

reg

@CASE-Register, enthält die Nummer des auszuführenden Unterblocks

Unterblock Folge von Instruktionen oder weiteren geschachtelten Strukturblöcken

260

U5223-J-Z125-3

Strukturblöcke

Fallunterscheidung durch Nummer

Beschreibung
Das @CASE-Register muß vor der Ausführung des Strukturblocks mit der Nummer des entsprechenden Unterblocks geladen werden. Für den Strukturblock sind maximal 90 Unterblöcke möglich.
Die Verwendung von Register 0 als @CASE-Register ist unzulässig.
Der Inhalt des @CASE-Registers wird bei der Ausführung des @CASE-Makro verändert.

Ist der Inhalt des @CASE-Registers kleiner als 1 oder größer als die Zahl der definierten Unterblöcke,
wird der letzte Unterblock ausgeführt, falls im Prozedurkopf CHECK=ON gesetzt ist (siehe 10.2, @ENTR); treten Programmfehler auf, falls im Prozedurkopf CHECK=OFF gesetzt ist.

Die Unterblöcke in einer Fallunterscheidung durch Nummer müssen mit einer Sequenz (@BEGI, @BEND) abgegrenzt werden.

Beispiel

Name

Operation Operanden

L

R6,T2

@CASE

(R6)

@BEGI

.

1. Unterblock

.

@BEND

@BEGI

.

2. Unterblock

.

@BEND

.

weitere Unterblöcke

.

möglich

@BEND

.

.

T1

DC

F'1'

T2

DC

F'2'

.

.

Im Beispiel wird Register 6 für die @CASE-Verzweigung verwendet. Der Inhalt von Register 6 ist hier 2, deshalb wird der zweite Unterblock ausgeführt.

U5223-J-Z125-3

261

Fallunterscheidung durch Vergleich

Strukturblöcke

9.2.2.3

Fallunterscheidung durch Vergleich
Bei der Fallunterscheidung durch Vergleich wird von mehreren Unterblöcken einer ausgewählt. Dies geschieht auf Grund des Vergleichs von Selektor und Komparanden. Der Selektor wird im Kopf des Strukturblocks angegeben, die Komparanden im Kopf der Unterblöcke.
Darstellung nach Nassi-Shneiderman

Komparand 1

Selektor

1.Unterblock Komparand 2

2.Unterblock

.......... Komparand n

n.Unterblock

Rest-Unterblock

262

U5223-J-Z125-3

Strukturblöcke

Fallunterscheidung durch Vergleich

Format des Strukturblocks

Name [name] [name]
[[name] [name]

Operation Operanden

@CAS2

name literal [,COMP=instr] (reg)

name

@OF

literal [,...][,COMP=instr]

val

1. Unterblock

. . . @OFRE Rest-Unterblock]

@BEND

name, bzw. literal oder (reg) im Operandeneintrag von @CAS2 gibt den Namen des Feldes oder das Register an, das den Selektor enthält, bzw. in Form eines Literals, den Selektor selbst.

name, bzw. literal oder val im Operandeneintrag eines @OF gibt den Namen des Feldes an, das den entsprechenden Komparanden enthält, bzw. in Form eines Literals oder eines selbstdefinierenden Wertes, den Komparanden selbst.

Unterblock Folge von Instruktionen oder weiteren geschachtelten Strukturblöcken

instr

Anzeige-setzender Assemblerbefehl

U5223-J-Z125-3

263

Fallunterscheidung durch Vergleich

Strukturblöcke

Beschreibung
Der aktuelle Wert des Selektors im @CAS2-Makro wird mit den Komparanden in den @OF-Makros verglichen. Der Vergleich erfolgt in der angegebenen Reihenfolge der Komparanden, von oben nach unten und von links nach rechts. Bei der ersten Gleichheit von Selektor und Komparand wird der zugehörige Unterblock abgearbeitet und der Strukturblock anschließend verlassen.
Liegt kein passender Komparand vor, wird der Restunterblock bearbeitet. Bei dessen Fehlen wird der Strukturblock verlassen und die Instruktion bearbeitet, die auf den @BEND-Makro folgt.
Das Ende eines Unterblocks ist gekennzeichnet durch den nächsten @OF, @OFRE oder den @BEND-Makro, der den Strukturblock abschließt.

Standardmäßig erfolgt der Vergleich mit dem CLC-Befehl, bei Registern mit dem C-Befehl. Mit dem Operanden COMP= kann eine abweichende Vergleichsart gewählt werden. Dabei gilt der Operand im @CAS2 für den ganzen Strukturblock, in den @OFMakros nur für den jeweiligen Unterblock.

Der Anwender muß selbst dafür sorgen, daß die generierten Assembler-Befehle

Vergleichsbefehl

Selektor,Komparand

korrekt sind, das heißt u.a., daß implizite oder explizite Längenangaben und die Ausrichtung der Operanden richtig sind.

Bei den Vergleichsbefehlen wird der Unterblock bei Gleichheit (EQ) ausgeführt; bei COMP=TM, falls die der Maske entsprechenden Bits im Selektor alle gesetzt sind (ON); bei COMP=TRT, falls im Komparanden (Umsetzungstafel) ein Funktionsbyte ungleich Null (NZ) gefunden wurde.

Die Anzahl der Unterblöcke im Strukturblock und die Anzahl der Komparanden in einem @OF sind nicht begrenzt.
Für die Auswahl des richtigen Unterblocks werden alle Vergleiche, die vor dem gesuchten Unterblock stehen, ausgeführt. Es empfiehlt sich daher, die Unterblöcke und Komparanden nach zu erwartender Häufigkeit zu ordnen.

264

U5223-J-Z125-3

Strukturblöcke

Fallunterscheidung durch Vergleich

Beispiel

Name

Operation Operanden

BLOC
(01) (02) (03) (04) (05)

@CAS2 @OF . . @OF . . @OF . . @OF . . @BEND

KEY,COMP=CLI 5
6,8
END,COMP=CLC
X'80',COMP=TM

(01) (02)
(03)
(04)
(05)

Der Selektor liegt vor im Feld KEY, der Vergleichsbefehl für den Strukturblock ist CLI. Komparand für den ersten Unterblock ist der selbstdefinierende Wert 5. D.h., der erste Unterblock wird ausgeführt, wenn der aktuelle Wert von KEY gleich 5 ist. Für den zweiten Unterblock sind als Komparanden die selbstdefinierenden Werte 6 und 8 angegeben. D.h., er wird ausgeführt, wenn der Wert von KEY gleich 6 oder gleich 8 ist. Änderung des Vergleichsbefehls für diesen Unterblock; er wird bearbeitet, falls der Wert von KEY gleich dem Wert von END ist. Für den letzten Unterblock wird erneut ein anderer Vergleichsbefehl angegeben. Er wird ausgeführt, falls die der Maske entsprechenden Bits im Selektor alle gesetzt sind.

U5223-J-Z125-3

265

Schleife mit Vorabprüfung

Strukturblöcke

9.2.3

Schleifen
Eine Schleife besteht aus einem Schleifen-Unterblock und einer Bedingung, die angibt, wie oft, bzw. wie lange dieser wiederholt werden soll.

9.2.3.1

Schleife mit Vorabprüfung
Bei einer Schleife mit Vorabprüfung wird jeweils vor Ausführung des Schleifen-Unterblocks die Bedingung geprüft.

Darstellung nach Nassi-Shneiderman

Bedingung Schleifen-Unterblock

Format des Strukturblocks

Name [name] [name] [name]

Operation Operanden

@WHIL

cond_sym

[Anzeige-setzender Assemblerbefehl]

@DO Schleifen-Unterblock

@BEND

cond_sym vordefiniertes oder benutzereigenes Bedingungssymbol; gibt an, worauf die Bedingung abgefragt werden soll.
Schleifen-Unterblock Folge von Instruktionen oder weiteren geschachtelten Strukturblöcken

266

U5223-J-Z125-3

Strukturblöcke

Schleife mit Vorabprüfung

Beschreibung
Der Schleifenunterblock wird ausgeführt, falls die Bedingung (siehe 9.2.4 und 9.2.5) erfüllt ist. Ist die Bedingung nicht erfüllt, wird die Schleife vor dem Schleifenunterblock verlassen.
Wenn bei der ersten Prüfung die Bedingung nicht erfüllt ist, wird der Schleifenunterblock nicht durchlaufen.

Beispiel

Name

Operation Operanden

LOOP

@WHIL CLI @DO . . @BEND

EQ END,C'N'

Der Schleifenunterblock wird ausgeführt, solange END gleich "N" ist.

U5223-J-Z125-3

267

Schleife mit freier Endebedingung

Strukturblöcke

9.2.3.2

Schleife mit freier Endebedingung Bei der Schleife mit freier Endebedingung können eine oder mehrere Endebedingungen an beliebigen Stellen des Schleifen-Unterblocks angegeben werden.
Darstellung nach Nassi-Shneiderman

Schleifen-Unterblock Bedingung
[Bedingung]

Format des Strukturblocks

Name [name]
[name] [name]
[name]

Operation Operanden

@CYCL

.

.

.

@WHEN

cond_sym

[Anzeige-setzender Assemblerbefehl]

@BREA . . . @BEND

cond_sym vordefiniertes oder benutzereigenes Bedingungssymbol; gibt an, worauf die Bedingung abgefragt werden soll.

268

U5223-J-Z125-3

Strukturblöcke

Schleife mit freier Endebedingung

Beschreibung
Der Schleifen-Unterblock wird von @CYCL und @BEND begrenzt. Er wird so lange wiederholt, bis eine der Endebedingungen zutrifft. Dann wird die Schleife an der angegebenen Stelle mit @BREA verlassen.
Die gesetzten Bedingungen (siehe 9.2.4 und 9.2.5) werden jeweils bei ihrem Auftreten geprüft.
@WHEN-@BREA kann innerhalb des Schleifen-Unterblocks mehrfach gesetzt sein.
Innerhalb des Schleifen-Unterblocks können weitere Strukturblöcke geschachtelt sein. Diese dürfen nur dann mit @WHEN-@BREA verlassen werden, wenn sie ebenfalls @CYCL-Schleifen sind. Bei so geschachtelten @CYCL-Schleifen beendet eine @WHEN@BREA-Bedingung nur jeweils die Schleife, in der sie definiert ist, nicht den gesamten Strukturblock.

Beispiel
Register 3 enthält die Adresse einer Zeichenkette. In dieser soll die Position des Trennzeichens '*' gesucht werden.

Name ONE

Operation
@CYCL @WHEN CLI @BREA AH @BEND . . DC

Operanden
EQ 0(R3),C'*' R3,ONE
H'1'

U5223-J-Z125-3

269

Zählschleife

Strukturblöcke

9.2.3.3

Zählschleife Bei einer Zählschleife wird der Unterblock so oft wiederholt, wie der Wiederholungsfaktor angibt.
Darstellung nach Nassi-Shneiderman

Wiederholungsfaktor Schleifen-Unterblock

Format des Strukturblocks

Name [name]
[name]
reg

Operation Operanden

@CYCL

(reg)

Schleifen-Unterblock

@BEND

Register, dessen Inhalt die Anzahl der Wiederholungen angibt

Beschreibung
reg wird nach jedem Durchlauf um 1 vermindert und auf 0 abgefragt. Ist 0 erreicht, wird der Strukturblock verlassen.
Ist der Inhalt von reg schon am Anfang kleiner als 1, wird die Schleife sofort beendet, falls im Prozedurkopf CHECK=ON gesetzt ist (siehe 10.2, @ENTR), entsteht eine Endlosschleife, falls CHECK=OFF gesetzt ist und die Schleife keine Endebedingung hat.
reg darf im Schleifen-Unterblock nicht verändert werden.

270

U5223-J-Z125-3

Strukturblöcke

Zählschleife

Beispiel
Die Tabelle 2 (TAB2) soll in die Tabelle 1 (TAB1) kopiert werden. Die Anzahl der Elemente ist im Feld N angegeben, die Länge jedes Elements in L.

Name LOOP

Operation
L LA LA @CYCL LA LA MVC @BEND

Operanden
R5,N R6,TAB1-L R7,TAB2-L (R5) R6,L(0,R6) R7,L(0,R7) 0(L,R6),0(R7)

U5223-J-Z125-3

271

Zählschleife mit freier Endebedingung

Strukturblöcke

9.2.3.4

Zählschleife mit freier Endebedingung
Die Zählschleife mit freier Endebedingung vereinigt in sich die Eigenschaften der Zählschleife mit denen der Schleife mit freier Endebedingung. Es gibt nebeneinander @WHEN-@BREA-Endebedingungen und einen Wiederholungsfaktor. Der Wiederholungsfaktor bildet eine obere Schranke für die Zahl der Durchläufe des Schleifenunterblocks.
Darstellung nach Nassi-Shneiderman

Wiederholungsfaktor
Schleifen-Unterblock Bedingung

[Bedingung]

Format des Strukturblocks

Name [name]
[name] [name]
[name]

Operation Operanden

@CYCL

(reg)

.

.

.

@WHEN

cond_sym

[Anzeige-setzender Assemblerbefehl]

@BREA . . . @BEND

reg

Register, dessen Inhalt die Anzahl der Wiederholungen angibt

cond_sym vordefiniertes oder benutzereigenes Bedingungssymbol; gibt an, worauf die

Bedingung abgefragt werden soll.

272

U5223-J-Z125-3

Strukturblöcke

Zählschleife mit freier Endebedingung

Beschreibung
Der Schleifen-Unterblock wird von @CYCL und @BEND begrenzt. Er wird so oft wiederholt, wie der Wiederholungsfaktor angibt, bzw. bis eine der Endebedingungen zutrifft. Dann wird die Schleife an der angegebenen Stelle mit @BREA verlassen.
Die gesetzten Bedingungen werden jeweils bei ihrem Auftreten geprüft.
@WHEN-@BREA kann innerhalb des Schleifen-Unterblocks mehrfach gesetzt sein.
Innerhalb des Schleifen-Unterblocks können weitere Strukturblöcke geschachtelt sein. Diese dürfen nur dann mit @WHEN-@BREA verlassen werden, wenn sie ebenfalls @CYCL-Schleifen sind. Bei so geschachtelten @CYCL-Schleifen beendet eine @WHEN@BREA-Bedingung nur jeweils die Schleife, in der sie definiert ist, nicht den gesamten Strukturblock.
reg wird nach jedem Durchlauf um 1 vermindert und auf 0 abgefragt. Ist 0 erreicht, wird der Strukturblock verlassen.
reg darf im Schleifen-Unterblock nicht verändert werden.

Beispiel
Die Schleife im Beispiel wird zehnmal durchlaufen, wenn nicht vorher die Abbruchbedingung eintritt.

Name

Operation Operanden

LOOP
NR TEST END
(01) (02) (03)

L @CYCL . . @WHEN CLC @BREA . . @BEND . . DC . .

R7,NR (R7)
EQ TEST,END
F'10' . .

(01) (02)
(03)

Register 7 wird mit dem Wiederholungsfaktor geladen Schleifenanfang Abbruchbedingung und Schleifenausgang

U5223-J-Z125-3

273

Iterative Schleife

Strukturblöcke

9.2.3.5

Iterative Schleife In einer iterativen Schleife bestimmen Anfangs- und Endwert der Laufvariablen die Zahl der Wiederholungen des Schleifen-Unterblocks.
Darstellung nach Nassi-Shneiderman

Laufvariable Schleifen-Unterblock

Format des Strukturblocks

Name [name]
[name] [name]

Operation Operanden

@THRU

(reg2)

(reg3)

(reg1), name [, name ]

literal literal

@DO Schleifen-Unterblock

@BEND

(reg1)

Register; gibt den Anfangswert für die Laufvariable an

(reg2), bzw. name oder literal im zweiten Operanden Register, Name einer Konstanten oder Literal, das den Endwert für die Laufvariable angibt. Die Konstante, bzw. das Literal muß dabei auf Halbwort ausgerichtet und ein Halbwort lang sein.

(reg3), bzw. name oder literal im dritten Operanden Register, Name einer Konstanten oder Literal, das die Schrittweite angibt. Die Konstante, bzw. das Literal muß dabei auf Halbwort ausgerichtet und ein Halbwort lang sein.

274

U5223-J-Z125-3

Strukturblöcke

Iterative Schleife

Beschreibung
Der erste Operand von @THRU (reg1) muß vor dem Aufruf mit dem Anfangswert der Laufvariablen geladen werden.
Vor jeder Ausführung des Schleifen-Unterblocks wird abgefragt, ob die Summe aus Laufvariabler und Schrittweite den Endwert übersteigt. Ist dies der Fall, wird der Strukturblock verlassen.
Nach jeder Ausführung des Schleifen-Unterblocks wird die Schrittweite zum Anfangswert, bzw. zum aktuellen Wert der Laufvariablen addiert. Der aktuelle Wert der Laufvariablen liegt jeweils in reg1 vor.
Der Schleifen-Unterblock wird so oft wiederholt, wie der ganzzahlige Teil des folgenden Ausdrucks angibt:
((Endwert-Anfangswert)/Schrittweite)+1

Wird keine Schrittweite angegeben, darf Register 0 nicht für den Anfangswert verwendet werden.
Ein @THRU-Makro mit Anfangswert Endwert und Schrittweite 0 führt zu einer Endlosschleife.

Beispiel

Name

Operation Operanden

LOOP
BEGL ENDL PLUS

. . LH @THRU @DO . . @BEND . . DC DC DC

R6,BEGL (R6),ENDL,PLUS
H'1' H'10' H'2'

In diesem Beispiel ist der Anfangswert der Laufvariablen 1, der Endwert 10 und die Schrittweite 2. Daher wird der Schleifenunterblock 5 mal durchlaufen.

U5223-J-Z125-3

275

Bedingungen

9.2.4

Einfache Bedingungen

Strukturblöcke

Format

Name

Operation Operanden
cond_sym [Anzeige-setzender Assemblerbefehl]

cond_sym vordefiniertes oder benutzereigenes Bedingungssymbol (siehe unten); gibt an, worauf die Bedingung abgefragt werden soll
Anzeige-setzender Assemblerbefehl Befehl, der unmittelbar vor der Abfrage der Anzeige ausgeführt wird. Der Befehl, der die abzufragende Anzeige setzt, muß nicht unmittelbar nach dem Bedingungssymbol folgen. Steht er außerhalb der Bedingung, darf die Anzeige zwischen dem Setzen und der Abfage nicht durch einen weiteren Befehl geändert werden. Die Abfrage der Anzeige erfolgt durch @THEN, @DO und @BREA.

276

U5223-J-Z125-3

Strukturblöcke

Bedingungen

9.2.4.1

Vordefinierte Bedingungssymbole
Es gibt bei der strukturierten Programmierung eine Reihe vordefinierter Bedingungssymbole. Sie werden entsprechend der folgenden Tabelle den am häufigsten vorkommenden Vergleichsergebnissen zugeordnet.

Ergebnisse von Vergleichsbefehlen

=

EQ equal

<

LT less than

>

GT greater than

NE not equal

GE greater or equal

LE less or equal

Eigenschaften von Ergebnissen arithmetischer und logischer Operationen

=0 <0 >0
0 Überlauf

ZE zero LZ less than zero GZ greater than zero NZ not zero ON

Ergebnisse des TM-Befehls (Testen mit Maske)

nur binäre Einsen

ON ones

nur binäre Nullen

ZE zeroes

gemischt Einsen und Nullen

MI mixed

nur Nullen oder nur Einsen

ZO ZE oder ON

mindestens eine binäre Null ZM ZE oder MI

mindestens eine binäre Eins OM ON oder MI

Tabelle 9-1

Zuordnung der vordefinierten Bedingungssymbole zu den am häufigsten vorkommenden Befehlsergebnissen

U5223-J-Z125-3

277

Bedingungen

Strukturblöcke

Beispiele

Name

Operation Operanden

@... LTR

LZ R1,R1

Die Bedingung ist wahr, wenn der Inhalt des Registers R1 negativ (less than zero) ist. Der Befehl LTR R1,R1 bewirkt nichts anderes als das Setzen der Anzeige.

@... S

GZ R1,ALPHA

Die Bedingung ist wahr, wenn das Ergebnis der Subtraktion Register R1 minus ALPHA größer als Null (greater than zero) ist, sonst falsch. Außer dem Setzen der Anzeige wird auch der Registerinhalt verändert.

@... TM

ON 0(RPEGEL),MASKE

Die Bedingung ist wahr, wenn alle durch die Maske MASKE ausgewählten Bits des Bytes mit der im Register RPEGEL stehenden Adresse binäre Einsen (ones) sind.

@... CLC

EQ KANDIDAT,0(RLISTE)

Die Bedingung ist wahr, wenn der Inhalt von KANDIDAT gleich (equal) dem gleichlangen Wert ist, der über das Register RLISTE adressiert ist.

278

U5223-J-Z125-3

Strukturblöcke

Bedingungen

9.2.4.2

Benutzereigene Bedingungssymbole
Zusätzlich zu den vordefinierten Bedingungssymbolen kann der Benutzer den möglichen Bedingungsmasken eigene Bedingungssymbole zuweisen. Diese müssen jeweils mit einem '@' anfangen.

Format der Zuweisung

Name @name

Operation EQU

Operanden Maske

Der Aufbau der Maske im Operandeneintrag der EQU-Anweisung ist aus der folgenden Tabelle zu ersehen.
(Die in einer Zeile stehenden Bedingungssymbole sind gleichwertig).

Anzeige

0 gesetzt

1 gesetzt

nicht gesetzt

nicht gesetzt

2 gesetzt
nicht gesetzt

3 gesetzt
nicht gesetzt

Maske für die bedingte Verzweigung

binär numerisch

1000

8

0100

4

0010

2

0001

1

0111

7

1011

11

1101

13

1110

14

entspricht dem vordef. Bedingungssymbol
EQ ZE
LT LZ MI
GT GZ
ON

NE NZ OM

GE

ZO

LE

ZM

Tabelle 9-2

Masken für die Zuweisung benutzereigener Bedingungssymbole

U5223-J-Z125-3

279

Bedingungen

Strukturblöcke

9.2.5

Zusammengesetzte Bedingungen Eine zusammengesetzte Bedingung besteht aus zwei oder mehr einfachen Bedingungen, die mit Hilfe der Makros @TOR, @AND und @OR verknüpft werden müssen.
Format

Name [name]
[name]

Operation Operanden

@IF

cond_sym

@WHEN

@WHIL

Anzeige-setzender Assemblerbefehl

@TOR

cond_sym

@AND

@OR

Anzeige-setzender Assemblerbefehl

cond_sym vordefiniertes oder benutzereigenes Bedingungssymbol (siehe 9.2.4)
Anzeige-setzender Assemblerbefehl Befehl, der unmittelbar vor der Abfrage der Anzeige ausgeführt wird.
In einer zusammengesetzten Bedingung muß jede einfache Bedingung den Anzeige-setzenden Assemblerbefehl enthalten.
Unter Umständen werden nicht alle Anzeige-setzenden Befehle ausgeführt. Wenn z.B. in einer Und-Verknüpfung dreier einfacher Bedingungen die erste Bedingung als nicht erfüllt erkannt wurde, bleiben die beiden restlichen Bedingungen einschließlich der in ihnen enthaltenen Befehle unbeachtet. Es empfiehlt sich daher, in zusammengesetzten Bedingungen nur solche Befehle zu verwenden, deren einzige Wirkung im Setzen der Anzeige besteht.

In einer zusammengesetzten Bedingung realisiert @TOR das logische "Oder mit Priorität", @AND das logische "Und" und @OR das logische "Oder".
Die Bindungspriorität der Makros, die logische Operatoren darstellen, entspricht der aufgeführten Reihenfolge. @TOR realisiert dabei, ebenso wie @OR, die Oder-Verknüpfung, hat aber höhere Bindungspriorität. D.h., durch die Verwendung von @TOR statt @OR wird die Reihenfolge der Bearbeitung gegenüber @AND geändert.

280

U5223-J-Z125-3

Strukturblöcke

Bedingungen

Beispiele

Name

Operation Operanden

@CYCL @WHEN CR @AND C @TOR C @BREA . .

EQ R1,R2 EQ R3,N EQ R4,M

Bedingung 1 Bedingung 2 Bedingung 3

Die Schleife wird verlassen, wenn einer der beiden Fälle gegeben ist: Bedingung 1 und Bedingung 2 treffen zu Bedingung 1 und Bedingung 3 treffen zu.

Name

Operation Operanden

@CYCL @WHEN CR @AND C @OR C @BREA . .

EQ R1,R2 EQ R3,N EQ R4,M

Bedingung 1 Bedingung 2 Bedingung 3

Das zweite Beispiel ist gleich dem ersten, bis auf die Verwendung von @OR statt @TOR in Bedingung 3.

Die Schleife wird hier verlassen, wenn einer der beiden Fälle gegeben ist: Bedingung 1 und Bedingung 2 treffen zu nur Bedingung 3 trifft zu.

U5223-J-Z125-3

281

Prozedurkonzept

9.3

Prozedurkonzept

Im Prozedurkonzept wird der Kontrollfluß zwischen Hauptprogrammen und Unterprogrammen geregelt. Eine Prozedur im Sinne der Strukturierten Programmierung ist eine Programmeinheit mit einem Eingang und einem Ausgang, die unter einem Namen, ggf. mit aktuellen Parameterwerten, aufgerufen werden kann. Für einen Prozedurtext können - im Gegensatz zu den Strukturblöcken - das dynamische und das statische Ende unterschiedlich sein.
Eine Prozedur ist aus aneinandergereihten oder geschachtelten Strukturblöcken aufgebaut. Wird ein Strukturblock zu kompliziert oder zu umfangreich, kann man ihn auslagern und zu einer eigenen Prozedur erklären. Eine Prozedur kann in einen eigenen Objektmodul übersetzt werden. Es können aber auch zwei oder mehr Prozeduren in einem Objektmodul vorliegen. Ein Prozedur kann eine andere aufrufen. Beim Aufruf kann die rufende Prozedur Parameter an die aufgerufene übergeben. Bei der Rückkehr in die rufende Prozedur kann die aufgerufene einen Rückkehrwert abgeben. Die rufende Prozedur wird mit der Instruktion fortgesetzt, die dem Aufruf unmittelbar folgt.
Prozeduren können nicht statisch ineinandergeschachtelt werden.
Die strukturierte Programmierung verlangt, daß Programme aus reentrantfähigen Prozeduren aufgebaut sind. Eine Prozedur wird "reentrantfähig" genannt, wenn sich zu gleicher Zeit mehrere Anwenderprogramme auf dem Lauf durch den (einmal vorhandenen) Code der Prozedur befinden können. Ist dies der Fall, dann belegt ein Programm den Prozessor, die übrigen befinden sich im Wartezustand; ihre Registerstände sind in einem Registersicherungsbereich zwischengespeichert.
Die Datenbereiche, die Teil des Codes einer reentrantfähigen Prozedur sind, dürfen also nur Konstanten enthalten; Datenbereiche für Variable müssen zur Laufzeit separat angefordert und verwaltet werden.
Bei der strukturierten Programmierung wird unterschieden zwischen Datenbereichen, die beim Laden des Programms bereitgestellt werden und während des ganzen Programmlaufs erhalten bleiben (Static-Bereiche), Bereichen, die während des Programmlaufs angefordert und auch wieder freigegeben werden (Controlled-Bereiche) und Bereichen, die während eines Prozedurdurchlaufs erhalten bleiben (Automatic-Bereiche).
Sollen die erzeugten Prozeduren reentrantfähig sein, dürfen statisch bereitgestellte Datenbereiche nur der Speicherung von Konstanten dienen.
Für jeden Datenbereich, auf den in einer Prozedur zugegriffen wird, muß eine Definition in der Prozedur enthalten sein, die über die Speicherklasse und die Zugriffsart Auskunft gibt.

282

U5223-J-Z125-3

Prozedurkonzept

Prozedurerklärung und Prozedurende

9.3.1

Prozedurerklärung und Prozedurende
Eine Prozedur wird statisch abgegrenzt durch die Makros @ENTR (Prozeduranfang) und @END (statisches Prozedurende). Beim Programmlauf wird eine Prozedur mit @PASS aufgerufen und mit @EXIT (dynamisches Prozedurende) beendet. Die folgende Abbildung zeigt die dynamische Verknüpfung von mehreren Prozeduren durch den Aufruf mit @PASS und die Rückkehr in die rufende Prozedur mit @EXIT.

... ... ...

@ENTR TYP=M @PASS NAME=B/
EXTNAME=B @EXIT @END Hauptprozedur

... ... ... ...

B @ENTR TYP=I/E @PASS NAME=C @PASS EXTNAME=D @EXIT @END interne oder externe Prozedur

Bild 9-1

Dynamische Prozedurverknüpfung

... ...

... ...

CC @ENTR TYP=L @EXIT @END
Low-Level-Prozedur
D @ENTR TYP=B @EXIT @END END Basisprozedur

U5223-J-Z125-3

283

Prozedurerklärung und Prozedurende

Prozedurkonzept

Prozedurerklärung
Der @ENTR-Makro stellt den Kopf für alle Typen von Prozeduren dar. Hier muß neben dem Namen der Prozedur der Prozedurtyp angegeben werden.
Neben der Hauptprozedur, die vom Betriebssystem aus durch /START-PROGRAM oder /LOAD-PROGRAM aufgerufen wird (Typ M), werden externe und interne Prozeduren unterschieden. Eine Prozedur heißt "extern", wenn sie von einem beliebigen Modul aus, "intern", wenn sie nur innerhalb eines Moduls aufgerufen werden kann.
Externe Prozeduren können zu den Typen E, B, D, interne Prozeduren zu den Typen I, L, D gehören.
Der Aufruf von @ENTR gibt außerdem Auskunft darüber, ob die Prozedur Parameter von einer anderen übernehmen und/oder selbst Parameter an eine andere übergibt. Gekennzeichnet ist zusätzlich die Anzahl der Parameter und die Übergabeform, sowie die Datenbereiche, die hierfür bereit gestellt werden müssen (siehe 9.5 und 10.2, @ENTR).
Prozedurende
Hier muß unterschieden werden zwischen dem statischen und dem dynamischen Prozedurende.
Das statische Prozedurende wird realisiert durch den @END-Makro. Durch diesen Makro werden alle Basis- und Adressierungs-Register freigegeben, die für diese Prozedur durch den ASSEMBH zugewiesen wurden.
Der @EXIT-Makro kennzeichnet das dynamische Prozedurende. In einer Hauptprozedur wird durch @EXIT das Programm beendet.
In einer gerufenen Prozedur wird die Steuerung an die rufende Prozedur zurückgegeben. Diese wird mit der Instruktion fortgesetzt, die dem Prozeduraufruf folgt. Es ist möglich, an die rufende Prozedur einen Rückkehrwert zu übergeben.
Der Rückkehrwert wird in der gerufenen Prozedur berechnet. Im @EXIT-Makro wird entweder seine Adresse angegeben oder der Rückkehrwert direkt in Form eines selbstdefinierenden Wertes übergeben (siehe 10.2, @EXIT). In der rufenden Prozedur kann dieser Wert dann weiter verarbeitet oder ausgewertet werden.

284

U5223-J-Z125-3

Prozedurkonzept

Prozedurtypen

9.3.2

Prozedurtypen

9.3.2.1

Prozeduren der Typen M, E und I
Prozeduren vom Typ M, E und I sind an die Speicherverwaltung durch das Laufzeitsystem angeschlossen. Bei ihrer Eröffnung werden automatisch die Register gesichert und bei ihrer Beendigung wieder zurückgeladen. Speicherbereiche für die Registersicherung und für zur Laufzeit angeforderte Daten werden dynamisch bereitgestellt.
In diesen Prozeduren können neben Datenbereichen der Klassen S und B (Static und Based) auch Datenbereiche der Klassen A und C (Automatic und Controlled) angefordert werden (siehe 9.4, Datenkonzept).
Für alle drei Prozedurtypen ist als Basisadreßregister das Register 10 zugewiesen. Dieses kann auch mit R@BASE angesprochen werden.
Prozeduren vom Typ M
Eine Prozedur vom Typ M ist die Hauptprozedur eines Programms. In ihr beginnt und endet die Programmausführung. Durch den @ENTR-Makro wird eine CSECT-Anweisung mit dem Namen des Programms generiert. Auch wenn Prozeduren aus mehreren Moduln zu einem Programm zusammengebunden werden, darf nur eine Prozedur vom Typ M vorhanden sein.
Eine Prozedur vom Typ M kann nicht von einer anderen aufgerufen werden. Sie kann also auch keine Parameter von einer anderen Prozedur übernehmen.
Die Übergabe von Parametern von der Hauptprozedur an weitere Prozeduren kann statisch oder dynamisch, über die STANDARD- oder die OPTIMAL-Schnittstelle erfolgen (siehe 9.5, Prozedurverknüpfung und Parameterübergabe).
Prozeduren vom Typ E und I
Eine Prozedur vom Typ E kann von einem beliebigen Modul aus aufgerufen werden (externe Prozedur).
Eine Prozedur vom Typ I kann nur innerhalb des Moduls aufgerufen werden, in dem sie liegt (interne Prozedur).
Prozeduren beider Typen können weitere interne oder externe Prozeduren aufrufen. Sie können sowohl Parameter an die gerufene Prozedur übergeben, als auch selbst Parameter von einer rufenden Prozedur übernehmen. Die Übergabe der Parameter ist sowohl statisch als auch dynamisch, über die STANDARD- oder die OPTIMAL-Schnittstelle möglich, die Übernahme von Parametern erfolgt nur statisch (siehe 9.5, Prozedurverknüpfung und Parameterübergabe).

U5223-J-Z125-3

285

Prozedurtypen

Prozedurkonzept

Bei der Rückkehr in die rufende Prozedur werden die durch ASSEMBH zugewiesenen Register wieder mit den ursprünglichen Werten geladen. Über den Operanden RETURNS= im @ENTR-Makro kann diese Möglichkeit erweitert oder eingeschränkt werden (siehe @ENTR, Format 2).

Durch den @ENTR-Makro wird bei E-Prozeduren standardmäßig eine CSECT-Anweisung mit dem Prozedurnamen generiert. Parametergesteuert kann auch nur eine ENTRY-Anweisung statt der CSECT-Anweisung generiert werden.
In I-Prozeduren wird keine CSECT-Anweisung generiert. D.h., sie gehören jeweils zum vorausgehenden Programmabschnitt. Der Anwender muß darauf achten, daß eine I-Prozedur nicht im Bereich eines Pseudoabschnitt (DSECT-Anweisung) liegt.
Beispiel

Name MAIN
DUMMY LDUMMY MAIN INTERN

Operation
@ENTR @DATA . . @EXIT @END DSECT . . EQU CSECT @ENTR . .

Operanden TYP=M ...,DSECT=DUMMY,...
*-DUMMY TYP=I

286

U5223-J-Z125-3

Prozedurkonzept

Prozedurtypen

9.3.2.2

Prozeduren der Typen B, L und D
Prozeduren vom Typ B, L und D sind nicht an die Speicherverwaltung durch das Laufzeitsystem angeschlossen. Es werden keine Speicherbereiche für die Registersicherung oder eine dynamische Parameterübergabe bereitgestellt. Die Register werden bei der Eröffnung dieser Prozeduren nicht gesichert und bei ihrer Beendigung auch nicht zurückgeladen.
Die Typen B, L und D sind für Prozeduren vorgesehen, die in der Aufrufhierarchie auf einer niedrigeren Ebene liegen und dementsprechend Basisfunktionen ausführen.
In diesen Prozeduren muß der Anwender selbst für die Speicherverwaltung sorgen. Es dürfen keine Speicheranforderungen (Datenbereiche der Klassen A und C, siehe 9.4) gestellt werden.
Prozeduren der Typen B und L
Eine Prozedur vom Typ B (Basisprozedur) kann von einem beliebigen Modul aus aufgerufen werden.
Eine Prozedur vom Typ L (Low-level-Prozedur) kann nur innerhalb des Moduls aufgerufen werden, in dem sie liegt.
Für beide Typen ist standardmäßig Register 15 als Basisadreßregister zugewiesen. Im BASE-Operanden des @ENTR-Makro kann der Anwender ein anderes Register als Basisadreßregister zuweisen. Dieses Register muß am Anfang der Prozedur explizit mit dem richtigen Wert geladen werden (z.B mit dem Assemblerbefehl "LR reg,R15").
Das Laden des Basisadreßregisters nach jedem Aufruf einer weiteren Unterprozedur wird über den Operanden LOADSB= im @ENTR-Makro gesteuert. Die Angabe von LOADSB=YES ist nur notwendig, wenn die Prozedur ein Ersatzbasisregister hat und eine andere Prozedur aufruft.
Prozeduren vom Typ B und L können ihrerseits weitere externe oder interne Prozeduren aufrufen. Eine Parameterübergabe an die gerufene Prozedur ist nur statisch möglich.
In Prozeduren vom Typ B wird durch den @ENTR-Makro standardmäßig eine CSECTAnweisung mit dem Prozedurnamen generiert. Parametergesteuert kann auch nur eine ENTRY-Anweisung statt der CSECT-Anweisung generiert werden.
Bei Prozeduren vom Typ L wird keine CSECT-Anweisung generiert. D.h., sie gehören jeweils zum vorausgehenden Programmabschnitt. Der Anwender muß darauf achten, daß eine L-Prozedur nicht im Bereich eines Pseudoabschnitts (DSECT-Anweisung) liegt.

U5223-J-Z125-3

287

Prozedurtypen

Prozedurkonzept

Prozeduren vom Typ D
Prozeduren vom Typ D (Pseudoprozeduren) sind für einfache Abläufe vorgesehen, die ohne viel Aufwand erledigt werden können. Bei diesem Typ muß auch die Basisregisterversorgung vom Anwender explizit durchgeführt werden. D-Prozeduren können sowohl extern als auch intern sein.
In einer Prozedur vom Typ D ist nicht erlaubt: der Aufruf von weiteren Unterprozeduren mit @PASS, die Rückkehr in die rufende Prozedur mit @EXIT, Speicheranforderung und Speicherfreigabe.
Ist die erste Prozedur eines Moduls vom Typ D, darf kein Prozedurname angegeben werden. Die Prozedur erhält den Namen der START-, bzw. CSECT-Anweisung.

288

U5223-J-Z125-3

Datenkonzept

9.4

Datenkonzept

Das Datenkonzept von ASSEMBH verhilft dem Anwender zur rationellen Speichernutzung und nimmt ihm die Speicherverwaltung ab, die für die Erzeugung reentrant-fähiger Prozeduren notwendig ist. Das Datenkonzept regelt den Gültigkeitsbereich aller Daten und sorgt für Übersichtlichkeit. Es verlangt, daß jede Prozedur über alle verwendeten Daten Auskunft gibt. In einer Prozedur muß angegeben werden, welche Daten sie benutzt, wo sich die Daten befinden und wie der Zugriff organisiert ist.
Für reentrant-fähige Prozeduren gilt: Datenbereiche, die Teil einer Prozedur sind, dürfen nur Konstanten enthalten. Datenbereiche für Variable müssen zur Laufzeit angefordert werden.

Dementsprechend wird unterschieden zwischen Datenbereichen, die beim Laden des Programms bereitgestellt werden und während des gesamten Programmlaufs zur Verfügung stehen, und Bereichen, die während des Programmlaufs angefordert und wieder freigegeben werden.
Bei den dynamisch angeforderten Bereichen wird unterschieden zwischen solchen, die bei Verlassen der Prozedur, in der die Anforderung erfolgte, automatisch wieder freigegeben werden, und solchen, die benutzergesteuert (controlled) durch eine explizite Instruktion wieder freigegeben werden.

Gemäß dieser Unterscheidung lassen sich die Speicherbereiche eines Programms in die folgenden vier Klassen einteilen:
Static, Automatic, Controlled und Based.
Die Zuordnung einer Klasse zu einem Bereich legt der Anwender im @DATA-Makro fest. Mit dem @DATA-Makro wird für Static- und Based-Bereiche der Zugriff realisiert, für Automatic- und Controlled-Bereiche Speicherplatz angefordert und der Zugriff realisiert.
Bereiche der Klasse Static werden durch "@DATA CLASS=S" (siehe 10.2, Format 2 von @DATA) zugeordnet. Sie erhalten während des Ladens des Programms Speicherplatz zugewiesen, der während des gesamten Programmlaufs bestehen bleibt. Der @DATAMakro lädt dazu ein Basisadreßregister.
Für Bereiche der Klasse Automatic wird entweder mit "@DATA CLASS=A" (siehe 10.2, Format 1 von @DATA) Speicher bereitgestellt oder über die Anforderung eines LOCALBereichs (siehe 9.4.2). Der Speicherbereich wird innerhalb des STACK-Bereiches der Prozedur bereitgestellt. Er wird automatisch wieder freigegeben, wenn die Prozedur, in der er angefordert wurde, durch @EXIT verlassen wird.

U5223-J-Z125-3

289

Datenkonzept
Für Bereiche der Klasse Controlled wird durch "@DATA CLASS=C" (siehe 10.2, Format 1 von @DATA) ein Bereich im HEAP-Speicher bereitgestellt. Er wird erst dann freigegeben, wenn der Benutzer dies ausdrücklich durch den @FREE-Makro fordert. Dies kann auch in einer anderen Prozedur erfolgen.
Soll ein Bereich, der in einer Prozedur einer der Klassen Static, Automatic oder Controlled zugeordnet wurde, auch in einer untergeordneten oder zeitlich später zu durchlaufenden Prozedur angesprochen werden, so muß er dort mit der Angabe eines Registers, welches die Adresse des Bereiches enthält, durch "@DATA CLASS=B" (siehe 10.2, Format 3 von @DATA) bekannt gemacht werden. Dadurch wird ihm für diese Prozedur das Klassenmerkmal "Based" zugeordnet.
Register 0, 1, 13, 14, 15 und das Prozedurbasisregister dürfen als Basisadreßregister für einen durch @DATA definierten Datenbereich nicht benützt werden.

290

U5223-J-Z125-3

Datenkonzept

Static-Bereiche

9.4.1

Datenbereiche der Klasse Static
Datenbereiche der Klasse Static sind für konstante Daten vorgesehen. Der Zugriff auf Static-Bereiche wird mit "@DATA CLASS=S" realisiert. Diese Bereiche werden statisch im Programm definiert, so daß bereits beim Laden des Programms Speicherplatz reserviert wird, der bis zum Programmende bestehen bleibt. Die Daten in einem StaticBereich stehen während des ganzen Programmlaufs zur Verfügung.
Der Speicherplatz für Static-Bereiche muß entweder intern nach dem statischen Ende der Prozedur (nach @END und vor @ENTR, bzw. der END-Anweisung) oder extern in einem eigenen Datenmodul bereitgestellt werden.
Als Basisadreßregister ist das Register zugewiesen, daß im BASE-Operanden von @DATA angegeben ist.

Interne Static-Bereiche Der INIT-Operand von @DATA gibt die symbolische Adresse des Datenbereichs an.

Beispiel

Name

Operation Operanden

EX1
CONST C1

@ENTR . . @DATA . . @EXIT @END DS DC . .

TYP=E CLASS=S,BASE=R5,INIT=CONST
0CL180 C'ABC'

Für den Static-Bereich in der Prozedur EX1 wird Register 5 als Basisadreßregister zugewiesen. Dieser Bereich beginnt an der symbolischen Adresse CONST.

Externe Static-Bereiche
Der EXTINIT-Operand von @DATA gibt die symbolische Adresse eines Datenbereichs an, der in einem eigenen Datenmodul liegt. In der zugreifenden Prozedur muß die Struktur dieses Bereichs mit Hilfe eines Pseudoabschnitts beschrieben werden. Den Namen dieses Pseudoabschnitts gibt der Operand DSECT= an.

U5223-J-Z125-3

291

Static-Bereiche

Datenkonzept

Beispiel

Name

Operation Operanden

* Zugreifende Prozedur

EX2

@ENTR

.

.

@DATA

.

.

@EXIT

@END

EX2DUMMY

DSECT

E1

DS

.

.

EEND

DS

TYP=I CLASS=S,BASE=R5,EXTINIT=EXDATEN,DSECT=EX2DUMMY
CL5 CL3

* Datenmodul

EXDATEN

CSECT

@ENTR

D

DS

D1

DC

.

.

DEND

DC

@END

TYP=D 0CL180 C'HALLO'
C'END'

Als Basisadreßregister für den Static-Bereich der Prozedur EX2 wird Register 5 zugewiesen. Der Datenbereich beginnt an der Adresse EXDATEN. Der Pseudoabschnitt EX2DUMMY beschreibt in der Prozedur EX2 die Struktur des angesprochenen Datenbereichs.

292

U5223-J-Z125-3

Datenkonzept

Automatic-Bereiche

9.4.2

Datenbereiche der Klasse Automatic
Datenbereiche der Klasse Automatic enthalten veränderbare Daten. Der Speicherplatz wird von einer Prozedur zur Laufzeit angefordert und im Prozedur-STACK zur Verfügung gestellt. Dieser Prozedur-STACK wird beim Ansprung jeder Prozedur angelegt und beim Verlassen der Prozedur mit @EXIT automatisch wieder freigegeben (prozedurgebundene Lebensdauer).
Wird die Prozedur rekursiv aufgerufen oder von verschiedenen Anwendern "gleichzeitig" durchlaufen (reentrant), so bestehen mehrere Datenbereiche nebeneinander.
Datenbereiche der Klasse Automatic können nur in Prozeduren vom Typ M, E und I angefordert werden.
Es gibt zwei Möglichkeiten für das Anfordern eines Automatic-Bereichs: Der Datenbereich wird über das Basisregister 13 zusammen mit dem Registersicherstellungsbereich der Prozedur adressiert (Anfordern eines LOCAL-Bereichs). Der Datenbereich wird über ein eigenes Register, das der Benutzer explizit angibt, adressiert (Anfordern eines CLASS-A-Bereichs).
Anfordern eines LOCAL-Bereichs
Beim Eröffnen einer Prozedur wird automatisch der Prozedur-STACK bereitgestellt, der den Registersicherstellungsbereich (SAVAREA) und den LOCAL-Bereich enthält. Das Basisadreßregister für den Prozedur-STACK und damit auch für die SAVAREA und für den LOCAL-Bereich ist Register 13. Der Zugriff auf den LOCAL-Bereich ist nach Durchlaufen des Prozedurkopfes möglich.
Der Bereich wird angefordert über den LOCAL-Operanden von @ENTR (siehe 10.2, Format 1 und 2 von @ENTR). Eine Initialisierung des neu angeforderten Bereichs ist nicht möglich. Auf Daten in diesem Speicherbereich kann man nicht von einer anderen Prozedur aus zugreifen.
Die Struktur dieses Speicherbereichs wird von einem Pseudoabschnitt beschrieben, der unmittelbar nach dem statischen Ende der betreffenden Prozedur definiert sein muß. Der Pseudoabschnitt muß mit dem @PAR-Makro definiert werden (siehe 10.2, Format 3 von @PAR). Der Name des Pseudoabschnitts muß mit der Angabe im LOCAL-Operanden von @ENTR übereinstimmen.

U5223-J-Z125-3

293

Automatic-Bereiche

Beispiel

Name EX1
PRIVATE P1 PRIVATE

Operation
@ENTR . . @EXIT @END @PAR DS . . @PAR

Operanden TYP=I,LOCAL=PRIVATE

D=YES CL5
LEND=YES

(01) (02)

(01) Beginn des Pseudoabschnitts (02) Ende des Pseudoabschnitts

Datenkonzept

294

U5223-J-Z125-3

Datenkonzept

Automatic-Bereiche

Anfordern mit @DATA CLASS=A
Für einen Datenbereich, der mit "@DATA CLASS=A" angefordert wurde, ist als Basisadreßregister das Register zugewiesen, das im BASE-Operanden von @DATA angegeben ist.
Der Speicherplatz wird angefordert entsprechend der Länge, die entweder im Operanden LENGTH= direkt angegeben wird oder die anhand eines zugeordneten Pseudoabschnitts errechnet wird. Bei Angabe von LENGTH= entfällt die Möglichkeit der symbolischen Adressierung.
Der zugeordnete Pseudoabschnitt beschreibt die Struktur des angeforderten Speicherbereichs. Seine Definition muß mit einer DSECT-Anweisung beginnen. Der Pseudoabschnitt muß abgeschlossen werden mit der folgenden Assembleranweisung:
Ldsect_name EQU *-dsect_name

Beispiel
Name MAIN
DUMMY D D1 D2 LDUMMY

Operation
@ENTR @DATA . . @EXIT @END DSECT DS DS DS EQU

Operanden TYP=M CLASS=A,BASE=R7,DSECT=DUMMY
0CL20 CL10 CL10 *-DUMMY

Automatic-Bereiche, die mit @DATA CLASS=A angefordert wurden, können initialisiert werden. D.h., bereits definierte Daten werden in den angeforderten Speicherbereich kopiert. Diese Daten können im gleichen Modul liegen, wie die betreffende Prozedur, dann werden sie mit dem Operanden INIT= angesprochen. Liegen die zu kopierenden Daten in einem anderen Modul, ist der Name des Datenbereichs mit EXTINIT= anzugeben.

U5223-J-Z125-3

295

Automatic-Bereiche

Datenkonzept

Beispiel
Name MAIN
IDAT

Operation
@ENTR @DATA . . @EXIT DC DC . . @END

Operanden TYP=M CLASS=A,BASE=R7,LENGTH=(R8),INIT=IDAT
C'ABC' C'DEF'

296

U5223-J-Z125-3

Datenkonzept

Controlled-Bereiche

9.4.3

Datenbereiche der Klasse Controlled
Datenbereiche der Klasse Controlled enthalten veränderbare Daten. Der Speicherplatz wird von einer Prozedur zur Laufzeit angefordert und im HEAP-Speicher zur Verfügung gestellt. Er liegt außerhalb des Moduls und kann nur explizit mit @FREE vom Benutzer freigegeben werden (benutzergesteuerte Lebensdauer).
Wird die Prozedur rekursiv aufgerufen oder von verschiedenen Anwendern "gleichzeitig" durchlaufen (reentrant), so bestehen für jeden Durchlauf des @DATA-Makro mehrere Datenbereiche nebeneinander.
Datenbereiche der Klasse Controlled können nur in Prozeduren vom Typ M, E und I angefordert werden.
Datenbereiche der Klasse Controlled werden angefordert mit "@DATA CLASS=C" und adressiert über das Basisadreßregister, das im BASE-Operanden explizit angegeben ist.
Der Speicherplatz wird angefordert entsprechend der Länge, die entweder im Operanden LENGTH= direkt angegeben wird oder die anhand eines zugeordneten Pseudoabschnitts errechnet wird. Bei Angabe von LENGTH= entfällt die Möglichkeit der symbolischen Adressierung.
Der zugeordnete Pseudoabschnitt beschreibt die Struktur des angeforderten Speicherbereichs. Seine Definition muß mit einer DSECT-Anweisung beginnen. Der Pseudoabschnitt muß abgeschlossen werden mit der folgenden Assembleranweisung:
Ldsect_name EQU *-dsect_name
Controlled-Bereiche, die mit @DATA CLASS=C angefordert wurden, können initialisiert werden. D.h., bereits definierte Daten werden in den angeforderten Speicherbereich kopiert. Diese Daten können im gleichen Modul liegen, wie die betreffende Prozedur, dann werden sie mit dem Operanden INIT= angesprochen. Liegen die zu kopierenden Daten in einem anderen Modul, ist der Name des Datenbereichs mit EXTINIT= anzugeben.
Der Benutzer muß den angeforderten Speicherbereich mit @FREE freigeben (siehe 10.2). Das kann bereits vor Prozedurende geschehen, um Platz und Register zu sparen, oder in einer späteren Prozedur, falls z.B. die Daten noch weiter bearbeitet werden sollen.

U5223-J-Z125-3

297

Controlled-Bereiche

Beispiel
Name MAIN
DUMMY D D1 D2 LDUMMY

Operation
@ENTR @DATA . . @FREE @EXIT @END DSECT DS DS DS EQU

Operanden TYP=M CLASS=C,BASE=R7,DSECT=DUMMY
BASE=R7
0CL20 CL10 CL10 *-DUMMY

Datenkonzept

298

U5223-J-Z125-3

Datenkonzept

Based-Bereiche

9.4.4

Datenbereiche der Klasse Based

Die Klasse Based dient dem Zugriff auf einen Datenbereich, dessen SpeicherplatzZuordnung in einer anderen, dynamisch übergeordneten oder zeitlich vorangegangenen Prozedur erfolgt ist (@DATA CLASS=S, CLASS=A oder CLASS=C).
Eine Unterprozedur greift auf einen bereits bestehenden Datenbereich zu mit @DATA CLASS=B (siehe 10.2, Format 3 von @DATA). Der BASE-Operand dieses Makroaufrufs gibt das Basisadreßregister an, das in der übergeordneten Prozedur für diesen Datenbereich zugewiesen wurde. Das Register muß in der übergeordneten Prozedur mit der Anfangsadresse des Bereichs versorgt werden. Dies geschieht entweder mit @DATA CLASS=A, C oder S oder z.B. bei der Parameterübergabe.

Um die symbolische Adressierung des angesprochenen Datenbereichs zu ermöglichen, ist im @DATA-Makro der Operand DSECT= anzugeben. Dieser enthält entweder:
die symbolische Adresse des angesprochenen Datenbereichs oder den Namen eines Pseudoabschnitts, der die Struktur des Bereichs beschreiben soll. Der Pseudoabschnitt muß mit der folgenden Assembleranweisung abgeschlossen werden:

Ldsect_name

EQU *-dsect_name

U5223-J-Z125-3

299

Based-Bereiche

Datenkonzept

Beispiel

Name

Operation Operanden

EX1 DUMMY ..
LDUMMY

CSECT DSECT DS . . EQU

.. *-DUMMY

(01)

* Übergeordnete Prozedur

EX1

@ENTR

TYP=M

@DATA

CLASS=S,BASE=R7,INIT=GLOB

.

.

@PASS

NAME=EX2

.

.

@EXIT

@END

GLOB

DS

0C

..

.

..

.

(02) (03)

* Unterprozedur

EX2

@ENTR

@DATA

.

.

TYP=I CLASS=B,BASE=R7,DSECT=DUMMY (04)

(01) Definition des Pseudoabschnitts (02) Einrichten eines Static-Bereichs mit Register 7 als Basisadreßregister; der Bereich
wird mit den Daten in GLOB initialisiert. (03) Aufruf der Unterprozedur (04) Zugriff auf den Datenbereich, der in EX1 eingerichtet wurde und der über R7
adressiert ist. Die Struktur des Speicherbereichs beschreibt für die Prozedur EX2 der Pseudoabschnitt DUMMY

300

U5223-J-Z125-3

Prozedurverknüpfung und Parameterübergabe

9.5

Prozedurverknüpfung und Parameterübergabe

Die Verknüpfung von Prozeduren erfolgt mit Hilfe von @PASS (siehe 10.2). Dieser Makro ruft von einer dynamisch übergeordneten Prozedur aus eine Unterprozedur auf. Die gerufene Prozedur kehrt mit @EXIT in die rufende zurück.
Bei der Eröffnung von Prozeduren der Typen M, E und I wird automatisch der Prozedur-STACK bereitgestellt, der die Verkettungsinformation, die Register (SAVAREA) und evtl. den LOCAL-Bereich enthält. Der Prozedur-STACK wird über Register 13 adressiert. Die rufende Prozedur übergibt in Register 13 die Adresse des eigenen Prozedur-STACK, die gerufene Prozedur legt im Prozedur-STACK der rufenden die Register ab und lädt sie vor dem Rücksprung wieder.
Register 13 wird bei der Registersicherstellung nicht mitgesichert.

Beim Aufruf von Prozeduren der Typen B, L und D wird kein Prozedur-STACK bereitgestellt. Bei diesen Prozeduren muß der Anwender selbst für eine Registersicherung sorgen. Insbesondere muß bei Prozeduren vom Typ B oder L das Prozedurrückkehrregister 14 sichergestellt werden.

Parameterübergabe
Eine Prozedur kann beim Aufruf einer weiteren Parameter an die gerufene Prozedur übergeben. Ein Parameter ist immer ein Wort lang. Er kann eine Adresse oder einen Wert enthalten. An die gerufene Prozedur übergeben wird entweder der Parameter selbst oder seine Adresse. Für die Übergabe wird eine Parameterliste aufgebaut, die entsprechend für jeden Parameter dessen Adresse oder den Wert enthält.

Für die Parameterübergabe sind verschiedene Formen vorgesehen. Diese berücksichtigen
ob die bei einem Aufruf zu übergebenden Parameterwerte sich schon beim Programmieren festlegen lassen (statische Übergabe) oder ob sie erst zur Laufzeit bekannt sind (dynamische Übergabe),
ob bei dynamischer Übergabe die Parameteradressen in einer Liste zusammengestellt werden, deren Adresse in Register 1 übergeben wird (STANDARD-Schnittstelle) oder ob bis zu vier Parameteradressen oder -werte in den Registern 1 bis 4 übergeben werden (OPTIMAL-Schnittstelle).

U5223-J-Z125-3

301

Prozedurverknüpfung und Parameterübergabe

Die zu einem @PASS aufgebaute Parameterliste besteht bei statischer Übergabe aus Konstanten, die zur Übersetzungszeit generiert werden und während der gesamten Lebensdauer des Programms erhalten bleiben. Bei dynamischer Übergabe werden die Parameterlisten wie veränderbare Daten behandelt. Ihr Speicherplatz wird im ProzedurSTACK der rufenden Prozedur bereitgestellt und beim Prozeduraufruf (@PASS) wird die Parameterliste dort abgelegt.
Die Angabe, ob eine Übergabe in STANDARD- oder OPTIMAL-Form stattfinden soll, erfolgt
in der aufrufenden Prozedur im PASS-Operanden des Prozeduraufrufs (@PASS), in der aufgerufenen Prozedur im PASS-Operanden des Prozedurkopfes (@ENTR). Beide Angaben müssen übereinstimmen.
Im Programm "DEMOPARA" (siehe Anhang 11.5) sind die verschiedenen Möglichkeiten der Parameterübergabe und -übernahme in einem Beispiel dargestellt.
Die folgende Tabelle zeigt die Kombinationsmöglichkeiten der Formen der Parameterübergabe mit denen der Parameterübernahme.

Parameterübernahme,

Parameterübergabe,

STANDARDSchnittst. (9.5.3.1)

OPTIMALSchnittst. (9.5.3.2)

STANDARD-Schnittst.,

statisch

X

-

(9.5.1.1)

STANDARD-Schnittst.,

dynamisch

X

-

(9.5.1.2)

OPTIMAL-Schnittst.,

dynamisch

-

X

(9.5.2)

in Formalparameter (9.5.3.3)
X
X
X

in Formalpar. im LOCAL (9.5.3.4)
X
X
X

Tabelle 9-3

Kombinationen von Parameterübergabe und Parameterübernahme

302

U5223-J-Z125-3

Prozedurverknüpfung

Parameterübergabe

9.5.1

Parameterübergabe über die STANDARD-Schnittstelle
Bei der Parameterübergabe über die STANDARD-Schnittstelle werden die Parameter in einer Parameterliste zusammengefaßt. Die Adresse der Parameterliste wird in Register 1 übergeben.

9.5.1.1

Statische Parameterübergabe
Bei der statischen Parameterübergabe wird die Parameterliste mit konstanten Werten zur Übersetzungszeit erzeugt. Sie bleibt bis zum Programmende bestehen. Die Parameterliste wird über den @PAR-Makro (Format 1) innerhalb der rufenden Prozedur gespeichert, d.h., sie gehört zum entsprechenden Modul.
Diese Form der Parameterübergabe ist erlaubt in Prozeduren vom Typ M, E, I, L und B.
In der rufenden Prozedur
gibt der PAR-Operand von @PASS (Format 2) den Namen der zu übergebenden Parameterliste an. Register 1 wird mit dieser Adresse geladen.
muß die Parameterliste mit @PAR (Format 1) zwischen @EXIT und @END erzeugt werden. Der Name von @PAR gibt den Namen der Parameterliste an.
vergibt der PLIST-Operand von @PAR (Format 1) Namen an die Adreßkonstanten der Parameterliste. Fehlt der PLIST-Operand, werden namenlose Konstanten erzeugt.
enthält der VLIST-Operand von @PAR (Format 1) die Aktualparameter. Dies sind entweder der Name eines Feldes, dessen Adresse übergeben werden soll, oder ein selbstdefinierender Wert.
Ist ein Aktualparameter nicht vorhanden, muß im VLIST-Operanden ein zusätzliches Komma geschrieben werden.
In der gerufenenen Prozedur
gibt es für die Übernahme der Parameter die folgenden Möglichkeiten:
Ansprechen der Parameter über die Adresse der Parameterliste (STANDARD-Schnittstelle, siehe 9.5.3.1), Übernahme der Parameter in Formalparameter, denen Felder in der gerufenen Prozedur entsprechen (siehe 9.5.3.3) und Übernahme der Parameter in Formalparameter, denen Felder im LOCAL-Bereich der gerufenen Prozedur entsprechen (siehe 9.5.3.4).

U5223-J-Z125-3

303

Parameterübergabe

Prozedurverknüpfung

Beispiel

Name

Operation Operanden

* rufende Prozedur

PRO1

@ENTR

@DATA

.

.

@PASS

.

.

@EXIT

PARLIST

@PAR

@END

PRO1DAT

DS

FIELD

DC

SET

DC

.

.

TYP=M CLASS=S,BASE=R6,INIT=PRO1DAT
NAME=PRO2,PAR=PARLIST
PLIST=(PAR1,PAR2,PAR3),VLIST=(FIELD,27,SET) 0H C'ABC' C'DEF'

Die Prozedur PRO1 ruft PRO2 auf und übergibt drei Parameter. Übergeben wird die Adresse von FIELD, der Wert 27 und die Adresse von SET.

* gerufene Prozedur

PRO2

@ENTR

@DATA

.

.

L

MVC

.

.

@EXIT

@END

IN

@PAR

.

.

PRO2DAT

DS

FIELDA

DS

FIELDB

DS

.

.

TYP=I,LOCAL=IN,PLIST=(IN1,IN2,IN3) CLASS=S,BASE=R7,INIT=PRO2DAT
R8,IN3 FIELDB,0(R8)
D=YES,LEND=YES,PLIST=(IN1,IN2,IN3)
0H CL3 CL3

PRO2 übernimmt drei Parameter in ihren LOCAL-Bereich und überträgt den Inhalt von SET nach FIELDB.

304

U5223-J-Z125-3

Prozedurverknüpfung

Parameterübergabe

9.5.1.2

Dynamische Parameterübergabe
Bei der dynamischen Parameterübergabe wird die Parameterliste zur Laufzeit erzeugt und im Sicherstellungsbereich der rufenden Prozedur abgelegt. Bei der Rückkehr aus dieser Prozedur wird der Speicherbereich wieder freigegeben. Der Aufbau der Parameterliste erfolgt über den PLIST-Operanden von @PASS (Format 2) in der rufenden Prozedur.
Dynamische Parameterübergabe ist nur möglich in Prozeduren der Typen M, E und I.
In der rufenden Prozedur
gibt der MAXPRM-Operand von @ENTR (Format 1 und 2) an, wieviele Parameter die Prozedur maximal übergeben darf. Entsprechend dieser Angabe wird im LOCALBereich der rufenden Prozedur Speicherplatz für die Maximalgröße der Parameterliste reserviert.
gibt der PLIST-Operand von @PASS (Format 3) die Namen der Felder, bzw. die Register an, deren Adresse an die rufende Prozedur übergeben werden sollen (Aktualparameter).
gibt der PASS-Operand von @PASS (Format 3) an, daß die Übergabe über die STANDARD-Schnittstelle erfolgen soll.
In der gerufenen Prozedur
gibt es für die Übernahme der Parameter die folgenden Möglichkeiten:
Ansprechen der Parameter über die Adresse der Parameterliste (STANDARD-Schnittstelle, siehe 9.5.3.1), Übernahme der Parameter in Formalparameter, denen Felder in der gerufenen Prozedur entsprechen (siehe 9.5.3.3) und Übernahme der Parameter in Formalparameter, denen Felder im LOCAL-Bereich der gerufenen Prozedur entsprechen (siehe 9.5.3.4).

U5223-J-Z125-3

305

Parameterübergabe

Prozedurverknüpfung

Beispiel

Name

Operation

* rufende Prozedur

PRO1

@ENTR

@DATA

.

.

@PASS

.

.

@EXIT

PRO1DAT

DS

FIELD

DC

SET

DC

@END

DUMMY

DSECT

D1

DS

D2

DS

.

.

PRO1

CSECT

Operanden
TYP=M,MAXPRM=2 CLASS=A,BASE=R6,DSECT=DUMMY,INIT=PRO1DAT
NAME=PRO2,PLIST=(D1,D2),PASS=STA
0H C'ABC' C'DEF'
CL3 CL3

Die Prozedur PRO1 ruft PRO2 auf und übergibt zwei Parameter. Die Felder, deren Adressen übergeben werden sollen, sind in DUMMY definiert und werden mit den Werten aus PRO1DAT initialisiert.

* gerufene Prozedur

PRO2

@ENTR

@DATA

.

.

L

MVC

.

.

@EXIT

@END

IN

@PAR

.

.

PRO2DAT

DS

FIELDA

DS

FIELDB

DS

.

.

TYP=I,LOCAL=IN,PLIST=(IN1,IN2),PASS=STA CLASS=S,BASE=R7,INIT=PRO2DAT
R8,IN2 FIELDB,0(R8)
D=YES,LEND=YES,PLIST=(IN1,IN2)
0H CL3 CL3

PRO2 übernimmt zwei Parameter in ihren LOCAL-Bereich und überträgt den Inhalt von D2 nach FIELDB.

306

U5223-J-Z125-3

Prozedurverknüpfung

Parameterübergabe

9.5.2

Parameterübergabe über die OPTIMAL-Schnittstelle
Die Parameterübergabe über die OPTIMAL-Schnittstelle ist nur dynamisch möglich. Hier werden die Parameter in den Registern 1 bis 4 direkt übergeben. In diesen Registern werden die Adressen der Felder, bzw. die Werte abgelegt, die an die gerufene Prozedur übergeben werden sollen.
Bei mehr als vier Parametern werden die ersten drei Parameter in den Registern 2 bis 4 übergeben. Für die restlichen Parameter wird eine Parameterliste angelegt, deren Adresse in Register 1 geladen wird. D.h., drei Parameter werden über die OPTIMALSchnittstelle übergeben, die weiteren über die STANDARD-Schnittstelle.
Dynamische Parameterübergabe ist nur möglich in Prozeduren der Typen M, E und I.
Bei der Verknüpfung mit Programmen in anderen Programmiersprachen ist diese Form der Parameterübergabe nicht zulässig.
In der rufenden Prozedur
gibt der PLIST-Operand von @PASS (Format 3) die Aktualparameter an, d.h., die Adressen der Felder, bzw. die Register, die an die gerufene Prozedur übergeben werden sollen.
gibt der PASS-Operand von @PASS (Format 3) an, daß die Übergabe über die OPTIMAL-Schnittstelle erfolgen soll.
In der gerufenen Prozedur
gibt es für die Übernahme der Parameter die folgenden Möglichkeiten:
Direktes Ansprechen der Parameter über die Register 1 bis 4 (OPTIMAL-Schnittstelle, siehe 9.5.3.2), Übernahme der Parameter in Formalparameter, denen Felder in der gerufenen Prozedur entsprechen (siehe 9.5.3.3) und Übernahme der Parameter in Formalparameter, denen Felder im LOCAL-Bereich der gerufenen Prozedur entsprechen (siehe 9.5.3.4).

U5223-J-Z125-3

307

Parameterübergabe

Prozedurverknüpfung

Beispiel

Name

Operation

* rufende Prozedur

PRO1

@ENTR

@DATA

.

.

@PASS

.

.

@EXIT

PRO1DAT

DS

FIELD

DC

SET

DC

@END

DUMMY

DSECT

D1

DS

D2

DS

.

.

PRO1

CSECT

Operanden
TYP=M CLASS=A,BASE=R6,DSECT=DUMMY,INIT=PRO1DAT
NAME=PRO2,PLIST=(D1,D2),PASS=OPT
0H C'ABC' C'DEF'
CL3 CL3

Die Prozedur PRO1 ruft PRO2 auf und übergibt zwei Parameter. Die Felder, deren Adressen übergeben werden sollen, sind in DUMMY definiert und werden mit den Werten aus PRO1DAT initialisiert.

* gerufene Prozedur

PRO2

@ENTR

@DATA

.

.

L

MVC

.

.

@EXIT

@END

IN

@PAR

.

.

PRO2DAT

DS

FIELDA

DS

FIELDB

DS

.

.

TYP=I,LOCAL=IN,PLIST=(IN1,IN2),PASS=OPT CLASS=S,BASE=R7,INIT=PRO2DAT
R8,IN2 FIELDB,0(R8)
D=YES,LEND=YES,PLIST=(IN1,IN2)
0H CL3 CL3

PRO2 übernimmt zwei Parameter in ihren LOCAL-Bereich und überträgt den Inhalt von D2 nach FIELDB.

308

U5223-J-Z125-3

Prozedurverknüpfung

Parameterübernahme

9.5.3

Parameterübernahme
Für die Übernahme von Parametern gibt es, abhängig von der Übergabeform und dem Prozedurtyp, verschiedene Möglichkeiten.

9.5.3.1

Parameterübernahme über die STANDARD-Schnittstelle
Bei der STANDARD-Übergabe enthält Register 1 immer die Adresse der Parameterliste. Die gerufene Prozedur kann auf diese STANDARD-Schnittstelle aufsetzen und die Parameter über die Adresse der Parameterliste ansprechen. Diese Form ist in allen Prozedurtypen erlaubt.

Beispiel

Name

Operation

* rufende Prozedur

PRO1

@ENTR

@DATA

.

.

@PASS

.

.

@EXIT

PARLIST

@PAR

@END

PRO1DAT

DS

FIELD

DC

SET

DC

.

.

Operanden
TYP=M CLASS=S,BASE=R6,INIT=PRO1DAT
NAME=PRO2,PAR=PARLIST
PLIST=(PAR1,PAR2,PAR3),VLIST=(FIELD,27,SET) 0H C'ABC' C'DEF'

U5223-J-Z125-3

309

Parameterübernahme

Prozedurverknüpfung

Die Prozedur PRO1 ruft PRO2 auf und übergibt drei Parameter (statische Übergabe). Übergeben wird die Adresse von FIELD, der Wert 27 und die Adresse von SET.

* gerufene Prozedur

PRO2

@ENTR

@DATA

.

.

L

MVC

L

MVC

.

.

@EXIT

@END

.

.

PRO2DAT

DS

FIELDA

DS

FIELDB

DS

.

.

TYP=I CLASS=S,BASE=R7,INIT=PRO2DAT
R8,0(0,R1) FIELDA,0(R8) R8,8(0,R1) FIELDB,0(R8)
0H CL3 CL3

PRO2 übernimmt die Parameter und überträgt den Inhalt von FIELD nach FIELDA und den Inhalt von SET nach FIELDB.

310

U5223-J-Z125-3

Prozedurverknüpfung

Parameterübernahme

9.5.3.2

Parameterübernahme über die OPTIMAL-Schnittstelle
Bei der OPTIMAL-Übergabe werden die Parameter in den Registern 1 bis 4 übergeben. Die gerufene Prozedur kann direkt auf diese OPTIMAL-Schnittstelle aufsetzen und die Parameter über die Register 1 bis 4 ansprechen. Bei mehr als vier Parametern muß die gerufene Prozedur auch die entsprechende Verwaltung übernehmen.
In der gerufenen Prozedur muß im @ENTR-Makro (Format 2) der PASS-Operand angeben, daß die Übergabe über die OPTIMAL-Schnittstelle stattfindet.

Beispiel

Name

Operation

* rufende Prozedur

PRO1

@ENTR

@DATA

.

.

@PASS

.

.

@EXIT

PRO1DAT

DS

FIELD

DC

SET

DC

@END

DUMMY

DSECT

D1

DS

D2

DS

.

.

PRO1

CSECT

Operanden
TYP=M CLASS=A,BASE=R6,DSECT=DUMMY,INIT=PRO1DAT
NAME=PRO2,PLIST=(D1,D2),PASS=OPT
0H C'ABC' C'DEF'
CL3 CL3

U5223-J-Z125-3

311

Parameterübernahme

Prozedurverknüpfung

Die Prozedur PRO1 ruft PRO2 auf und übergibt zwei Parameter. Die Felder, deren Adressen übergeben werden sollen, sind in DUMMY definiert und werden mit den Werten aus PRO1DAT initialisiert.

* gerufene Prozedur

PRO2

@ENTR

@DATA

.

.

MVC

.

.

@EXIT

@END

.

.

PRO2DAT

DS

FIELDA

DS

FIELDB

DS

.

.

TYP=I,PASS=OPT CLASS=S,BASE=R7,INIT=PRO2DAT FIELDB,0(R2)
0H CL3 CL3

PRO2 übernimmt zwei Parameter und überträgt den Inhalt von D2 nach FIELDB.

312

U5223-J-Z125-3

Prozedurverknüpfung

Parameterübernahme

9.5.3.3

Parameterübernahme in Formalparameter
Den Formalparametern entsprechen in diesem Fall Felder, die in der gerufenen Prozedur definiert sind.
Diese Form der Parameterübernahme ist nicht sinnvoll für Prozeduren vom Typ B oder L. Außerdem sollte sie nicht angewendet werden für READ-ONLY-Prozeduren und bei rekursiven Prozeduraufrufen.

In der gerufenen Prozedur
muß der PLIST-Operand von @ENTR (Format 2) die Liste der Formalparameter enthalten. In diese Datenfelder werden die Einträge aus der Parameterliste übernommen.
muß der PASS-Operand von @ENTR (Format 2) angeben, ob die Übergabe der Parameter über die OPTIMAL- oder die STANDARD-Schnittstelle stattfindet.
müssen die Datenfelder, die im PLIST-Operanden angegeben sind, vom Anwender in der Prozedur definiert werden. Dies ist nur möglich mit Hilfe von @DATA CLASS=S.

Beispiel

Name

Operation

* rufende Prozedur

PRO1

@ENTR

@DATA

.

.

@PASS

.

.

@EXIT

PARLIST

@PAR

@END

PRO1DAT

DS

FIELD

DC

SET

DC

.

.

Operanden
TYP=M CLASS=S,BASE=R6,INIT=PRO1DAT
NAME=PRO2,PAR=PARLIST
PLIST=(PAR1,PAR2,PAR3),VLIST=(FIELD,27,SET) 0H C'ABC' C'DEF'

U5223-J-Z125-3

313

Parameterübernahme

Prozedurverknüpfung

Die Prozedur PRO1 ruft PRO2 auf und übergibt drei Parameter (statische Übergabe). Übergeben wird die Adresse von FIELD, der Wert 27 und die Adresse von SET.

* gerufene Prozedur

PRO2

@ENTR

@DATA

.

.

L

MVC

.

.

@EXIT

@END

.

.

PRO2DAT

DS

FIELDA

DS

FIELDB

DS

IN1

DS

IN2

DS

IN3

DS

TYP=I,PLIST=(IN1,IN2,IN3) CLASS=S,BASE=R7,INIT=PRO2DAT
R8,IN3 FIELDB,0(R8)
0H CL3 CL3 F F F

PRO2 übernimmt drei Parameter und überträgt den Inhalt von SET nach FIELDB.

314

U5223-J-Z125-3

Prozedurverknüpfung

Parameterübernahme

9.5.3.4

Parameterübernahme in Formalparameter im LOCAL-Bereich
Den Formalparametern entsprechen in diesem Fall Felder, die im LOCAL-Bereich des Prozedur-STACKS (siehe 9.4.2) der gerufenen Prozedur liegen. Die Struktur dieses Bereiches beschreibt ein Pseudoabschnitt, der mit der Struktur der Parameterliste übereinstimmen muß. In der gerufenen Prozedur bezeichnet dann ein Formalparameter, der im Pseudoabschnitt definiert wurde, bzw. das entsprechende Register, die Adresse der Konstanten aus der rufenden Prozedur.
Diese Form der Parameterübernahme ist nur erlaubt für Prozeduren vom Typ E oder I. Sie sollte unbedingt angewendet werden für READ-ONLY-Prozeduren und bei rekursiven Prozeduraufrufen.
In der gerufenen Prozedur
muß mit dem LOCAL-Operanden von @ENTR (Format 2) ein LOCAL-Bereich im Prozedur-STACK angefordert werden, in den die Parameter übernommen werden sollen.
muß der PLIST-Operand von @ENTR (Format 2) die Liste der Formalparameter enthalten. In diese Datenfelder, bzw. Register werden die Einträge aus der Parameterliste übernommen.
muß der PASS-Operand von @ENTR (Format 2) angeben, ob die Übergabe der Parameter über die OPTIMAL- oder die STANDARD-Schnittstelle stattfindet.
muß mit @PAR (Format 2) unmittelbar nach der Prozedur ein Pseudoabschnitt generiert werden. Der Name dieses Pseudoabschnitts muß mit dem Namen im LOCALOperanden von @ENTR übereinstimmen.
gibt der PLIST-Operand von @PAR die Namen der Formalparameter im Pseudoabschnitt an, die die Struktur des LOCAL-Bereichs beschreiben. Die PLIST-Operanden von @PAR müssen mit den PLIST-Operanden von @ENTR übereinstimmen.

Beispiel

siehe 9.5.1, Statische Parameterübergabe oder 9.5.2, Dynamische Parameterübergabe

U5223-J-Z125-3

315

ILCS-Anschluß

9.6

ILCS-Anschluß für die Strukturierte Programmierung

Mit der Version V1.1A des ASSEMBH sind die Makros zur Strukturierten Programmierung (@-Makros, siehe Kapitel 10) und das Assembler-Laufzeitsystem (ASSEMBH-RTS) dahingehend erweitert, daß der Anwender auch in Assembler ILCS-fähige Programme schreiben kann. Folgende Leistungen werden in der ILCS-Umgebung bereitgestellt:
Durch neue Operanden im @ENTR-Makro für die Hauptprozedur werden folgende ILCS-Funktionen ermöglicht:
Anmeldung benutzereigener Routinen zur Speicherbeschaffung und Speicherfreigabe für Stack- und Heap-Speicher
Anmeldung benutzereigener Beendigungs-Routinen
Angabe der minimalen Stack-Extent-Größe

Über diese Anpassungen an die ILCS-Norm hinaus wird dem Anwender mit neuen Strukturmakros der Zugang zu folgenden prozedurübergreifenden Funktionen von ILCS ermöglicht:
Behandlung von Ereignissen (Event's)
Behandlung von Folgeprozessen (Contingencies)
Behandlung von Unterbrechungen (STXIT's)
Die neuen Makros sollen in ILCS-Prozeduren notwendige Aufrufe von Systemmakros für die genannten Behandlungsarten ersetzen.

Durch zusätzliche neue Makros werden folgende Funktionen ermöglicht: Behandlung von Programmasken Setzen der Monitorjobvariablen Sprachinitialisierung bei nachgeladenen Moduln

Die neuen @-Makros generieren den Aufruf entsprechender Eingänge im StandardEvent-Handler (SEH), im Standard-Contingency-Handler (SCH), sowie im StandardSTXIT-Handler (SSH) der ILCS-Schnittstelle.
Will der Anwender keine ILCS-Prozedur schreiben, so kann er die Makros auf die gleiche Weise wie bisher aufrufen. Für bestehende Quellen, die nicht auf ILCS umgestellt werden sollen, sind deshalb weder Source-Änderungen noch eine neue Übersetzung notwendig.

316

U5223-J-Z125-3

9.6.1

ILCS-Anschluß

Prozedurverknüpfung
Durch die Erweiterungen der Makros @ENTR, @PASS, @PAR und @EXIT kann die Prozedurschnittstelle auf die ILCS-Konventionen umgestellt werden. Dies betrifft den Prozedurprolog, den Prozedurepilog mit Rückgabe von Funktionswert und Returncode sowie den Prozeduraufruf mit Übergabe von Parametern.

Registerkonventionen (ILCS- und Nicht-ILCS-Schnittstelle)
Die folgende Übersicht enthält einen Vergleich der Konventionen der ILCS- und NichtILCS-Schnittstelle für
Registerverwendung bei Prozeduraufruf mit/ohne Parameter Registerrestaurierung bei Prozedurende mit/ohne Funktionswert und Returncode Longjump über mehrere Prozedurebenen bei Prozedurende.

Registerverwendung bei Prozeduraufruf

ILCS

Nicht-ILCS

R15 enthält die Adresse der gerufenen Prozedur

wie ILCS

R14 enthält die Rückkehradresse

wie ILCS

R1 enthält die Adresse der Parameterliste bei Parameterversorgung STANDARD; im letzten Wort der Liste ist linkes Bit gesetzt

wie ILCS

R0 enthält die Anzahl der übergebenen Aktualparameter

Parameteranzahl steht nicht in R0; im letzten Wort der Liste ist linkes Bit gesetzt

Parameterübergabe OPTIMAL ist nicht erlaubt

Übergabe OPTIMAL neben STANDARD zulässig

Parameterübergabe "call by reference", d.h. R1 enthält die Adresse einer Parameteradreßliste

Sowohl die Parameterübergabe "call by value", als auch die Übergabe "call by reference" sind möglich.

U5223-J-Z125-3

317

ILCS-Anschluß

Registersicherung bei Prozedurende

ILCS R2 bis R14 werden restauriert
RETURNS=YES (@ENTR): R0 und R1: Funktionswert
RETURNS=NO (@ENTR): R0 und R1: undefiniert

Nicht-ILCS
keine Angabe bei @EXIT/@ENTR: R2 bis R14 restauriert R0, R1: Funktionswerte R15: Returncode
RETURNS=YES (@ENTR): R2 bis R14 und R0 restauriert R1: Funktionswert R15: Returncode
RETURNS=NO (@ENTR): R0 bis R14 restauriert R15: Returncode
RESTORE=MIN (@EXIT): R7 bis R14 restauriert R0 bis R6: Funktionswerte R15: Returncode
PROG=FORTRAN (@EXIT): R2 bis R14 restauriert R1: von FORTRAN nicht aus-
gewertet R0: Returncode

Longjump
ILCS Nicht zulässig

Nicht-ILCS
Über @EXIT TO = möglich, nur in Nicht-ILCS-Umgebung ablauffähig

318

U5223-J-Z125-3

ILCS-Anschluß

Parameterübergabe
Es gibt zwei Möglichkeiten der Parameterübergabe und -übernahme: in STANDARD-Form durch "call by reference" Der Anwender muß in der Aktualparameterliste (@PAR-/@PASS-Makro) nicht die Werte, sondern die Adressen der zu übergebenden Parameterwerte angeben.
Beachte: sowohl bei statischer als auch bei dynamischer Parameterübergabe wird in der Parameterliste im letzten Parameter das linke Bit, abhängig vom Parameter PLEND gesetzt.
Verboten sind: bei @ENTR: der Parameter PASS=OPTIMAL bei @PASS: der Parameter PASS=OPTIMAL und bei der statischen Parameterübergabe der Parameter PAR=(<register>). bei @EXIT: die Parameter RESTORE=MIN, TO=<proz.name> und PROG=FORTRAN.

Beispiele für Parameterübergabe
1. 'Call by reference' @PASS ziel, PLIST=(par_name1, par_name2, par_reg), PASS=STANDARD wobei <par_reg>=par_name3

ILCS

Nicht-ILCS

<R1>= Adresse der Parameteradreßliste

<R0>= Anzahl Parameter

<R0>= undefiniert

0 A(par_name1)

0 A(par_name2)

b A(par_name3)

b = 0 keine PLEND-Angabe oder PLEND = NO
b = 1 PLEND = YES

b = 1 keine PLEND-Angabe oder PLEND = YES
b = 0 PLEND = NO

U5223-J-Z125-3

319

ILCS-Anschluß

2. 'Call by reference' und 'Call by value' @PASS aufrufziel, PLIST=(par_name1,2, par_name3), PASS=STANDARD

ILCS

Nicht-ILCS

Direktwert nur erlaubt, wenn die rufende Prozedur diesen als absolute A d r e s s e interpretiert

Direktwert immer erlaubt, wird als absolute Adresse oder als Direktwert interpretiert

<R1>= Adresse der Parameteradreßliste

<R0>= Anzahl Parameter

<R0>= undefiniert

0 A(par_name1) 0 A(2) b A(par_name3)

b = 0 keine PLEND-Angabe oder PLEND = NO
b = 1 PLEND = YES

b = 1 keine PLEND-Angabe oder PLEND = YES
b = 0 PLEND = NO

3. 'Call by reference' und fehlender Parameter @PASS aufrufziel, PLIST=(par_name1,, par_name3), PASS=STANDARD

ILCS

Nicht-ILCS

Nicht erlaubt

Nicht erlaubt

MNOTE (Significant Error)

Mnote und Flag (Severe)

<R1>= undefiniert

<R1>= Adresse der Parameteradreßliste

<R0>= undefiniert

0 A(par_name1) 0 A(0) 1 A(par_name3)

320

U5223-J-Z125-3

9.6.2 9.6.3

ILCS-Anschluß
Benutzereigene Routinen anmelden
Mit ILCS kann der Anwender bei der Initialisierung benutzereigene Routinen anmelden: für Speicherbeschaffung und Speicherfreigabe für Stack- und Heap-Speicher zur Beendigungs-Behandlung zur Festlegung der minimalen Stack-Extent-Größe
Diese Routinen müssen die ILCS-Konventionen einhalten. Sie gelten für die gesamte ILCS-Umgebung und können nur bei der Hauptprozedur @ENTR mit TYP = M definiert werden (siehe @ENTR, Operand STREQ ff; Kapitel 10).
Ereignisse behandeln (Event Handling)
ILCS stellt mit dem Standard-Event-Handler (SEH) eine Routine zur Verfügung, die in ILCS-Programmen auftretende Ereignisse koordiniert.
An Ereignissen werden von ILCS behandelt: STXIT-Ereignisse im Sinne der BS2000-STXIT-Klassen PROCHK und ERROR.
Nicht-STXIT-Ereignisse, die vom BS2000 nicht abgedeckt werden (z.B. OPEN-Fehler bei Dateizugriff).
STXIT-Ereignisse werden vom System zugestellt, während Nicht-STXIT-Ereignisse von einer Prozedur dem Standard-Event-Handler signalisiert werden müssen.
Die Ereignisbehandlungsroutinen für die verschiedenen Ereignisklassen werden durch den @ENTR-Makro mit Angabe von entsprechenden Parametern bereitgestellt.
Das dynamische Anmelden der vom Benutzer im Prozedurprolog angegebenen Ereignisbehandlungsroutinen erfolgt bei Aufruf einer Prozedur, das Abmelden beim Verlassen einer Prozedur.
Ein explizites An- und Abmelden dieser Routinen durch den Benutzer entfällt.
Der Standard-Event-Handler bekommt immer dann die Kontrolle, wenn vom Benutzer für ein aufgetretenes Ereignis keine STXIT-Routine beim Standard-STXIT-Handler angemeldet wurde bzw. wenn der Standard-Event-Handler nicht beendet wurde.
Für jeden durch ein Ereignis ausgelösten STXIT- oder Contingency-Prozeß wird von ILCS ein separater Stack und Heap beschafft und eingerichtet. Bei einem STXIT-Ereignis im Sinne des BS2000 wird vom Standard-Event-Handler der Zustand der Unterbrechungsstelle festgehalten. Für Nicht-STXIT-Ereignisse übergibt der Benutzer beim Signalisieren dieses Ereignisses an den Standard-Event-Handler einen Parameterblock, der die Beschreibung der Unterbrechungsstelle enthält.

U5223-J-Z125-3

321

ILCS-Anschluß

9.6.4

Der Standard-Event-Handler sucht ab der aktuellen Save-Area innnerhalb der Save-AreaVerkettung in einer jeweils angeschlossenen Event-Handler-List nach der Adresse einer für dieses Ereignis zuständigen Behandlungsroutine. Ist eine solche gefunden, so wird sie vom Standard-Event-Handler nach ILCS-Konventionen gerufen; als Parameter wird vom Standard-Event-Handler der Kontext der Unterbrechungsstelle, erweitert um einen zusätzlichen Parameterblock, an die Routine übergeben.
Im einzelnen können folgende Funktionen des Standard-Event-Handlers über neue Strukturmakros aufgerufen werden:
Ereignisbehandlungsroutinen anmelden (siehe @ENTR, Operanden ABKR, PROCHK, ERROR und OTHEVT; Kapitel 10)
Nicht-STXIT-Ereignis signalisieren (siehe @EVTOE, Kapitel 10)
Folgeprozesse behandeln (Contingency Handling)
Neben der Ereignisbehandlung bietet ILCS mit dem Standard-Contingency-Handler (SCH) eine Routine an, die dem Benutzer die Möglichkeit gibt, in ILCS-Programmen mit Folgeprozessen zu arbeiten.
Diese Folgeprozesse sind vom Benutzer zu definierende externe Prozeduren, die vom Standard-Contingency-Handler verwaltet und nach ILCS-Konventionen aufgerufen werden.
Mit Hilfe neuer Strukturmakros kann eine Contingency-Routine an- und abgemeldet werden.
Das Eintreten eines Ereignisses muß vom Benutzer weiterhin mit dem Systemmakro POSSIG (Sende Signal) für eine Ereigniskennung signalisiert werden. Die Anforderung für ein Signal muß mit dem Systemmakro SOLSIG erfolgen.
Ein auftretendes Ereignis, etwa ein Signal an eine Ereigniskennung, aktiviert zunächst eine der Benutzerroutine zugeordnete Standard-Contingency-Handler-Routine, die für die Behandlungsroutine die notwendige Umgebung einrichtet: dazu gehört ein separater Heap sowie ein Stack für die Save-Areas des Benutzerprozesses.
Danach ruft der Standard-Contingency-Handler die Benutzer-Contingency-Routine nach ILCS-Konventionen auf.
Folgende Einzelfunktionen können über die neue Makroschnittstelle erreicht werden:
Contingency-Routine anmelden (siehe @CONEN, Kapitel 10)
Contingency-Routine abmelden (siehe @CONDI, Kapitel 10)

322

U5223-J-Z125-3

9.6.5

ILCS-Anschluß
Unterbrechungsereignisse behandeln (STXIT Handling)
Der Benutzer kann innerhalb von ILCS-Programmen auf Prozedurebene mit eigenen STXIT-Routinen arbeiten. Dafür stellt ILCS mit dem Standard-STXIT-Handler (SSH) eine Routine zur Verfügung, die bei auftretenden STXIT-Ereignissen vom Benutzer angemeldete Behandlungsroutinen nach ILCS-Konventionen aufruft. Das An- und Abmelden dieser Routinen in ILCS-Umgebung übernehmen neue Strukturmakros mit der entsprechenden Parameterversorgung. Von ILCS werden alle im BS2000 definierten STXIT-Ereignisse unterstützt. In strukturierten ILCS-Programmen können die expliziten Aufrufe von BS2000-Makros für STXIT-Behandlung durch die neuen Strukturmakros ersetzt werden. Sie sorgen in ILCSUmgebung für den ILCS-konformen Aufruf des STXIT-Handlers. Der Standard-STXIT-Handler bekommt immer dann die Kontrolle, wenn für ein STXITEreignis Benutzer-STXIT-Routinen angemeldet wurden; für einen STXIT-Prozeß wird ein separater Stack und Heap eingerichtet. Die angemeldeten STXIT-Routinen werden vom Standard-STXIT-Handler gemäß der definierten BS2000-Bearbeitungsreihenfolge nach ILCS-Konventionen aufgerufen. Wenn alle STXIT-Routinen abgearbeitet sind, gibt der Standard-STXIT-Handler den separaten Stack und Heap frei und richtet wieder die Umgebung der unterbrochenen Prozedur ein. Folgende ILCS-Funktionen sind mit diesen Makros erreichbar:
STXIT-Routine anmelden (siehe @STXEN, Kapitel 10) STXIT-Routine abmelden (siehe @STXDI, Kapitel 10)

U5223-J-Z125-3

323

ILCS-Anschluß

9.6.6
9.6.7 9.6.8

Programmaske setzen
Mit dem neuen Strukturmakro @SETPM (siehe Kapitel 10) kann der Benutzer in Prozeduren die Programmaske einschließlich der Anzeige dynamisch so verändern, daß bei bestimmten mathematischen Operationen auftretende Ereignisse vom System nicht auf Programmunterbrechung geleitet werden. Solche Ereignisse können sein:
Festpunktüberlauf Dezimalüberlauf Exponentenunterlauf Mantisse=0 Der Makro ersetzt in strukturierten ILCS-Programmen den BS2000-Befehl zum Setzen der Programmaske.
MONJV-Wert in der PCD setzen
Mit dem neuen Strukturmakro @SETJV (siehe Kapitel 10) kann der Benutzer in Prozeduren einen Wert definieren, der in das entsprechende Feld der PCD (siehe ASSEMBH, Benutzerhandbuch [1], 'ILCS-Datenstrukturen') eingetragen wird. Mit diesem MONJVWert als Parameter wird von ILCS der Systemmakro TERM aufgerufen.
Sprachinitialisierung bei nachgeladenen Moduln
Innerhalb von strukturierten ILCS-Programmen können Moduln nachgeladen werden. Mit dem Makro @ININ (siehe Kapitel 10) muß dann ein Aufruf von ILCS erfolgen: ILCS prüft, ob eine Sprachinitialisierung notwendig ist. Ist dies der Fall, so aktiviert ILCS die Initialisierungs-Routine, wenn für sie noch kein Aufruf stattgefunden hat.

324

U5223-J-Z125-3

ILCS-Anschluß

10 Vordefinierte Makros für die Strukturierte Programmierung
Allgemeine Programmierhinweise
Format der Makroaufrufe Die vordefinierten Makros für die Strukturierte Programmierung werden über ihren jeweiligen Makroaufruf angesprochen. Das erste Zeichen dieser Makroaufrufe ist ein "@", deshalb werden diese Makros auch "@-Makros" genannt. Das Format der vordefinierten Makroaufrufe entspricht dem Format für Makroaufrufe, wie es in 7.1 ausführlich beschrieben ist. Die dort aufgeführten Regeln gelten hier ebenso. Namens-, Operations- und Operandeneintrag der vordefinierten Makroaufrufe können bei entsprechenden Voraussetzungen mit Hilfe von variablen Parametern generiert werden (siehe Kap. 6, variable Parameter). Die Angabe eines Folgesymbols im Namenseintrag ist bei einem Makroaufruf im allgemeinen möglich. Im Rahmen der strukturierten Programmierung sollte dies jedoch unbedingt vermieden werden.
Operanden der Makroaufrufe Stellungsoperanden werden auf Grund ihrer Stellung im Operandeneintrag zugewiesen. Ihre Reihenfolge muß daher der im Format angegebenen entsprechen. Kennwortoperanden sind durch das Gleichheitszeichen (=) kenntlich gemacht. Ihnen wird im Makroaufruf über das Kennwort ein Wert zugewiesen. Die Reihenfolge der Kennwortoperanden im Makroaufruf ist beliebig (siehe auch 7.1.1, Kennwort- und Stellungsoperanden).

U5223-J-Z125-3

325

ILCS-Anschluß
Namen Bei der strukturierten Programmierung gibt es für Register vordefinierte Namen. Die Mehrzweckregister können ohne vorherige explizite Zuweisung mit den Namen R0, R1, ..., R15 angesprochen werden, die Gleitpunktregister mit FA, FB, FC und FD. Zusätzlich zu diesen vordefinierten Namen sind alle Namen, die mit "@" oder mit "R@" beginnen, für den ASSEMBH reserviert und dürfen nicht anderweitig verwendet werden.

326

U5223-J-Z125-3

vordefinerte Makros

@AND

@AND Logisches 'Und'
Funktion @AND realisiert die logische Und-Verknüpfung in zusammengesetzten Bedingungen.

Format

Name [name]

Operation @AND

Operanden cond_sym

name

Name

cond_sym vordefiniertes oder benutzereigenes Bedingungssymbol (siehe 9.2.4 und

9.2.5)

Programmierhinweis
Dem Aufruf des @AND-Makro muß grundsätzlich ein Anzeige-setzender Assemblerbefehl folgen (siehe Assemblerbefehle [3]).

Beispiel

Name

Operation
. . @IF C @AND LTR @THEN ST @BEND .

Operanden
ZE R4,ZERO NZ R5,R5 R1,POINT

(01) (02)

Der @THEN-Zweig wird nur ausgeführt, wenn die erste Bedingung (01) und die zweite Bedingung (02) zutrifft.

>>>>> siehe auch @OR und @TOR

U5223-J-Z125-3

327

@BEGI/@BEND

vordefinierte Makros

@BEGI Sequenz
Funktion @BEGI bildet den Eintrittspunkt eines Sequenz-Strukturblocks.

Format

Name [name]

Operation @BEGI[N]

Operanden

@BEND Strukturblock-Ende
Funktion @BEND definiert das Block-Ende für alle Typen von Strukturblöcken.

Format

Name [name]

Operation @BEND

Operanden

>>>>> siehe auch @BEGI, @CASE, @CAS2, @CYCL, @IF, @THRU, @WHIL

328

U5223-J-Z125-3

vordefinierte Makros

@BREA

@BREA Abbrechen einer Schleife
Funktion @BREA definiert einen Ausgang aus einer Schleife mit freier Endebedingung oder einer Zählschleife mit freier Endebedingung.

Format

Name [name]

Operation @BREA[K]

Operanden

Beschreibung
@BREA tritt in Verbindung mit dem Makroaufruf @WHEN auf. Trifft die über @WHEN definierte Bedingung zu, wird der Strukturblock mit @BREA verlassen. Trifft die Bedingung nicht zu, wird die auf @BREA folgende Instruktion ausgeführt.

Beispiel

Name

Operation Operanden

LOOP

@CYCL . . @WHEN CLI @BREA . . @WHEN SR @BREA . . @BEND

NE OK,C'Y'
LZ R7,R5

(01) (02)

Das Beispiel zeigt eine Schleife mit zwei Endebedingungen und entsprechend den zwei möglichen Ausgängen (01) und (02). Der Strukturblock wird beim ersten Zutreffen einer der beiden Bedingungen verlassen.

>>>>> siehe auch @CYCL und @WHEN

U5223-J-Z125-3

329

@CASE

vordefinierte Makros

@CASE Fallunterscheidung durch Nummer
Funktion @CASE bildet den Kopf einer Mehrfachverzweigung. Der auszuführende Unterblock wird durch die Angabe seiner Nummer angesteuert.

Format

Name [name]
name reg

Operation @CASE

Operanden (reg)

Name Mehrzweckregister, das einen der folgenden Werte als positiven absoluten Ausdruck enthält:
dezimaler selbstdefinierender Wert vordefinierter Name eines Registers Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wurde.

Beschreibung
Der Inhalt von reg gibt an, der wievielte Unterblock in einer Fallunterscheidung ausgeführt werden soll. Es sind maximal 90 Unterblöcke möglich. Der angegebene Unterblock wird direkt angesprungen.
Die Verwendung von Register 0 ist unzulässig.

Programmierhinweise
1. reg muß vor dem Aufruf von @CASE mit der Nummer des entsprechenden Unterblocks geladen werden.
2. Bei der Verwendung eines Mehrzweckregisters für reg sind die Registerkonventionen zu beachten (siehe A3.3).
3. Ist der Inhalt des @CASE-Registers kleiner als 1 oder größer als die Zahl der definierten Unterblöcke, wird der letzte Unterblock ausgeführt, falls im Prozedurkopf CHECK=ON gesetzt ist (siehe 10.2, @ENTR); treten Programmfehler auf, falls im Prozedurkopf CHECK=OFF gesetzt ist.

330

U5223-J-Z125-3

vordefinierte Makros

@CASE

Beispiel

Name

Operation Operanden

L

R6,T2

@CASE

(R6)

@BEGI

.

1. Unterblock

.

@BEND

@BEGI

.

2. Unterblock

.

@BEND

.

weitere Unterblöcke

.

möglich

@BEND

.

.

T1

DC

F'1'

T2

DC

F'2'

.

.

Im Beispiel wird Register 6 für die @CASE-Verzweigung verwendet. Der Inhalt von Register 6 ist hier 2, deshalb wird der zweite Unterblock ausgeführt.

>>>>> siehe auch @BEGI und @BEND

U5223-J-Z125-3

331

@CAS2

vordefinierte Makros

@CAS2 Fallunterscheidung durch Vergleich
Funktion @CAS2 bildet den Kopf einer Mehrfachverzweigung. Der auszuführende Unterblock wird durch die Angabe eines Selektors angesteuert.

Format

Name [name1]
name1 name2 literal reg
instr

Operation @CAS2

Operanden
name2 literal [,COMP=instr] (reg)

Name Name des Feldes, das den Selektor enthält Literal, das den Selektor direkt angibt (siehe 2.5.3) Mehrzweckregister, das den Selektor in Form eines der folgenden Werte enthält:
dezimaler selbstdefinierender Wert vordefinierter Name eines Registers Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wurde Assemblerbefehl, der eine Anzeige setzt (siehe Assemblerbefehle [3]).

Beschreibung
Der Selektor im @CAS2-Makro wird mit den Komparanden der @OF-Makros verglichen. Bei Gleichheit von Selektor und Komparand wird der entsprechende Unterblock ausgeführt. Die Anzahl der Unterblöcke ist nicht begrenzt.
Mit COMP=instr kann eine vom Standard abweichende Vergleichsart gewählt werden.

332

U5223-J-Z125-3

vordefinierte Makros

@CAS2

Beispiel

Name

Operation
@CAS2 @OF . . @OF . . @OFRE . . @BEND

Operanden TEST =X'0005'
=X'0006'

1. Unterblock
2. Unterblock
Restunterblock

Das Feld TEST enthält den Selektor. Ist der Selektor gleich dem ersten Komparanden (X'0005'), wird der erste Unterblock ausgeführt. Ist der Selektor gleich dem zweiten Komparanden (X'0006'), wird der zweite Unterblock ausgeführt. In allen anderen Fällen wird der Restunterblock verarbeitet.

>>>>> siehe auch @OF, @OFRE und @BEND

U5223-J-Z125-3

333

@CONDI

vordefinierte Makros

@CONDI Contingency-Routine abmelden
Dieser Makroaufruf ist nur in Prozeduren mit ILCS=YES erlaubt.

Funktion
@CONDI (Contingency disable) meldet eine Contingency-Routine ab (siehe auch Abschnitt 9.6.4, Folgeprozesse behandeln).

Format

Name [name]

Operation @CONDI

Operanden
symb Adr CONID=
(reg)

name symb Adr reg

Name symbolische Adresse eines Feldes Mehrzweckregister, enthält die Adresse der Kurzkennung.

Beschreibung
CONID= Kurzkennung der Routine
symb Adr symbolische Adresse eines Feldes der Länge 4 auf Wortgrenze mit der Kurzkennung. Die Kurzkennung wird vom Makro @CONEN geliefert.
(reg) wahlweise Register mit der Adresse der Kurzkennung.

Der Inlinecode des Makros übernimmt die Angaben aus dem Aufruf in einen ILCS-konformen Parameterblock; mit dieser Versorgung wird der entsprechende Entry im Standard-Contingency-Handler zum Abmelden der Contingency-Routine angesprungen.
Nach Rückkehr des Standard-Contingency-Handlers in die aufrufende Prozedur enthält R15 einen Returncode, der besagt, ob die Funktion ausgeführt wurde oder nicht bzw. welche Fehler auftraten.

334

U5223-J-Z125-3

vordefinierte Makros

@CONEN

@CONEN Contingency-Routine anmelden
Dieser Makroaufruf ist nur in Prozeduren mit ILCS=YES erlaubt.

Funktion
@CONEN (Contingency enable) meldet eine Contingency-Routine an (siehe auch 9.6.4, Folgeprozesse behandeln).

Format

Name [name]

Operation @CONEN

Operanden

name1 CONAME= symb Adr1
(reg1)

[CONLEN=länge]

symb Adr2 CONID=
(reg2)

symb Adr3 CONADR=
(reg3)

symb Adr4 CONMSG=
(reg4)

level

[CONLEV=

]

(reg5)

name name1

Name Name der Contingency-Routine

symb Adr1...symb Adr4 symbolische Adressen von Feldern

reg1...reg4 Mehrzweckregister, in denen die Adresse eines Feldes steht.

länge level reg5

Länge in Bytes selbstdefinierender dezimaler Wert Mehrzweckregister, das eine Prioritätsangabe enthält.

U5223-J-Z125-3

335

@CONEN

vordefinierte Makros

Beschreibung

CONAME= Name der Contingency-Routine

name1 Der Name der Contingency-Routine besteht aus einem String mit max. 54 Zeichen. Blank beendet den Namen.

symb Adr1 Der Name der Contingency-Routine ist in einem Feld enthalten, dessen symbolische Adresse angegeben wird.

(reg1) Die Adresse des Namens für die Contingency-Routine ist in einem Register enthalten.

CONLEN= Länge des Namens der Routine

länge

Länge des Namens in Bytes; nur nötig bei Übergabe einer Adresse für den Namen der Contingency-Routine. Voreinstellung bei CONAME=symb Adr1: Längenattribut der symbolischen Adresse Voreinstellung bei CONAME=(reg1): 54 Bytes

CONID= Zurückgemeldete Kurzkennung

symb Adr2 Gibt die symbolische Adresse eines Feldes der Länge 4 auf Wortgrenze an, in dem die Kurzkennung zurückgemeldet werden soll.

(reg2) Gibt ein Register an, das die Adresse eines Feldes der Länge 4 auf Wortgrenze enthält.

CONADR= Startadresse der Contingency-Routine

symb Adr3 Die Startadresse der Contingency-Routine ist in einem Feld auf Wortgrenze enthalten, dessen symbolische Adresse angegeben wird.

(reg3) Die Startadresse der Contingency-Routine ist in einem Register enthalten.

CONMSG= Mitteilung des Benutzers

symb Adr4 Die Mitteilung des Benutzers an die Contingency-Routine ist in einem Feld der Länge 4 auf Wortgrenze enthalten, dessen symbolische Adresse angegeben wird.

(reg4) Die Adresse der Mitteilung des Benutzers an die Contingency-Routine ist in einem Register enthalten.

336

U5223-J-Z125-3

vordefinierte Makros

@CONEN

CONLEV= level
(reg5)

Priorität der Contingency-Routine
Die Priorität der Contingency-Routine wird als selbstdefinierender dezimaler Wert von 1 - 126 angegeben. Voreinstellung ist 1.
Ein Register enthält die Prioritätsangabe der Contingency-Routine.

Der Inlinecode des Makros übernimmt die Angaben aus dem Aufruf in einen ILCS-konformen Parameterblock; mit dieser Versorgung wird der entsprechende Entry im Standard-Contingency-Handler zum Anmelden der Contingency-Routine angesprungen.
Nach Rückkehr des Standard-Contingency-Handlers in die aufrufende Prozedur enthält R15 einen Returncode, der besagt, ob die Funktion ausgeführt wurde oder nicht bzw. welche Fehler auftraten.

U5223-J-Z125-3

337

@CYCL

vordefinierte Makros

@CYCL Schleifen-Kopf
Funktion @CYCL bildet den Kopf einer Schleifenkonstruktion. Die Anzahl der Durchläufe wird mit einem Wiederholungsfaktor oder durch eine Endebedingung bestimmt.

Format 1: Schleife mit freier Endebedingung

Name [name]

Operation @CYCL[E]

Operanden

>>>>> siehe auch @BREA, @WHEN und @BEND

Format 2: Zählschleife und Zählschleife mit freier Endebedingung

Name [name]
name reg

Operation @CYCL[E]

Operanden (reg)

Name Mehrzweckregister; positiver absoluter Ausdruck, entweder
dezimaler selbstdefinierender Wert oder vordefinierter Name eines Registers oder Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wurde

Beschreibung
Der Inhalt von reg gibt die Zahl der Wiederholungen des Schleifenunterblocks an. Der Maximalwert für die Wiederholungszahl ist X'FFFFFFFF'.
reg wird nach jedem Durchlauf um 1 vermindert und auf 0 abgefragt. Ist 0 erreicht, wird der Strukturblock verlassen.

338

U5223-J-Z125-3

vordefinierte Makros

@CYCL

Programmierhinweise
1. Bei der Angabe von reg müssen die Registerkonventionen beachtet werden (siehe 11.3).
2. reg darf im Schleifenunterblock nicht verändert werden.

Beispiel
Das Beispiel zeigt eine Zählschleife mit freier Endebedingung. Die Schleife wird in diesem Fall zehnmal durchlaufen, wenn nicht vorher die Abbruchbedingung eintritt.

Name LOOP
NR TEST END

Operation
L @CYCL . . @WHEN CLC @BREA . . @BEND . . DC . .

Operanden R7,NR (R7)
EQ TEST,END
F'10' . .

(01) (02)
(03)

(01) Register 7 wird mit dem Wiederholungsfaktor geladen (02) Schleifenanfang (03) Abbruchbedingung und Schleifenausgang

>>>>> siehe auch @BREA, @WHEN und @BEND

U5223-J-Z125-3

339

@DATA

vordefinierte Makros

@DATA Datenzugriff und Speicheranforderung
Funktion @DATA realisiert den Zugriff auf Benutzerdaten und die Anforderung des dafür benötigten Speicherplatzes. Abhängig von der Angabe der Speicherklasse werden durch den @DATA-Makro entsprechende Instruktionen generiert.
Format 1: Datenbereiche der Klassen A und C

Name [name]

Operation @DATA

Operanden

A CLASS= ,BASE=reg1
C

,DSECT=dsect_name

val ,LENGTH=
(reg2)

int_name

,INIT=

[

(reg3)

]

,EXTINIT=ext_name

name

Name

reg1, reg2, reg3

Mehrzweckregister; positive absolute Ausdrücke, entweder

dezimale selbstdefinierende Werte oder

vordefinierte Namen von Registern oder

Namen, denen ein entsprechender selbstdefinierender Wert zugewiesen

wurde

dsect_name

Name eines Pseudoabschnitts, maximal 7 Zeichen

val

dezimaler selbstdefinierender Wert

int_name, ext_name

Namen von Datenbereichen

340

U5223-J-Z125-3

vordefinierte Makros

@DATA

Beschreibung

CLASS=A

Es handelt sich um einen Datenbereich der Klasse Automatic. CLASS=A ist unzulässig in Prozeduren vom Typ B, L oder D, sowie in allen Prozeduren, bei denen im @ENTR "ENV=C" gesetzt ist.

CLASS=C Es handelt sich um einen Datenbereich der Klasse Controlled CLASS=C ist unzulässig in Prozeduren vom Typ B, L oder D.

BASE=reg1 Gibt das zu verwendende Basisadreßregister an.

Beim Aufruf von @DATA wird das genannte Register mit der Adresse des zur Verfügung gestellten Speicherbereichs geladen und als Basisadreßregister bereitgestellt.

DSECT=dsect_name Gibt den Namen des Pseudoabschnitts an, mit dem der angeforderte Speicherbereich überlagert werden soll.

LENGTH= Gibt die Länge des anzufordernden Bereichs in bytes durch val direkt an, bzw. durch den Inhalt von reg2.

INIT=

Gibt den Namen (int name) oder die Adresse (in reg3) eines Bereichs im gleichen Modul (intern) an, dessen Daten zur Initialisierung in den angeforderten Speicherbereich kopiert werden sollen.

EXTINIT=ext_name Gibt den Namen eines Bereichs in einem beliebigen Modul (extern) an, dessen Daten zur Initialisierung in den angeforderten Speicherbereich kopiert werden sollen.

U5223-J-Z125-3

341

@DATA

vordefinierte Makros

Programmierhinweis

Der in DSECT=dsect_name angegebene Pseudoabschnitt muß mit der folgenden Assembleranweisung abgeschlossen werden:

Ldsect_name

EQU *-dsect_name

Beispiel

Name EX1
INDATA DATA .. LDATA

Operation
@ENTR @DATA . . @EXIT . . DS . . @END DSECT DC . . EQU . .

Operanden
TYP=E CLASS=A,BASE=R7,DSECT=DATA,INIT=INDATA

..
.. *-DATA

(01) (02) (03)

(01) Definition der Daten, die in den angeforderten Speicherbereich kopiert werden sollen.
(02) Definition des Pseudoabschnitts, der den angeforderten Speicherbereich überlagern soll.
(03) Abschluß des Pseudoabschnitts, Längenberechnung.

342

U5223-J-Z125-3

vordefinierte Makros

@DATA

Format 2: Datenbereiche der Klasse S

Name [name]

Operation @DATA

Operanden
CLASS=S ,BASE=reg
,INIT=int_name ,EXTINIT=ext_name,DSECT=dsect_name

name

Name

reg

Mehrzweckregister; positiver absoluter Ausdruck, entweder

dezimaler selbstdefinierender Werte oder

vordefinierter Name eines Registers

Name dem ein entsprechender selbstdefinierender Wert zugewiesen

wurde

int_name, ext_name

Namen von Datenbereichen

dsect_name

Name eines Pseudoabschnitts

Beschreibung
CLASS=S Es handelt sich um einen Datenbereich der Klasse Static.
BASE=reg Gibt das zu verwendende Basisadreßregister an.
Beim Aufruf von @DATA wird das genannte Register als Basisadreßregister bereitgestellt und mit der Anfangsadresse des Datenbereichs geladen.
INIT=int_name Gibt den Namen eines Datenbereichs an, der im gleichen Modul liegt (intern).
EXTINIT=ext_name Gibt den Namen eines Datenbereichs an, der in einem beliebigen Modul liegt (extern).
DSECT=dsect_name Gibt den Namen des Pseudoabschnitts an, der die Struktur des Bereichs ext_name beschreiben muß.

U5223-J-Z125-3

343

@DATA

vordefinierte Makros

Beispiel Das Beispiel zeigt einen Zugriff auf Daten, die in einem externen Modul definiert sind.

Name * Modul A
ADATEN A1
AEND LADATEN * Modul B DATEN BDATEN B1
BEND

Operation
. . @DATA . . @EXIT @END DSECT DS . . DS EQU
START ENTRY DS DC . . DC

Operanden

(01)

CLASS=S,BASE=R5,EXTINIT=BDATEN,DSECT=ADATEN

CL5
CL6 *-ADATEN
BDATEN 0CL100 C'HALLO'
C'END B'

(02)
(03) (04)

(01) Modul A enthält die Prozedur, die auf die Daten zugreifen soll. (02) Pseudoabschnitt, der die Struktur des externen Datenbereichs beschreibt. (03) Modul B ist der externe Modul, der die Datendefinitionen enthält. (04) Datendefinition im externen Modul.

344

U5223-J-Z125-3

vordefinierte Makros

@DATA

Format 3: Datenbereiche der Klasse B

Name [name]

Operation @DATA

Operanden
CLASS=B ,BASE=reg ,DSECT=dsect_name

name

Name

reg

Mehrzweckregister, positiver absoluter Ausdruck, entweder

dezimaler selbstdefinierender Wert oder

vordefinierter Name eines Registers oder

Name, dem ein entsprechender selbstdefinierender Wert zugewiesen

wurde

dsect_name

Name eines Pseudoabschnitts oder eines Datenbereichs

Beschreibung
CLASS=B Es handelt sich um einen Datenbereich der Klasse Based.
BASE=reg Gibt das zu verwendende Basisadreßregister an.
reg muß mit der Anfangsadresse des Datenbereichs geladen sein, für den in einer anderen Prozedur bereits Speicher reserviert wurde.
DSECT=dsect_name Gibt den Namen eines bereits bestehenden Datenbereichs an oder den Namen eines Pseudoabschnitts, der die Struktur des neuen Datenbereichs beschreibt.

Programmierhinweis
reg muß in einer zeitlich vorangehenden oder dynamisch übergeordneten Prozedur durch einen @DATA-Aufruf mit CLASS=A, C oder S mit der Anfangsadresse des Datenbereiches geladen werden.

U5223-J-Z125-3

345

@DATA

vordefinierte Makros

Beispiel

Name

Operation Operanden

* übergeordnete Prozedur

FIRST

@ENTR

TYP=M

@DATA

CLASS=S,BASE=R9,INIT=CONST

.

.

@PASS

NAME=SECOND

@EXIT

@END

CONST

DS

0D

DC

..

.

.

* untergeordnete Prozedur

SECOND

@ENTR

TYP=I

@DATA

CLASS=B,BASE=R9,DSECT=CONST

.

.

(01) (02) (03)
(04)

(01) Einrichten des Datenbereichs CONST mit Basisadressregister R9. (02) Aufruf der Prozedur SECOND. (03) Definition des Datenbereichs CONST. (04) Überlagerung des neuen Datenbereichs mit der Struktur des Datenbereichs
CONST

346

U5223-J-Z125-3

vordefinierte Makros

@DO

@DO Schleifen-Unterblock
Funktion @DO kennzeichnet den Beginn des Schleifenunterblocks in einer iterativen Schleife und in einer Schleife mit Vorabprüfung.

Format

Name [name]

Operation @DO

Operanden

>>>>> siehe auch @BEND, @THRU und @WHIL

U5223-J-Z125-3

347

@ELSE

vordefinierte Makros

@ELSE Nein-Unterblock
Funktion @ELSE bildet den Kopf des Nein-Unterblocks in einer Entscheidung.

Format

Name [name]

Operation @ELSE

Operanden

Beschreibung
Der Unterblock in einer @IF-Verzweigung, der mit @ELSE beginnt, wird nur durchlaufen, wenn die mit @IF gesetzte Bedingung nicht zutrifft.

>>>>> siehe auch @IF, @THEN und @BEND 348

U5223-J-Z125-3

vordefinierte Makros

@END

@END Statisches Prozedurende
Funktion @END kennzeichnet das statische Ende einer durch @ENTR eröffneten Prozedur.

Format

Name
[name]
name reg

Operation @END

Operanden

YES

(reg[,...])

[,LTORG=

][,DROP=

]

NO

()

Name Mehrzweckregister; positiver absoluter Ausdruck, entweder
dezimaler selbstdefinierender Wert oder vordefinierter Name eines Registers oder Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wurde

Beschreibung
Durch den Aufruf des @END-Makro wird bei allen Prozeduren, außer Typ D, eine LTORG-Anweisung generiert. D.h., ein Literalbereich wird ab der nächsten Doppelwortgrenze angelegt (siehe 4.2, LTORGAnweisung). werden alle durch @ENTR und @DATA zugewiesenen Basisadreßregister freigegeben (siehe 4.2, DROP-Anweisung).

LTORG=YES Bewirkt, daß eine LTORG-Anweisung generiert wird; Standardwert für alle Prozeduren außer Typ D.
LTORG=NO Es wird keine LTORG-Anweisung generiert; Standardwert für Prozeduren vom Typ D.
DROP=(reg[,...]) Zusätzlich zu den standardmäßig freigegebenen Registern können weitere freigegeben werden.
DROP=() Es wird eine DROP-Anweisung ohne Operanden generiert; alle bis dahin mit USING definierten Basisregister werden freigegeben.

U5223-J-Z125-3

349

@ENTR

vordefinierte Makros

@ENTR Prozeduranfang
Funktion @ENTR bildet den Kopf für alle Prozedurtypen. Abhängig von der Typ-Angabe sind unterschiedliche Operandenangaben möglich. Für alle folgenden Formate von @ENTR sind zusätzlich zu den angegebenen Operanden die folgenden allgemeinen Angaben möglich.

Format

Name ...
xxx name function

Operation @ENTR

Operanden

... [,VERS=xxx] [,AUTHOR=name] [,FUNCT='function']

ON

[,CHECK=

]

OFF

YES

[,TITLE=

]

NO

Versionsbezeichnung, wird formatfrei angegeben.
Name des Programmierers.
Dokumentationstext; sollte die Funktion der Prozedur angeben; maximale Länge 63 Zeichen.

Beschreibung

CHECK= Entscheidet über die Erzeugung von Prüfungen zur Ablaufzeit mit Fehlerbehandlung.

ON

Prüfungen und Fehlerbehandlung werden erzeugt. Die Funktion dient der

Programmsicherheit und geht auf Kosten von Speicherplatz und Laufzeit.

OFF Prüfungen und Fehlerbehandlungen werden nicht erzeugt.

350

U5223-J-Z125-3

vordefinierte Makros

@ENTR

TITLE= YES
NO

Steuert die Generierung einer TITLE-Anweisung.
TITLE-Anweisung wird erzeugt (Standardwert für alle Prozedurtypen außer D). Der Titel enthält den Namen der Prozedur, ihren Typ, die Version und das Datum der Übersetzung.
TITLE-Anweisung wird nicht erzeugt (Standardwert für Prozedurtyp D).

U5223-J-Z125-3

351

@ENTR

vordefinierte Makros

Format 1: Hauptprozedur

Name name

Operation @ENTR

Operanden

TYP=M [,MAXPRM=val] [,LOCAL=dsect_name]

24

24

[,AMODE= 31 ,RMODE=

]

ANY

ANY

YES

[,ENV=C[,LOADR12=

]]

NO

[,STACK=n]

YES

[,ILCS=

]

NO

[,STREQ=symb Adr1] [,STREL=symb Adr2] [,HPREQ=symb Adr3] [,HPREL=symb Adr4] [,SLTERM=symb Adr5] [,SCTERM=symb Adr6] [,EXTMIN=val1]

YES

[,ABKR=

]

NO

[,PROCHK=symb Adr1]

[,ERROR=symb Adr2]

[,OTHEVT=symb Adr3]

name

Name der Hauptprozedur

val

dezimaler selbstdefinierender Wert; Anzahl der zu übergebenden Parameter

dsect_name

Name eines Datenbereichs

symb Adr1...symb Adr6 symbolische Adressen der benutzereigenen Routinen

352

U5223-J-Z125-3

vordefinierte Makros

@ENTR

val1

dezimaler selbstdefinierender Wert, der die minimale Stack-Extent-Größe in

Bytes angibt.

symb Adr1...symb Adr3 symbolische Adressen von Behandlungsroutinen

Beschreibung

TYP=M Gibt an, daß es sich um die Hauptprozedur eines Programms handelt.

Werden mehrere Module zu einem ablauffähigen Programm zusammengebunden, darf nur ein Modul eine Prozedur vom TYP=M enthalten.

MAXPRM=val Muß angegeben werden bei dynamischer Parameterübergabe über die STANDARD-Schnittstelle. val gibt die Maximalzahl der Parameter an, die mit dem @PASS-Makro an die aufgerufene Prozedur übergeben werden sollen (siehe @PASS, Format 3).

Der Speicherplatz für die Parameter wird im Prozedur-STACK reserviert. Die Angabe von MAXPRM= wird ignoriert, wenn gleichzeitig der Operand LOCAL= gesetzt ist, da sich der LOCAL-Bereich und der Bereich für die Parameter im Prozedur-STACK überdecken.

LOCAL=dsect_name Muß angegeben werden, wenn ein lokaler Datenbereich im ProzedurSTACK bereitgestellt werden soll.

Als Basisadreßregister für die Adressierung dieses Bereichs wird Register 13 verwendet.

Die Struktur des angeforderten Bereichs innerhalb des Prozedur-STACK beschreibt ein Pseudoabschnitt, der mit dsect_name @PAR definiert werden muß (siehe @PAR, Format 3).

AMODE=

ordnet der Prozedur einen Adressierungsmodus zu (siehe 4.2, AMODEAnweisung).

RMODE= ordnet der Prozedur ein Ladeattribut zu (siehe 4.2, RMODE-Anweisung).

Bei einer unzulässigen Kombination von AMODE und RMODE wird eine MNOTE generiert und für beide Werte AMODE 24 und RMODE 24 eingesetzt.

U5223-J-Z125-3

353

@ENTR

vordefinierte Makros

ENV=C

Nur bei ILCS=NO zugelassen! muß angegeben werden, wenn sich die betreffende Prozedur wie ein C-Programm verhalten soll. D.h., die Prozedur läuft mit der Steuerung des C-Laufzeitsystems (siehe ASSEMBH, Benutzerhandbuch [1]).

LOADR12=YES Die Adresse des Program-Manager für C-Programme (siehe C-Compiler, Benutzerhandbuch [9]) soll in Register 12 geladen werden.

LOADR12=NO Ein Laden von Register 12 erfolgt nicht.

Register 12 muß bereits die Adresse des Program-Manager enthalten. Dies ist immer der Fall, wenn die rufende Prozedur ein C-Programm ist oder wenn in einem Assembler-Programm mit "ENV=C" Register 12 nicht verändert wurde.

STACK=n Größe des dynamisch erweiterbaren Initialstacks in Bytes.

Bei fehlender Angabe wird ein Initialstack von einer Seite (4096 Bytes) angefordert.

ILCS=YES Anschluß an ILCS

ILCS=NO Voreingestellter Wert Nicht-ILCS-Prozedur

ILCS ermöglicht es dem Anwender bei der Initialisierung benutzereigene Routinen für die Speicherbeschaffung und Speicherfreigabe sowie zur Beendigungsbehandlung anzumelden. Diese Routinen müssen ILCS-Konventionen genügen. Außerdem kann die minimale Stack-Extent-Größe angegeben werden. Diese Angaben gelten für die gesamte ILCS-Umgebung und können nur in der Hauptprozedur @ENTR mit TYP = M und ILCS=YES definiert werden, dazu folgende Operanden:
STREQ=
symb Adr1 symbolische Adresse der benutzereigenen Speicherbeschaffungsroutine für die Stackverwaltung Eingabe-Parameter: Bytelänge des Speicherbereichs, mit Ausrichtung auf Doppelwortgrenze Returnwert in R0: Zeiger auf Speicherbereich Returncode in R15: =F'0', kein Fehler aufgetreten
keine Angabe Speicherbeschaffung in ILCS über REQM

354

U5223-J-Z125-3

vordefinierte Makros

@ENTR

STREL=
symb Adr2 symbolische Adresse der benutzereigenen Speicherfreigaberoutine für die Stackverwaltung Eingabe-Parameter: Zeiger auf Speicherbereich Bytelänge des Speicherbereichs Returncode in R15: =F'0', kein Fehler aufgetreten
keine Angabe Speicherfreigabe in ILCS über RELM
HPREQ=
symb Adr3 symbolische Adresse der benutzereigenen Speicherbeschaffungsroutine für die Heapverwaltung Eingabe-Parameter: Bytelänge des Speicherbereichs, mit Ausrichtung auf Doppelwortgrenze Returnwert in R0: Zeiger auf Speicherbereich Returncode in R15: =F'0', kein Fehler aufgetreten
keine Angabe Speicherbeschaffung in ILCS über REQM
HPREL=
symb Adr4 symbolische Adresse der benutzereigenen Speicherfreigaberoutine für die Heapverwaltung Eingabe-Parameter: Zeiger auf Speicherbereich Bytelänge des Speicherbereichs Returncode in R15: =F'0', kein Fehler aufgetreten
keine Angabe Speicherfreigabe in ILCS über RELM
SLTERM=
symb Adr5 symbolische Adresse der benutzereigenen Beendigungsroutine
keine Angabe keine benutzereigene Beendigungsroutine

U5223-J-Z125-3

355

@ENTR

vordefinierte Makros

SCTERM=
symb Adr6 symbolische Adresse der benutzereigenen Beendigungsroutine für STXITund Contingency-Prozesse in R15 Fehlercode: >0 interner Fehler in R0 und R1 Informationscode: = 0: es handelt sich um einen STXIT-Prozeß = 1: es handelt sich um einen Contingency-Prozeß
keine Angabe bei internen Fehlern Abbruch des STXIT- oder Contingency-Prozeß mit TERM UNIT=STEP

EXTMIN=
val1 dezimaler selbstdefinierender Wert, der die minimale Stack-Extent-Größe in Bytes angibt. Die Angabe wird auf die nächste Zweierpotenz von Seiten (4096 Bytes) aufgerundet.
keine Angabe minimale Stack-Extent-Größe beträgt 16 Seiten.

ILCS stellt mit dem Standard-Event-Handler (SEH) eine Routine zur Verfügung, die es ermöglicht, in ILCS-Programmen auftretende Ereignisse zu koordinieren (siehe auch 9.6.3, Ereignisse behandeln). Unter der Voraussetzung ILCS=YES sind folgende Operanden möglich:

ABKR= Abbruchkennzeichen setzen/nicht setzen

YES

In der zugehörigen Event-Handler-List (EHL) der Prozedur wird ein Kennzeichen für den Standard-Event-Handler eingetragen, die Suche nach Behandlungsroutinen innerhalb der Save-Area-Verkettung abzubrechen.

NO

Das Abbruchkennzeichen wird nicht gesetzt.

356

U5223-J-Z125-3

vordefinierte Makros

@ENTR

PROCHK=
symb Adr1 symbolische Adresse einer Behandlungsroutine für STXIT-Ereignisse der Klasse 'PROCHK'.
keine Angabe dem Standard-Event-Handler wird keine Behandlungs-Routine für Klasse 'PROCHK' bereitgestellt.
ERROR=
symb Adr2 symbolische Adresse einer Behandlungsroutine für STXIT-Ereignisse der Klasse 'ERROR'.
keine Angabe dem Standard-Event-Handler wird keine Behandlungs-Routine für Klasse 'ERROR' bereitgestellt.
OTHEVT=
symb Adr3 symbolische Adresse einer Behandlungsroutine für Nicht-STXIT-Ereignisse.
keine Angabe dem Standard-Event-Handler wird keine Behandlungs-Routine für Klasse 'OTHEVT' bereitgestellt.
Programmierhinweise
1. Das Abbruchkennzeichen in der Event-Handler-List wird benötigt, wenn der Standard-Event-Handler die Suche nach Ereignisbehandlungsroutinen abbrechen muß, da innerhalb der Prozedurverschachtelung ein Wechsel von einer ILCS- zu einer Nicht-ILCS-Prozedur stattfindet.
2. Wird mit TEST-SUPPORT=YES übersetzt, so darf vor dem Aufruf @ENTR Typ=M auf keinen Fall eine CSECT-Anweisung mit einem Namen ungleich des Namenseintrages des @ENTR stehen, da die für AID erzeugte Konsistenzkonstante diese CSECT abschließt. Dies kann zu einem undefinierten Programmverhalten führen, wenn der Programmabschnitt nicht vor der Konstanten verlassen wird.

U5223-J-Z125-3

357

@ENTR

vordefinierte Makros

Format 2: Prozeduren vom Typ I oder E

Name name1

Operation @ENTR

Operanden

I TYP=
E

name2

[,PLIST=(

[,...])]

(reg)

OPT[IMAL]

[,PASS=

]

STA[NDARD]

[,MAXPRM=val]

[,LOCAL=dsect_name]

YES

[,RETURNS=

]

NO

ENTRY

[,ENTRY=

24

24 ]

CSECT[,AMODE= 31 ,RMODE=

]

ANY

ANY

YES

[,ENV=C[,LOADR12=

]]

NO

YES

[,ILCS=

]

NO

YES

[,ABKR=

]

NO

[,PROCHK=symb Adr1]

[,ERROR=symb Adr2]

[,OTHEVT=symb Adr3]

358

U5223-J-Z125-3

vordefinierte Makros

@ENTR

name1

Name der Prozedur

name2

Formalparameter

reg

Register als Formalparameter; positiver absoluter Ausdruck, entweder

dezimaler selbstdefinierender Wert oder

vordefinierter Name eines Registers oder

Name, dem ein entsprechender selbstdefinierender Wert zugewiesen

wurde

val

dezimaler selbstdefinierender Wert; Anzahl der zu übergebenden Parameter

dsect_name

Name eines Datenbereichs

symb Adr1...symb Adr3 symbolische Adressen von Behandlungsroutinen

Beschreibung

TYP=I

Gibt an, daß es sich um eine Prozedur handelt, die nur von dem Modul aus gerufen werden kann, in dem sie selbst liegt (interne Prozedur) und die an Speicherverwaltung und Registersicherung angeschlossen ist.

TYP=E

Gibt an, daß es sich um eine Prozedur handelt, die von einem beliebigen Modul aus gerufen werden kann (externe Prozedur) und die an Speicherverwaltung und Registersicherung angeschlossen ist.

PLIST= Wird angegeben für die Übernahme von Parametern.

Der Operand gibt die Formalparametern an, eine Liste von Datenfeldern und Registern, in die beim Aufruf der Prozedur Einträge übernommen werden (siehe @PAR, Format 2).

Bei einer Übernahme der Parameter in den LOCAL-Bereich der Prozedur müssen die PLIST-Operanden mit den PLIST-Operanden des zugehörigen @PAR übereinstimmen.

PASS=OPT Nur bei ILCS=NO zugelassen! Muß angegeben werden, wenn in der aufgerufenen Prozedur die Parameterübernahme über die OPTIMAL-Schnittstelle erfolgen soll.

Zur Parameterübernahme werden die Register 1 bis 4 verwendet.

U5223-J-Z125-3

359

@ENTR

vordefinierte Makros

PASS=STA In der aufgerufenen Prozedur erfolgt die Parameterübernahme über die STANDARD-Schnittstelle.

Zur Parameterübernahme wird nur das Register 1 verwendet. Register 1 enthält die Adresse der Parameterliste.

Die Angabe PASS= muß mit dem PASS-Operanden im @PASS-Makro der aufrufenden Prozedur übereinstimmen (siehe @PASS, Format 3).

MAXPRM=val Muß angegeben werden bei dynamischer Parameterübergabe über die STANDARD-Schnittstelle. val gibt die Maximalzahl der Parameter an, die mit dem @PASS-Makro an eine Prozedur übergeben werden können (siehe @PASS, Format 3).

LOCAL=dsect_name Muß angegeben werden, wenn ein lokaler Datenbereich im Prozedur Prozedur-STACK bereitgestellt werden soll.

Basisadreßregister für diesen Bereich ist Register 13.

Die Struktur des angeforderten Bereichs beschreibt ein Pseudoabschnitt, der mit dsect_name @PAR definiert werden muß. dsect_name kann dabei
einen @PAR kennzeichnen, der einen lokalen Pseudoabschnitt definiert (Format 3 von @PAR) oder einen @PAR kennzeichnen, der einen Pseudoabschnitt zur Parameterübernahme definiert (Format 2 von @PAR).

RETURNS= Regelt, welche Register beim Verlassen der Prozedur über @EXIT wieder mit den ursprünglichen Werten (vor Aufruf der Prozedur) geladen werden bzw. ob ein Funktionswert zurückgeliefert wird.

Der Operand ILCS=YES/NO beeinflußt die Funktionsweise von RETURNS=YES/NO.

YES

Bei ILCS=NO: Die Register 0 und 2 bis 14 werden zurückgeladen, Register 1 nicht. Somit kann Register 1 dazu verwendet werden, der rufenden Prozedur einen Funktionswert zu übermitteln. Die gerufene Prozedur wird dadurch zu einer "Funktionsprozedur".

Bei ILCS=YES: Die Prozedur liefert einen Funktionswert zurück. Die Register 0 bis 14 werden zurückgeladen. Der Funktionswert im Register 1 wird im Prozedurepilog nach Register 0 kopiert, wenn der Rufer eine ILCS-Prozedur ist.

360

U5223-J-Z125-3

vordefinierte Makros

@ENTR

NO

Bei ILCS=NO:

Alle Register 0 bis 14 werden zurückgeladen.

bei ILCS=YES: Die Prozedur liefert keinen Funktionswert zurück und damit wird im Prozedurepilog R1 auch nicht nach R0 kopiert. Die Registerstände von R0 und R1 sind undefiniert. Register 2 bis 14 werden zurückgeladen.

Keine Angabe Die Register 2 bis 14 werden zurückgeladen.

Das Rückladen der Register kann bei ILCS=NO zusätzlich mit dem Operanden RESTORE=MIN des @EXIT-Makro eingeschränkt werden.

ENTRY=

Gibt an, welche Eingangs-Instruktionen für die Prozedur generiert werden sollen.
Die Angabe von ENTRY= ist nur bei Prozeduren vom Typ E zulässig.

bei Angabe von ENTRY wird generiert:

name1 DS ENTRY

0D name1

Diese Angabe ist notwendig, wenn für das Testen eines Programms mit mehr als einer Prozedur die AID-Kommandos %CONTROL oder %TRACE verwendet werden sollen (siehe AID, Testen von ASSEMBH-Programmen [2]).

Bei Angabe von CSECT wird generiert:

name1

CSECT

AMODE= ordnet der Prozedur einen Adressierungsmodus zu (siehe 4.2, AMODE-Anweisung).

RMODE= ordnet der Prozedur ein Ladeattribut zu (siehe 4.2, RMODE-Anweisung).

Bei einer unzulässigen Kombination von AMODE und RMODE wird eine MNOTE generiert und für beide Werte AMODE 24 und RMODE 24 eingesetzt.

ENV=C

muß angegeben werden, wenn sich die betreffende Prozedur wie ein C-Programm verhalten soll; d.h., die Prozedur läuft mit der Steuerung des C-Laufzeitsystems (siehe ASSEMBH, Benutzerhandbuch [1]).

Die Angabe ist nur für Prozeduren vom Typ E mit ILCS=NO zulässig.

LOADR12=YES Die Adresse des Program-Manager für C-Programme (siehe C-Compiler, Benutzerhandbuch [9]) soll in Register 12 geladen werden.

U5223-J-Z125-3

361

@ENTR

vordefinierte Makros

LOADR12=NO Ein Laden von Register 12 erfolgt nicht.
Register 12 muß bereits die Adresse des Program-Manager enthalten. Dies ist immer der Fall, wenn die rufende Prozedur ein C-Programm ist oder wenn in einem Assembler-Programm mit "ENV=C" Register 12 nicht verändert wurde.
ILCS=YES Anschluß an ILCS
ILCS=NO Voreingestellter Wert Nicht-ILCS-Prozedur

ILCS stellt mit dem Standard-Event-Handler (SEH) eine Routine zur Verfügung, die es ermöglicht, in ILCS-Programmen auftretende Ereignisse zu koordinieren (siehe auch 9.6.3, Ereignisse behandeln). Falls ILCS=YES gesetzt ist, sind folgende Angaben möglich:

ABKR= Abbruchkennzeichen setzen/nicht setzen

YES

In der zugehörigen Event-Handler-List der Prozedur wird ein Kennzeichen für den Standard-Event-Handler eingetragen, die Suche nach Behandlungsroutinen innerhalb der Save-Area-Verkettung abzubrechen.

NO

Das Abbruchkennzeichen wird nicht gesetzt.

PROCHK=
symb Adr1 symbolische Adresse einer Behandlungsroutine für STXIT-Ereignisse der Klasse 'PROCHK'.
keine Angabe dem Standard-Event-Handler wird keine Behandlungs-Routine für Klasse 'PROCHK' bereitgestellt.

362

U5223-J-Z125-3

vordefinierte Makros

@ENTR

ERROR=
symb Adr2 symbolische Adresse einer Behandlungsroutine für STXIT-Ereignisse der Klasse 'ERROR'.
keine Angabe dem Standard-Event-Handler wird keine Behandlungs-Routine für Klasse 'ERROR' bereitgestellt.
OTHEVT=
symb Adr3 symbolische Adresse einer Behandlungsroutine für Nicht-STXIT-Ereignisse.
keine Angabe dem Standard-Event-Handler wird keine Behandlungs-Routine für Klasse 'OTHEVT' bereitgestellt.
Programmierhinweis
Das Abbruchkennzeichen in der Event-Handler-List wird benötigt, wenn der StandardEvent-Handler die Suche nach Ereignisbehandlungsroutinen abbrechen muss, da innerhalb der Prozedurverschachtelung ein Wechsel von einer ILCS- zu einer Nicht-ILCSProzedur stattfindet.

U5223-J-Z125-3

363

@ENTR

vordefinierte Makros

Beispiel für Format 1 und Format 2

Name

Operation

* rufende Prozedur

MAIN

@ENTR

.

.

@PASS

.

.

DUMMY

@PAR

NAME1

DS

.

.

DUMMY

@PAR

.

.

Operanden TYP=M,MAXPRM=2,LOCAL=DUMMY NAME=PRO2,PLIST=(FIELD1,FIELD2) D=YES .. LEND=YES

(01) (02)
(03)

* gerufene Prozedur

PRO2

@ENTR

.

.

IN

@PAR

.

.

TYP=I,LOCAL=IN,PLIST=(INFIELD1,INFIELD2) (04) D=YES,LEND=YES,PLIST=(INFIELD1,INFIELD2) (05)

(01) Die Prozedur MAIN soll maximal 2 Parameter an eine andere übergeben (MAXPRM=2) und für sie wird ein lokaler Datenbereich angefordert, dessen Struktur im Pseudoabschnitt DUMMY beschrieben wird.
(02) Aufruf von PRO2, es sollen 2 Parameter an PRO2 übergeben werden; die Übergabe erfolgt dynamisch über die STANDARD-Schnittstelle.
(03) Definition des Pseudoabschnitts DUMMY. (04) PRO2 übernimmt 2 Parameter; der Pseudoabschnitt IN beschreibt die Struktur
des Datenbereichs, der für die Übernahme bereit gestellt wird, PLIST=... gibt die Liste der Parameter an. (05) Definition des Pseudoabschnitts IN.

364

U5223-J-Z125-3

vordefinierte Makros

@ENTR

Format 3: Prozeduren vom Typ B oder L

Name name
name reg

Operation @ENTR

Operanden

B TYP=
L [,BASE=reg]

YES

[,LOADSB=

]

NO

ENTRY

[,ENTRY=

24

24 ]

CSECT[,AMODE= 31 ,RMODE=

]

ANY

ANY

Name der Prozedur Mehrzweckregister; positiver absoluter Ausdruck, entweder
dezimaler selbstdefinierender Wert oder vordefinierter Name eines Registers oder Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wurde

Beschreibung

TYP=B

Gibt an, daß es sich um eine Prozedur handelt, die von einem beliebigen Modul aus gerufen werden kann (externe Prozedur) und die nicht Speicherverwaltung und Registersicherung angeschlossen ist.

TYP=L

Gibt an, daß es sich um eine Prozedur handelt, die nur vom gleichen Modul aus gerufen werden kann (interne Prozedur) und die nicht an Speicherverwaltung und Registersicherung angeschlossen ist.

BASE=reg Weist der Prozedur ein Register als Basisadreßregister zu.
Ohne diese Angabe wird der Prozedur vom Assembler das Register 15 als Basisadreßregister zugewiesen.

LOADSB= Regelt das Laden des Basisadreßregisters nach jedem Aufruf einer weiteren Unterprozedur mit @PASS.

YES

Das mit dem BASE-Operanden angegebene Basisadreßregister oder das Standard-Basisadreßregister 15 wird mit der Adresse der rufenden Prozedur geladen.

U5223-J-Z125-3

365

@ENTR

vordefinierte Makros

NO Kein Register wird nach dem Aufruf geladen, auch nicht Register 15.

Keine Angabe Register 15 wird nach dem Aufruf mit der Adresse der rufenden Prozedur geladen.

ENTRY=

gibt an, welche Eingangs-Instruktionen für die Prozedur generiert werden sollen.

Die Angabe von ENTRY= ist nur bei Prozeduren vom Typ B zulässig.

bei Angabe von ENTRY wird generiert:

name1 DS ENTRY

0D name1

bei Angabe von CSECT wird generiert:

name1 CSECT

AMODE= RMODE=

ordnet der Prozedur einen Adressierungsmodus zu (siehe 4.2, AMODE-AMODE-Anweisung).
ordnet der Prozedur ein Ladeattribut zu (siehe 4.2, RMODE-Anweisung). sung).
Bei einer unzulässigen Kombination von AMODE und RMODE wird eine MNOTE generiert und für beide Werte AMODE 24 und RMODE 24 eingesetzt.

Programmierhinweise

1. Ein Basisadreßregister, das mit BASE=reg zugewiesen wurde, muß am Anfang der

Prozedur (nach dem @ENTR-Makro) explizit geladen werden, z.B. mit dem Assem-

blerbefehl:

LR reg,R15

2. Der Prozedurtyp ist nur bei ILCS=NO zugelassen.

366

U5223-J-Z125-3

vordefinierte Makros

@ENTR

Format 4: Prozeduren vom Typ D

Name [name]
name

Operation @ENTR

Operanden TYP=D

Name der Prozedur

Beschreibung
Es handelt sich um eine Prozedur vom Typ D, ohne Anschluß an Speicherverwaltung und Registersicherung. Die Prozedur kann extern oder intern sein.

Programmierhinweise
1. Ist die Prozedur die erste eines Moduls, darf kein Prozedurname angegeben werden. Die Prozedur erhält den Namen der START- oder CSECT-Anweisung.
2. Der Prozedurtyp ist nur bei ILCS=NO zugelassen.

U5223-J-Z125-3

367

@EVTLC

vordefinierte Makros

@EVTLC Layout der Kontext-Beschreibung definieren
Dieser Makroaufruf ist nur in Prozeduren mit ILCS=YES erlaubt.

Funktion
@EVTLC (Event Layout Context) definiert das Layout der Kontext-Beschreibung für den Makro @EVTOE.

Format

Name [name]

Operation @EVTLC

Operanden [pre]=zeichenfolge

name

Name

pre

Präfix

zeichenfolge

alphanumerische Zeichen

Beschreibung

pre=

Präfix für die symbolischen Namen der Einzelfelder

zeichenfolge max. 4 Zeichen pre muß der Assemblersyntax für Namen genügen.

368

U5223-J-Z125-3

vordefinierte Makros

@EVTLC

Mit dem Präfix werden folgende DS-Anweisungen für die Einzelfelder der Kontextbeschreibung definiert:

preCR0

DS F

preCR1

DS F

preCR2

DS F

preCR3

DS F

preCR4

DS F

preCR5

DS F

preCR6

DS F

preCR7

DS F

preCR8

DS F

preCR9

DS F

preCR10 DS F

preCR11 DS F

preCR12 DS F

preCR13 DS F

preCR14 DS F

preCR15 DS F

preCPC

DS F

preCEVC DS F

preCFP0 DS 2F

preCFP2 DS 2F

preCFP4 DS 2F

preCFP6 DS 2F

preCILC DS X

preCCC

DS X

preCPM

DS X

preCSS

DS X

Context Register
Program Counter Event Code Floating Point Register Instruction Length Code Condition Code Program Mask Sprachschlüssel

Programmierhinweis Ein Präfix mit mehr als 4 Zeichen wird auf 4 Zeichen gekürzt.

U5223-J-Z125-3

369

@EVTOE

vordefinierte Makros

@EVTOE Nicht-STXIT-Ereignis signalisieren
Dieser Makroaufruf ist nur in Prozeduren mit ILCS=YES erlaubt.

Funktion
@EVTOE (Eventing other event) signalisiert ein Nicht-STXIT-Ereignis (siehe auch 9.6.3, Ereignisse behandeln).

Format

Name [name]

Operation @EVTOE

Operanden
symb Adr CONTXT=
(reg)

name symb Adr reg

Name symbolische Adresse eines Datenbereiches Mehrzweckregister, enthält die Adresse des Datenbereiches

Beschreibung
CONTXT= beschreibt die Umgebung der Ereignisstelle
symb Adr symbolische Adresse eines Datenbereiches der Länge 112 Bytes. In diesen Bereich muß der Benutzer den Kontext der Programmstelle ablegen, an der das Ereignis auftrat. Dazu gehören die Inhalte aller Standard-(Kontext-) und Gleitpunktregister sowie der Befehlszähler, die Programmaske und der vom Benutzer zu definierende Ereigniscode für die von ILCS aufgerufene Behandlungsroutine.
(reg) wahlweise Register, das die Adresse des Datenbereiches enthält.
Zur Struktur dieses Datenbereiches siehe Makro @EVTLC.

Der Inlinecode des Makros übernimmt die Angaben aus dem Aufruf in einen ILCS-konformen Parameterblock; mit dieser Versorgung wird der entsprechende Entry im Standard-Event-Handler zum Signalisieren eines Nicht-STXIT-Ereignisses angesprungen.
Nach Rückkehr des Standard-Event-Handlers in die aufrufende Prozedur enthält R15 einen Returncode, der besagt, ob die Funktion ausgeführt wurde oder nicht bzw. welche Fehler auftraten.

370

U5223-J-Z125-3

vordefinierte Makros

@EVTOE

Programmierhinweis
Eine Abprüfung der Kontexteinzelfelder ist nicht möglich; deshalb ist der Benutzer für die Richtigkeit und Konsistenz der Kontextangaben verantwortlich.

U5223-J-Z125-3

371

@EXIT

vordefinierte Makros

@EXIT Dynamisches Prozedurende
Funktion @EXIT beendet die aufgerufene Prozedur und gibt die Steuerung an die aufrufende Prozedur zurück.

Format 1: Rückkehr aus Prozeduren vom Typ M: B oder L

Name [name]

Operation @EXIT

Operanden

YES

[LOADR12=

]

NO

Beschreibung
In Prozeduren vom Typ M bewirkt @EXIT die Beendigung des Programms.
In Prozeduren von Typ B oder L wird das Programm mit der Instruktion fortgesetzt, die in der rufenden Prozedur dem @PASS-Makro folgt.

LOADR12= kann nur angegeben werden für Prozeduren, bei denen "ENV=C" und ILCS=NO gesetzt ist.

YES

Die Adresse des Program-Manager für C-Programme (siehe C-Compiler, Benutzerhandbuch [9]) soll in Register 12 geladen werden.

NO

Ein Laden von Register 12 erfolgt nicht.

Register 12 muß bereits die Adresse des Program-Manager enthalten. Dies ist immer der Fall, wenn die rufende Prozedur ein C-Programm ist oder wenn in einem Assembler-Programm mit "ENV=C" Register 12 nicht verändert wurde.

372

U5223-J-Z125-3

vordefinierte Makros

@EXIT

Format 2: Rückkehr aus Prozeduren vom Typ E oder I

Name [name1]

Operation @EXIT

Operanden

name2 RC= (reg)
val TO=proc_name [ RESTORE=MIN PROG=FORTRAN
YES LOADR12=
NO

][,...]

name1

Name

name2

Name eines Datenfeldes, das den Rückkehrwert enthält

reg

Mehrzweckregister, das den Rückkehrwert oder die Adresse des Rückkehr-

wertes enthält; positiver absoluter Ausdruck, entweder

dezimaler selbstdefinierender Wert oder

vordefinierter Name eines Registers oder

Name, dem ein entsprechender selbstdefinierender Wert zugewiesen

wurde

val

selbstdefinierender Wert, der den Rückkehrwert direkt angibt

proc_name Name einer Prozedur, die in der Aufrufhierarchie höher liegen muß als die

aufrufende Prozedur.

Beschreibung
Nach @EXIT wird das Programm mit der Instruktion fortgesetzt, die in der rufenden Prozedur dem @PASS-Makro folgt.
Durch @EXIT werden die Register 2 bis 14 wieder mit ihren Werten beim Prozeduraufruf geladen.

@EXIT-Aufruf in einer ILCS-Prozedur (@ENTR ILCS=YES)
Falls der @ENTR-Parameter RETURNS=YES gesetzt war, wird der Funktionswert in Register 1 nach Register 0 kopiert. Bei RETURNS=NO unterbleibt das Kopieren des Funktionswertes.

RC=

Sollte nur in Prozeduren angegeben werden, bei denen ILCS=NO gesetzt ist. Gibt einen Rückkehrwert an, der in der gerufenen Prozedur berechnet wurde und an die aufrufende Prozedur übergeben werden soll. Die Übergabe erfolgt standardmäßig im Register 15, bei Nicht-ILCS-FORTRAN-Programmen im Register 0.

U5223-J-Z125-3

373

@EXIT

vordefinierte Makros

Bei Angabe von val wird der Wert, bei Angabe von name2 wird die Adresse übergeben. Bei Angabe von (reg) wird der Registerinhalt in das Übergaberegister übernommen.

TO=proc_name Kann nur angegeben werden in Prozeduren, bei denen ILCS=NO gesetzt ist. Diese Angabe ist erforderlich, wenn nicht in die aufrufende Prozedur zurückgekehrt werden soll, sondern in eine in der Aufrufhierarchie höherliegende.

Das Programm wird mit der Instruktion fortgesetzt, die in der mit proc_name bezeichneten Prozedur dem aktuellen @PASS-Makro folgt.

RESTORE=MIN Wird angegeben, wenn bei der Rückkehr in die aufrufende Prozedur nur die Register 7 bis 14 zurückgeladen werden sollen.

PROG=FORTRAN Kann nur angegeben werden in Prozeduren, bei denen ILCS=NO gesetzt ist. Muß angegeben werden, wenn aus einer gerufenen Assembler-Prozedur in ein rufendes FORTRAN-Programm zurückgekehrt werden soll. In diesem Fall werden die Register 2 bis 14 zurückgeladen.

LOADR12= kann nur angegeben werden für Prozeduren, bei denen ENV=C und ILCS=NO gesetzt ist.

YES

Die Adresse des Program-Manager für C-Programme (siehe C-Compiler, Benutzerhandbuch [9]) soll in Register 12 geladen werden.

NO

Ein Laden von Register 12 erfolgt nicht.

Register 12 muß bereits die Adresse des Program-Manager enthalten. Dies ist immer der Fall, wenn die rufende Prozedur ein C-Programm ist oder wenn in einem Assembler-Programm mit "ENV=C" Register 12 nicht verändert wurde.

Programmierhinweis
Der @EXIT Operand RC=<Returncode> bewirkt die Übergabe des Returncodes in Register 15. Innerhalb von strukturierten Assembler-Programmen kann Register 15 wie gewohnt vom Anwender ausgewertet werden (gemäß ILCS-Registerkonventionen müssen im Prozedurepilog lediglich Register 2 bis Register 14 zurückgeladen werden). Rufende Fremdumgebungsprozeduren können diesen Returncode jedoch i.a. nicht mehr abfragen, da gemäß ILCS-Konventionen Register 15 als zerstört angesehen wird. Deshalb sollte auf den @EXIT-Operanden RC möglichst verzichtet werden und der Return-

374

U5223-J-Z125-3

vordefinierte Makros

@EXIT

code sollte anstatt dessen als Funktionswert in Register 1 oder als Ausgabeparameter übergeben werden.

Beispiel

Name PRO1
CONST TEST PRO2

Operation
@ENTR @DATA @PASS @IF CLI @THEN . . @BEND . . @EXIT @END DS DS . . @ENTR @DATA . . MVI @EXIT @END

Operanden TYP=M CLASS=S,BASE=R9,INIT=CONST NAME=PRO2 EQ TEST,C'A'
0H CL1
TYP=I CLASS=B,BASE=R9,DSECT=CONST
TEST,C'A' RC=TEST

(01) (02)
(03) (04) (05)

(01) Aufruf der Prozedur PRO2. (02) Abhängig vom Rückkehrwert sollen in PRO1 Instruktionen ausgeführt werden. (03) Definition des Feldes, das den Rückkehrwert enthält. (04) In PRO2 muß der Rückkehrwert versorgt werden. (05) Rückkehr in PRO1; übergeben wird die Adresse des Feldes, das den Rückkehr-
wert enthält.
Die gleiche Funktion könnte erfüllt werden durch die folgenden Instruktionen in PRO2:

LA @EXIT

R8,TEST RC=(R8)

U5223-J-Z125-3

375

@FREE

vordefenierte Makros

@FREE Speicherfreigabe
Funktion @FREE veranlaßt die Feigabe von Speicherplatz, der zuvor mit @DATA CLASS=C angefordert wurde.

Format

Name [name]
name reg

Operation @FREE

Operanden BASE=reg

Name Mehrzweckregister, positiver absoluter Ausdruck, entweder
dezimaler selbstdefinierender Wert oder vordefinierter Name eines Registers oder Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wurde

Beschreibung
reg gibt die Adresse des freizugebenden Speicherbereichs an und muß mit dem BASEOperanden des zugehörigen @DATA-Makro übereinstimmen.

>>>>> siehe auch @DATA 376

U5223-J-Z125-3

vordefinierte Makros

@IF

@IF Entscheidung
Funktion @IF bildet den Kopf einer Verzweigung, bei der zwischen zwei Alternativen auszuwählen ist.

Format

Name [name]

Operation @IF

Operanden cond_sym

name

Name

cond_sym vordefiniertes oder benutzereigenes Bedingungssymbol (siehe 9.2.4 und

9.2.5).

Beschreibung
cond_sym legt die Bedingung (siehe 9.2.4 und 9.2.5) fest, die zur Verzweigung verwendet werden soll.
Trifft die Bedingung zu, wird der @THEN-Zweig des Strukturblocks ausgeführt, trifft sie nicht zu, der @ELSE-Zweig.

Beispiel

Name

Operation
@IF CR @THEN MVI @ELSE MVI @BEND

Operanden LE R1,R2 FIELD,TRUE FIELD,FALSE

Wenn der Inhalt von Register 1 kleiner oder gleich dem von Register 2 ist, wird der @THEN-Unterblock ausgeführt, sonst der @ELSE-Unterblock.

>>>>> siehe auch @THEN, @ELSE und @BEND

U5223-J-Z125-3

377

@ININ

vordefinierte Makros

@ININ ILCS bei nachgeladenen Moduln aufrufen
Dieser Makroaufruf ist nur innerhalb der ILCS-Umgebung erlaubt. ILCS muß zu einem früheren Zeitpunkt initiiert worden sein.

Funktion @ININ sorgt durch Aufruf von ILCS dafür, daß bei nachgeladenen (Groß-) Moduln, die ein Laufzeitsystem eingebunden haben, dieses nachträglich initialisiert wird (siehe auch 9.6).
Format

Name [name]
name

Operation @ININ

Operanden

Name

Beschreibung Der Inlinecode des Makros generiert den Ansprung der ILCS-Routine zur Prüfung und ggf. Durchführung der Sprachinitialisierung. Nach dem Aufruf enthält Register 15 einen Returncode, der besagt, ob die Funktion ausgeführt wurde oder nicht.
Programmierhinweis Ein Fehler während des Ablaufes der Initialisierungsprüfung, der zu einem undefinierten Programmverhalten führt (z. B. Speicherengpaß), bewirkt den Aufruf der ILCS-Beendigungsroutine. Damit werden auch alle angeschlossenen Sprachen beendet.

378

U5223-J-Z125-3

vordefinierte Makros

@OF

@OF Fall-Unterblock
Funktion @OF bildet in einer Fallunterscheidung durch Vergleich den Kopf eines Unterblocks und gibt den oder die jeweiligen Komparanden an.

Format

Name
[name1]
name1 name2 literal val instr

Operation @OF

Operanden
name2 literal [,...][,COMP=instr] val

Name Name des Feldes, das einen Komparanden enthält Literal, das einen Komparanden direkt angibt (siehe 2.5.3) selbstdefinierender Wert, der einen Komparanden direkt angibt Assemblerbefehl, der eine Anzeige setzt (siehe Assemblerbefehle, Beschreibung)

Beschreibung
Der Unterblock, der mit @OF und den jeweiligen Komparanden beginnt, wird ausgeführt, wenn einer der angegebenen Komparanden gleich dem Selektor aus dem @CAS2-Makro ist.
Mit COMP=instr kann für diesen Unterblock eine vom Standard abweichende Vergleichsart gewählt werden.

Programmierhinweise
1. Der Anwender muß sicherstellen, daß Selektor und Komparanden bezüglich Länge, Ausrichtung und Vergleichsbefehl zusammenpassen.
2. Ein selbstdefinierender Wert als Komparand kann nur angegeben werden, wenn mit COMP=instr im @OF-Makro oder im @CAS2-Makro ein Assemblerbefehl angegeben wurde, der als zweiten Operanden einen Direktoperanden erlaubt.

U5223-J-Z125-3

379

@OF

vordefinierte Makros

Beispiel

Name

Operation Operanden

@CAS2 @OF . . @OF . .

FIELDA FIELDB
C'*',COMP=CLI

(01) (02)
(03)

(01) Beginn der Fallunterscheidung; FIELDA ist der Name des Feldes, das den Selektor enthält.
(02) Beginn des ersten Unterblocks; dieser wird ausgeführt, wenn FIELDA gleich FIELDB ist.
(03) Beginn des zweiten Unterblocks; dieser wird ausgeführt, wenn FIELDA gleich * ist. Der Vergleichsbefehl nur für diesen Unterblock ist CLI.

>>>>> siehe auch @CAS2, @OFRE und @BEND 380

U5223-J-Z125-3

vordefinierte Makros

@OFRE

@OFRE Rest-Unterblock
Funktion @OFRE bildet in einer Fallunterscheidung durch Vergleich den Kopf des letzten Unterblocks.

Format

Name [name]

Operation @OFRE[ST]

Operanden

Programmierhinweis
In diesem Unterblock werden alle Fälle behandelt, die in den übrigen Unterblöcken nicht auftraten. Dieser Block sollte verwendet werden für Fehlerfälle, bzw. für Fälle, die bei der Fallunterscheidung irrelevant sind.

>>>>> siehe auch @CAS2 und @OF

U5223-J-Z125-3

381

@OR

vordefinierte Makros

@OR Logisches 'Oder'
Funktion @OR realisiert die logische Oder-Verknüpfung in zusammengesetzten Bedingungen.

Format

Name [name]

Operation @OR

Operanden cond_sym

name

Name

cond_sym vordefiniertes oder benutzereigenes Bedingungssymbol (siehe 9.2.4 und

9.2.5)

Programmierhinweis
Dem Aufruf des @OR-Makro muß ein Anzeige-setzender Assemblerbefehl folgen (siehe Assemblerbefehle, Beschreibung).

Beispiel

Name

Operation
. . @IF C @OR LTR @THEN ST @ELSE . . @BEND . .

Operanden
ZE R4,ZERO NZ R5,R5 R1,POINT

(01) (02)

Der @THEN-Zweig wird ausgeführt, wenn die erste Bedingung (01) oder die zweite Bedingung (02) zutrifft.

>>>>> siehe auch @AND und @TOR

382

U5223-J-Z125-3

vordefinierte Makros

@PAR

@PAR Definition von Bereichen
Funktion
@PAR hat drei verschiedene Funktionen. Abhängig vom Format wird für die Parameterübergabe eine Parameterliste aufgebaut oder ein Pseudoabschnitt definiert, oder es wird für die Parameterübernahme ein Pseudoabschnitt definiert.
Format 1: Parameterliste für die statische Parameterübergabe über die STANDARD-Schnittstelle

Name list_name

Operation @PAR

Operanden

name1

[PLIST=(

[,...]),]

(val1)

name2

VLIST=(

[,...])

(val2)

YES

[,PLEND=

]

NO

list_name name1 val1
name2
val2

Name der Parameterliste (63 Zeichen) Name der Einträge in der Parameterliste dezimaler selbstdefinierender Wert; erzeugt einen unbenannten Eintrag in der Parameterliste Name der Felder, deren Adresse in der Parameterliste übergeben werden soll (Aktualparameter) dezimaler selbstdefinierender Wert; wird direkt in die Parameterliste eingetragen (Aktualparameter)

Beschreibung

Durch den Aufruf von @PAR wird zur Übersetzungszeit eine Parameterliste mit konstanten Werten erzeugt.

PLIST= Gibt den Einträgen der Parameterliste Namen.

Die Angabe von (val1) erzeugt eine namenlose Adreß-Konstante.

VLIST=

Gibt die Aktualparameter an, deren Adressen oder Werte in der Parameterliste abgelegt werden.

Wird einem Parameter kein Aktualparameter zugeordnet, muß im VLISTOperanden an dieser Stelle ein zusätzliches Komma stehen. Eine solche Angabe wird behandelt wie der selbstdefinierende Wert 0.

U5223-J-Z125-3

383

@PAR

vordefinierte Makros

PLEND=

Kann nur in Prozeduren angegeben werden, bei denen ILCS=YES gesetzt ist. Angabe, ob beim Aufbau der statischen Parameteradreßliste für den letzten Parameter das höchstwertige Bit gesetzt wird.

YES Bit wird gesetzt

NO

Bit wird nicht gesetzt

keine Angabe Bei ILCS=NO: Bit wird aus Kompatibilität gesetzt; Bei ILCS=YES: Bit wird nicht gesetzt

Die Aktualparameter müssen durch "call by reference" übergeben werden. Selbstdefinierende Parameterwerte dürfen in der Aktualparameterliste nicht übergeben werden (außer es handelt sich um absolute Adressen). Die Aktualparameterliste darf leere Listenelemente enthalten. Diese sind jedoch als nur "Platzhalter" zu betrachten. Vor einem Prozeduraufruf mit der Übergabe dieser Liste (@PASS PAR=<par-list>) müssen freigehaltene Plätze in der Parameterliste vom Benutzer mit korrekten Parameteradreßwerten belegt werden ("call by reference").

Programmierhinweise
1. Im VLIST-Operanden dürfen keine Namen aus Pseudoabschnitten (DSECT-Anweisung, siehe 4.2) angegeben werden.
2. Das höchstwertige Bit der letzten Adreßkonstanten wird auf 1 gesetzt, um das Ende der Parameterliste zu kennzeichnen. Deshalb sollten negative Werte nie direkt übergeben werden.
3. Der Aufruf von @PAR muß zwischen @EXIT und @END der entsprechenden Prozedur erfolgen.
4. @PAR-Aufruf in einer ILCS-Prozedur (@ENTR ILCS=YES):
Die Anzahl der Parameter wird in einer neuen EQU-Konstanten abgelegt. Der Name der EQU-Konstanten bestimmt sich aus dem Namen der Parameteradreßliste mit einem am Ende angehängten Zeichen "#".
Der Name der Parameterliste darf nicht länger als 63 Zeichen sein, da der Name der zu generierenden EQU-Konstanten genau um ein Zeichen länger ist.

384

U5223-J-Z125-3

vordefinierte Makros

@PAR

Beispiel

Name

Operation Operanden

PARLIST

@PASS . . @EXIT @PAR . .

NAME=PROX,PAR=PARLIST PLIST=((1),A,B,C,D),VLIST=(ADR,4,NAME,,FIELD)

* generierte Instruktionen

PARLIST

DS

0F

DC

A(ADR)

A

DC

A(4)

B

DC

A(NAME)

C

DC

A(0)

D

DC

A(FIELD+X'80000000')

>>>>> siehe auch @PASS, Format 2

U5223-J-Z125-3

385

@PAR

vordefinierte Makros

Format 2: Definition eines Pseudoabschnitts im LOCAL-Bereich für die Parameterübernahme

Name dsect_name

Operation @PAR

Operanden

D=YES,

name

PLIST=(

[,...]),

(reg)

LEND=YES

dsect_name

Name des zu generierenden Pseudoabschnitts

name

Formalparameter; Name eines Feldes, in das beim Aufruf der entspre-

chende Parameter übernommen wird

reg

Register, in das beim Aufruf der entsprechende Parameter übernommen

wird; positiver absoluter Ausdruck, entweder

dezimaler selbstdefinierender Wert oder

vordefinierter Name eines Registers oder

Name, dem ein entsprechender selbstdefinierender Wert zugewiesen

wurde

Beschreibung
Durch den Aufruf von @PAR wird in der gerufenen Prozedur ein Pseudoabschnitt generiert. Dieser gibt die Liste der Formalparameter an, d.h., er beschreibt, bzw. redefiniert die Struktur des LOCAL-Bereichs im Prozedur-STACK der aufgerufenen Prozedur.
Für jeden Formalparameter-Namen aus dem PLIST-Operanden wird ein Eintrag im Pseudoabschnitt erzeugt.
Format 2 von @PAR ist nur in Prozeduren vom Typ E oder I zulässig.

Programmierhinweise
1. Die PLIST-Operanden von @PAR müssen mit den PLIST-Operanden des entsprechenden @ENTR übereinstimmen.
2. Der @PAR-Makro muß nach dem Aufruf von @END der entsprechenden Prozedur folgen.

386

U5223-J-Z125-3

vordefinierte Makros

@PAR

3. Soll der Pseudoabschnitt außer der Liste der zu übernehmenden Felder und Register noch weitere Daten enthalten, muß er in folgender Weise erklärt werden:

Name
dsect_name ... dsect_name

Operation
. .
@PAR
DS . . @PAR

Operanden

name

D=YES,PLIST=(

[,...])

(reg)

...

LEND=YES

Beispiel
Das Beispiel zeigt die Generierung einer DSECT im LOCAL-Bereich einer gerufenen Prozedur.

Name

Operation Operanden

PRO

@ENTR

TYP=E,LOCAL=IN,PLIST=(INPAR1,INPAR2,(R5),INPAR3)

.

.

@END

IN

@PAR

D=YES,LEND=YES,PLIST=(INPAR1,INPAR2,(R5),INPAR3)

.

.

* generierte Instruktionen

IN

DSECT

ORG

*+96

INPAR1

DS

A

INPAR2

DS

A

INPAR3

DS

A

LIN

EQU

*-IN

PRO

CSECT

>>>>> siehe auch @ENTR und @PASS, Format 3

U5223-J-Z125-3

387

@PAR

vordefinierte Makros

Format 3: Definition des Pseudoabschnitts für den LOCAL-Bereich

Name dsect_name

Operation @PAR

Operanden
D=YES LEND=YES

dsect_name Name des zu generierenden Pseudoabschnitts

Beschreibung

D=YES

@PAR mit diesem Operanden kennzeichnet den Beginn des Pseudoabschnitts.

LEND=YES @PAR mit diesem Operanden kennzeichnet das Ende des Pseudoabschnitts.

Zwischen @PAR D=YES und @PAR LEND=YES müssen Datenfelder definiert sein. Diese Folge von Instruktionen kann verwendet werden, um die Struktur eines lokalen Datenbereichs im Prozedur-STACK zu beschreiben, der durch @ENTR..., LOCAL=dsect_name angefordert wurde.

Programmierhinweis
Der Name des zu generierenden Pseudoabschnitts muß mit dem LOCAL-Operanden von @ENTR der entsprechenden Prozedur übereinstimmen.

Beispiel
Name PRO
DUMMY NAME1
DUMMY

Operation
@ENTR . . @END @PAR DS . . @PAR

Operanden TYP=I,LOCAL=DUMMY
D=YES ..
LEND=YES

>>>>> siehe auch @ENTR

388

U5223-J-Z125-3

vordefinierte Makros

@PASS

@PASS Prozedur-Aufruf
Funktion @PASS realisiert den Aufruf einer Unter-Prozedur. Die aufrufende Prozedur kann dabei Parameter an die aufgerufene Prozedur übergeben.

Format 1: Aufruf ohne Parameterübergabe

Name [name1]

Operation @PASS

Operanden
NAME=int_name EXTNAME=ext_name
name2 ADDR=
(reg)

name1 int_name ext_name
name2 reg

Name Name einer Prozedur im gleichen Modul wie die rufende (interne Prozedur) Name einer Prozedur in einem anderen Modul als die rufende (externe Prozedur) Name eines Wortes, das die Adresse der gerufenen Prozedur enthält Register, das die Adresse der gerufenen Prozedur enthält; positiver absoluter Ausdruck; entweder
dezimaler selbstdefinierender Wert oder vordefinierter Name eines Registers oder Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wurde

Programmierhinweise
1. Eine mit EXTNAME=ext_name aufgerufene Prozedur muß mit @ENTR TYP=E gekennzeichnet sein.
2. Bei der Angabe von ADDR= muß name2, bzw. reg in der Prozedur mit der Adresse der gerufenen Prozedur versorgt werden.

U5223-J-Z125-3

389

@PASS

vordefinierte Makros

Format 2: Aufruf mit statischer Parameterübergabe über die STANDARD-Schnittstelle

Name [name1]

Operation @PASS

Operanden

NAME=int_name

EXTNAME=ext_name

list_name

name2

,PAR=

ADDR=

(list_reg)

(reg)

name1 int_name ext_name name2 reg
list_name list_reg

Name Name einer Prozedur im gleichen Modul wie die rufende (interne Prozedur) Name einer Prozedur in einem anderen Modul als die rufende (externe Prozedur) Name eines Wortes, das die Adresse der gerufenen Prozedur enthält Register, das die Adresse der gerufenen Prozedur enthält; positiver absoluter Ausdruck; entweder
dezimaler selbstdefinierender Wert oder vordefinierter Name eines Registers oder Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wurde Name der Parameterliste Nur in Prozeduren zulässig, in denen ILCS=NO gesetzt ist. Register, das die Adresse der Parameterliste enthalten muß; positiver absoluter Ausdruck, entweder dezimaler selbstdefinierender Wert oder vordefinierter Name eines Registers oder Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wurde.

Beschreibung
list_name, bzw. list_reg gibt den Namen, bzw. die Adresse der Parameterliste an, die in der rufenden Prozedur durch den @PAR-Makro erzeugt wurde.
Die Adresse der Parameterliste wird über das Register 1 an die aufgerufene Prozedur übergeben.
Bei ILCS=YES wird Register 0 mit der Anzahl der Parameter geladen.
Die Verwendung von Register 1 im Operanden ADDR=reg ist unzulässig.

390

U5223-J-Z125-3

vordefinierte Makros

@PASS

Beispiel
Name PRO1
PARLIST PRO2
IN

Operation
@ENTR . . @PASS . . @EXIT @PAR @END . . @ENTR . . @EXIT @END @PAR . .

Operanden TYP=M NAME=PRO2,PAR=PARLIST PLIST=(PAR1,PAR2,PAR3),VLIST=(FIELD,27,SET) TYP=I,LOCAL=IN,PLIST=(INPAR1,INPAR2,INPAR3)
D=YES,LEND=YES,PLIST=(INPAR1,INPAR2,INPAR3)

>>>>> siehe auch @PAR, Format 1

U5223-J-Z125-3

391

@PASS

vordefinierte Makros

Format 3: Aufruf mit dynamischer Parameterübergabe; STANDARD- oder OPTIMAL-Schnittstelle

Name [name1]

Operation @PASS

Operanden

NAME=int_name EXTNAME=ext_name
name2 ADDR=
(reg)

par_name

,PLIST=(

[,...])

(par_reg)

STA[NDARD]

[,PASS=

]

OPT[IMAL]

YES [,PLEND=
NO

name1 int_name ext_name name2 reg
par_name par_reg

Name Name einer Prozedur im gleichen Modul wie die rufende (interne Prozedur) Name einer Prozedur in einem anderen Modul als die rufende (externe Prozedur) Name eines Wortes, das die Adresse der gerufenen Prozedur enthält Register, das die Adresse der gerufenen Prozedur enthält; positiver absoluter Ausdruck; entweder
dezimaler selbstdefinierender Wert oder vordefinierter Name eines Registers oder Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wurde Name des Feldes, dessen Adresse an die aufgerufene Prozedur übergeben werden soll Register, dessen Inhalt an die aufgerufene Prozedur übergeben werden soll; positiver absoluter Ausdruck, entweder dezimaler selbstdefinierender Wert oder vordefinierter Name eines Registers oder Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wurde. Bei ILCS=YES muß das Register die Adresse des zu übergebenden Wertes enthalten ("call by reference").

392

U5223-J-Z125-3

vordefinierte Makros

@PASS

Beschreibung

PASS=STA Die Parameterübergabe erfolgt über die STANDARD-Schnittstelle.

Der PLIST-Operand gibt die Aktualparameter an. Im LOCAL-Bereich der rufenden Prozedur wird eine Parameterliste mit den Aktualparametern angelegt.

Die Verwendung von Register 1 im Operanden ADDR=reg ist nicht zulässig.

PASS=OPT Nur bei ILCS=NO zulässig. Die Parameterübergabe erfolgt über die OPTIMAL-Schnittstelle.

Der PLIST-Operand gibt die Aktualparameter an. Bis zu vier Parameter werden in den Registern 1 bis 4 übergeben. Bei mehr als vier Parametern werden die ersten drei in den Registern 2 bis 4 übergeben. Für die restlichen wird eine Parameterliste angelegt, deren Adresse in Register 1 übergeben wird.

Die Verwendung der Register 1 bis 4 im Operanden ADDR=reg ist nicht zulässig.

PLEND=

Kann nur in Prozeduren angegeben werden, bei denen ILCS=YES gesetzt ist und nur bei Angabe einer PLIST. Angabe, ob bei der dynamischen Parameterübergabe in der Parameteradreßliste für den letzten Parameter das höchswertige Bit gesetzt wird.

YES Bit wird gesetzt

NO

Bit wird nicht gesetzt

keine Angabe Bei ILCS=NO: Bit wird aus Kompatibilität gesetzt; Bei ILCS=YES: Bit wird nicht gesetzt

Bei ILCS=YES wird Register 0 mit der Anzahl der Parameter geladen.

Register 1 wird mit der Adresse einer Parameteradreßliste geladen.

Das höchstwertige Bit bei der Adresse des letzten Parameters in der Parameteradreßliste wird abhängig vom Parameter PLEND gesetzt.

Werden keine Parameter übergeben, so werden bei ILCS=YES die Register 0 und 1 auf Null gesetzt.

Format 3 von @PASS ist nur in Prozeduren vom Typ M, E oder I zulässig.

U5223-J-Z125-3

393

@PASS

vordefinierte Makros

Programmierhinweis
Im Falle eines @PASS-Aufrufs aus einer ILCS-Prozedur ist der Anwender selbst für das korrekte Belegen der Parameteradreßliste verantwortlich: ILCS verlangt immer "call by reference". Bei Nicht-ILCS ist auch "call by value" möglich. Eine Überprüfung durch die Makros zum Übersetzungszeitpunkt ist z.B. wegen EQU-Symbolen nicht möglich.

Beispiel Das Beispiel zeigt die Übergabe von drei Parametern über die STANDARD-Schnittstelle.

Name PRO1
DUMMY FIELD1 FIELD4 LDUMMY PRO2
IN

Operation
@ENTR @DATA . . @PASS . . @EXIT @END DSECT DS . . DS EQU . . @ENTR . . @EXIT @END @PAR . .

Operanden TYP=M,MAXPRM=3 CLASS=A,BASE=R6,DSECT=DUMMY NAME=PRO2,PLIST=(FIELD1,(R7),FIELD4)
CL10 CL25 *-DUMMY TYP=I,LOCAL=IN,PLIST=(INPAR1,INPAR2,INPAR3)
D=YES,LEND=YES,PLIST=(INPAR1,INPAR2,INPAR3)

>>>>> siehe auch @ENTR und @PAR, Format 2 394

U5223-J-Z125-3

vordefinierte Makros

@SETJV

@SETJV Monitorjobvariable setzen
Dieser Makroaufruf ist nur in Prozeduren mit ILCS=YES erlaubt.

Funktion
@SETJV (SET Job Variable) setzt einen Wert in das MONJV-Feld der PCD (siehe auch 9.6.7).

Format

Name [name]

Operation @SETJV

Operanden
monjv [MONJV= symb Adr ]
(reg)

name monjv symb Adr reg

Name alphanumerischer Wert symbolische Adresse eines Feldes Mehrzweckregister, enthält die Adresse des Feldes.

Beschreibung MONJV= definiert den neuen MONJV-Wert
monjv alphanumerischer Wert der Länge 4, eingeschlossen in Hochkommas. symb Adr1
symbolische Adresse eines Feldes mit dem String. (reg1) wahlweise Register, das die Adresse des Strings enthält. keine Angabe
In das PCD-Feld MONJV werden vier Blanks eingetragen.

Programmierhinweise
1. Ist die Zeichenfolge des MONJV-Wertes länger als 4 Zeichen, so werden die ersten 4 Zeichen verwendet.
2. Ist die Zeichenfolge des MONJV-Wertes kürzer als 4 Zeichen, so wird rechts mit Blanks aufgefüllt.

U5223-J-Z125-3

395

@SETPM

vordefinierte Makros

@SETPM Programmaske setzen oder rücksetzen
Dieser Makroaufruf ist nur in Prozeduren mit ILCS=YES erlaubt.

Funktion
@SETPM (SET Program Mask) setzt die Programmaske oder setzt eine veränderte Programmaske zurück (siehe auch 9.6.6).

Format

Name [name]

Operation @SETPM

Operanden

symb Adr

[PMASK=

]

(reg)

name symb Adr reg

Name symbolische Adresse eines Feldes Mehrzweckregister, enthält die Programmaske.

Beschreibung
PMASK= definiert die neue Programmaske
symb Adr symbolische Adresse eines Feldes der Länge 1 mit der neuen Programmmaske in hexadezimaler Form.
(reg) wahlweise Register mit der neuen Programmaske im linken Byte.
keine Angabe Die Programmaske wird auf den ILCS-Standardwert gesetzt.

Programmierhinweis
Wurde die Programmaske verändert, so muß die Maske zurückgesetzt werden vor einem @EXIT bzw. immer dann, wenn eine ILCS-Prozedur nach ILCS-Konventionen aufgerufen wird. Die Programmaske muß den ILCS-Standardwert haben.

396

U5223-J-Z125-3

vordefinierte Makros

@STXDI

@STXDI STXIT-Behandlungsroutine abmelden
Dieser Makroaufruf ist nur in Prozeduren mit ILCS=YES erlaubt.

Funktion
@STXDI (STXIT disable) meldet eine STXIT-Behandlungsroutine ab (siehe auch 9.6.5, Unterbrechungsereignisse behandeln).

Format

Name [name]

Operation @STXDI

Operanden
symb Adr STXID=
(reg)

name symb Adr reg

Name symbolische Adresse eines Feldes Mehrzweckregister, enthält die Adresse der Kurzkennung

Beschreibung

STXID

Kurzkennung der STXIT-Routine Die Kurzkennung wird vom Makro @STXEN geliefert.

symb Adr symbolische Adresse eines Feldes der Länge 4 auf Wortgrenze mit der Kurzkennung.

(reg) wahlweise Register mit der Adresse der Kurzkennung.

Der Inlinecode des Makros übernimmt die Angaben aus dem Aufruf in einen ILCS-konformen Parameterblock; mit dieser Versorgung wird der entsprechende Entry im Standard-STXIT-Handler zum Abmelden der STXIT-Behandlungsroutine angesprungen.
Nach Rückkehr des Standard-STXIT-Handlers in die aufrufende Prozedur enthält Register 15 einen Returncode, der besagt, ob die Funktion ausgeführt wurde oder nicht bzw. welche Fehler auftraten.

U5223-J-Z125-3

397

@STXEN

vordefinierte Makros

@STXEN STXIT-Behandlungsroutine anmelden
Dieser Makroaufruf ist nur in Prozeduren mit ILCS=YES erlaubt.

Funktion
@STXEN (STXIT enable) meldet eine STXIT-Behandlungsroutine an (siehe auch 9.6.5, Unterbrechungsereignisse behandeln).

Format

Name [name]

Operation @STXEN

Operanden

name1 STXNAME= symb Adr1
(reg1)

symb Adr2 STXID=
(reg2)

symb Adr3 STXADR=
(reg3)

symb Adr4

[STXSVC=

]

(reg4)

name name1

Name alphabetische Zeichenfolge

symb Adr1...symb Adr4 symbolische Adressen von Feldern

reg1...reg4 Mehrzweckregister, in denen die Adresse eines Feldes steht.

398

U5223-J-Z125-3

vordefinierte Makros

@STXEN

Beschreibung

STXNAME= Name des STXIT-Ereignisses

name1 'String' mit max. 7 Zeichen. Folgende Werte können für die entsprechenden Unterbrechungsklassen angegeben werden:

'PROCHK ' 'TIMER ' 'RUNOUT ' 'ERROR ' 'ABEND ' 'ESCPBRK' 'TERM ' 'RTIMER ' 'INTR' 'MSG ' 'HWERROR' 'SVC '

"Programmüberprüfung" "Intervallzeitgeber CPU" "Ende Programmlaufzeit" "Nicht behebbarer Programmfehler" Klasse "ABEND" Klasse "ESCPBRK" "Programmbeendigung" "Intervallzeitgeber Real-Zeit" "Mitteilung an das Programm" "Mitteilung an das Programm" "Hardwarefehler" "SVC-Unterbrechung"

symb Adr1 symbolische Adresse eines Feldes der Länge 7 mit einem der oben genannten Strings.

(reg1) wahlweise Register, das die Adresse des Strings enthält.

STXID= zurückgemeldete Kurzkennung

symb Adr2 symbolische Adresse eines Feldes der Länge 4 auf Wortgrenze.
(reg2) wahlweise Register mit der Adresse des Rückmeldefeldes.

STXADR= Startadresse der STXIT-Routine

symb Adr3 symbolische Adresse eines Feldes der Länge 4 auf Wortgrenze mit der Startadresse.

(reg3) wahlweise Register mit der Startadresse.

STXSVC= Liste mit SVC-Nummern Der Parameter muß angegeben werden, wenn im ersten Parameter als Ereignisname 'SVC' angegeben wurde.

symb Adr4 symbolische Adresse einer Liste auf Halbwortgrenze mit Anzahl der Einträge und SVC-Nummern.

(reg4) wahlweise Register mit der SVC-Listenadresse.

U5223-J-Z125-3

399

@STXEN

vordefinierte Makros

Der Inlinecode des Makros übernimmt die Angaben aus dem Aufruf in einen ILCS-konformen Parameterblock; mit dieser Versorgung wird der entsprechende Entry im Standard-STXIT-Handler zum Anmelden der STXIT-Behandlungsroutine angesprungen.
Nach Rückkehr des Standard-STXIT-Handlers in die aufrufende Prozedur enthält Register 15 einen Returncode, der besagt, ob die Funktion ausgeführt wurde oder nicht bzw. welche Fehler auftraten.
Programmierhinweis
Die Ereignisklassen 'HWERROR' und 'MSG' werden erst ab BS2000 V11.0 unterstützt (auch abhängig von der ILCS-Version). Die Angabe 'MSG' wird schon jetzt vom Makro auf 'INTR' abgebildet.

400

U5223-J-Z125-3

vordefinierte Makros

@STXIM

@STXIM Layout der Unterbrechungsmeldung definieren
Dieser Makroaufruf ist nur in Prozeduren mit ILCS=YES erlaubt.

Funktion
@STXIM (STXIT Interrupt Message) definiert das Layout der Parameter, die vom Standard-STXIT-Handler (SSH) an die Benutzerroutine übergeben werden.

Format

Name [name]

Operation @STXIM

Operanden [pre]=zeichenfolge

name

Name

pre

Präfix

zeichenfolge

alphanumerische Zeichen

Beschreibung

pre=

Präfix für die symbolischen Namen der Einzelfelder

zeichenfolge max. 4 Zeichen pre muß der Assemblersyntax für Namen genügen.

Mit dem Präfix werden folgende DS-Anweisungen für die Einzelfelder definiert:

preSTIW DS F preSTMG DS CL64

STXIT Interrupt Weight Interrupt Message

Diese Parameter werden vom Standard-STXIT-Handler bei Eintreten eines STXIT-Ereignisses an die Benutzerroutine übergeben.

Programmierhinweis Ein Präfix mit mehr als 4 Zeichen wird auf 4 Zeichen gekürzt.

U5223-J-Z125-3

401

@THEN

vordefinierte Makros

@THEN Ja-Unterblock
Funktion @THEN bildet den Kopf des Ja-Unterblocks in einer Entscheidung.

Format

Name [name]

Operation @THEN

Operanden

Beschreibung
Der Unterblock in einer @IF-Verzweigung, der mit @THEN beginnt, wird nur durchlaufen, wenn die mit @IF gesetzte Bedingung zutrifft.

>>>>> siehe auch @IF, @ELSE und @BEND 402

U5223-J-Z125-3

vordefinierte Makros

@THRU

@THRU Iterative Schleife
Funktion @THRU bildet den Kopf einer Schleifenkonstruktion. Die Anzahl der Durchläufe wird durch die Angabe von Anfangswert und Endwert einer Laufvariablen bestimmt.

Format

Name [name]

Operation @THRU

Operanden

(reg2)

(reg3)

(reg1), name2 [, name3 ]

literal2 literal3

name

Name

reg1, reg2, reg3

Mehrzweckregister; positive absolute Ausdrücke, entweder

dezimale selbstdefinierende Werte oder

vordefinierte Namen von Registern oder

Namen, denen ein entsprechender selbstdefinierender Wert zugewiesen

wurde

name2, name3

Namen von Konstanten oder Speicherbereichen, die auf Halbwortgrenze

ausgerichtet und jeweils ein Halbwort lang sein müssen

literal2, literal3

Literale, die auf Halbwortgrenze ausgerichtet und jeweils ein Halbwort lang

sein müssen.

Beschreibung

reg1

enthält den Anfangswert für die Laufvariable

reg2, bzw. name2 oder literal2 gibt den Endwert für die Laufvariable an

reg3 bzw. name3 oder literal3 gibt die Schrittweite an. Standardwert für die Schrittweite ist 1

Die Schrittweite wird jeweils nach Ausführung des Schleifen-Unterblocks zur Laufvariablen addiert. Ist die Summe aus Laufvariable und Schrittweite größer als der Endwert, wird der Strukturblock verlassen.

U5223-J-Z125-3

403

@THRU

vordefinierte Makros

Programmierhinweise
1. reg1 muß vor dem Aufruf des @THRU-Makro mit dem Anfangswert geladen werden.
2. Wird keine Schrittweite angegeben, darf Register 0 nicht für den Anfangswert verwendet werden.
3. Ein @THRU-Makro mit Anfangswert Endwert und Schrittweite 0 führt zu einer Endlosschleife.

Beispiel

Name LOOP
BEGL ENDL

Operation
. . LH @THRU @DO . . @BEND . . DC DC

Operanden
R6,BEGL (R6),ENDL
H'1' H'10'

In diesem Beispiel ist der Anfangswert der Laufvariablen 1, der Endwert 10 und die Schrittweite ebenfalls 1 (Standardwert). Daher wird der Schleifenunterblock 10-mal durchlaufen.

>>>>> siehe auch @DO und @BEND 404

U5223-J-Z125-3

vordefinierte Makros

@TOR

@TOR Logisches 'Oder mit Priorität'
Funktion @TOR realisiert in zusammengesetzten Bedingungen eine logische Oder-Verknüpfung, die aber eine höhere Bindungspriorität hat als @AND.

Format

Name [name]

Operation @TOR

Operanden cond_sym

name

Name

cond_sym vordefiniertes oder benutzereigenes Bedingungssymbol (siehe 9.2.4 und

9.2.5)

Programmierhinweise
Dem Aufruf des @TOR-Makro muß ein Anzeige-setzender Assemblerbefehl folgen (siehe Assemblerbefehle, Beschreibung).

Beispiel

Name LOOP

Operation
@CYCL . . @WHEN CR @AND CR @TOR CLI @BREA . . @BEND

Operanden
EQ R1,R2 EQ R7,R8 EQ FIELD,C'3'

Die Schleife wird verlassen, entweder bei R1 = R2 und R7 = R8 oder bei R1 = R2 und FIELD = 3.

>>>>> siehe auch @AND und @OR

U5223-J-Z125-3

405

@WHEN

vordefinierte Makros

@WHEN Bedingung für Schleifenabbruch
Funktion @WHEN gibt in einer Schleife mit freier Endebedingung oder in einer Zählschleife mit freier Endebedingung die Bedingung an, die zum Abbrechen der Schleife führt.

Format

Name [name]

Operation @WHEN

Operanden cond_sym

name

Name

cond_sym vordefiniertes oder benutzereigenes Bedingungssymbol (siehe 9.2.4 und

9.2.5)

Beschreibung
cond_sym legt die Bedingung (siehe 9.2.4 und 9.2.5) fest, die zum Beenden der entsprechenden Schleife führen soll. Trifft die Bedingung zu, wird die Schleife mit dem @BREA-Makro verlassen.

Beispiel

siehe bei @BREA

>>>>> siehe auch @BREA, @CYCL und @BEND 406

U5223-J-Z125-3

vordefinierte Makros

@WHIL

@WHIL Schleife mit Vorabprüfung
Funktion @WHIL bildet den Kopf einer Schleifenkonstruktion, bei der die Anzahl der Durchläufe vom Zutreffen einer Bedingung bestimmt wird.

Format

Name [name]

Operation @WHIL[E]

Operanden cond_sym

name

Name

cond_sym vordefiniertes oder benutzereigenes Bedingungssymbol (siehe 9.2.4 und

9.2.5)

Beschreibung
cond_sym legt die Bedingung (siehe 9.2.4 und 9.2.5) fest, die zum Durchlaufen des Schleifenunterblocks führen soll. Beim Aufruf des @WHIL-Makro wird die Bedingung geprüft und wenn sie zutrifft, der Schleifenunterblock ausgeführt.

Beispiel

Name LOOP

Operation
@WHIL CLI @DO . . @BEND

Operanden
EQ END,C'N'

Der Schleifenunterblock wird ausgeführt, solange END gleich N ist.

>>>>> siehe auch @DO und @BEND

U5223-J-Z125-3

407

vordefinierte Makros
11 Anhang

@WHIL

U5223-J-Z125-3

409

DC-Konstanten

11.1 Zusammenfassung der DC-Konstanten

Spezifiziert

implizite

Längen- Exponenten- Skalen-

Typ durch

Ausrichtung Länge (byte) faktor faktor

faktor

Auffüllen, Abschneiden

absoluter

A oder relati- Wort

4

ver Ausdruck

1 bis 4

links

BinärB Ziffern

Byte

wie benötigt 1 bis 256

links

C Zeichen

Byte

wie benötigt 1 bis 256

rechts

D Dezimal-

Doppel-

8

ziffern

wort

1 bis 8 -85 bis +75 0 bis 14

Auffüllen rechts Abschneiden nicht anwendbar

E Dezimal-

Wort

4

ziffern

1 bis 8 -85 bis +75 0 bis 14

Auffüllen rechts Abschneiden nicht anwendbar

Dezimal-

F ziffern

Wort

4

1 bis 8 -85 bis +75 -187 bis +346 links

DezimalH ziffern

Halbwort 2

1 bis 8 -85 bis +75 -187 bis +346 links

L Dezimal-

Doppel-

16

ziffern

wort

1 bis 16 -85 bis +75 0 bis 28

Auffüllen rechts Abschneiden nicht anwendbar

DezimalP ziffern

Byte

wie benötigt 1 bis 16

links

Name eines

Q Pseudo-

Wort

4

registers

1 bis 4

links

symbolische

S oder nicht- Halbwort 2

2

symbolische

Adresse

V Name

Wort

4

3 oder 4

links

Sedezimal-

X Ziffern

Byte

wie benötigt 1 bis 256

links

absoluter Y oder relati- Halbwort 2
ver Ausdruck

1 oder 2

links

DezimalZ ziffern

Byte

wie benötigt 1 bis 16

links

410

U5223-J-Z125-3

Assemblerbefehle

11.2

Format der Assemblerbefehle
In dieser Befehlsmenge sind die Befehle der Befehlssätze BS2000-NXS (SET1), BS2000XS (SET3) und BS2000-ESA enthalten (die Assemblerbefehle sind in der Sprachbeschreibung "Assemblerbefehle" [3] beschrieben). Der Befehlssatz BS2000-NXS unterstützt die Zentraleinheiten mit der 24-Bit-Adressierung (NXS bedeutet Nicht eXtended System). Der Befehlssatz BS2000-XS unterstützt die XS-Anlagen mit der 31-Bit-Adressierung (XS bedeutet eXtended System). Der Befehlssatz BS2000-ESA unterstützt die ESA-Anlagen, auf denen eine Erweiterung der virtuellen Adreßräume möglich ist (ESA bedeutet Enterprise Systems Architecture). Im Befehlssatz BS2000-XS ist der Befehlssatz BS2000-NXS enthalten und beide sind im Befehlssatz BS2000-ESA enthalten. In der Spalte NXS / XS / ESA ist jeweils mit dem Anfangsbuchstaben N, X oder E markiert, zu welchem Befehlssatz der Befehl gehört. In folgender Darstellung sind die mit N markierten Befehle eine Befehlsgrundmenge und die mit X oder E markierten Befehle die zusätzliche Menge dieser Befehlssätze.

U5223-J-Z125-3

411

Assemblerbefehle

Mnem. Code

Befehlsname

NXS Masch. Län- Operandenformat XS Code ge ESA

A

Addieren

N 5A

AD

Addieren normalisiert lang

N 6A

ADR Addieren normalisiert lang

N 2A

AE

Addieren normalisiert kurz

N 7A

AER Addieren normalisiert kurz

N 3A

AH

Addieren Halbwort

N 4A

AL

Addieren ohne Vorzeichen

N 5E

ALR Addieren ohne Vorzeichen

N 1E

AP

Addieren dezimal

N FA

AR

Addieren

N 1A

AU

Addieren nicht normalisiert kurz N 7E

AUR Addieren nicht normalisiert kurz N 3E

AW

Addieren nicht normalisiert lang N 6E

AWR Addieren nicht normalisiert lang N 2E

AXR Addieren normalisiert mit er-

N 36

weiterter Länge

BAL Springen und Speichern Rück-

N 45

sprungadresse

BALR Springen und Speichern Rück-

N 05

sprungadresse

BAS Springen und Speichern Rück-

N 4D

sprungadresse

BASR Springen und Speichern Rück-

N 0D

sprungadresse

BASSM Branch and Save and Set Mode

X 0C

BC

Springen bedingt

N 47

BCR Springen bedingt

N 07

BCT Springen nach Zählen

N 46

BCTR Springen nach Zählen

N 06

BSM Branch and Save

X 0B

BXH Springen wenn Index größer

N 86

BXLE Springen wenn Index kleiner

N 87

gleich

C

Vergleichen algebraisch

N 59

* CCPU Prüfen Zentraleinheit

N AC

CCW Define Channel Command Word

N

CCW0 Define Channel Command Word

X

(Format 0)

CCW1 Define Channel Command Word

X

(Format 1)

CD

Vergleichen lang

N 69

CDR Vergleichen lang

N 29

CDS Vergleichen doppelt und

N BB

austauschen

CE

Vergleichen kurz

N 79

CER Vergleichen kurz

N 39

CH

Vergleichen Halbwort

N 49

* CIOC Prüfen Ein-Ausgabesteuerung

N AD

* CKC Prüfen Kanal

N 9F

CL

Vergleichen logisch

N 55

CLC Vergleichen logisch

N D5

CLCL Vergleichen logisch lang

N 0F

4 R1,D2(X2,B2) 4 R1,D2(X2,B2) 2 R1,R2 4 R1,D2(X2,B2) 2 R1,R2 4 R1,D2(X2,B2) 4 R1,D2(X2,B2) 2 R1,R2 6 D1(L1,B1),D2(L2,B2) 2 R1,R2 4 R1,D2(X2,B2) 2 R1,R2 4 R1,D2(X2,B2) 2 R1,R2 2 R1,R2
4 R1,D2(X2,B2)
2 R1,R2
4 R1,D2(X2,B2)
2 R1,R2
2 R1,R2 4 I,D2(X2,B2) 2 I,R2 4 R1,D2(X2,B2) 2 R1,R2 2 R1,R2 4 R1,R3,D2(B2) 4 R1,R3,D2(B2)
4 R1,D2(X2,B2) 4 D1(B1),I2 8 I1,I2,I3,I4 8 I1,I2,I3,I4
8 I1,I2,I3,I4
4 R1,D2(X2,B2) 2 R1,R2 4 R1,R3,D2(B2)
4 R1,D2(X2,B2) 2 R1,R2 4 R1,D2(C2,B2) 4 D1(B1),I2 4 D1(B1) 4 R1,D2(X2,B2) 6 D1(L,B1),D2(B2) 2 R1,R2

412

U5223-J-Z125-3

Assemblerbefehle

Mnem. Code

Befehlsname

CLI CLM CLR CP CPYA CR CS * CSCH CVB CVD D DD DDR DE DER * DIG DP DR DXR EAR ED EDMK ** EPAR ** ESAR EX * FC * FCAL HDR * HDV HER * HSCH ** IAC IC ICM * IDL ** IPK IPM * ISK ** IVSK L LA LAE LAM LCDR LCER LCR LD LDR LE LER LH LM

Vergleichen logisch Vergleichen logisch mit Maske Vergleichen logisch Vergleichen dezimal Copy Access Register Vergleichen algebraisch Vergleichen und austauschen Clear Subchannel Umwandeln in Binärform Umwandeln in Dezimalform Dividieren Dividieren lang Dividieren lang Dividieren kurz Dividieren kurz Suchen Maschinenfehler Dividieren dezimal Dividieren Divide extended Extract Access Register Aufbereiten Aufbereiten und Markieren Extract Primary ASN Extract Secondary ASN Ausführen Ausführen Sonderfunktionen Ausführen Sonderfunktionen Halbieren lang Halten Gerät Halbieren kurz Halt Subchannel Insert Address Space Control Laden Zeichen Einsetzen Zeichen mit Maske Warten Insert PSW Key Einsetzen Programmaske Abfragen Speicherschlüssel Insert Virtual Storage Key Laden Laden Adresse Load Address Extended Load Access Multiple Laden Komplement lang Laden Komplement kurz Laden Komplement Laden lang Laden lang Laden kurz Laden kurz Laden Halbwort Laden mehrfach

NXS Masch. Län- Operandenformat XS Code ge ESA

N 95

4

N BD

4

N 15

2

N F9

6

E B24D 4

N 19

2

N BA

4

X B230 4

N 4F

4

N 4E

4

N 5D

4

N 6D

4

N 2D

2

N 7D

4

N 3D

2

N 83

4

N FD

6

N 1D

2

X B22D 4

E B24F 4

N DE

6

N DF

6

X B226 4

X B227 4

N 44

4

N 9A

4

N B7

4

N 24

2

N 9E

4

N 34

2

X B231 4

E B224 4

N 43

4

N BF

4

N 80

4

X B20B 4

N B222 4

N 09

2

X B223 4

N 58

4

N 41

4

E 51

4

E 9A

4

N 23

2

N 33

2

N 13

2

N 68

4

N 28

2

N 78

4

N 38

2

N 48

4

N 98

4

D1(B1),I2 R1,M3,D2(B2) R1,R2 D1(L1,B1),D2(L2,B2) R1,R2 R1,R2 R1,R3,D2(B2) kein Operand R1,D2(X2,B2) R1,D2(X2,B2) R1,D2(X2,B2) R1,D2(X2,B2) R1,R2 R1,D2(X2,B2) R1,R2 D1(B1) D1(L1,B1),D2(L2,B2) R1,R2 R1,R2 R1,R2 D1(L,B1),D2(B2) D1(L,B1),D2(B2) R1 R1 R1,D2(X2,B2) D1(B1),I2 D1(B1),I2 R1,R2 D1(B1) R1,R2 kein Operand R1 R1,D2(X2,B2) R1,M3,D2(B2) I2 kein Operand R1 R1,R2 R1,R2 R1,D2(X2,B2) R1,D2(X2,B2) R1,D2(X2,B2) R1,R3,D2(B2) R1,R2 R1,R2 R1,R2 R1,D2(X2,B2) R1,R2 R1,D2(X2,B2) R1,R2 R1,D2(X2,B2) R1,R3,D2(B2)

U5223-J-Z125-3

413

Assemblerbefehle

Mnem. Code
LNDR LNER LNR LPDR LPER LPR LR LRDR
LRER
* LSM * LSP
LTDR LTER LTR M MD MDR ME MER MH MP MR * MSCH MVC MVCL ** MVCP ** MVCS MVI MVN MVO MVZ MXD
MXDR
MXR
N NC NI NR O OC OI OR PACK ** PC ** PT * RCHP * RDD

Befehlsname

NXS Masch. Län- Operandenformat XS Code ge ESA

Laden negativ lang

N 21

2

Laden negativ kurz

N 31

2

Laden negativ

N 11

2

Laden positiv lang

N 20

2

Laden positiv kurz

N 30

2

Laden positiv

N 10

2

Laden

N 18

2

Laden und Runden mit erweiterter N 25

2

Länge, Ergebnis lang

Laden und Runden mit erweiterter N 35

2

Länge, Ergebnis kurz

Laden Schattenspeicher

N D9

6

Laden Zwischenspeicher

N D8

6

Laden und Testen lang

N 22

2

Laden und Testen kurz

N 32

2

Laden und Testen

N 12

2

Multiplizieren

N 5C

4

Multiplizieren lang

N 6C

4

Multiplizieren lang

N 2C

2

Multiplizieren kurz

N 7C

4

Multiplizieren kurz

N 3C

2

Multiplizieren Halbwort

N 4C

4

Multiplizieren dezimal

N FC

6

Multiplizieren

N 1C

2

Modify Subchannel

X B232 4

Übertragen Zeichenfolge

N D2

6

Übertragen Zeichenfolge lang

N 0E

2

Move to Primary

X DA

6

Move to Secondary

X DB

6

Ersetzen Zeichen

N 92

4

Übertragen numerisch

N D1

6

Übertragen mit Versetzen

N F1

6

Übertragen Zonen

N D3

6

Multiplizieren mit erweiterter N 67

4

Länge, Ergebnis lang

Multiplizieren mit erweiterter N 27

2

Länge, Ergebnis lang

Multiplizieren mit erweiterter N 26

2

Länge, Ergebnis kurz

UND

N 54

4

UND

N D4

6

UND

N 94

4

UND

N 14

2

ODER

N 56

4

ODER

N D6

6

ODER

N 96

4

ODER

N 16

2

Packen

N F2

6

Wechseln Funktionszustand

X B218 4

Program Transfer

X B228 4

Reset Channel Path

X B23B 4

Lesen direkt

N 85

4

R1,R2 R1,R2 R1,R2 R1,R2 R1,R2 R1,R2 R1,R2 R1,R2
R1,R2
D1(L,B1),D2(B2) D1(L,B1),D2(B2) R1,R2 R1,R2 R1,R2 R1,D2(X2,B2) R1,D2(X2,B2) R1,R2 R1,D2(X2,B2) R1,R2 R1,D2(X2,B2) D1(L1,B1),D2(L2,B2) R1,R2 D2(B2) D1(L,B1),D2(B2) R1,R2 D1(R1,B1),D2(B2),R3 D1(R1,B1),D2(B2),R3 D1(B1),I2 D1(L,B1),D2(B2) D1(L1,B1),D2(L2,B2) D1(L,B1),D2(B2) R1,D2(X2,B2)
R1,R2
R1,R2
R1,D2(X2,B2) D1(L,B1),D2(B2) D1(B1),I2 R1,R2 R1,D2(X2,B2) D1(L,B1),D2(B2) D1(B1),I2 R1,R2 D1(L1,B1),D2(L2,B2) D2(B2) R1,R2 kein Operand D1(B1),I2

414

U5223-J-Z125-3

Assemblerbefehle

Mnem. Code

Befehlsname

NXS Masch. Län- Operandenformat XS Code ge ESA

* RSCH Resume Subchannel

X B238 4

S

Subtrahieren

N 5B

4

SAC Set Address Space Control

E B219 4

* SAL Set Address Limit

X B237 4

SAR Set Access Register

E B24E 4

* SCHM Set Channel Monitor

X B23C 4

SD

Subtrahieren normalisiert lang N 6B

4

SDR Subtrahieren normalisiert lang N 2B

2

* SDV Starten Gerät

N 9C

4

SE

Subtrahieren normalisiert kurz N 7B

4

SER Subtrahieren normalisiert kurz N 3B

2

SH

Subtrahieren Halbwort

N 4B

4

SL

Subtrahieren ohne Vorzeichen

N 5F

4

SLA Verschieben links

N 8B

4

SLDA Verschieben links doppelt

N 8F

4

SLDL Verschieben links doppelt

N 8D

4

logisch

SLL Verschieben links logisch

N 89

4

SLR Subtrahieren ohne Überlauf

N 1F

2

SP

Subtrahieren dezimal

N FB

6

** SPKA Set PSW Key from Address

X B20A 4

SPM Setzen Programmaske

N 04

2

SR

Subtrahieren

N 1B

2

SRA Verschieben rechts

N 8A

4

SRDA Verschieben rechts doppelt

N 8E

4

SRDL Verschieben rechts doppelt

N 8C

4

logisch

SRL Verschieben rechts logisch

N 88

4

SRP Verschieben und Runden dezimal N F0

6

* SSCH Start Subchannel

X B233 4

* SSK Setzen Speicherschlüssel

N 08

2

* SSM Speichern aus Schattenspeicher N DA

6

* SSP Speichern aus Zwischenspeicher N D0

6

ST

Speichern

N 50

4

STAM Store Access Multiple

E 9B

4

STC Speichern Zeichen

N 42

4

STCK Speichern Uhrzeit

N B2

4

STCM Speichern Zeichen mit Maske

N BE

4

* STCPS Store Channel Path Status

X B23A 4

* STCRW Store Channel Report Word

X B239 4

STD Speichern lang

N 60

4

STE Speichern kurz

N 70

4

STH Speichern Halbwort

N 40

4

STM Speichern mehrfach

N 90

4

* STSCH Store Subchannel

X B234 4

SU

Subtrahieren nicht normalisiert N 7F

4

kurz

SUR Subtrahieren nicht normalisiert N 3F

2

kurz

SVC Aufrufen Organisationsprogramm N 0A

2

kein Operand R1,D2(X2,B2) D2(B2) kein Operand R1,R2 kein Operand R1,D2(X2,B2) R1,R2 D1(B1) R1,D2(X2,B2) R1,R2 R1,D2(X2,B2) R1,D2(X2,B2) R1,D2(B2) R1,D2(B2) R1,D2(B2)
R1,D2(B2) R1,R2 D1(L1,B1),D2(L2,B2) D2(B2) R1 R1,R2 R1,D2(B2) R1,D2(B2) R1,D2(B2)
R1,D2(B2) D1(L1,B1),D2(B2),I3 D2(B2) R1,R2 D1(L,B1),D2(B2) D1(L,B1),D2(B2) R1,D2(X2,B2) R1,R3,D2(B2) R1,D2(X2,B2) D1(B1) R1,M3,D2(B2) D2(B2) D2(B2) R1,D2(X2,B2) R1,D2(X2,B2) R1,D2(X2,B2) R1,R3,D2(B2) D2(B2) R1,D2(X2,B2)
R1,R2
I

U5223-J-Z125-3

415

Assemblerbefehle

Mnem. Code

Befehlsname

NXS Masch. Län- Operandenformat XS Code ge ESA

SW

Subtrahieren nicht normalisiert N 6F

4

lang

SWR Subtrahieren nicht normalisiert N 2F

2

lang

SXR Subtrahieren normalisiert mit

N 37

2

erweiterter Länge

TAR Test Access Register

E B24C 4

* TDV Prüfen Gerät

N 9D

4

TM

Testen mit Maske

N 91

4

* TPI Test Pending Interruption

X B236 4

TR

Umsetzen Code

N DC

6

* TRACE Trace

X 99

4

TRT Umsetzen und Testen

N DD

6

TS

Testen und Setzen

N 93

4

* TSCH Test Subchannel

X B235 4

UNPK Entpacken

N F3

6

* WRD Schreiben direkt

N 84

4

X

Ausschließendes ODER

N 57

4

XC

Ausschließendes ODER

N D7

6

XI

Ausschließendes ODER

N 97

4

XR

Ausschließendes ODER

N 17

2

ZAP Löschen und Addieren dezimal

N F8

6

R1,D2(X2,B2)
R1,R2
R1,R2
R1,R2 D1(B1) D1(B1),I2 D2(B2) D1(L,B1),D2(B2) R1,R3,D2(B2) D1(L,B1),D2(B2) D1(B1) D2(B2) D1(L1,B1),D2(L2,B2) D1(B1),I2 R1,D2(X2,B2) D1(L,B1),D2(B2) D1(B1),I2 R1,R2 D1(L1,B1),D2(L2,B2)

* Privilegierte Befehle ** Semiprivilegierte Befehle

416

U5223-J-Z125-3

Assembler-Restriktionen

11.3

Assembler-Restriktionen
Der ASSEMBH kann keine beliebig großen Programme übersetzen. Es gibt Einschränkungen bezüglich der Größe der Programme, der Zahl der Namen, und ähnlichem, die beachtet werden müssen, damit die Übersetzung korrekt abläuft. Diese ASSEMBH-spezifischen Einschränkungen sind im folgenden aufgeführt. Zusätzlich zu diesen theoretischen Maximalwerten ist die Größe von Programmen, die der ASSEMBH übersetzen kann, abhängig von der Speicherkapazität und der Komplexität der Programme und des Assemblers.
· Anzahl der Zeilen im Quellprogramm
Im Quellprogramm gilt jede einzelne Instruktion und jeder Kommentar als ein Statement und erhält im Übersetzungsprotokoll eine Statementnummer. Wird eine Instruktion über mehrere Listingzeilen fortgesetzt, dann hat trotzdem die gesamte Instruktion nur eine Statementnummer.
Ein Quellprogramm darf nach der Auflösung der Makros und dem Einfügen der COPYElemente maximal 231-1 Statements enthalten.
· Anzahl der Namen und Literale Ein Quellprogramm darf maximal 231-1 Namen und Literale enthalten, d.h., die Symboltabelle darf maximal so viele Einträge haben. Wurden in einem Quellprogramm mehr Namen und Literale verwendet, gibt der ASSEMBH eine Meldung aus und die Übersetzung wird abgebrochen.
· Länge von Namen
Namen dürfen eine maximale Länge von 64 Zeichen haben. Externe Namen in Moduln im OM-Format (Objektmodul-Format), die vom Binder TSOSLNK bearbeitet werden, sind auf 8 Zeichen beschränkt. Externe Namen in Moduln, die mit der Option COMPILER-ACT(,MODULEFORMAT=LLM) erstellt wurden (siehe ASSEMBH, Benutzerhandbuch [1]), sind auf 32 Zeichen erweitert und werden vom Binder BINDER bearbeitet.
· Klammerstufen in arithmetischen Ausdrücken
Das Ergebnis des Ausdrucks
(Anzahl Elemente) + (Anzahl Operatoren) + (Klammerstufen) + (Verwaltungseinträge)
darf den Grenzwert nicht überschreiten, der durch die internen Tabellen des Assemblers vorgegeben ist.

U5223-J-Z125-3

417

Assembler-Restriktionen
· Anzahl der Makrodefinitionen Aus den Bibliotheken, die für eine Übersetzung zugewiesen wurden und dem Quelltext können maximal 231-1 Makrodefinitionen verwendet werden.
· Schachtelungstiefe von Makros und COPY-Elementen Die maximal mögliche Schachtelungstiefe von Makros ist 255. Für COPY-Elemente ist die Schachtelungstiefe auf 5 voreingestellt. Sie kann mit Hilfe einer SDF-Option auf maximal 255 erhöht werden (siehe ASSEMBH, Benutzerhandbuch [1]).
· Länge der Operanden von Makroaufrufen Ein Operand eines Makroaufrufs darf maximal 1020 Zeichen lang sein. Bei Kennwortoperanden wird die Zeichenzahl nach dem Gleichheitszeichen gezählt. Enthält ein Operand variable Parameter, gilt diese Länge nach dem Einsetzen der aktuellen Werte. Ist der Operand eine Operandenunterliste, dann werden alle Kommas und Klammern als Zeichen mitgezählt.
· Variable Parameter Pro Makrodefiniton dürfen maximal 215-1 variable Parameter verwendet werden.
· Länge der Eingabesätze Beim Einlesen aus einer Datei ist festgelegt, was der Assembler als Quelltext interpretieren soll. Dieser Quelltext darf maximal 255 Zeichen lang sein. Die Voreinstellung für den zu interpretierenden Quelltext sind die Spalten 1, 71, 72 und 16. Mit Hilfe der SDF-Option FROM-COLUMN, TO-COLUMN kann die Einstellung für die Anfangsspalte bis auf 70, die für die Endspalte auf maximal 255 erhöht werden. Mit der ICTL-Anweisung kann die Anfangsspalte auf 40 und die Endspalte auf maximal 80 eingestellt werden.
· XREF-Listing Im XREF-Listing können maximal 231-1 Referenzen stehen. Wird diese Zahl überschritten, dann erfolgt eine Fehlermeldung und Abbruch der Übersetzung.

418

U5223-J-Z125-3

Assembler-Restriktionen
· ESID-Nummern
Der ASSEMBH kann maximal 215-1 ESID-Nummern vergeben.
Eine ESID-Nummer bekommt: jeder Programmabschnitt (Typ SD) jeder gemeinsame Hilfsabschnitt (Typ CM) jeder Pseudoabschnitt (Typ DS) jeder externe Pseudoabschnitt (Typ XD, XR) jeder XDSEC-Name (Typ XD, XR) jeder EXTRN-Name (Typ ER) jeder WXTRN-Name (Typ WX) jede V-Konstante (Typ VC) jedes Pseudoregister (Typ DX)
· Assembler-/Makroanweisungen
Anzahl der LTORG-Anweisungen: beliebig maximaler Wiederholungsfaktor bei DC und DS: 224-1 maximaler Längenfaktor bei DC und DS: abhängig vom Konstantentyp maximale Längenangabe bei EQU: 224-1 maximale Zahl von Folgesymbolen pro Makro: 215-1 maximale Dimension bei indizierten SET-Parametern: 231-1 maximaler Wertebereich von arithmetischen Ausdrücken: -231 bis 231-1 Anzahl der Fortsetzungszeilen einer Instruktion: 9 Fortsetzungszeilen im alternativen Anweisungsformat: beliebig

U5223-J-Z125-3

419

Assembler-Restriktionen

Zusätzliche Restriktionen bei der Strukturierten Programmierung
· Vordefinierte Namen
Alle Namen, die mit "@" oder mit "R@" beginnen, sind für ASSEMBH reserviert und dürfen nicht anderweitig verwendet werden.
Mehrzweckregister können mit R0 bis R15 angesprochen werden, Gleitpunktregister mit FA bis FD.

Registerverwendung
Nur die Register 5 bis 9 können uneingeschränkt verwendet werden. Alle anderen sind durch die folgenden Registerkonventionen vorbesetzt.

Register
1 1 bis 4
10 11 12 13 14 15

Verwendung
Adresse der Parameterliste bei der Parameterübergabe Parameterwerte, bzw. -adressen bei der Parameterübergabe in OPTIMAL-Form Basisadreßregister für Prozeduren der Typen M, E und I Arbeitsregister. Bei C-Programmen Zeiger auf Static-Bereiche Anfangsadresse des Program Manager Basisadreßregister für den STACK Prozedur-Rücksprungsadresse Prozedur-Anfangsadresse, Standard-Basisadreßregister für Prozeduren der Typen B und L

· Durch ASSEMBH generierte Namen Es sind maximal 9000 interne Namen möglich, die vom ASSEMBH generiert werden können. Bei einem Überlauf der internen Namenszählung gibt der ASSEMBH eine MNOTE mit Abbruchgewicht aus.
· Verschachtelung von Strukturblöcken Die Verschachtelung von Strukturblöcken wird in einem SETC-Parameter abgelegt. Die Verschachtelung ist durch die Länge dieses Parameters begrenzt. Wird er zu lang, erfolgt eine Fehlermeldung.
· Modulgröße Die Größe eines Objektmoduls ist begrenzt durch die Adressierbarkeit über ein Basisadreßregister.

420

U5223-J-Z125-3

Pseudoregister, Beispiele

11.4 Pseudoregister, Beispiele

PSEUDOREGISTER BEISPIEL1/ 1. TEIL

14:27:36 1994-03-08 PAGE 0003

LOCTN OBJECT CODE ADDR1 ADDR2

STMNT M SOURCE STATEMENT

1

TITLE 'PSEUDOREGISTER BEISPIEL1/ 1. TEIL'

2

*

3

* - IN DIESEM BEISPIEL WIRD BEREITS ZUM ZEITPUNKT DES PROGRAMMIERENS

4

* DIE LAENGE DES PSEUDOREGISTERVEKTORS BESTIMMT UND FESTGELEGT.

5

* - DIE ADRESSIERUNG DER EINZELNEN PSEUDOREGISTER ERFOLGT UEBER

6

* Q-KONSTANTEN

7

*

8

PRINT NOGEN

000000

9

PSEUDO1 START

10

EXTRN PSEUDO2

0000F4

11

ENTRY PSRVEKT

000000 05 A0

12

BALR 10,0

000002

00000002

13

USING *,10

14

*

000002 41 10 A0F2

000000F4

15

LA 1,PSRVEKT

000006 58 20 A0E6

000000E8

16

L

2,QPSREG1

R2 <- DISTANZ DES PSREG. 1

00000A 1A 21

17

AR 2,1

ZUM ANFANG DES PSREG.VEKTORS

00000C D2 09 2000A142

00000144

18

MVC 0(10,2),=C'WUNDERLICH' WIRD INHALT DES PSREG 1

000012 58 20 A0EE

000000F0

19

L

2,QPSREG3

R2 <- DISTANZ DES PSREG 3

000016 1A 21

20

AR 2,1

ZUM ANFANG DES PSREG.VEKTORS

000018 D2 4F 2000A094

00000096

21

MVC 0(80,2),TEXT

TEXT WIRD INHALT DES PSREG 3

00001E 58 E0 A13E

00000140

22

L

14,=A(PSEUDO2)

000022 05 FE

23

BALR 15,14

000024

24

WROUT NACHR1,FEHLER

39 2

*,@DCEO

952 900503 53531004

00066200

42 1

*,WROUT

004 890217 53121058

43

*

000032

44

TERM

47 2

*,VERSION 010

00001300

000046

59

FEHLER TERM DUMP=Y

62 2

*,VERSION 010

00001300

74

*

00005C

75

NACHR1 DS 0F

00005C 0038000040

76

DC X'0038000040'

X'38' = NACHRICHTENLAENGE

000061 5C5C5C5C5C5C5C5C

77

DC C'**************PROGRAMMENDE BEISPIEL 1****************'

000096 C5C9D540D4C5D5E2

78

TEXT

DC C'EIN MENSCH KANNS MANCHMAL NICHT VERSTEHN,'

0000BF E3D9C9C6C6E340C5

79

DC C'TRIFFT EIN WAS ER VORAUSGESEHN

'

80

*

000000

81

PSREG1 DXD CL10

DEFINITIONEN DER PSREG 1,

000000

82

PSREG2 DXD CL60

2 UND

000000

83

PSREG3 DXD 20F

3

84

*

0000E8 00000000

85

QPSREG1 DC Q(PSREG1)

DEFINITINEN DER ZUR ADRESSIERUNG

0000EC 00000000

86

QPSREG2 DC Q(PSREG2)

DER EINZELNEN PSREG VERWENDETEN

0000F0 00000000

87

QPSREG3 DC Q(PSREG3)

Q-KONSTANTEN

88

*

0000F4

89

PSRVEKT DS CL(L'PSREG1+L'PSREG2+L'PSREG3)

PSEUDOREGISTERVEKTOR

90

*

91

END

000140 00000000

92

=A(PSEUDO2)

000144 E6E4D5C4C5D9D3C9

93

=C'WUNDERLICH'

FLAGS IN 00000 STATEMENTS, 000 PRIVILEGED FLAGS, 000 MNOTES

HIGHEST ERROR-WEIGHT : NO ERRORS

THIS PROGRAM WAS ASSEMBLED BY ASSEMBH

V 1.2A00

ON 1994-03-08 AT 14:07:24

U5223-J-Z125-3

421

Pseudoregister, Beispiele

BEISPIEL 1/ 2.TEIL

14:27:37 1994-03-08 PAGE 0003

LOCTN OBJECT CODE ADDR1 ADDR2

STMNT M

1

2

3

4

000000

5

000000 05 B0

6

000002

00000002

7

8

9

000002 58 10 B016

00000018

10

000006 58 20 B012

00000014

11

00000A 1A 21

12

00000C D2 13 2000B01A

0000001C

13

000012 07 FF

14

15

000000

16

000014 00000000

17

18

19

000018 00000000

20

00001C 4DC54BD9D6E3C840

21

SOURCE STATEMENT

*

TITLE 'BEISPIEL 1/ 2.TEIL'

*

PRINT NOGEN

PSEUDO2 START

BALR 11,0

USING *,11

EXTRN PSRVEKT

*

L

1,=A(PSRVEKT)

L

2,QPSREG2

AR 2,1

MVC 0(20,2),=C'(E.ROTH

BR 15

*

PSREG2 DXD CL22

QPSREG2 DC Q(PSREG2)

*

END

=A(PSRVEKT)

=C'(E.ROTH

)'

R2 <- DISTANZ DES PSREG 2 ZUM ANFANG DES PSREG.VEKTORS
)'

FLAGS IN 00000 STATEMENTS, 000 PRIVILEGED FLAGS, 000 MNOTES

HIGHEST ERROR-WEIGHT : NO ERRORS

THIS PROGRAM WAS ASSEMBLED BY ASSEMBH

V 1.2A00

ON 1994-03-08 AT 14:07:24

422

U5223-J-Z125-3

Pseudoregister, Beispiele

PSEUDOREGISTER BEISPIEL 2/ 1. TEIL

14:28:39 1994-03-08 PAGE 0003

LOCTN OBJECT CODE ADDR1 ADDR2

000000

000000 05 A0 000002 000002

00000002

000002 58 E0 A0E6 000006 05 CE 000008 18 81

000000E8

00000A D2 23 8000A0EA 00000000 000000EC 000010 D2 03 8000A07B 00000000 0000007D 000016 D2 20 8000A09F 00000000 000000A1 00001C D2 07 8000A0C0 00000000 000000C2 000022

000032
000048 000048 0035000040 00004D 5C5C5C5C5C5C5C5C 00007D D5C9C540D2C1D5D5 0000A1 C4D6C3C840C7C5D9 0000C2 C1E4C640C6D9C1C7
000000 000000 000000 000000
000000 0000E8 00000000 0000EC C5C9D540D4C5D5E2

STMNT 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 42 45 46 47 50 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

M SOURCE STATEMENT

TITLE 'PSEUDOREGISTER BEISPIEL 2/ 1. TEIL'

*

* - IN DIESEM BEISPIEL WIRD DER PSEUDOREGISTERVEKTOR ZUR PROGRAMM-

* LAUFZEIT DURCH ANFORDERUNG VON SPEICHERSEITEN FESTGELEGT. DER

* PROGRAMMIERER MUSS SICH NICHT UM DAS ERMITTELN DER LAENGE DES

* PSEUDOREGISTERVEKTORS KUEMMERN, DA DIESE VOM BINDER IN DAS FELD

* 'PRVLEN' (SIEHE INITIALISIERUNGSROUTINE) EINGETRAGEN WIRD. DIE

* AUSWERTUN GERFOLGT ZUR PROGRAMMLAUFZEIT.

* - DIE ADRESSIERUNG DER EINZELNEN PSEUDOREGISTER WIRD UEBER EIN

* 'PSEUDOREGISTERVEKTOR-BASISREGISTER' BEWERKSTELLIGT.

*

PRINT NOGEN

PSEUDO1 START

EXTRN PRVINIT

BALR 10,0

USING *,10

USING *PRV,8

FESTLEGEN DES BASISREGISTERS FUR

*

ZUGRIFFE AUF DEN PSREG.VEKTOR

L

14,=A(PRVINIT)

BALR 12,14

LR 8,1

R8 <- A(1.BEREITGESTELLTE SEITE)

*

MVC PSREG1,=C'EIN MENSCH WIRD MUEDE SEINER FRAGEN:'

MVC PSREG2,TEXT2

UEBERTRAGEN VON DATEN

MVC PSREG3,TEXT3

AUF DIE

MVC PSREG4,TEXT4

PSEUDOREGISTER

WROUT NACHR,FEHLER

2

*,@DCEO

952 900503 53531004

00066200

1

*,WROUT

004 890217 53121058

*

FEHLER TERM

2

*,VERSION 010

00001300

*

NACHR DS 0F

DC X'0035000040'

DC C'*************PROGRAMMENDE BEISPIEL 2************'

TEXT2 DC C'NIE KANN DIE WELT IHM ANTWORT SAGEN.'

TEXT3 DC C'DOCH GERN GIBT AUSKUNFT ALLE WELT'

TEXT4 DC C'AUF FRAGEN, DIE ER NIE GESTELLT. '

*

PSREG1 DXD CL36

PSREG2 DXD 9F

PSREG3 DXD XL33

PSREG4 DXD 4D

*

END PSEUDO1

=A(PRVINIT)

=C'EIN MENSCH WIRD MUEDE SEINER FRAGEN:'

FLAGS IN 00000 STATEMENTS, 000 PRIVILEGED FLAGS, 000 MNOTES

HIGHEST ERROR-WEIGHT : NO ERRORS

THIS PROGRAM WAS ASSEMBLED BY ASSEMBH

V 1.2A00

ON 1994-03-08 AT 14:07:24

U5223-J-Z125-3

423

Pseudoregister, Beispiele

PSEUDOREGISTER BEISPIEL 2/ INITIALISIERUNG

14:28:40 1994-03-08 PAGE 0003

LOCTN OBJECT CODE ADDR1 ADDR2

000000 000000 05 B0 000002
000002 17 22 000004 58 30 B036 000008 5D 20 B03E 00000C 5A 30 B042
000010
00001E 12 FF 000020 07 8C
000022

00000002
00000038 00000040 00000044

000038 000038 00000000
000000 000040 00001000 000044 00000001

STMNT 1 2 3 4 5 6 7 8 9
10 11 12 13 14 17 24 25 26 27 30 42 43 44 45 46 47 48

M SOURCE STATEMENT

*

TITLE 'PSEUDOREGISTER BEISPIEL 2/ INITIALISIERUNG'

PRINT NOGEN

*

PRVINIT START

BALR 11,0

USING *,11

*

XR 2,2

ERMITTELN D. ENTSPR. DER LAENGE

L

3,PRVLEN

DES PSREG.VEKTORS NOTWENDIGEN

D

2,=F'4096'

ANZAHL 4K-SEITEN UND

A

3,=F'1'

*

REQM (3)

BEREITSTELLEN DERSELBEN

2

*,VERSION 500

00001300

LTR 15,15

BRZ 12

*

TERM DUMP=Y

2

*,VERSION 010

00001300

*

DS 0F

PRVLEN CXD

HIER HINTERLEGT BINDER DIE LAENGE

*

DES PSREG.VEKTORS

END PRVINIT

=F'4096'

=F'1'

FLAGS IN 00000 STATEMENTS, 000 PRIVILEGED FLAGS, 000 MNOTES

HIGHEST ERROR-WEIGHT : NOTE

THIS PROGRAM WAS ASSEMBLED BY ASSEMBH

V 1.2A00

ON 1994-03-08 AT 14:07:24

424

U5223-J-Z125-3

Parameterübergabe, Beispiel

11.5 Parameterübergabe bei der strukturierten Programmierung, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0003

LOCTN OBJECT CODE ADDR1 ADDR2

000000

000030 48 B0 A13E 000034 4C B0 A140 000038 40 B0 A142 00003C 1A BB 00003E 1A BB 000040
000050 41 60 A144 000054 41 70 A146
000058 41 80 0001
00005C 000064 40 80 A144 000068 41 90 0001
00006C 000074 40 90 A146

00000140 00000142 00000144
00000146 00000148
00000146
00000148

STMNT 1 2 3 4 5 5
89 110 111 112 113 114 115 116 127 128 129 130 131 132 136 140 141 142 146 150 151 152

M SOURCE STATEMENT

DEMOPARA START

PRINT NOGEN

* MATRIXBEARBEITUNG EINER ZEILENWEISE

* GESPEICHERTEN MATRIX VON WORTEN

DEMOPARA @ENTR TYP=M,MAXPRM=2,

*

FUNCT='DEMO MOEGLICHKEITEN PARAMETERUEBERGABE/NAHME'

3

*,VERSION 010

00001300

* DIMENSION MATRIX ERRECHNEN UND SPEICHER ANFORDERN

LH R11,ANZZEIL

MH R11,ANZSPAL

STH R11,DIMMATR

AR R11,R11

AR R11,R11

@DATA CLASS=A,BASE=R11,LENGTH=(R11)

*

LA ARZEILE,HZEILE

LA ARSPALTE,HSPALTE

* MATRIX ELEMENTWEISE ABARBEITEN

LA RZEILE,1

@THRU (RZEILE),ANZZEIL

@DO

STH RZEILE,HZEILE

LA RSPALTE,1

@THRU (RSPALTE),ANZSPAL

@DO

STH RSPALTE,HSPALTE

PRINT GEN

EJECT

U5223-J-Z125-3

425

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0004

LOCTN OBJECT CODE ADDR1 ADDR2

000078 18 16 00007A 18 27 00007C 58 F0 A15A
000080 05 EF

0000015C

000082 41 10 A144 000086 41 20 A146 00008A 58 F0 A15E
00008E 05 EF

00000146 00000148 00000160

000090 41 10 A144 000094 41 20 A146 000098 58 F0 A162
00009C 05 EF

00000146 00000148 00000164

00009E 18 18 0000A0 18 29 0000A2 58 F0 A166
0000A6 05 EF

00000168

STMNT 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

M SOURCE STATEMENT

* DYNAMISCHE PARAMETERUEBERGABE (OPTIMAL)

*

* UEBERGABE ADRESSE VON ZEILEN- UND SPALTENNUMMER ALS REGISTERINHALT

* REGISTER VERWEISEN AUF PARAMETERWERTE

@PASS NAME=DO1,PASS=OPT,PLIST=((ARZEILE),(ARSPALTE))

1

@@OUV ,,O,U,V,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

2

@@SYN K,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

1

@@PPP P,R@STACK,96,2,OPT,((ARZEILE),(ARSPALTE))

2

LR R1,ARZEILE

2

LR R2,ARSPALTE

1

L

R@PASS,=A(DO1)

1

##BALR R@EXIT,R@PASS

2

BALR R@EXIT,R@PASS

* UEBERGABE ADRESSE VON ZEILEN- UND SPALTENNUMMER ALS REGISTERINHALT

* REGISTER VERWEISEN AUF PARAMETERWERTE

@PASS NAME=DO2,PASS=OPT,PLIST=(HZEILE,HSPALTE)

1

@@OUV ,,O,U,V,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

2

@@SYN K,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

1

@@PPP P,R@STACK,96,2,OPT,(HZEILE,HSPALTE)

2

LA R1,HZEILE

2

LA R2,HSPALTE

1

L

R@PASS,=A(DO2)

1

##BALR R@EXIT,R@PASS

2

BALR R@EXIT,R@PASS

* UEBERGABE ADRESSE VON ZEILEN- UND SPALTENNUMMER ALS REGISTERINHALT

* REGISTER VERWEISEN AUF PARAMETERWERTE

@PASS NAME=DO3,PASS=OPT,PLIST=(HZEILE,HSPALTE)

1

@@OUV ,,O,U,V,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

2

@@SYN K,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

1

@@PPP P,R@STACK,96,2,OPT,(HZEILE,HSPALTE)

2

LA R1,HZEILE

2

LA R2,HSPALTE

1

L

R@PASS,=A(DO3)

1

##BALR R@EXIT,R@PASS

2

BALR R@EXIT,R@PASS

* UEBERGABE ZEILEN- UND SPALTENNUMMER ALS REGISTERINHALT

* REGISTER ENTHALTEN PARAMETERWERTE

@PASS NAME=DO4,PASS=OPT,PLIST=((RZEILE),(RSPALTE))

1

@@OUV ,,O,U,V,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

2

@@SYN K,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

1

@@PPP P,R@STACK,96,2,OPT,((RZEILE),(RSPALTE))

2

LR R1,RZEILE

2

LR R2,RSPALTE

1

L

R@PASS,=A(DO4)

1

##BALR R@EXIT,R@PASS

2

BALR R@EXIT,R@PASS

EJECT

426

U5223-J-Z125-3

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0005

LOCTN OBJECT CODE ADDR1 ADDR2

0000A8 50 60 D060 0000AC 50 70 D064 0000B0 41 10 D060 0000B4 96 80 D064 0000B8 58 F0 A16A
0000BC 05 EF

0000016C

0000BE 41 E0 A144 0000C2 50 E0 D060 0000C6 41 E0 A146 0000CA 50 E0 D064 0000CE 41 10 D060 0000D2 96 80 D064 0000D6 58 F0 A16E
0000DA 05 EF

00000146 00000148
00000170

0000DC 41 E0 A144 0000E0 50 E0 D060 0000E4 41 E0 A146 0000E8 50 E0 D064 0000EC 41 10 D060 0000F0 96 80 D064 0000F4 58 F0 A172
0000F8 05 EF

00000146 00000148
00000174

STMNT 200
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248

M SOURCE STATEMENT

* DYNAMISCHE PARAMETERUEBERGABE (STANDARD)

*

* UEBERGABE ADRESSE DYNAMISCHE PARAMETERADRESSENLISTE

* REGISTER 1 VERWEIST AUF PARAMETERADRESSENLISTE

* LISTEINTRAEGE VERWEISEN AUF PARAMETERWERTE

@PASS NAME=DS1,PASS=STA,PLIST=((ARZEILE),(ARSPALTE))

1

@@OUV ,,O,U,V,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

2

@@SYN K,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

1

@@PPP P,R@STACK,96,2,STA,((ARZEILE),(ARSPALTE))

2

ST ARZEILE,96(0,R@STACK)

2

ST ARSPALTE,100(0,R@STACK)

2

LA R@PAR,96(0,R@STACK)

2

OI 100(R@STACK),X'80'

1

L

R@PASS,=A(DS1)

1

##BALR R@EXIT,R@PASS

2

BALR R@EXIT,R@PASS

* UEBERGABE ADRESSE DYNAMISCHE PARAMETERADRESSENLISTE

* REGISTER 1 VERWEIST AUF PARAMETERADRESSENLISTE

* LISTEINTRAEGE VERWEISEN AUF PARAMETERWERTE

@PASS NAME=DS2,PASS=STA,PLIST=(HZEILE,HSPALTE)

1

@@OUV ,,O,U,V,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

2

@@SYN K,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

1

@@PPP P,R@STACK,96,2,STA,(HZEILE,HSPALTE)

2

LA R@EXIT,HZEILE

2

ST R@EXIT,96(0,R@STACK)

2

LA R@EXIT,HSPALTE

2

ST R@EXIT,100(0,R@STACK)

2

LA R@PAR,96(0,R@STACK)

2

OI 100(R@STACK),X'80'

1

L

R@PASS,=A(DS2)

1

##BALR R@EXIT,R@PASS

2

BALR R@EXIT,R@PASS

* UEBERGABE ADRESSE DYNAMISCHE PARAMETERADRESSENLISTE

* REGISTER 1 VERWEIST AUF PARAMETERADRESSENLISTE

* LISTEINTRAEGE VERWEISEN AUF PARAMETERWERTE

@PASS NAME=DS3,PASS=STA,PLIST=(HZEILE,HSPALTE)

1

@@OUV ,,O,U,V,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

2

@@SYN K,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

1

@@PPP P,R@STACK,96,2,STA,(HZEILE,HSPALTE)

2

LA R@EXIT,HZEILE

2

ST R@EXIT,96(0,R@STACK)

2

LA R@EXIT,HSPALTE

2

ST R@EXIT,100(0,R@STACK)

2

LA R@PAR,96(0,R@STACK)

2

OI 100(R@STACK),X'80'

1

L

R@PASS,=A(DS3)

1

##BALR R@EXIT,R@PASS

2

BALR R@EXIT,R@PASS

EJECT

U5223-J-Z125-3

427

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0006

LOCTN OBJECT CODE ADDR1 ADDR2

0000FA 41 10 A12E 0000FE 58 F0 A176
000102 05 EF

00000130 00000178

000104 41 10 A12E 000108 58 F0 A17A
00010C 05 EF

00000130 0000017C

00010E 41 10 A12E 000112 58 F0 A17E
000116 05 EF
000118 000120 000128

00000130 00000180

000130 000130 00000146 000134 80000148

STMNT 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 289 296 303 304 305 306 307 308 309 310

M SOURCE STATEMENT

* STATISCHE PARAMETERUEBERGABE

*

* UEBERGABE ADRESSE STATISCHE PARAMETERADRESSENLISTE

* REGISTER 1 VERWEIST AUF PARAMETERADRESSENLISTE

* LISTEINTRAEGE VERWEISEN AUF PARAMETERWERTE

@PASS NAME=S1,PAR=STAPLIS

1

@@OUV ,,O,U,V,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

2

@@SYN K,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

1

LA R@PAR,STAPLIS

1

L

R@PASS,=A(S1)

1

##BALR R@EXIT,R@PASS

2

BALR R@EXIT,R@PASS

* UEBERGABE ADRESSE STATISCHE PARAMETERADRESSENLISTE

* REGISTER 1 VERWEIST AUF PARAMETERADRESSENLISTE

* LISTEINTRAEGE VERWEISEN AUF PARAMETERWERTE

@PASS NAME=S2,PAR=STAPLIS

1

@@OUV ,,O,U,V,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

2

@@SYN K,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

1

LA R@PAR,STAPLIS

1

L

R@PASS,=A(S2)

1

##BALR R@EXIT,R@PASS

2

BALR R@EXIT,R@PASS

* UEBERGABE ADRESSE STATISCHE PARAMETERADRESSENLISTE

* REGISTER 1 VERWEIST AUF PARAMETERADRESSENLISTE

* LISTEINTRAEGE VERWEISEN AUF PARAMETERWERTE

@PASS NAME=S3,PAR=STAPLIS

1

@@OUV ,,O,U,V,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

2

@@SYN K,@PASS,(@,T,E,D,K,G,Y,A,X,Z,B)

1

LA R@PAR,STAPLIS

1

L

R@PASS,=A(S3)

1

##BALR R@EXIT,R@PASS

2

BALR R@EXIT,R@PASS

PRINT NOGEN

@BEND

@BEND

@EXIT

PRINT GEN

* STATISCHE PARAMETERADRESSENLISTE

STAPLIS @PAR PLIST=(ZNA,SNA),VLIST=(HZEILE,HSPALTE)

1

@@SYN ,@PAR,,LE,1

1 STAPLIS DS 0F

1 ZNA

DC A(HZEILE)

1 SNA

DC A(HSPALTE+X'80000000')

EJECT

428

U5223-J-Z125-3

ASSEMBH LISTING

LOCTN OBJECT CODE
000138 00000146 00013C 00000148 000140 000142 000144 000146 000148
000150

ADDR1 ADDR2 00000138
00000006 00000007 00000008 00000009 00000009 00000008 00000007

STMNT M SOURCE STATEMENT

311

PRINT NOGEN

312

VAR

EQU *

313

ADRZEIL DC A(HZEILE)

314

ADRSPAL DC A(HSPALTE)

315

ANZZEIL DS H

316

ANZSPAL DS H

317

DIMMATR DS H

318

HZEILE DS H

319

HSPALTE DS H

320

ARZEILE EQU R6

321

ARSPALTE EQU R7

322

RZEILE EQU R8

323

RSPALTE EQU R9

324

@END

343

Z

EQU R9

344

S

EQU R8

345

P

EQU R7

346

PRINT GEN

347

*

348

* PARAMETERUEBERNAHME

349

EJECT

Parameterübergabe, Beispiel
14:29:44 1994-03-08 PAGE 0007

U5223-J-Z125-3

429

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0008

LOCTN OBJECT CODE ADDR1 ADDR2

000188 000188 000188 90 EC D00C 00018C 18 AF 00018E

00000000 0000000C
00000188

00018E 58 F0 A038 000192

000001C0

000192 05 EF 000194 00000060 000198 C4D6F14040404040

0001A0

0001A4 48 70 1000 0001A8 06 70 0001AA 4C 70 C00A 0001AE 4A 70 2000 0001B2 06 70 0001B4 1A 77 0001B6 1A 77

00000142

0001B8 0001C0

STMNT 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 371 372 373 374 375 376 377 378 379 380 388 396 397

M SOURCE STATEMENT

* UEBERNAHME PARAMETERADRESSEN IN REGISTERN R1,R2

DO1

@ENTR TYP=I,TITLE=NO

1

@@SYN ,@ENTR,,EQ,0

1 DO1

DS 0D

1

USING @SAV,R@STACK

1

STM R14,R12,@SAVR14

1

LR R@BASE,R@PASS

1

USING DO1,R@BASE

1

@PASS EXTNAME=$NUCENTR,CNOP=(0,4),DC=(A(96),CL8'DO1')

2

L

R@PASS,=V($NUCENTR)

2

CNOP 2,4

2

##BALR R@EXIT,R@PASS

3

BALR R@EXIT,R@PASS

2

DC A(96)

2

DC CL8'DO1'

PRINT NOGEN

@DATA CLASS=S,BASE=R12,INIT=VAR

* ERRECHNEN MATRIXPOSITION

LH P,0(0,R1)

WERT ERSTER PARAMETER

BCTR P,0

MH P,ANZSPAL

AH P,0(0,R2)

WERT ZWEITER PARAMETER

BCTR P,0

AR P,P

AR P,P

* FUNKTION AUSFUEHREN

@EXIT

@END

PRINT GEN

EJECT

430

U5223-J-Z125-3

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0009

LOCTN OBJECT CODE ADDR1 ADDR2

0001D0 0001D0 0001D0 90 EC D00C 0001D4 18 AF 0001D6

00000000 0000000C
000001D0

0001D6 58 F0 A048 0001DA

00000218

0001DA 05 EF 0001DC 00000068 0001E0 C4D6F24040404040

0001E8

00000000

0001E8 50 10 D064 0001EC 50 20 D060

00000064 00000060

0001F0

0001F4 58 20 D064 0001F8 48 70 2000 0001FC 06 70 0001FE 4C 70 C00A 000202 58 20 D060 000206 4A 70 2000 00020A 06 70 00020C 1A 77 00020E 1A 77

00000064
00000142 00000060

000210 000218

000000 000000 000060 000064
000228

00000060 00000068

STMNT 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 424 425 426 427 428 429 430 431 432 433 434 435 443 451 452 453 454 455 456 457 458 459 460

M SOURCE STATEMENT

* UEBERNAHME PARAMETERADRESSEN AUS REGISTERN IN ADRESSLISTE

DO2

@ENTR TYP=I,TITLE=NO,LOCAL=PARLI1,PASS=OPT,PLIST=(ADRZN,ADRSN)

1

@@SYN ,@ENTR,,EQ,0

1 DO2

DS 0D

1

USING @SAV,R@STACK

1

STM R14,R12,@SAVR14

1

LR R@BASE,R@PASS

1

USING DO2,R@BASE

1

@PASS EXTNAME=$NUCENTR,CNOP=(0,4),DC=(A(LPARLI1),CL8'DO2')

2

L

R@PASS,=V($NUCENTR)

2

CNOP 2,4

2

##BALR R@EXIT,R@PASS

3

BALR R@EXIT,R@PASS

2

DC A(LPARLI1)

2

DC CL8'DO2'

1

@DATA BASE=R@STACK,DSECT=PARLI1

2

USING PARLI1,R@STACK

1

@@PPP E,R@PAR,0,0,OPT,(ADRZN,ADRSN)

2

ST R1,ADRZN

2

ST R2,ADRSN

PRINT NOGEN

@DATA CLASS=S,BASE=R12,INIT=VAR

* ERRECHNEN MATRIXPOSITION

L

R2,ADRZN ADRESSE ERSTER PARAMETER

LH P,0(0,R2)

WERT ERSTER PARAMETER

BCTR P,0

MH P,ANZSPAL

L

R2,ADRSN ADRESSE ZWEITER PARAMETER

AH P,0(0,R2)

WERT ZWEITER PARAMETER

BCTR P,0

AR P,P

AR P,P

* FUNKTION AUSFUEHREN

@EXIT

@END

PRINT GEN

PARLI1 @PAR D=YES,LEND=YES,PLIST=(ADRSN,ADRZN)

1

@@SYN ,@PAR,,LE,1

1 PARLI1 DSECT

1

ORG *+96

1 ADRSN DS A

1 ADRZN DS A

1 LPARLI1 EQU *-PARLI1

1 DEMOPARA CSECT

EJECT

U5223-J-Z125-3

431

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0010

LOCTN OBJECT CODE ADDR1 ADDR2

000228 000228 000228 90 EC D00C 00022C 18 AF 00022E

00000000 0000000C
00000228

00022E 58 F0 A040 000232

00000268

000232 05 EF 000234 00000060 000238 C4D6F34040404040

000240 18 91 000242 18 82

000244

000248 48 70 9000 00024C 06 70 00024E 4C 70 C00A 000252 4A 70 8000 000256 06 70 000258 1A 77 00025A 1A 77

00000142

00025C 000268

STMNT 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 485 486 487 488 489 490 491 492 493 494 502 510 511

M SOURCE STATEMENT

* UEBERNAHME PARAMETERADRESSEN AUS REGISTERN IN REGISTER

DO3

@ENTR TYP=I,TITLE=NO,PASS=OPT,PLIST=((Z),(S))

1

@@SYN ,@ENTR,,EQ,0

1 DO3

DS 0D

1

USING @SAV,R@STACK

1

STM R14,R12,@SAVR14

1

LR R@BASE,R@PASS

1

USING DO3,R@BASE

1

@PASS EXTNAME=$NUCENTR,CNOP=(0,4),DC=(A(96),CL8'DO3')

2

L

R@PASS,=V($NUCENTR)

2

CNOP 2,4

2

##BALR R@EXIT,R@PASS

3

BALR R@EXIT,R@PASS

2

DC A(96)

2

DC CL8'DO3'

1

@@PPP E,R@PAR,0,0,OPT,((Z),(S))

2

LR Z,R1

2

LR S,R2

PRINT NOGEN

@DATA CLASS=S,BASE=R12,INIT=VAR

* ERRECHNEN MATRIXPOSITION

LH P,0(0,Z)

WERT ERSTER PARAMETER

BCTR P,0

MH P,ANZSPAL

AH P,0(0,S)

WERT ZWEITER PARAMETER

BCTR P,0

AR P,P

AR P,P

* FUNKTION AUSFUEHREN

@EXIT

@END

PRINT GEN

EJECT

432

U5223-J-Z125-3

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0011

LOCTN OBJECT CODE ADDR1 ADDR2

000278 000278 000278 90 EC D00C 00027C 18 AF 00027E

00000000 0000000C
00000278

00027E 58 F0 A038 000282

000002B0

000282 05 EF 000284 00000060 000288 C4D6F44040404040

000290 18 91 000292 18 82

000294

000298 18 79 00029A 06 70 00029C 4C 70 C00A 0002A0 1A 78 0002A2 06 70 0002A4 1A 77 0002A6 1A 77

00000142

0002A8 0002B0

STMNT 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 536 537 538 539 540 541 542 543 544 545 553 561 562

M SOURCE STATEMENT

* UEBERNAHME PARAMETERWERTE AUS REGISTERN IN REGISTER

DO4

@ENTR TYP=I,TITLE=NO,PASS=OPT,PLIST=((Z),(S))

1

@@SYN ,@ENTR,,EQ,0

1 DO4

DS 0D

1

USING @SAV,R@STACK

1

STM R14,R12,@SAVR14

1

LR R@BASE,R@PASS

1

USING DO4,R@BASE

1

@PASS EXTNAME=$NUCENTR,CNOP=(0,4),DC=(A(96),CL8'DO4')

2

L

R@PASS,=V($NUCENTR)

2

CNOP 2,4

2

##BALR R@EXIT,R@PASS

3

BALR R@EXIT,R@PASS

2

DC A(96)

2

DC CL8'DO4'

1

@@PPP E,R@PAR,0,0,OPT,((Z),(S))

2

LR Z,R1

2

LR S,R2

PRINT NOGEN

@DATA CLASS=S,BASE=R12,INIT=VAR

* ERRECHNEN MATRIXPOSITION

LR P,Z

WERT ERSTER PARAMETER

BCTR P,0

MH P,ANZSPAL

AR P,S

WERT ZWEITER PARAMETER

BCTR P,0

AR P,P

AR P,P

* FUNKTION AUSFUEHREN

@EXIT

@END

PRINT GEN

EJECT

U5223-J-Z125-3

433

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0012

LOCTN OBJECT CODE ADDR1 ADDR2

0002C0 0002C0 0002C0 90 EC D00C 0002C4 18 AF 0002C6

00000000 0000000C
000002C0

0002C6 58 F0 A040 0002CA

00000300

0002CA 05 EF 0002CC 00000060 0002D0 C4E2F14040404040

0002D8

0002DC 58 20 1000 0002E0 48 70 2000 0002E4 06 70 0002E6 4C 70 C00A 0002EA 58 20 1004 0002EE 4A 70 2000 0002F2 06 70 0002F4 1A 77 0002F6 1A 77

00000142

0002F8 000300

STMNT 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 584 585 586 587 588 589 590 591 592 593 594 595 603 611 612

M SOURCE STATEMENT

* UEBERNAHME ADRESSLISTE VON PARAMETERN ADRESSIERT DURCH R1

DS1

@ENTR TYP=I,TITLE=NO

1

@@SYN ,@ENTR,,EQ,0

1 DS1

DS 0D

1

USING @SAV,R@STACK

1

STM R14,R12,@SAVR14

1

LR R@BASE,R@PASS

1

USING DS1,R@BASE

1

@PASS EXTNAME=$NUCENTR,CNOP=(0,4),DC=(A(96),CL8'DS1')

2

L

R@PASS,=V($NUCENTR)

2

CNOP 2,4

2

##BALR R@EXIT,R@PASS

3

BALR R@EXIT,R@PASS

2

DC A(96)

2

DC CL8'DS1'

PRINT NOGEN

@DATA CLASS=S,BASE=R12,INIT=VAR

* ERRECHNEN MATRIXPOSITION

L

R2,0(0,R1) ADRESSE ERSTER PARAMETER

LH P,0(0,R2)

WERT ERSTER PARAMETER

BCTR P,0

MH P,ANZSPAL

L

R2,4(0,R1) ADRESSE ZWEITER PARAMETER

AH P,0(0,R2)

WERT ZWEITER PARAMETER

BCTR P,0

AR P,P

AR P,P

* FUNKTION AUSFUEHREN

@EXIT

@END

PRINT GEN

EJECT

434

U5223-J-Z125-3

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0013

LOCTN OBJECT CODE ADDR1 ADDR2

000310 000310 000310 90 EC D00C 000314 18 AF 000316

00000000 0000000C
00000310

000316 58 F0 A050 00031A

00000360

00031A 05 EF 00031C 00000068 000320 C4E2F24040404040

000328

00000000

000328 D2 03 D0641000 00000064 00032E D2 03 D0601004 00000060

000334

000338 58 20 D064 00033C 48 70 2000 000340 06 70 000342 4C 70 C00A 000346 58 20 D060 00034A 4A 70 2000 00034E 06 70 000350 1A 77 000352 1A 77

00000064
00000142 00000060

000354 000360

000000 000000 000060 000064
000370

00000060 00000068

STMNT 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 639 640 641 642 643 644 645 646 647 648 649 650 658 666 667 668 669 670 671 672 673 674 675

M SOURCE STATEMENT

* UEBERNAHME ADRESSLISTE VON PARAMETERN IN ADRESSLISTE

DS2

@ENTR TYP=I,TITLE=NO,LOCAL=PARLI2,PASS=STA,PLIST=(ZNADR,SNADR)

1

@@SYN ,@ENTR,,EQ,0

1 DS2

DS 0D

1

USING @SAV,R@STACK

1

STM R14,R12,@SAVR14

1

LR R@BASE,R@PASS

1

USING DS2,R@BASE

1

@PASS EXTNAME=$NUCENTR,CNOP=(0,4),DC=(A(LPARLI2),CL8'DS2')

2

L

R@PASS,=V($NUCENTR)

2

CNOP 2,4

2

##BALR R@EXIT,R@PASS

3

BALR R@EXIT,R@PASS

2

DC A(LPARLI2)

2

DC CL8'DS2'

1

@DATA BASE=R@STACK,DSECT=PARLI2

2

USING PARLI2,R@STACK

1

@@PPP E,R@PAR,0,0,STA,(ZNADR,SNADR)

2

MVC ZNADR(4),0(R@PAR)

2

MVC SNADR(4),4(R@PAR)

PRINT NOGEN

@DATA CLASS=S,BASE=R12,INIT=VAR

* ERRECHNEN MATRIXPOSITION

L

R2,ZNADR ADRESSE ERSTER PARAMETER

LH P,0(0,R2)

WERT ERSTER PARAMETER

BCTR P,0

MH P,ANZSPAL

L

R2,SNADR ADRESSE ZWEITER PARAMETER

AH P,0(0,R2)

WERT ZWEITER PARAMETER

BCTR P,0

AR P,P

AR P,P

* FUNKTION AUSFUEHREN

@EXIT

@END

PRINT GEN

PARLI2 @PAR D=YES,LEND=YES,PLIST=(SNADR,ZNADR)

1

@@SYN ,@PAR,,LE,1

1 PARLI2 DSECT

1

ORG *+96

1 SNADR DS A

1 ZNADR DS A

1 LPARLI2 EQU *-PARLI2

1 DEMOPARA CSECT

EJECT

U5223-J-Z125-3

435

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0014

LOCTN OBJECT CODE ADDR1 ADDR2

000370 000370 000370 90 EC D00C 000374 18 AF 000376

00000000 0000000C
00000370

000376 58 F0 A040 00037A

000003B0

00037A 05 EF 00037C 00000060 000380 C4E2F34040404040

000388 58 20 1000 00038C 58 10 1004

000390

000394 48 70 2000 000398 06 70 00039A 4C 70 C00A 00039E 4A 70 1000 0003A2 06 70 0003A4 1A 77 0003A6 1A 77

00000142

0003A8 0003B0

STMNT 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 700 701 702 703 704 705 706 707 708 709 717 725 726

M SOURCE STATEMENT

* UEBERNAHME ADRESSEN AUS PARAMETERADRESSENLISTE IN REGISTER

DS3

@ENTR TYP=I,TITLE=NO,PASS=STA,PLIST=((R2),(R1))

1

@@SYN ,@ENTR,,EQ,0

1 DS3

DS 0D

1

USING @SAV,R@STACK

1

STM R14,R12,@SAVR14

1

LR R@BASE,R@PASS

1

USING DS3,R@BASE

1

@PASS EXTNAME=$NUCENTR,CNOP=(0,4),DC=(A(96),CL8'DS3')

2

L

R@PASS,=V($NUCENTR)

2

CNOP 2,4

2

##BALR R@EXIT,R@PASS

3

BALR R@EXIT,R@PASS

2

DC A(96)

2

DC CL8'DS3'

1

@@PPP E,R@PAR,0,0,STA,((R2),(R1))

2

L

R2,0(0,R@PAR)

2

L

R1,4(0,R@PAR)

PRINT NOGEN

@DATA CLASS=S,BASE=R12,INIT=VAR

* ERRECHNEN MATRIXPOSITION

LH P,0(0,R2)

WERT ERSTER PARAMETER

BCTR P,0

MH P,ANZSPAL

AH P,0(0,R1)

WERT ZWEITER PARAMETER

BCTR P,0

AR P,P

AR P,P

* FUNKTION AUSFUEHREN

@EXIT

@END

PRINT GEN

EJECT

436

U5223-J-Z125-3

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0015

LOCTN OBJECT CODE ADDR1 ADDR2

0003C0 0003C0 0003C0 90 EC D00C 0003C4 18 AF 0003C6

00000000 0000000C
000003C0

0003C6 58 F0 A040 0003CA

00000400

0003CA 05 EF 0003CC 00000060 0003D0 E2F1404040404040

0003D8

0003DC 58 20 1000 0003E0 48 70 2000 0003E4 06 70 0003E6 4C 70 C00A 0003EA 58 20 1004 0003EE 4A 70 2000 0003F2 06 70 0003F4 1A 77 0003F6 1A 77

00000142

0003F8 000400

STMNT 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 748 749 750 751 752 753 754 755 756 757 758 759 767 775 776

M SOURCE STATEMENT

* UEBERNAHME ADRESSLISTE VON PARAMETERN ADRESSIERT DURCH R1

S1

@ENTR TYP=I,TITLE=NO

1

@@SYN ,@ENTR,,EQ,0

1 S1

DS 0D

1

USING @SAV,R@STACK

1

STM R14,R12,@SAVR14

1

LR R@BASE,R@PASS

1

USING S1,R@BASE

1

@PASS EXTNAME=$NUCENTR,CNOP=(0,4),DC=(A(96),CL8'S1')

2

L

R@PASS,=V($NUCENTR)

2

CNOP 2,4

2

##BALR R@EXIT,R@PASS

3

BALR R@EXIT,R@PASS

2

DC A(96)

2

DC CL8'S1'

PRINT NOGEN

@DATA CLASS=S,BASE=R12,INIT=VAR

* ERRECHNEN MATRIXPOSITION

L

R2,0(0,R1) ADRESSE ERSTER PARAMETER

LH P,0(0,R2)

WERT ERSTER PARAMETER

BCTR P,0

MH P,ANZSPAL

L

R2,4(0,R1) ADRESSE ZWEITER PARAMETER

AH P,0(0,R2)

WERT ZWEITER PARAMETER

BCTR P,0

AR P,P

AR P,P

* FUNKTION AUSFUEHREN

@EXIT

@END

PRINT GEN

EJECT

U5223-J-Z125-3

437

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0016

LOCTN OBJECT CODE ADDR1 ADDR2

000410 000410 000410 90 EC D00C 000414 18 AF 000416

00000000 0000000C
00000410

000416 58 F0 A050 00041A

00000460

00041A 05 EF 00041C 00000068 000420 E2F2404040404040

000428

00000000

000428 D2 03 D0641000 00000064 00042E D2 03 D0601004 00000060

000434

000438 58 20 D064 00043C 48 70 2000 000440 06 70 000442 4C 70 C00A 000446 58 20 D060 00044A 4A 70 2000 00044E 06 70 000450 1A 77 000452 1A 77

00000064
00000142 00000060

000454 000460

000000 000000 000060 000064
000470

00000060 00000068

STMNT 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 803 804 805 806 807 808 809 810 811 812 813 814 822 830 831 832 833 834 835 836 837 838 839

M SOURCE STATEMENT

* UEBERNAHME ADRESSLISTE VON PARAMETERN IN ADRESSLISTE

S2

@ENTR TYP=I,TITLE=NO,LOCAL=PARLI3,PASS=STA,PLIST=(AVZN,AVSN)

1

@@SYN ,@ENTR,,EQ,0

1 S2

DS 0D

1

USING @SAV,R@STACK

1

STM R14,R12,@SAVR14

1

LR R@BASE,R@PASS

1

USING S2,R@BASE

1

@PASS EXTNAME=$NUCENTR,CNOP=(0,4),DC=(A(LPARLI3),CL8'S2')

2

L

R@PASS,=V($NUCENTR)

2

CNOP 2,4

2

##BALR R@EXIT,R@PASS

3

BALR R@EXIT,R@PASS

2

DC A(LPARLI3)

2

DC CL8'S2'

1

@DATA BASE=R@STACK,DSECT=PARLI3

2

USING PARLI3,R@STACK

1

@@PPP E,R@PAR,0,0,STA,(AVZN,AVSN)

2

MVC AVZN(4),0(R@PAR)

2

MVC AVSN(4),4(R@PAR)

PRINT NOGEN

@DATA CLASS=S,BASE=R12,INIT=VAR

* ERRECHNEN MATRIXPOSITION

L

R2,AVZN ADRESSE ERSTER PARAMETER

LH P,0(0,R2)

WERT ERSTER PARAMETER

BCTR P,0

MH P,ANZSPAL

L

R2,AVSN ADRESSE ZWEITER PARAMETER

AH P,0(0,R2)

WERT ZWEITER PARAMETER

BCTR P,0

AR P,P

AR P,P

* FUNKTION AUSFUEHREN

@EXIT

@END

PRINT GEN

PARLI3 @PAR D=YES,LEND=YES,PLIST=(AVSN,AVZN)

1

@@SYN ,@PAR,,LE,1

1 PARLI3 DSECT

1

ORG *+96

1 AVSN

DS A

1 AVZN

DS A

1 LPARLI3 EQU *-PARLI3

1 DEMOPARA CSECT

EJECT

438

U5223-J-Z125-3

Parameterübergabe, Beispiel

ASSEMBH LISTING

14:29:44 1994-03-08 PAGE 0017

LOCTN OBJECT CODE ADDR1 ADDR2

000470 000470 000470 90 EC D00C 000474 18 AF 000476

00000000 0000000C
00000470

000476 58 F0 A040 00047A

000004B0

00047A 05 EF 00047C 00000060 000480 E2F3404040404040

000488 58 20 1000 00048C 58 10 1004

000490

000494 48 70 2000 000498 06 70 00049A 4C 70 C00A 00049E 4A 70 1000 0004A2 06 70 0004A4 1A 77 0004A6 1A 77

00000142

0004A8 0004B0

STMNT 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 864 865 866 867 868 869 870 871 872 873 881 889

M SOURCE STATEMENT

* UEBERNAHME ADRESSEN AUS PARAMETERADRESSENLISTE IN REGISTER

S3

@ENTR TYP=I,TITLE=NO,PASS=STA,PLIST=((R2),(R1))

1

@@SYN ,@ENTR,,EQ,0

1 S3

DS 0D

1

USING @SAV,R@STACK

1

STM R14,R12,@SAVR14

1

LR R@BASE,R@PASS

1

USING S3,R@BASE

1

@PASS EXTNAME=$NUCENTR,CNOP=(0,4),DC=(A(96),CL8'S3')

2

L

R@PASS,=V($NUCENTR)

2

CNOP 2,4

2

##BALR R@EXIT,R@PASS

3

BALR R@EXIT,R@PASS

2

DC A(96)

2

DC CL8'S3'

1

@@PPP E,R@PAR,0,0,STA,((R2),(R1))

2

L

R2,0(0,R@PAR)

2

L

R1,4(0,R@PAR)

PRINT NOGEN

@DATA CLASS=S,BASE=R12,INIT=VAR

* ERRECHNEN MATRIXPOSITION

LH P,0(0,R2)

WERT ERSTER PARAMETER

BCTR P,0

MH P,ANZSPAL

AH P,0(0,R1)

WERT ZWEITER PARAMETER

BCTR P,0

AR P,P

AR P,P

* FUNKTION AUSFUEHREN

@EXIT

@END

END

FLAGS IN 00000 STATEMENTS, 000 PRIVILEGED FLAGS, 000 MNOTES

HIGHEST ERROR-WEIGHT : NO ERRORS

THIS PROGRAM WAS ASSEMBLED BY ASSEMBH

V 1.2A00

ON 1994-03-08 AT 14:07:24

THIS LISTING WAS GENERATED BY THE LISTING GENERATOR V 1.2A00.

U5223-J-Z125-3

439

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

11.6

Unterschiede von ASSEMBH V1.2A und ASSEMB V30.0A
In den folgenden Tabellen sind die Funktionen und Sprachelemente aufgeführt, bei denen sich Unterschiede von ASSEMBH V1.2A und ASSEMB V30.0A ergeben. Nicht aufgeführte Funktionen bleiben gleich.
x Funktion wird unterstützt Funktion wird nicht unterstützt

SDF-Benutzerschnittstelle
/PARAM-Kommando
Prozeßschaltersteuerung bei DUET-Programmierung
Prozeßschaltersteuerung für die MCALL-Option
COMOPT-Schnittstelle *COMOPT ADIAG=
COPYMAC ERRFIL ISD
MCALL MDIAG OUTPUT PROCOM SAVLST
SEQ SOURCE = + SYSPARM UPD
Ausgabe von Objektcode im OM-Format im LLM-Format

ASSEMBH V1.2A
x
-
-
-
x x (nicht ASSEMBH-BC) x x (nicht ASSEMBH-BC) Erstellung von LSD-Information x (nicht ASSEMBH-BC) x max. 255 Zeichen bei Verwendung nicht unterstützter Optionen gibt der ASSEMBH eine Meldung aus
x x

ASSEMB V30.0A x x
x
x x x x Erstellung von ISD-Sätzen x x x x x x x max. 8 Zeichen x
x -

440

U5223-J-Z125-3

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

AID-Schnittstelle Ablage der AID-Konstante im Objektmodul
IDA-Schnittstelle ASSDIAG / ADIAG Kommandos COMOPT, OPEN Expliziter Start CDT-Anweisungen Kommando CONTINUE-CDT Zahl der möglichen MAKRO- und COPY-Bibliotheken ISLU HALSTEAD-Metrik Unterstützung der Groß-/ Kleinschreibung Maximale Zahl der ESID-Nummern Maximale Zahl der Programmabschnitte Vergabe der Statementnummer

ASSEMBH V1.2A

ASSEMB V30.0A

x

-

(nicht ASSEMBH-BC)

x

-

Nach dem ersten Programmabschnitt wird bei der Option TEST-SUPPORT=AID eine 8-Bytes lange Konsistenzkonstante im Objekt abgelegt.

-

x

x

x

(nicht ASSEMBH-BC)

-

x

-

x

x

-

x

-

je 100

insgesamt 5

-
x
231-1 215-1

x x -
2500 512

Alle Statements, außer Makroanweisungen bei der Makrogenerierung und Makrokommentare, erhalten eine Statementnummer, wenn sie fehlerhaft sind oder MTRAC angegeben ist. Eine Fortsetzungszeile erhält die Nummer der Anfangszeile des Statements.

Die Statementnummer wird abhängig von PRINT-Steuerung, Fehlermeldungen und MTRAC-Steuerung vergeben. Jedes gedruckte Statement erhält eine eigene Nummer. In Makrodefinitionen erhält jede Fortsetzungszeile eine eigene Nummer.

U5223-J-Z125-3

441

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

Assemblerbefehle, Assembleranweisungen, Kommentare

ASSEMBH V1.2A

ASSEMB V30.0A

Länge von Namen Externe Namen Unterstrich in Namen

64 Zeichen 8/32 Zeichen x

8 Zeichen 8 Zeichen
-

Namen als Elemente in Ausdrücken

müssen nicht vorher definiert sein (Ausnahme: im Operand der ORGAnweisung)

müssen vor ihrer Verwendung in Anweisungen definiert sein

Arithmetische Ausdrücke

beliebige Schachte- maximal 6 Klammerlung der Klammern stufen

müssen immer in Klammern stehen

Ausdrücke, die nur Ziffern enthalten, können ohne Klammer stehen (Fehler des Assemblers)

Fortsetzungszeilen

beliebig viele

3

Assemblerbefehle EXST LBF LWI POP PUSH STBF STWI ESA-Befehle

-

x

-

x

-

x

-

x

-

x

-

x

-

x

x

-

ISEQ-Anweisung

-

x

die Anweisung wird

wie ein Kommentar

behandelt.

COPY-Anweisung

Schachtelungstiefe Schachtelungstiefe

maximal 255

maximal 5

DC-Anweisung

Wiederholungsfaktor bis 224-1

Wiederholungsfaktor bis 216-1

442

U5223-J-Z125-3

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

EJECT-Anweisung EQU-Anweisung LTORG-Anweisung Fehlende LTORG-Anweisung Fehlerhafte Literale Literalablage im Literalpool und Literal-XREF
MNOTE-Anweisung

ASSEMBH V1.2A

ASSEMB V30.0A

wird vor dem Vorschub protokolliert
bei fehlerhaften Operanden wird eine MNOTE ausgegeben.

wird nicht protokolliert, fehlerhafte Operanden werden ignoriert (Fehler des Assembler).

negative Werte sind möglich

nur positive Werte

beliebige Anzahl im Quellprogramm

maximal 255

der Literalbereich wird nach der ENDAnweisung protokolliert

der Literalbereich wird vor der ENDAnweisung protokolliert

werden nicht in den werden auch in den

Literalbereich auf- Literalbereich auf-

genommen

genommen

Semantisch gleiche, aber syntaktisch verschiedene Literale werden in Literalpool und -XREF je Literaldefinition abgelegt. Beispiel: Die Literale '=A(B)' und '=AL4(B)' werden beide abgelegt. Syntaktisch gleiche Literale werden intern in Literalpool und -XREF nur einmal abgelegt. Durch die unterschiedliche Literalablage sind Abweichungen im Objekt möglich, was unter Umständen zu nicht mehr passenden REPs führen kann.

Semantisch gleiche, aber syntaktisch verschiedene Literale werden in Literalpool und -XREF nur einmal abgelegt.
Für syntaktisch gleiche Literale gilt das zum ASSEMBH geschriebene.

fehlt das Leerzeichen zwischen Operand und Bemerkung, erfolgt eine Meldung

fehlt das Leerzeichen, so wird nach dem Apostroph alles als Bemerkung interpretiert (Fehler des Assembler)

U5223-J-Z125-3

443

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

OPSYN-Anweisung Bearbeitung von Modellanweisungen in Makros
PRINT-Anweisung Operanden BASE
CLOSED/OPEN DECK/NODECK NUM/NONUM NOBF/DBF REF/NOREF xON/xOFF PUNCH-Anweisung REPRO-Anweisung
SPACE-Anweisung
TITLE-Anweisung

ASSEMBH V1.2A
auch innerhalb von Makros für Makroanweisungen, sowie REPROund COPY-Anweisung gilt das OPSYN bei Definition des Makro; für alle übrigen Instruktionen gilt das OPSYN, das direkt davor liegt

ASSEMB V30.0A
nur ausserhalb von Makros für BibliotheksMakros gilt das letzte OPSYN in der Quelle, für Makros in der Quelle gilt das OPSYN vor der Definition.

für jedes Basisregister wird zusätzlich der Kommentar aus der USING-Anweisung ausgegeben
-

es wird nur der adressierbare Bereich ausgegeben
x x x x x x

Werden bei der Modulausgabe im LLMFormat nicht mehr unterstützt

kein LLM-Format

wird vor dem Vor- wird nicht protoschub protokolliert kolliert

bei fehlerhaften Operanden wird eine MNOTE ausgegeben

fehlerhafte Operanden werden ignoriert (Fehler des Assembler)

wird vor dem Vor- wird nach dem Vorschub protokolliert schub protokolliert

der Namenseintrag wird in einen PLAMObjektmodul nicht ausgegben

immer Ausgabe des Namenseintrags in den Objektmodul

444

U5223-J-Z125-3

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

ASSEMBH V1.2A

ASSEMB V30.0A

Register 0

Ausgabe einer Warnung, wenn ein Speicheroperand mit Basis- und Indexregister 0 adressiert wird

Ausgabe einer Warnung, wenn der Assembler für den 2. Operanden einer SS-Instruktion bei fehlendem Basisregister den Wert 0 einsetzt.

XDSEC-Anweisung ohne Operand, bzw. mit fehlerhaftem Operand

es wird R angenommen, falls nicht bereits ein gleichnamiger externer Pseu. definiert ist

Ausgabe einer Warnung

Kommentarzeilen mit .* am Anfang im Assembler-Quellprogramm

werden wie in einer Makrodefinition behandelt und nicht ausgedruckt

sind im AssemblerQuellprogramm nicht erlaubt

U5223-J-Z125-3

445

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

Makrosprachelemente

Makrodefinitionen im Quellprogramm
Umdefinieren von Assemblerinstruktionen (in Makrodefinitionen im Quellprogramm)
Generierte mnemotechnische Operationscodes von Assembleranweisungen

ASSEMBH V1.2A

ASSEMB V30.0A

die Definition muß vor dem 1. Aufruf des Makro durchlaufen werden

die Definition kann an beliebiger Stelle im Quellprogramm stehen

der mnemotechnische Operationscode von Assemblerinstruktionen kann als Makroname verwendet werden; der jeweilige Makro ersetzt die entsprechende Instruktion

umdefinieren von mnemotechnischem Operationscode ist nur über die OPSYN-Anweisung möglich

die Anweisungen ICTL, COPY, MNOTE und REPRO
dürfen nicht generiert werden

die Anweisungen ICTL, START, COM, MNOTE, REPRO und COPY
dürfen nicht generiert werden

conditional assembly Innere Makrodefinitionen

Makrodefinitionen im Quellprogramm werden nur eingelesen, wenn sie durchlaufen werden; Bibliotheksmakros werden nur eingelesen, wenn ihr Aufruf durchlaufen wurde

Makrodefinitionen im Quellprogramm werden immer eingelesen;
Bibliotheksmakros werden immer eingelesen, wenn ihr Aufruf im Quellprogramm steht

Makrodefinitionen dürfen auch innerhalb einer anderen stehen

Makrodefinitionen dürfen nicht innerhalb von anderen stehen

446

U5223-J-Z125-3

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

ASSEMBH V1.2A

ASSEMB V30.0A

Makrodefinitionen mit gleichem Namen im Quellprogramm oder in einer Makrodefinition

Es gilt die zuletzt eingelesene Definition bis zur nächsten.

Es gilt die erste Definition. Weitere werden als Fehler behandelt.

Kommentarzeilen mit .* am Anfang sind auch vor der Musteranweisung möglich

sind nur nach der Musteranweisung möglich

dürfen nicht gene- dürfen generiert

riert werden

werden

Bezugnahmen auf Merkmale

führen auch bei Bezugnahme auf noch nicht definierte Namen zu gültigen Merkmalen

bei noch nicht definierten Namen sind die Merkmale immer undefiniert.

Bezugnahme auf das Definitions-

x

-

merkmal (D')

Bezugnahme auf das Anzahlmerkmal (N')

ergibt bei SET-Parametern die aktuelle Dimension

ist für SET-Parameter nicht erlaubt

Generierte Folgesymbole

werden immer erkannt und bearbeitet

werden nur erkannt, wenn sie in einer GSEQ-Anweisung definiert sind

Folgesymbole im Namenseintrag von generierten Instruktionen

werden nicht proto- werden protokol-

kolliert

liert

Mehrfach definierte Folgesymbole Fehlermeldung

Fehlermeldung nur, wenn MTRAC eingeschaltet ist

Länge von Zeichenwerten und Teilzeichenfolgen

maximal 1020 Zeichen

maximal 255 Zeichen

U5223-J-Z125-3

447

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

ASSEMBH V1.2A

Verkettung von Teilzeichenfolgen

Der Verkettungspunkt vor dem Wieholungsfaktor der 2. Folge kann weggelassen werden.

Schreibweise von Zeichenwerten

Die Schreibweise C'...' ist nicht zulässig

Arithmetischer Makroausdruck

Zeichenwerte sind als Elemente nicht zulässig

ASSEMB V30.0A
Der Verkettungspunkt muß stehen.
C'...' ist zulässig Das C wird ignoriert (Fehler des Assembler)
Zeichenwerte werden konvertiert. Ist nicht möglich, erfolgt keine Meldung und es wird mit 0 weitergerechnet (Fehler des Assembler)

448

U5223-J-Z125-3

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

Makroaufruf und Musteranweisung

Makroaufruf und Musteranweisung
Innere Makroaufrufe
Adreßpegel des Makroaufrufs Generierte Makronamen
Länge der Operanden von Makroaufrufen Ausdrücke in MakroaufrufOperanden

ASSEMBH V1.2A

ASSEMB V30.0A

Stellungs- und Kennwortparameter können in gemischter Reihenfolge angegeben werden

Zuerst müssen alle Stellungsparameter kommen, dann alle Kennwortparameter

Innere Makroaufrufe werden immer aufgelöst, wenn sie durchlaufen werden

Bei Angabe der MCALL-Option werden innere Makroaufrufe nur aufgelöst, wenn sie in einer MCALLAnweisung definiert sind

Der aktuelle Adreß- Der aktuelle Adreß-

pegel wird nicht

pegel wird proto-

protokolliert

kolliert

Generierte Makronamen werden immer erkannt und bearbeitet

Generierte Makronamen werden nur erkannt und aufgelöst, wenn sie in einer MCALLAnweisung definiert sind

maximal 1020 Zeichen

maximal 127 Zeichen

ist der Operand eines Makroaufrufs ein Ausdruck, so hat der entsprechende symb. Parameter die Merkmale einer C-Konstanten

ist der Operand eines Makroaufrufs ein Ausdruck,so hat der symb. Parameter die Merkmale des 1. Namen im Ausdruck.

U5223-J-Z125-3

449

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

Makroanweisungen

ACTR-Anweisung AIF- und AGO-Anweisung
LCLx- und GBLx-Anweisung OPSYN-Anweisung GSEQ-Anweisung MCALL-Anweisung
Protokollierung von sedezimalen selbstdefinierenden Werten

ASSEMBH V1.2A

ASSEMB V30.0A

der ACTR-Zähler ist der ACTR-Zähler ist vorbesetzt mit 4096 vorbesetzt mit 1200

jeweils erweitertes

-

Format möglich

(siehe 7.2),

jeweils alternatives Anweisungsformat möglich

nur normales Format möglich

jeweils alternatives Anweisungsformat möglich

nur normales Format möglich

auch innerhalb einer Makrodefinition möglich

nur außerhalb der Makrodefinition möglich

-

x

-

x

beide Anweisungen

werden mit einer

Warnung versehen,

ansonsten ignoriert

werden dezimal pro- die Original-In-

tokolliert

struktion wird

protokolliert

450

U5223-J-Z125-3

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

Variable Parameter

ASSEMBH V1.2A

ASSEMB V30.0A

Generierte Parameternamen

x

-

Implizite Definition von lokalen

x

-

SET-Parametern

SETA-Parameter

einem SETA-Parameter kann ein SETC-Parameter zugewiesen werden, wenn er einen arithmetischen Wert hat

einem SETA-Parameter kann ein beliebiger Zeichenausdruck zugewiesen werden, der einen arithmetischen Wert hat

SETB-Parameter

einem SETB-Parameter kann ein SETCParameter zugewiesen werden, wenn sein Wert 0 oder 1 ist.

nicht zulässig

Variable Systemparameter &SYSECT
&SYSLIST(n) mit n=0
&SYSPARM &SYSTSEC &SYSVERM/&SYSVERS

wird auch mit Namen von COM und XDSEC belegt ergibt den Namenseintrag des Makroaufrufs maximal 255 Zeichen
x werden rechts abgeschnitten, bzw. rechts mit Unterstrich '_' aufgefüllt

wird nur durch START, CSECT und DSECT belegt nicht erlaubt
maximal 8 Zeichen -
werden rechts abschnitten, bzw. links mit 0 aufgefüllt füllt

Variable Systemparameter im Operationseintrag

der Operationseintrag kann mit variablen Systempar. generiert werden

variable Systempar. sind im Operationseintrag nicht erlaubt

Verkettung von variablen Parametern mit alphanum. Zeichen

bei Verwendung einer Verkettung in Assemblerbefehlen muß der Verkettungspunkt geschrieben werden

bei einer Verkettung in Assemblerbefehlen kann der Verkettungspunkt wegfallen (Fehler des Assembler)

U5223-J-Z125-3

451

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

Strukturierte Programmierung mit ASSEMBH

STACK-Verwaltung
@ENTR-Makro Operanden ENTRY= AMODE= RMODE= STACK=
KL5SP=
ILCS=YES STREQ STREL HPREQ HPREL SLTERM SCTERM EXTMIN ABKR PROCHK ERROR OTHEVT Entry IASSIN (COLBIN)

ASSEMBH V1.2A

ASSEMB V30.0A/ COLUMBUS-ASSEMBLER V2.2F

dynamische STACKVerwaltung; Der logische Aufbau des STACK entspricht der PROSYS-Standard Linkage-Konvention

statische Ablage im Speicher

x

-

x

-

x

-

x

x

Größe des dyna-

Minimalstack, dyna-

misch erweiterbaren misch erweiterbar

Initialstacks:

(keine STACK-Angabe)

Keine Angabe = eine oder statischer,

Seite (4096 Bytes). nicht erweiterbarer

STACK=n bedeutet: Stack von n Bytes

n Bytes Init.stack (STACK=n).

-

x

eine KL5SP-Angabe wird mit MNOTE 0 ignoriert.

x

-

x

-

x

-

x

-

x

-

x

-

x

-

x

-

x

-

x

-

x

-

x

-

ignoriert eine KL5SP-Angabe

unterstützt eine KL5SP-Angabe

452

U5223-J-Z125-3

@CONDI-Makro @CONEN-Makro @EVTLC-Makro @EVTOE-Makro @ININ -Makro @SETJV-Makro @SETPM-Makro @STXDI-Makro @STXEN-Makro @STXIM-Makro
@END-Makro Operand DROP=

Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A

ASSEMBH V1.2A
x x x x x x x x x x

ASSEMB V30.0A/ COLUMBUS-ASSEMBLER V2.2F
-

x

x

zusätzlicher Ope-

randenwert =(),

alle USING-Register

werden freigegeben

U5223-J-Z125-3

453

12 Handbuchergänzungen
Diese Kapitel aktualisiert das vorliegende Handbuch auf den Stand ASSEMBH V1.2D.
12.1 SPACE-Anweisung
SPACE Zeilenvorschub (S.123)
Beschreibung nr modulo 100 gibt die Anzahl der Leerzeilen an, die nach der SPACE-Anweisung im Übersetzungsprotokoll erscheinen sollen. Ist nr modulo 100 größer als die Zahl der auf dieser Seite noch verbleibenden Zeilen, dann bewirkt die SPACE-Anweisung einen Seitenvorschub.
12.2 Variable Systemparameter
Abschnitt 6.3, Zusätzlicher Systemparameter (S.197) &SYSDATE_ISO4 Wert von &SYSDATE_ISO4: jjjj-mm-tt Zählermerkmal ist 10 Das Jahr wird 4-stellig ausgegeben, sonst alles wie bei &SYSDATE.

U5223-J-Z125-3

455

Prozeduren vom Typ S

Handbuchergänzungen

12.3 Prozeduren vom Typ S
Abschnitt 9.3.2.2 (S.288), ergänzen um:
Prozeduren vom Typ S
Prozeduren vom Typ S sind wie die Prozedurtypen B/L/D nicht an die Speicherverwaltung angeschlossen. Es wird kein neuer Sicherstellungsbereich bereitgestellt und es ist keine dynamische Parameterübergabe möglich. Im Gegensatz zu den Typen B/L/D werden aber die Registerstände der rufenden Prozedur in deren Sicherstellungsbereich gesichert.
Mit dem Parameter ENTRY= kann gesteuert werden, ob ein CSECT- oder eine ENTRY-Anweisung generiert wird.
Standardmäßig ist Register 15 als Basisadressregister zugewiesen. Im BASE-Operanden des @ENTR-Makro kann der Anwender ein anderes Register als Basisadressregister zuweisen. Dieses Register muss am Anfang der Prozedur mit dem richtigen Wert geladen werden (z.B. mit dem Assemblerbefehl "LR reg,R15").
Da die Prozeduren auf einer niedrigen Ebene liegen (kein Anschluss an das Laufzeitsystem), muss der Anwender selbst bei Bedarf die Register restaurieren, d.h. die Register werden bei Prozedurbeendigung nicht zurückgeladen.
Aus demselben Grund sollte der Aufruf weiterer Unterprozeduren mit @PASS vermieden werden, da wegen der fehlenden Savearea-Verkettung keine Rückverfolgung mehr möglich ist.

12.4 Prozedurverknüpfung und Parameterübergabe
Abschnitt 9.5, Prozedurverknüpfung und Parameterübergabe (S. 301) Beim Aufruf von Prozeduren der Typen B, L, D und S wird kein Prozedur STACK bereitgestellt.

456

U5223-J-Z125-3

Handbuchergänzungen

Statische Parameterübergabe

12.5 Statische Parameterübergabe
Abschnitt 9.5.1.1, Statische Parameterübergabe (S. 303) Diese Form der Parameterübergabe ist erlaubt in Prozeduren vom Typ M, E, I, L, B und S.

12.6 Folgeprozesse behandeln
Abschnitt 9.6.4, Folgeprozesse behandeln (S. 322), vorletzter Absatz:
Danach ruft der Standard-Contingency-Handler die Benutzer Contingency-Routine nach ILCS-Konventionen auf. Die Benutzer-Contingency-Routine erhält die Informationen über den unterbrochenen Prozess durch R1.
R1 zeigt auf eine Parameterliste mit folgendem Inhalt:
1. Wort: Contingency-Mitteilung; entspricht dem CONMSG-Parameter im Makro @CONEN (S. 335) (siehe dazu im BS2000 Manual 'Makroaufrufe an den Ablaufteil', Kapitel 'Contingency-Prozesse', Abschnitt 'Informationsübergabe an Contingency-Prozesse')
2. Wort: Ereignis-Informationscode; (siehe Manual wie oben, gleicher Abschnitt, Tabelle 'Ereignis-Informationscode')
3. Wort: Pointer auf Post Code; (siehe Manual wie oben, gleicher Abschnitt)

12.7 Unterbrechungsereignisse behandeln
Abschnitt 9.6.5, Unterbrechungsereignisse behandeln (S. 323), 3. Absatz: Von ILCS werden alle im BS2000 definierten STXIT-Ereignisse unterstützt. Die Ereignisse TERM und ABEND werden nur von ILCS intern behandelt jedoch nicht an eine vom Anwender über @STXEN angemeldete Routine weitergeleitet.

U5223-J-Z125-3

457

Vordefinierte Makros für die strukturierte Programmierung

Handbuchergänzungen

12.8 Vordefinierte Makros für die strukturierte Programmierung
Kapitel 10, Vordefinierte Makros für die strukturierte Programmierung
­ @CONEN Contingency-Routine anmelden (S.335), erster Absatz Dieser Makroaufruf ist nur in Prozeduren mit ILCS=YES erlaubt.
Er arbeitet nur dann ordnungsgemäß, wenn die Initialisierung mit ILCS richtig ausgeführt wurde.
­ @CONEN Contingency-Routine anmelden (S.337), letzter Absatz
Returncode in Register 15:
0 Verarbeitung richtig abgeschlossen
1 Register 13 hat einen falschen Wert
2 ILCS ist nicht richtig initialisiert
3 ungültiger Parameterwert bei CONLEV
Alle anderen Returncodes signalisieren interne Fehler.
@ENTR (Typ=M/E/I), Parameter ILCS=YES (S. 354, 362) voller Anschluss an ILCS, erlaubt die Angabe der folgenden Parameter.
@ENTR (Typ=M/E/I), Programmierhinweise (S. 357, 363)
Das Abbruchkennzeichen in der Event-Handler-List wird benötigt, wenn der StandardEvent-Handler die Suche nach Ereignisbehandlungsroutinen abbrechen soll. Innerhalb der Prozedurkette existierende Nicht-ILCS- Prozeduren (für diese wird keine EventHandler-List angelegt) werden von ILCS erkannt und übergangen.
@ENTR (Typ=E/I), Parameter RETURNS=YES (S. 360)
Bei ILCS=YES: Die Register 2 bis 14 werden zurückgeladen.
@ENTR (Typ=B/L), Parameter TYP=B (S. 365)
Gibt an, dass es sich um eine Prozedur handelt, die von einem beliebigen Modul aus aufgerufen werden kann (externe Prozedur) und die nicht an Speicherverwaltung und Registersicherung angeschlossen ist.

458

U5223-J-Z125-3

Handbuchergänzungen

Vordefinierte Makros für die strukturierte Programmierung

@ENTR mit neuem Prozedurtyp S (S. 367.1)

Format 5: Prozeduren vom Typ S

-------------------------------------------------------------------

Name | Operation | Operanden

--------|-----------|----------------------------------------------

[name] | @ENTR

| TYP=S

|

| [,BASE=reg],

|

| [,ENTRY= {ENTRY|CSECT

|

|

[,AMODE={24|31|ANY}

|

|

,RMODE={24|ANY}]}]

-------------------------------------------------------------------

name Name der Prozedur

reg Mehrzweckregister; positiver absoluter Ausdruck, entweder

­ dezimaler selbstdefinierender Wert oder ­ vordefinierter Name eines Registers oder ­ Name, dem ein entsprechender selbstdefinierender Wert zugewiesen wur-
de.

a) Beschreibung

Es handelt sich um eine Prozedur vom Typ S, ohne Anschluss an die Speicherverwaltung des Laufzeitsystems. Im Gegensatz zu den Prozeduren vom Typ B/L/D werden bei diesem Prozedurtyp die Registerstände der rufenden Prozedur gesichert.

BASE=reg Weist der Prozedur ein Register als Basisadressregister zu.

Ohne diese Angabe wird der Prozedur vom Assembler das Register 15 als Basisadressregister zugewiesen.

ENTRY=

gibt an, welche Eingangsinstruktion für die Prozedur generiert werden soll.

Bei Angabe von ENTRY wird generiert:

name1 DS 0D

ENTRY

name1

Bei Angabe von CSECT wird generiert:

name1

CSECT

AMODE=

ordnet der Prozedur einen Adressierungsmodus zu (siehe 4.2, AMODE-Anweisung)

U5223-J-Z125-3

459

Vordefinierte Makros für die strukturierte Programmierung

Handbuchergänzungen

RMODE=

ordnet der Prozedur ein Ladeattribut zu (siehe 4.2, RMODE-Anweisung)

Bei einer unzulässigen Kombination von AMODE und RMODE wird eine MNOTE generiert und für beide Werte AMODE 24 und RMODE 24 eingesetzt.

b) Programmierhinweise

1. Standardmäßig wird der Prozedur das Register 15 (=Einsprungpunkt) als Basisadressregister zugewiesen, falls mit BASE kein anderes Register vereinbart wurde.

2. Die Prozedur darf nicht die erste eines Moduls sein.

3. Der Prozedurtyp ist nur bei ILCS=NO zugelassen.

@ENTR (Typ=M), Parameter ENV=C (S. 354)

Die Einschränkung 'Nur bei ILCS=NO zugelassen' entfällt.

@ENTR (Typ=E/I), Parameter ENV=C (S. 361)

Die Angabe ist nur für Prozeduren vom Typ E zulässig.

@ENTR (Typ=E/I), Parameter ENTRY= (S. 361)

Die Angabe von @ENTR ENTRY= ist sowohl für Prozeduren vom Typ E als auch für Prozeduren vom Typ I zulässig.

Bei Angabe von @ENTR TYP=I zusammen mit den Parametern ENTRY=ENTRY und ENV=SPL... wird ein interner Einsprungpunkt generiert, dem ein Code-Basisregister zugewiesen ist.

@ENTR (Typ=E), Programmierhinweise (S. 363)

1. Das Abbruchkennzeichen ...

2. Mit @ENTR TYP=E und den Parametern ENV=C und ENTRY=ENTRY wird keine neue Prozedur, sondern lediglich ein Secondary Entry in der übergeordneten Prozedur generiert. Diese Definition darf abweichend von Prozeduren ohne Environment-Angabe nicht mit @END abgeschlossen werden.

@EXIT Format 1 (S. 372)

­ Format 1: Rückkehr aus Prozeduren vom Typ M, B, L oder S

In Prozeduren vom Typ B,L oder S wird das Programm mit der Instruktion fortgesetzt, die in der rufenden Prozedur dem @PASS-Makro folgt.

@PASS Programmierhinweise (S. 389)

1. Eine mit EXTNAME=ext_name aufgerufene Prozedur muss mit @ENTR TYP=E/B/S vereinbart sein.

460

U5223-J-Z125-3

Handbuchergänzungen

Pseudoregister, Beispiel

12.9 Pseudoregister, Beispiel
zu Abschnitt 11.4 Pseudoregister, Beispiel In Beispiel 1/Teil 1 ist die Deklaration von PSRVEKT nicht korrekt. Sie muss geändert werden in PSRVEKT DS CL(L'PSREG1 + L'PSREG2 + 20 * L'PSREG3)

12.10 Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A
zu Abschnitt 11.6 Unterschiede ASSEMBH V1.2A/ASSEMB V30.0A Im Listing für DSECT wird kein Objektcode ausgedruckt, auch wenn ein DC oder Befehle in der DSECT stehen.

U5223-J-Z125-3

461

Literatur
[ 1] ASSEMBH Benutzerhandbuch
[ 2] AID (BS2000) Testen von ASSEMBH-Programmen Benutzerhandbuch
[ 3] BS2000 Assemblerbefehle Beschreibung
[ 4] LMS (BS2000) SDF-Format Benutzerhandbuch
[ 5] BS2000/OSD-BC DVS Einführung Benutzerhandbuch
[ 6] BS2000/OSD-BC Makroaufrufe an den Ablaufteil Benutzerhandbuch
[ 7] BS2000 Einführung in die XS-Programmierung (für ASSEMBLER-Programmierer) Benutzerhandbuch
[ 8] BS2000/OSD-BC Bindelader-Starter Benutzerhandbuch
[ 9] C (BS2000) C-Compiler Benutzerhandbuch
U5223-J-Z125-3

Literatur

Stichwörter
&SYSDATE 197 &SYSECT 198 &SYSLIST 200 &SYSMOD 202 &SYSNDX 203 &SYSPARM 206 &SYSTEM 206 &SYSTIME 206 &SYSTSEC 207 &SYSVERM 208 &SYSVERS 208 @-Makros 325 @AND 280, 327 @BEGI 257, 328 @BEND 257, 328 @BREA 268, 272, 329 @CAS2 263, 332 @CASE 260, 330 @CONDI 334 @CONEN 335 @CYCL 268, 270, 272, 338 @DATA 289, 340 @DO 266, 274, 347 @ELSE 258, 348 @END 283, 284, 349 @ENTR 283, 284, 350 @EVTLC 368 @EVTOE 370 @EXIT 283, 284, 372 @FREE 297, 376 @IF 256, 258, 377 @ININ 378 @OF 263, 379 @OFRE 263, 381 @OR 280, 382
U5223-J-Z125-3

Stichwörter

Stichwörter
@PAR 293, 303, 383 @PASS 283, 301, 305, 389 @SETJV 395 @SETPM 396 @STXDI 397 @STXEN 398 @STXIM 401 @THEN 258, 402 @THRU 274, 403 @TOR 280, 405 @WHEN 256, 268, 272, 406 @WHIL 256, 266, 407
A A-Konstante 80 Abbrechen einer Schleife 329 abschneiden von Konstanten 60 absoluter Ausdruck 17 absolutes Element 20 ACTR-Anweisung 222 ACTR-Operand 222 ACTR-Zähler 222 Adreßkonstante 80 Adreßpegel
Ausrichtung mit der CNOP-Anweisung 49 Bezugnahme 25 Maximalwert 25 Adreßpegel im Programmabschnitt 36 Adreßpegel setzen 115 Adreßpegel von Namen 10 Adresse 33 externe 42 nicht-symbolische 33 symbolische 33 Adressierungsmodus 41 Voreinstellung 47 Adressierungsmodus zuordnen 46 ändern des mnemotechnischen Operationscode 112 äußerer Makroaufruf 218 AGO-Anweisung 226 AIF-Anweisung 223 Aktualparameter 303, 305, 307 Alternative (syn) Entscheidung 258 alternative Formatdarstellung 220

U5223-J-Z125-3

alternatives Anweisungsformat 220 AMODE-Anweisung 46 Anfangsanweisung 144, 234 Anfangsspalte 7
Voreinstellung ändern 109 ANOP-Anweisung 229 Anzahlmerkmal, Bezugnahme 183 Anzeige-setzender Assemblerbefehl 276, 280 arithmetische Operatoren 14 arithmetischer Ausdruck 14 arithmetischer Makroausdruck 165
Berechnung 166 arithmetischer Vergleich 167 Assembler-Quellprogramm 5, 35 Assemblerbefehl, Anzeige-setzender 276 Assemblerbefehle 1
Format 411 auffüllen von Konstanten 60 Ausdruck 14
absoluter 17 arithmetischer 14 Berechnung 16 einfacher 14 Elemente 14, 20 Makrosprache 159 relativer 17, 18 Werte 15 ausführbarer Programmabschnitt 36 Ausrichtung CNOP-Anweisung 49 erzwungene 91 Ausrichtung von Konstanten 59 Ausrichtung von Speicherbereichen 90 Auswahlstrukturblock 258 Automatic-Bereich 289, 293, 341 Initialisierung 295
B B-Konstante 70 B-Prozedur 287, 365 BASE-Operand
@ENTR 365 CLASS=A 295, 341 CLASS=B 299, 345
U5223-J-Z125-3

Stichwörter

Stichwörter
CLASS=C 297, 341 CLASS=S 291, 343 Based-Bereich 289, 299, 345 Basisadreßregister Automatic-Bereich 295 Based-Bereich 299 Controlled-Bereich 297 LOCAL-Bereich 293 Prozedur- 285, 287 SAVAREA 293 STACK 293, 301 Static-Bereich 291 Basisadreßregister freigeben 95 Basisadreßregister zuweisen 131 Basisadresse angeben 131 Basisprozedur 287 bedingte EXTRN-Adresse 136 bedingte Verzweigung 223 Bedingung 256 einfache 276 zusammengesetzte 280 Bedingungsmaske 279 Bedingungssymbol 277 benutzereigenes 279 vordefiniertes 277 Befehlssatz BS2000-ESA 411 BS2000-NXS 411 BS2000-XS 411 Bemerkung 30 Bemerkungseintrag 30 Bemerkungszeile 9 benutzereigenes Bedingungssymbol 279 Bezugnahme auf das Anzahlmerkmal 183 Bezugnahme auf das Definitionsmerkmal 185 Bezugnahme auf das Ganzzahligkeitsmerkmal 181 Bezugnahme auf das Längenmerkmal 26 Makrosprache 179 Bezugnahme auf das Skalenfaktormerkmal 180 Bezugnahme auf das Zählermerkmal 182 Bezugnahme auf den Adreßpegel 25 Bezugnahme auf ein Merkmal, Makrosprache 171 Bibliothekselement kopieren 52 binärer selbstdefinierender Wert 23

U5223-J-Z125-3

Binärkonstante 70 Blockkonzept 253, 256
C C-Konstante 68 CASE-Register Fallunterscheidung durch Nummer 260 CLASS=A 295, 341 CLASS=B 299, 345 CLASS=C 297, 341 CLASS=S 291, 343 CNOP-Anweisung 48 Code-Section (syn) ausführbarerProgrammabschnitt 36 COM-Anweisung 38, 50 Contingency-Routine 322 Contingency-Routine abmelden 334 Contingency-Routine anmelden 335 Controlled-Bereich 289, 297, 341
Initialisierung 297 COPY-Anweisung 52 COPY-Element, Schachtelungstiefe 418 COPY-Elemente (syn) Bibliothekselement kopieren 52 CSECT (syn) ausführbarer Programmabschnitt 37 CSECT-Anweisung 37, 54 CXD-Anweisung 39, 56 CYCLE-Schleife (syn) Schleife mit freier Endebedingung 268
D D' Bezugnahme auf das Definitionsmerkmal 185 D-Konstante 74 D-Prozedur 288, 367 Datenbereich 289
Klasse Automatic 289, 293 Klasse Based 290, 299 Klasse Controlled 290, 297 Klasse Static 289, 291 Datenklasse (syn) Datenbereich 289 Datenkonzept 254, 289 Datenmodul 291 externer 291 DC-Anweisung 57 definieren von Konstanten 57 definieren von Makronamen Musteranweisung 144, 209 definieren von Namen 11 definieren von SET-Parametern 230, 232 Definitionsmerkmal, Bezugnahme 185
U5223-J-Z125-3

Stichwörter

Stichwörter
dezimaler selbstdefinierender Wert 22 Dezimalkonstante 78 DROP-Anweisung 34, 95 DS-Anweisung 87
Längenberechnung 91 DSECT (syn) Pseudoabschnitt 37 DSECT-Anweisung 37, 96 Dummy-Section (syn) Pseudoabschnitt 37 DXD-Anweisung 40, 93 dynamische Parameterübergabe 301, 305 dynamisches Prozedurende 283, 284, 372
E E-Konstante 74 E-Prozedur 285, 358 einfache Bedingung 276 einfacher Ausdruck 14 Eingabeformat 109 Eingabesatz 109, 418
Länge 418 Voreinstellung 418 Einsprungstelle 42 Einsprungstelle kennzeichnen 103 Einträge Instruktion 7 Instruktion der Makrosprache 147 XREF-Listing 418 EJECT-Anweisung 100 Element absolutes 20 relatives 20 Elemente von Ausdrücken 14, 20 END-Anweisung 101 Endanweisung, Makrosprache 144, 234 Ende der Übersetzung 101 Endebedingung 268, 272 Endspalte 7 Voreinstellung ändern 109 ENTRY-Adresse 42 ENTRY-Adresse kennzeichnen 103 ENTRY-Anweisung 103 Entscheidung 258, 348, 377, 402 EQU-Anweisung 106 Ereignisbehandlung, ILCS 321, 322

U5223-J-Z125-3

erster Programmabschnitt 36 kennzeichnen 126
ESID-Nummern 419 explizite Längenangabe, EQU-Anweisung 106 Exponentenfaktor 66 externe Adresse 42 externe Adresse kennzeichnen 104 externe Prozedur 284, 285, 287 externer Datenmodul 291 externer Pseudoabschnitt 38
Definition 137 Referenz 137 externer Static-Bereich 291 EXTRN-Adresse 42 bedingte 136 EXTRN-Adresse kennzeichnen 104 EXTRN-Anweisung 104
F F-Konstante 71 Fallunterscheidung durch Nummer 260, 330 Fallunterscheidung durch Vergleich 262, 332, 379, 381 Festpunktkonstante 71 Folgesymbol 149
generiertes Format 158 Namenseintrag 149 Operandeneintrag 158 Standardformat 149 vordefinierte Makros 325 Folgezeile kopieren 120 Formalparameter 303, 305, 307, 313, 315 Fortsetzungsspalte 7, 31 Voreinstellung ändern 109 Fortsetzungszeichen 31 Fortsetzungszeichenspalte 31 Fortsetzungszeile 31 Bemerkungseintrag 30 Kommentar 9 Freigabe von Speicherbereich 297, 376 freigeben von Basisadreßregistern 95
U5223-J-Z125-3

Stichwörter

Stichwörter
G Ganzzahligkeitsmerkmal, Bezugnahme 181 GBLx-Anweisung 230 gemeinsamer Hilfsabschnitt 38
definieren 50 generierter Kennwortoperand 213 generierter Makroname 210, 211 generierter Stellungsoperand 213 generierter variabler Parameter 153 Gleichsetzen 106 Gleitpunktkonstante 74
Charakteristik 74 Mantisse 74 Maschinenformat 74 globalen SET-Parameter definieren 230 globaler SET-Parameter 191 globaler variabler Systemparameter 196 Größe eines Objektmoduls 420 Groß- und Kleinschreibung 7 Großbuchstaben 7 GSEQ-Anweisung 450
H H-Konstante 71 Hauptprozedur 284, 285, 352 Hilfsabschnitt
gemeinsamer 38 gemeinsamer, definieren 50 Hochkomma 5 Hochkomma in C-Konstanten 68 Hochkomma in Makroaufrufen 212 Hochkomma in selbstdefinierenden Zeichenwerten 24 Hochkomma in Zeichenwerten 162
I I' Bezugnahme auf das Ganzzahligkeitsmerkmal 181 I-Prozedur 285, 358 ICTL-Anweisung 109 IDA 440 ILCS bei nachgeladenen Moduln aufrufen 378 ILCS-Schnittstelle 316 implizite Länge
DC-Konstanten 63 DS-Anweisung 89 EQU-Anweisung 106

U5223-J-Z125-3

indizierter SET-Parameter 194 Initialisierung von Automatic Bereichen 295 Initialisierung von Controlled-Bereichen 297 innere Makrodefinition 143, 146 innerer Makroaufruf 218 Instruktion 7
Einträge 7 Makrosprache 147 interne Prozedur 284, 285, 287 interner Static-Bereich 291 ISEQ-Anweisung 442 ISLU 440 iterative Schleife 274, 347, 403
J Ja-Unterblock 259, 402
K K' Bezugnahme auf das Zählermerkmal 182 Kennwortoperand 187, 213 Klammern in arithmetischen Ausdrücken 16 Klammern in Makroaufrufen 212 Kleinbuchstaben 7 Kommas in Makroaufrufen 212 Kommentar 9
Makrosprache 147 Kommentarzeile 9 Komparand 262, 264, 332, 379 Konstante
Ausrichtung 59 Bezugnahme auf den Adreßpegel 61 Exponentenfaktor 66 implizite Länge 63 Längenfaktor 63 Skalenfaktor 64 Speicherplatz 60 Konstante abschneiden 60 Konstante auffüllen 60 Konstante definieren 57 Konstantentyp 58, 67 kopieren Bibliothekselement 52 kopieren Folgezeile 120 kopieren Text 119
U5223-J-Z125-3

Stichwörter

Stichwörter
L L' Bezugnahme auf das Längenmerkmal 26, 179 L-Konstante 74 L-Prozedur 287, 365 Ladeattribut 41
Voreinstellung 122 Ladeattribut zuordnen 121 Länge von Namen 10, 417 Längenfaktor
DC-Anweisung 63 DS-Anweisung 89 DXD-Anweisung 94 Längenmerkmal Bezugnahme 26 Bezugnahme in der Makrosprache 179 Längenmerkmal von Namen 11 Laufanweisung (syn) iterative Schleife 274 Laufvariable 274, 403 Laufzeitsystem 254, 285 Layout der Kontext-Beschreibung definieren 368 Layout der Unterbrechungsmeldung definieren 401 LCLx-Anweisung 232 Literal 27 Format 27 maximale Anzahl 417 Regeln 28 Literalbereich 29 Lage festlegen 110 Literalbereich definieren 110 LLM-Format PUNCH-Anweisung 119 REPRO-Anweisung 120 LOCAL-Bereich 293, 315 LOCAL-Operand 293, 315, 353, 360 logische Operatoren 169 logischer Ausdruck 169 logisches Oder 280, 382, 405 logisches Oder mit Prorität 280 logisches Und 280, 327 lokalen SET-Parameter definieren 232 lokaler Pseudoabschnitt 293, 315, 388 lokaler SET-Parameter 191 implizit vereinbarter 194 lokaler variabler Systemparameter 196

U5223-J-Z125-3

Longjump, ILCS-Schnittstelle 318 Low-level-Prozedur 287 LTORG-Anweisung 110, 349
M M-Prozedur 285, 352 MACRO-Anweisung 234 Macro-trace 239 Macro-trace beenden 241 Makroauflösung Makrogenerierung 142 Makroaufruf 142, 209
äußerer 218 innerer 218 Länge der Operanden 418 Namenseintrag 211 Operandeneintrag 212 Operandenunterliste 215 Operationseintrag 211 Regeln für Operanden 212 Makroausdruck 159 arithmetischer 165 logischer 169 Vergleichsausdruck 167 Makrobibliothek 144 Makrodefinition 142 Aufbau 144 innere 143, 146 maximale Anzahl 418 Schachtelungstiefe 418 Makrodefinition im Quellprogramm 143 Makrogenerierung 142 Makrogenerierung beenden MEXIT-Anweisung 235 Makros, vordefinierte 254, 325 Maschineninstruktion (syn) Assemblerbefehle 1 MAXPRM-Operand 305, 353, 360 MCALL-Anweisung 450 MCALL-Option 440 Mehrfachverzweigung 330, 332 MEND-Anweisung 234 Merkmal, Bezugnahme 171 Merkmale von Programmabschnitten 41 MEXIT-Anweisung 235 mnemotechnischen Operationscode ändern 112 mnemotechnischen Operationscode zuweisen 112
U5223-J-Z125-3

Stichwörter

Stichwörter
mnemotechnischer Operationscode, Assemblerbefehle 411 MNOTE-Anweisung 237 Modellanweisung 144 Modifizierfaktor
DC-Anweisung 58 DS-Anweisung 88 Modulgröße 420 Monitorjobvariable 324 Monitorjobvariable setzen 395 MTRAC-Anweisung 239 Musteranweisung 144, 209 Namenseintrag 211 Operandeneintrag 212 Operationseintrag 211
N N' Bezugnahme auf das Anzahlmerkmal 183 Name 10, 20
absoluter Wert 10 Adreßpegel 10 Länge 10, 417 Längenmerkmal 11 maximale Anzahl 417 Merkmale in der Makrosprache 172 Regeln 10 reservierter 326 Unterstrich 10 unzulässige Angaben 11 vordefinierter 326, 420 Wert 10 zulässige Angaben 11 Name definieren 11 Namenseintrag 10 Makrosprache 149 unzulässige Angaben 11 vordefinierte Makros 325 zulässige Angaben 11 Nassi-Shneiderman-Diagramm 256 Nein-Unterblock 259, 348 Nicht-STXIT-Ereignis signalisieren 370 nicht-symbolische Adresse 33 NTRAC-Anweisung 241 Nulloperation (ANOP) 229 Nulloperation setzen (CNOP) 48

U5223-J-Z125-3

O Objektmodul, Größe 420 Oder, logisches 280, 382, 405 Operandeneintrag 13
Literal 27 Makrosprache 157 vorfdefinierte Makros 325 Operandenunterliste 215 Operationscode, OPSYN-Anweisung 112 Operationseintrag 12 Makrosprache 155 vordefinierte Makros 325 zulässiger 12 Operatoren arithmetische 14 logische 169 Vergleichs- 167 OPSYN-Anweisung 112 OPTIMAL-Schnittstelle, Parameterübergabe 307 ORG-Anweisung 115
P P-Konstante 78 paarweises Auftreten von relativen Elementen 18 PAGE Merkmale von Programmabschnitten 41 PAR-Operand, @PASS 303, 390 Parameter 301 Parameterliste 301, 302, 303, 305, 383
Adresse 309 Parameterübergabe 284, 301
dynamisch 301, 305 ILCS-Schnittstelle 319 OPTIMAL 301, 307 STANDARD 301 STANDARD-Schnittstelle 303 statisch 301, 303 Parameterübernahme 309 Formalparameter 313, 315 STANDARD-Schnittstelle 309 PASS-Operand @ENTR 313, 315, 359 @PASS 305, 307, 393 PASS-operand, @ENTR 311 PLIST-Operand
U5223-J-Z125-3

Stichwörter

Stichwörter
@ENTR 313, 315, 359 @PAR 303, 315, 383, 386 @PASS 305, 307, 393 PRINT-Anweisung 117 PRINT-Parameter 117 PRINT-Parameter sichern 124 PRINT-Parameter zurücksetzen 129 Programm Übersetzungseinheit 35 Programmabschnitt 35, 36 Adreßpegel 36 Adressierungsmodus 41 ausführbarer 36 erster 36 Ladeattribut 41 Literalbereich 29, 36 Merkmale 41 Referenz- 37 Programmabschnitt definieren 54 Programmabschnitt fortsetzen 54 Programmanfang definieren 126 Programmaske 324 Programmaske setzen oder rücksetzen 396 Programmentwurf 254 Programmverknüpfung, symbolische 42 Prozedur 282 Aufruf 282, 389 Basisadreßregister 285, 287 externe 284, 285, 287 Hauptprozedur 285 interne 284, 285, 287 reentrant-fähige 282, 289 Typ B 287, 365 Typ D 288, 367 Typ E 285, 358 Typ I 285, 358 Typ L 287, 365 Typ M 285, 352 Verkettungsinformation 301 Prozedur-STACK 293, 301 Prozeduranfang 283, 350 Prozedurende 284 dynamisches 283, 284, 372 statisches 283, 284, 349 Prozedurerklärung 284, 350

U5223-J-Z125-3

Prozedurkonzept 253, 282 Prozedurkopf 284, 350 Prozedurtyp 285 Prozedurverknüpfung 301
ILCS-Schnittstelle 317 PRVLGD Merkmale von Programmabschnitten 41 Pseudoabschnitt 37
Definition für Parameterübernahme 386 externer 38 externer, Definition 137 externer, Referenz 137 lokaler 293, 315, 388 Pseudoabschnitt definieren 96 Pseudoabschnitt fortsetzen 96 Pseudocode 254 Pseudoprozedur 288 Pseudoregister 39 Adressierung 40 DSECT-Anweisung 97 USING-Anweisung 135 Verwendung 39 Pseudoregister definieren 40, 93 Pseudoregistervektor 39 Länge 56 Speicherplatz reservieren 56 PUBLIC Merkmale von Programmabschnitten 41 PUNCH-Anweisung 119 LLM-Format 119
Q Q-Konstante 40, 86 Quellprogramm 1, 5, 35 Quellprogrammtext 1, 5, 35
R READ Merkmale von Programmabschnitten 41 redefinieren von Speicherbereichen 91 reentrant-fähige Prozedur 282, 289 Referenz-Programmabschnitt 37 Registerkonventionen 420
ILCS-Schnittstelle 317 Registersicherung 282, 285, 301 relative Elemente, paarweises Auftreten 18 relativer Ausdruck 17, 18 relatives Element 20
U5223-J-Z125-3

Stichwörter

Stichwörter
REPRO-Anweisung 120 LLM-Format 120
reservieren von Speicherplatz 87 reservierte Namen 326 RESIDENT Merkmale von Programmabschnitten 41 Residenzmodus (syn) Ladeattribut 41 Rest-Unterblock 262, 381 restaurieren PRINT-Parameter 129 restaurieren USING-Status 129 RMODE-Anweisung 121 Rückkehrwert 284, 373
S S' Bezugnahme auf das Skalenfaktormerkmal 180 S-Konstante 82 SAVAREA 301 Schachtelung von Strukturblöcken 256 Schachtelungstiefe
COPY-Anweisungen 52, 418 Makroaufrufe 218, 418 Makrodefinitionen 143 Schleife 266 abbrechen 329 Ausgang 329 iterative 274, 347, 403 Kopf 338 Unterblock 347 Zählschleife 270 Zählschleife mit freier Endebedingung 272 Schleife mit freier Endebedingung 268, 338, 406 Schleife mit Vorabprüfung 266, 347, 407 Schleifen-Unterblock 266 Schrittweite 274, 403 sedezimaler selbstdefinierener Wert 23 Sedezimalkonstante 69 Seitenüberschrift 128 Seitenvorschub 100 selbstdefinierender Wert 21 binärer 23 dezimaler 22 sedezimaler 23 selbstdefinierender Zeichenwert 24 Selektor 262, 264, 332, 379 Sequenz 257

U5223-J-Z125-3

SET-Parameter 152, 189 globaler 191 indizierter 194 lokaler 191 Standardwerte vordefinierte SET-Parameter 190
SETA-Anweisung 243 SETA-Parameter 189 SETA-Parameter setzen 243 SETB-Anweisung 245 SETB-Parameter 189 SETB-Parameter setzen 245 SETC-Anweisung 247 SETC-Parameter 189 SETC-Parameter setzen 247 setzen Adreßpegel 115 setzen arithmetischen Wert 243 setzen Binärwert 245 setzen Nulloperation 48 setzen Zeichenwert 247 sichern PRINT-Parameter 124 sichern USING-Status 124 Skalenfaktor 64
Festpunktkonstanten 65 Gleitpunktkonstanten 65 Skalenfaktormerkmal, Bezugnahme 180 Source (syn) Quellprogramm 1, 5, 35 Source-Deck-Makro (syn) Makrodefinition im Quellprogramm 143 SPACE-Anweisung 123 Speicheranforderung 340 Speicherbereich, explizite Freigabe 297, 376 Speicherbereich redefinieren 91 Speicherklasse 289, 340 Speicherplatz reservieren 87 Speicherverwaltung 254, 289 Sprachinitialisierung, ILCS 324 Sprungziel definieren 229 STACK, Prozedur- 293, 301 STACK-Anweisung 124 Standard-Contingency-Handler (SCH), ILCS 322 Standard-Event-Handler (SEH), ILCS 321 STANDARD-Schnittstelle Parameterübergabe 303 Parameterübernahme 309 Standard-STXIT-Handler (SSH), ILCS 323
U5223-J-Z125-3

Stichwörter

Stichwörter
START-Anweisung 36, 126 Statementnummer 417 Static-Bereich 289, 291, 343
externer 291 interner 291 statische Parameterübergabe 301, 303 statisches Prozedurende 283, 284, 349 Stellungsoperand 187, 213 Stern-Adresse (syn) Bezugnahme auf den Adreßpegel 25 Steuerfluß 254, 256 Struktogramm 256 Strukturblock 256, 282 Entscheidung 258 Fallunterscheidung durch Nummer 260 Fallunterscheidung durch Vergleich 262 iterative Schleife 274 Schachtelung 256 Schleife mit freier Endebedingung 268 Schleife mit Vorabprüfung 266 Sequenz 257 Zählschleife 270 Zählschleife mit freier Endebedingung 272 Strukturblock-Ende 328 Strukturierte Programmierung 253 Blockkonzept 256 Datenkonzept 289 Einführung 253 ILCS-Schnittstelle 316 Prozedurkonzept 282 Prozedurverknüpfung und Parameterübergabe 301 vordefinierte Makros 325 STXIT-Behandlungsroutine abmelden 397 STXIT-Behandlungsroutine anmelden 398 STXIT-Ereignisse 321, 323 STXIT-Routine 323 Sublist (syn) Operandenunterliste 215 Suboperand Operandenunterliste 215 symbolische Adresse 33 symbolische Programmverknüpfung 42 symbolischer Parameter 152, 187
U5223-J-Z125-3

T T' Bezugnahme auf das Typenmerkmal 174 Teilzeichenfolge 163
Verkettung 164 Text kopieren 119 textuelle Ersetzung 151 TITLE-Anweisung 128 Typenmerkmal, Bezugnahme 174
U Übergabe von Parametern 284, 301 Übernahme von Parametern 309 Übersetzungseinheit 1, 35
Programmabschnitt 35 Übersetzungsende 101 Übersetzungsprotokoll
Inhalt 117 Seitenüberschrift 128 Seitenvorschub 100 Zeilenvorschub 123 Übersetzungsprotokoll ausdrucken 117 überwachen Verzweigungen 239 Überwachung beenden 241 unbedingte Verzweigung 226 Und, logisches 280, 327 Und-Zeichen 5 Und-Zeichen in C-Konstanten 68 Und-Zeichen in Makroaufrufen 212 Und-Zeichen in selbstdefinierenden Zeichenwerten 24 Und-Zeichen in Zeichenwerten 162 UNSTK-Anweisung 129 Unterblock 258 Rest- 262 Rest-Unterblock 381 Schleifen- 266 Unterliste Operandenunterliste 215 Unterstrich 5 Unterstrich in Namen 10 USING-Anweisung 34, 131 USING-Status sichern 124 USING-Status zurücksetzen 129
U5223-J-Z125-3

Stichwörter

Stichwörter
V V-Konstante 42, 84 variabler Parameter 151
Bemerkungseintrag 151 generierter 153 Kommentarzeile 148 Merkmale 173 Namenseintrag 151 Operandeneintrag 157 Operationseintrag 155 Verkettung 154 vordefinierte Makros 325 variabler Systemparameter 152, 196 globaler 196 lokaler 196 Vergleich arithmetischer 167 Zeichen- 167 Vergleichsausdruck 167 Vergleichsbefehl 264 Vergleichsoperatoren 167 Verkettung von variablen Parametern und alphanumerischen Zeichen 154 Verkettung von Zeichenwerten und Teilzeichenfolgen 164 Verkettungsinformation 301 Verknüpfung von Programmen 42 Verknüpfung von Prozeduren 301 Verzweigung 377 bedingte 223 unbedingte 226 Verzweigungen überwachen 239 VLIST-Operand, @PAR 303, 383 vordefinierte Makros 254, 325 vordefinierte Namen 326, 420 vordefinierte SET-Parameter 190 vordefiniertes Bedingungssymbol 277
W Wert, selbstdefinierender 21 Wert von Ausdrücken 15 Wert von Namen 10 WHILE-Schleifen (syn) Schleife mit Vorabprüfung 266 Wiederholungsfaktor
DC-Anweisung 58 DS-Anweisung 88
U5223-J-Z125-3

DXD-Anweisung 93 Zählschleife 270, 272 WXTRN-Anweisung 136
X X-Konstante 69 XDSEC (syn) externer Pseudoabschnitt 38 XDSEC-Anweisung 38, 137 XREF-Listing 418
Y Y-Konstante 80
Z Z-Konstante 78 zählen Verzweigungen 222 Zählermerkmal, Bezugnahme 182 Zählschleife 270, 338 Zählschleife mit freier Endebedingung 272, 338, 406 Zeichenausdruck 161 Zeichenkonstante 68 Zeichenvergleich 167 Zeichenvorrat 5 Zeichenwert 161
selbstdefinierender 24 Verkettung 164 Zeilennummer Statementnummer 417 Zeilenvorschub 123 zurücksetzen PRINT-Parameter 129 zurücksetzen USING-Status 129 zusammengesetzte Bedingung 280 zuweisen Basisadreßregister 131 zuweisen des mnemotechnischen Operationscode 112 zuweisen von Werten 106

Stichwörter

U5223-J-Z125-3

Inhalt

1

Einleitung . . . . . . . . . . . . . . . . . . . . . . . 1

1.1

Kurzbeschreibung des Produkts . . . . . . . . . . . . . . . 1

1.2

Zielgruppe . . . . . . . . . . . . . . . . . . . . . . . 2

1.3

Konzept des Handbuchs . . . . . . . . . . . . . . . . . . 2

1.4

Änderungen gegenüber der vorigen Ausgabe . . . . . . . . . . 3

1.5

Metasprache . . . . . . . . . . . . . . . . . . . . . . 4

2

Struktur der Assemblersprache . . . . . . . . . . . . . . . 5

2.1

Zeichenvorrat . . . . . . . . . . . . . . . . . . . . . . 5

2.2

Instruktionen und Kommentare . . . . . . . . . . . . . . . . 7

2.3

Namenseintrag . . . . . . . . . . . . . . . . . . . . . . 10

Definieren von Namen . . . . . . . . . . . . . . . . . . . 11

2.4

Operationseintrag . . . . . . . . . . . . . . . . . . . . . 12

2.5

Operandeneintrag . . . . . . . . . . . . . . . . . . . . . 13

2.5.1 Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . 14

2.5.1.1 Einfache Ausdrücke . . . . . . . . . . . . . . . . . . . . 14

2.5.1.2 Arithmetische Ausdrücke . . . . . . . . . . . . . . . . . . 14

2.5.1.3 Absolute und relative Ausdrücke . . . . . . . . . . . . . . . 17

2.5.2 Elemente von Ausdrücken . . . . . . . . . . . . . . . . . 20

2.5.2.1 Namen . . . . . . . . . . . . . . . . . . . . . . . . . 20

2.5.2.2 Selbstdefinierende Werte . . . . . . . . . . . . . . . . . . 21

2.5.2.3 Bezugnahme auf den Adreßpegel . . . . . . . . . . . . . . . 25

2.5.2.4 Bezugnahme auf das Längenmerkmal . . . . . . . . . . . . . 26

2.5.3 Literale . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.6

Bemerkungseintrag . . . . . . . . . . . . . . . . . . . . 30

2.7

Fortsetzungszeichen . . . . . . . . . . . . . . . . . . . 31

3
3.1 3.2 3.3 3.3.1 3.3.2

Adressierung, Programmunterteilung und Programmverknüpfung . . . . . . . . . . . . . . . . . . 33 Adressierung . . . . . . . . . . . . . . . . . . . . . . 33 Programmunterteilung . . . . . . . . . . . . . . . . . . . 35 Programmabschnitte . . . . . . . . . . . . . . . . . . . 36 Ausführbare Programmabschnitte . . . . . . . . . . . . . . 36 Referenz-Programmabschnitte . . . . . . . . . . . . . . . . 37 Pseudoabschnitt . . . . . . . . . . . . . . . . . . . . . 37 Externer Pseudoabschnitt . . . . . . . . . . . . . . . . . . 38

U5223-J-Z125-3

Inhalt

3.3.3 3.4
4 4.1 4.2

Gemeinsamer Hilfsabschnitt . . . . . . . . . . . . . . . . . 38 Pseudoregister . . . . . . . . . . . . . . . . . . . . . . 39 Merkmale von Programmabschnitten . . . . . . . . . . . . . 41 Symbolische Programmverknüpfung . . . . . . . . . . . . . 42

Assembleranweisungen . . . . . . . . . . . . . . . . . . 43

Allgemeines . . . . . . . . . . . . . . . . . . . . . . . 43

Beschreibung der Anweisungen . . . . . . . . . . . . . . . 46

AMODE Adressierungsmodus zuordnen . . . . . . . . . . . . 46

CNOP Nulloperation setzen . . . . . . . . . . . . . . . . 48

COM Gemeinsamen Hilfsabschnitt definieren . . . . . . . . . 50

COPY Quellprogrammtext aus Bibliothekselement

kopieren . . . . . . . . . . . . . . . . . . . . . 52

CSECT Programmabschnitt definieren . . . . . . . . . . . . 54

CXD Speicherplatz für die Länge des Pseudoregister-

vektors reservieren . . . . . . . . . . . . . . . . . 56

DC

Konstante definieren . . . . . . . . . . . . . . . . 57

Modifizierfaktoren . . . . . . . . . . . . . . . . . 63

Längenfaktor . . . . . . . . . . . . . . . . . . . 63

Skalenfaktor . . . . . . . . . . . . . . . . . . . 64

Exponentenfaktor . . . . . . . . . . . . . . . . . 66

Konstantentypen . . . . . . . . . . . . . . . . . 67

Zeichenkonstanten C . . . . . . . . . . . . . . 68

Sedezimalkonstanten X . . . . . . . . . . . . . 69

Binärkonstanten B . . . . . . . . . . . . . . . 70

Festpunktkonstanten F und H . . . . . . . . . . . 71

Gleitpunktkonstanten

E, D und L . . . . . . . . . 74

Dezimalkonstanten P und Z . . . . . . . . . . . . 78

Adreßkonstanten . . . . . . . . . . . . . . . . . 80

Adreßkonstanten vom Typ A und Y . . . . . . . . . . 80

Adreßkonstanten vom Typ S . . . . . . . . . . . . . 82

Adreßkonstanten vom Typ V . . . . . . . . . . . . . 84

Adreßkonstanten vom Typ Q . . . . . . . . . . . . . 86

DS

Speicherplatz reservieren . . . . . . . . . . . . . . 87

DXD Pseudoregister definieren . . . . . . . . . . . . . . 93

DROP Basisadreßregister freigeben . . . . . . . . . . . . . 95

DSECT Pseudoabschnitt definieren . . . . . . . . . . . . . . 96

EJECT Seitenvorschub . . . . . . . . . . . . . . . . . . 100

END Übersetzungsende . . . . . . . . . . . . . . . . . 101

ENTRY ENTRY-Adresse kennzeichnen . . . . . . . . . . . . 103

EXTRN EXTRN-Adresse kennzeichnen . . . . . . . . . . . . 104

EQU Gleichsetzen . . . . . . . . . . . . . . . . . . . 106

ICTL Eingabeformat steuern . . . . . . . . . . . . . . . 109

LTORG Literalbereich definieren . . . . . . . . . . . . . . . 110

U5223-J-Z125-3

Inhalt

5 5.1 5.1.1 5.1.2 5.1.3 5.2 5.3 5.3.1 5.3.2 5.3.3 5.3.4 5.4
5.5 5.5.1 5.5.2 5.5.3 5.5.4 5.5.4.1 5.5.4.2 5.5.4.3 5.5.5 5.5.6 5.5.7 5.5.8 5.5.8.1 5.5.8.2 5.5.8.3 5.5.8.4

OPSYN Mnemotechnischen Operationscode zuweisen . . . . . . 112 ORG Adreßpegel setzen . . . . . . . . . . . . . . . . . 115 PRINT Protokollinhalt steuern . . . . . . . . . . . . . . . 117 PUNCH Text in Objektmodul kopieren . . . . . . . . . . . . . 119 REPRO Folgezeile in Objektmodul kopieren . . . . . . . . . . 120 RMODE Ladeattribut zuordnen . . . . . . . . . . . . . . . . 121 SPACE Zeilenvorschub . . . . . . . . . . . . . . . . . . 123 STACK USING- oder PRINT-Status sichern . . . . . . . . . . 124 START Programmanfang definieren . . . . . . . . . . . . . 126 TITLE Protokollüberschrift . . . . . . . . . . . . . . . . . 128 UNSTK USING- oder PRINT-Status restaurieren . . . . . . . . 129 USING Basisadreßregister zuweisen . . . . . . . . . . . . . 131 WXTRN Bedingte EXTRN-Adresse kennzeichnen . . . . . . . . 136 XDSEC Externen Pseudoabschnitt definieren . . . . . . . . . . 137
Struktur der Makrosprache . . . . . . . . . . . . . . . . 141 Aufruf und Definition von Makros . . . . . . . . . . . . . . . 142 Ablage der Makrodefinition . . . . . . . . . . . . . . . . . 143 Aufbau der Makrodefinition . . . . . . . . . . . . . . . . . 144 Aufbau der inneren Makrodefinition . . . . . . . . . . . . . . 146 Instruktionen und Kommentare . . . . . . . . . . . . . . . . 147 Namenseintrag . . . . . . . . . . . . . . . . . . . . . . 149 Folgesymbole . . . . . . . . . . . . . . . . . . . . . . 149 Variable Parameter . . . . . . . . . . . . . . . . . . . . 151 Generierte variable Parameter . . . . . . . . . . . . . . . . 153 Verkettung von variablen Parametern und alphanumerischen Zeichen . 154 Operationseintrag . . . . . . . . . . . . . . . . . . . . . 155 Variable Parameter im Operationseintrag . . . . . . . . . . . . 155 Operandeneintrag . . . . . . . . . . . . . . . . . . . . . 157 Variable Parameter im Operandeneintrag . . . . . . . . . . . . 157 Folgesymbole im Operandeneintrag . . . . . . . . . . . . . . 158 Makroausdrücke . . . . . . . . . . . . . . . . . . . . . 159 Zeichenausdrücke . . . . . . . . . . . . . . . . . . . . 161 Zeichenwert . . . . . . . . . . . . . . . . . . . . . . . 161 Teilzeichenfolge . . . . . . . . . . . . . . . . . . . . . 163 Verkettung von Zeichenwerten und Teilzeichenfolgen . . . . . . . 164 Arithmetische Makroausdrücke . . . . . . . . . . . . . . . . 165 Vergleichsausdrücke . . . . . . . . . . . . . . . . . . . 167 Logische Ausdrücke . . . . . . . . . . . . . . . . . . . . 169 Bezugnahme auf Merkmale . . . . . . . . . . . . . . . . . 171 T' Bezugnahme auf das Typenmerkmal . . . . . . . . . . . . 174 L' Bezugnahme auf das Längenmerkmal . . . . . . . . . . . 179 S' Bezugnahme auf das Skalenfaktormerkmal . . . . . . . . . 180 I' Bezugnahme auf das Ganzzahligkeitsmerkmal . . . . . . . . 181

U5223-J-Z125-3

Inhalt

5.5.8.5 5.5.8.6 5.5.8.7 6 6.1 6.2
6.3
7 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.2

K' Bezugnahme auf das Zählermerkmal . . . . . . . . . . . . 182 N' Bezugnahme auf das Anzahlmerkmal . . . . . . . . . . . 183 D' Bezugnahme auf das Definitionsmerkmal . . . . . . . . . . 185
Variable Parameter . . . . . . . . . . . . . . . . . . . . 187 Symbolische Parameter . . . . . . . . . . . . . . . . . . 187 SET-Parameter . . . . . . . . . . . . . . . . . . . . . 189 Globale und lokale SET-Parameter . . . . . . . . . . . . . . 191 Implizit vereinbarte lokale SET-Parameter . . . . . . . . . . . 194 Indizierte SET-Parameter . . . . . . . . . . . . . . . . . . 194 Variable Systemparameter . . . . . . . . . . . . . . . . . 196 &SYSDATE . . . . . . . . . . . . . . . . . . . . . . . 197 &SYSECT . . . . . . . . . . . . . . . . . . . . . . . 198 &SYSLIST . . . . . . . . . . . . . . . . . . . . . . . 200 &SYSMOD . . . . . . . . . . . . . . . . . . . . . . . 202 &SYSNDX . . . . . . . . . . . . . . . . . . . . . . . 203 &SYSPARM . . . . . . . . . . . . . . . . . . . . . . . 206 &SYSTEM . . . . . . . . . . . . . . . . . . . . . . . 206 &SYSTIME . . . . . . . . . . . . . . . . . . . . . . . 206 &SYSTSEC . . . . . . . . . . . . . . . . . . . . . . . 207 &SYSVERM . . . . . . . . . . . . . . . . . . . . . . . 208 &SYSVERS . . . . . . . . . . . . . . . . . . . . . . . 208
Instruktionen der Makrosprache . . . . . . . . . . . . . . 209 Musteranweisung und Makroaufruf . . . . . . . . . . . . . . 209 Kennwort- und Stellungsoperanden . . . . . . . . . . . . . . 213 Operandenunterlisten . . . . . . . . . . . . . . . . . . . 215 Äußere und innere Makroaufrufe . . . . . . . . . . . . . . . 218 Alternatives Anweisungsformat . . . . . . . . . . . . . . . . 220 Beschreibung der Makroanweisungen . . . . . . . . . . . . . 222 ACTR Verzweigungen zählen . . . . . . . . . . . . . . . 222 AIF Bedingt verzweigen . . . . . . . . . . . . . . . . 223 AGO Unbedingt verzweigen . . . . . . . . . . . . . . . 226 ANOP Nulloperation . . . . . . . . . . . . . . . . . . . 229 GBLx Globalen SET-Parameter definieren . . . . . . . . . . 230 LCLx Lokalen SET-Parameter definieren . . . . . . . . . . . 232 MACRO Anfangsanweisung . . . . . . . . . . . . . . . . . 234 MEND Endanweisung . . . . . . . . . . . . . . . . . . 234 MEXIT Ausgang aus einer Makrodefinition definieren . . . . . . . 235 MNOTE Meldungen absetzen . . . . . . . . . . . . . . . . 237 MTRAC Macro trace . . . . . . . . . . . . . . . . . . . 239 NTRAC Macro trace beenden . . . . . . . . . . . . . . . . 241 SETA SETA-Parameter setzen . . . . . . . . . . . . . . . 243 SETB SETB-Parameter setzen . . . . . . . . . . . . . . . 245 SETC SETC-Parameter setzen . . . . . . . . . . . . . . . 247

U5223-J-Z125-3

Inhalt

8
9 9.1 9.2 9.2.1 9.2.2 9.2.2.1 9.2.2.2 9.2.2.3 9.2.3 9.2.3.1 9.2.3.2 9.2.3.3 9.2.3.4 9.2.3.5 9.2.4 9.2.4.1 9.2.4.2 9.2.5 9.3 9.3.1 9.3.2 9.3.2.1 9.3.2.2 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.1.1 9.5.1.2 9.5.2 9.5.3 9.5.3.1 9.5.3.2 9.5.3.3 9.5.3.4 9.6

Makrosprachelemente im Assembler-Quellprogrammtext . . . . 249
Strukturierte Programmierung mit ASSEMBH . . . . . . . . . 253 Einführung . . . . . . . . . . . . . . . . . . . . . . . 253 Blockkonzept . . . . . . . . . . . . . . . . . . . . . . 256 Sequenz . . . . . . . . . . . . . . . . . . . . . . . . 257 Auswahlstrukturblöcke . . . . . . . . . . . . . . . . . . . 258 Entscheidung . . . . . . . . . . . . . . . . . . . . . . 258 Fallunterscheidung durch Nummer . . . . . . . . . . . . . . 260 Fallunterscheidung durch Vergleich . . . . . . . . . . . . . . 262 Schleifen . . . . . . . . . . . . . . . . . . . . . . . . 266 Schleife mit Vorabprüfung . . . . . . . . . . . . . . . . . 266 Schleife mit freier Endebedingung . . . . . . . . . . . . . . 268 Zählschleife . . . . . . . . . . . . . . . . . . . . . . . 270 Zählschleife mit freier Endebedingung . . . . . . . . . . . . . 272 Iterative Schleife . . . . . . . . . . . . . . . . . . . . . 274 Einfache Bedingungen . . . . . . . . . . . . . . . . . . . 276 Vordefinierte Bedingungssymbole . . . . . . . . . . . . . . . 277 Benutzereigene Bedingungssymbole . . . . . . . . . . . . . 279 Zusammengesetzte Bedingungen . . . . . . . . . . . . . . . 280 Prozedurkonzept . . . . . . . . . . . . . . . . . . . . . 282 Prozedurerklärung und Prozedurende . . . . . . . . . . . . . 283 Prozedurtypen . . . . . . . . . . . . . . . . . . . . . . 285 Prozeduren der Typen M, E und I . . . . . . . . . . . . . . . 285 Prozeduren der Typen B, L und D . . . . . . . . . . . . . . 287 Datenkonzept . . . . . . . . . . . . . . . . . . . . . . 289 Datenbereiche der Klasse Static . . . . . . . . . . . . . . . 291 Datenbereiche der Klasse Automatic . . . . . . . . . . . . . 293 Datenbereiche der Klasse Controlled . . . . . . . . . . . . . 297 Datenbereiche der Klasse Based . . . . . . . . . . . . . . . 299 Prozedurverknüpfung und Parameterübergabe . . . . . . . . . . 301 Parameterübergabe über die STANDARD-Schnittstelle . . . . . . 303 Statische Parameterübergabe . . . . . . . . . . . . . . . . 303 Dynamische Parameterübergabe . . . . . . . . . . . . . . . 305 Parameterübergabe über die OPTIMAL-Schnittstelle . . . . . . . 307 Parameterübernahme . . . . . . . . . . . . . . . . . . . 309 Parameterübernahme über die STANDARD-Schnittstelle . . . . . . 309 Parameterübernahme über die OPTIMAL-Schnittstelle . . . . . . . 311 Parameterübernahme in Formalparameter . . . . . . . . . . . 313 Parameterübernahme in Formalparameter im LOCAL-Bereich . . . . 315 ILCS-Anschluß für die Strukturierte Programmierung . . . . . . . 316

U5223-J-Z125-3

Inhalt

9.6.1
9.6.2 9.6.3 9.6.4 9.6.5 9.6.6 9.6.7 9.6.8
10

Prozedurverknüpfung . . . . . . . . . . . . . . . . . . . 317 Registerkonventionen (ILCS- und Nicht-ILCS-Schnittstelle) . . . . . 317 Parameterübergabe . . . . . . . . . . . . . . . . . . . . 319 Benutzereigene Routinen anmelden . . . . . . . . . . . . . . 321 Ereignisse behandeln (Event Handling) . . . . . . . . . . . . 321 Folgeprozesse behandeln (Contingency Handling) . . . . . . . . 322 Unterbrechungsereignisse behandeln (STXIT Handling) . . . . . . 323 Programmaske setzen . . . . . . . . . . . . . . . . . . . 324 MONJV-Wert in der PCD setzen . . . . . . . . . . . . . . . 324 Sprachinitialisierung bei nachgeladenen Moduln . . . . . . . . . 324

Vordefinierte Makros für die Strukturierte

Programmierung . . . . . . . . . . . . . . . . . . . . . 325

Allgemeine Programmierhinweise . . . . . . . . . . . . . . . 325

@AND Logisches 'Und' . . . . . . . . . . . . . . . . . 327

@BEGI Sequenz . . . . . . . . . . . . . . . . . . . . 328

@BEND Strukturblock-Ende . . . . . . . . . . . . . . . . 328

@BREA Abbrechen einer Schleife . . . . . . . . . . . . . 329

@CASE Fallunterscheidung durch Nummer . . . . . . . . . . 330

@CAS2 Fallunterscheidung durch Vergleich . . . . . . . . . . 332

@CONDI Contingency-Routine abmelden . . . . . . . . . . . 334

@CONEN Contingency-Routine anmelden . . . . . . . . . . . 335

@CYCL Schleifen-Kopf . . . . . . . . . . . . . . . . . 338

@DATA Datenzugriff und Speicheranforderung . . . . . . . . 340

@DO

Schleifen-Unterblock . . . . . . . . . . . . . . . 347

@ELSE Nein-Unterblock . . . . . . . . . . . . . . . . . 348

@END Statisches Prozedurende . . . . . . . . . . . . . 349

@ENTR Prozeduranfang . . . . . . . . . . . . . . . . . 350

@EVTLC Layout der Kontext-Beschreibung definieren . . . . . . 368

@EVTOE Nicht-STXIT-Ereignis signalisieren . . . . . . . . . . 370

@EXIT Dynamisches Prozedurende . . . . . . . . . . . . 372

@FREE Speicherfreigabe . . . . . . . . . . . . . . . . . 376

@IF

Entscheidung . . . . . . . . . . . . . . . . . . 377

@ININ ILCS bei nachgeladenen Moduln aufrufen . . . . . . . 378

@OF

Fall-Unterblock . . . . . . . . . . . . . . . . . 379

@OFRE Rest-Unterblock . . . . . . . . . . . . . . . . . 381

@OR

Logisches 'Oder' . . . . . . . . . . . . . . . . . 382

@PAR Definition von Bereichen . . . . . . . . . . . . . . 383

@PASS Prozedur-Aufruf . . . . . . . . . . . . . . . . . 389

@SETJV Monitorjobvariable setzen . . . . . . . . . . . . . 395

@SETPM Programmaske setzen oder rücksetzen . . . . . . . . 396

@STXDI STXIT-Behandlungsroutine abmelden . . . . . . . . . 397

@STXEN STXIT-Behandlungsroutine anmelden . . . . . . . . . 398

@STXIM Layout der Unterbrechungsmeldung definieren . . . . . 401

U5223-J-Z125-3

Inhalt

@THEN Ja-Unterblock . . . . . . . . . . . . . . . . . . 402 @THRU Iterative Schleife . . . . . . . . . . . . . . . . . 403 @TOR Logisches 'Oder mit Priorität' . . . . . . . . . . . . 405 @WHEN Bedingung für Schleifenabbruch . . . . . . . . . . . 406 @WHIL Schleife mit Vorabprüfung . . . . . . . . . . . . . 407

11

Anhang . . . . . . . . . . . . . . . . . . . . . . . . 409

11.1

Zusammenfassung der DC-Konstanten . . . . . . . . . . . . 410

11.2

Format der Assemblerbefehle . . . . . . . . . . . . . . . . 411

11.3

Assembler-Restriktionen . . . . . . . . . . . . . . . . . . 417

11.4

Pseudoregister, Beispiele . . . . . . . . . . . . . . . . . . 421

11.5

Parameterübergabe bei der strukturierten Programmierung,

Beispiel . . . . . . . . . . . . . . . . . . . . . . . . 425

11.6

Unterschiede von ASSEMBH V1.2A und ASSEMB V30.0A . . . . . 440

Handbuchergänzungen Litera.tur Stichwörter

U5223-J-Z125-3

Benutzerhandbuch - Deutsch
ASSEMBH
Beschreibung Stand der Beschreibung: ASSEMBH V1.2 Mit Ergänzungkapitel zu ASSEMBH V1.2D
Ausgabe Juni 2010

Kritik... Anregungen... Korrekturen...
Die Redaktion ist interessiert an Ihren Kommentaren zu diesem Handbuch. Ihre Rückmeldungen helfen uns, die Dokumentation zu optimieren und auf Ihre Wünsche und Bedürfnisse abzustimmen.
Sie können uns Ihre Kommentare per E-Mail an [email protected] senden.
Zertifizierte Dokumentation nach DIN EN ISO 9001:2000
Um eine gleichbleibend hohe Qualität und Anwenderfreundlichkeit zu gewährleisten, wurde diese Dokumentation nach den Vorgaben eines Qualitätsmanagementsystems erstellt, welches die Forderungen der DIN EN ISO 9001:2000 erfüllt.
cognitas. Gesellschaft für Technik-Dokumentation mbH www.cognitas.de

Copyright und Handelsmarken
Copyright © Fujitsu Technology Solutions GmbH 2010. Alle Rechte vorbehalten. Liefermöglichkeiten und technische Änderungen vorbehalten. Alle verwendeten Hard- und Softwarenamen sind Handelsnamen und/oder Warenzeichen der jeweiligen Hersteller.

i

Zum 1. April 2009 ist Fujitsu Siemens Computers in den alleinigen Besitz von Fujitsu übergegangen. Diese neue Tochtergesellschaft von Fujitsu trägt seitdem den Namen Fujitsu Technology Solutions.

Das vorliegende Dokument ist eine fachlich ergänzte Neuausgabe eines früheren Handbuchs zu einer be-

reits vor längerer Zeit freigegebene Produktversion.

Bitte beachten Sie, dass alle Firmenbezüge und Copyrights im vorliegenden Dokument rechtlich auf Fujitsu

Technology Solutions übergegangen sind.

Kontakt- und Supportadressen werden nun von Fujitsu Technology Solutions angeboten und haben die

Form [email protected].

Die Internetseiten von Fujitsu Technology Solutions finden Sie unter http://de.ts.fujitsu.com/

Dieses Handbuch wurde auf chlorfrei gebleichtem Papier gedruckt.


Acrobat Distiller 1.0 for Windows

Search Any Device: