Einführung in das Programmieren in ASSEMBLER: Systeme IBM, Siemens, Univac, Comparex IBM-PC/370 9783110884814, 9783110121742


232 51 6MB

German Pages [348] Year 1989

Report DMCA / Copyright

DOWNLOAD PDF FILE

Table of contents :
1. Die Darstellung von Daten in Bytemaschinen
1.1 Die Organisation des Arbeitsspeichers und der Register
1.2 Der EBCDI-Code
1.3 Die dezimal gepackte Zahlendarstellung
1.4 Die duale Zahlendarstellung
1.5 Die Zahlendarstellung im Halbwort, Wort und Festpunktregister
1.6 Exkurs: Zahlensysteme
1.7 Die Zahlendarstellung im Gleitpunktregister
2. Maschineninstruktionen und Operandenadressierung
2.1 Allgemeine Vorbemerkungen
2.2 Die Instruktionstypen und ihre Formate
2.3 Die Arbeitsspeicheradressierung
2.4 Die Länge der Operanden
2.5 Die Ausrichtung von Operanden im Arbeitsspeicher
2.6 Programmstatuswort, Bedingungsanzeige
3. Die Programmiersprache ASSEMBLER
3.1 Allgemeine Vorbemerkungen
3.2 Die Elemente der Sprache
3.3 Ausdrücke
3.4 Maschinenbefehle
3.5 Assembler-Anweisungen
3.6 Elementare Makroprogrammierung
3.7 Systemmakros
4. Übungsprogramme
Übung 1 : Auflisten von Adreßkarten
Übung 2: Ausdrucken des Inhalts eines Festpunktregisters
Übung 3: Dezimalarithmetik
Übung 4: Dualarithmetik
Übung 5: Rechnungsschreibung
Übung 6: Sortieren von Adreßkarten numerisch und alphabetisch
Übung 7: Programmsegmentierung bei Übung 1
Übung 8a: Erzeugen einer Banddatei mit statistischen Erhebungsdaten
Übung 8b: Auszählen statistischer Merkmale von einer Banddatei
Übung 9: Sedezimale Gleitpunktarithmetik
Übung 10: Einrichten einer Buchhaltung auf einer Magnetplatte
Übung 11 : Multiplikation von Inzidenzmatrizen mit Zustandsvektoren
5. Programmierhilfen
5.1 Lochkartenformat im ASSEMBLER
5.2 Tabelle der Maschineninstruktionen
5.3 Tabelle der 2er-Potenzen
5.4 Umrechnungstabelle sedezimal - dezimal
5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)
5.6 Tabelle der maschineninternen Instruktionsformate
5.7 Fehleranzeigen des Übersetzerprogramms (Übersetzungsphase).
5.8 Fehleranzeigen des Betriebssystems (Ablaufphase)
6. Einführung in den 8086/Assembler
6.1 Ehe 80iger Prozessor-Familie von Intel
6.2 Die Architektur des 8086
6.3 Der Registersatz
6.4 Der Befehlssatz des 8086
6.5 Ehe Segmentierung des Arbeitsspeichers
6.6 Die Adressierverfahren im 8086/Assembler
6.7 Beispiel
Literaturverzeichnis
Stichwortverzeichnis
Recommend Papers

Einführung in das Programmieren in ASSEMBLER: Systeme IBM, Siemens, Univac, Comparex IBM-PC/370
 9783110884814, 9783110121742

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

de Gruyter Lehrbuch Niemeyer · Programmieren in ASSEMBLER

Gerhard Niemeyer

Einführung in das

Programmieren in ASSEMBLER Systeme IBM, Siemens, Univac Comparex, IBM-PC/370 6., bearbeitete und erweiterte Auflage

W G DE

Walter de Gruyter · Berlin · New York 1989

Dr. rer. pol. Gerhard Niemeyer, o. Professor der Betriebswirtschaftslehre, insbes. Wirtschaftsinformatik, an der Universität Regensburg

ClP-Kurztitelau fnahme der Deutschen

Bibliothek

Niemeyer, Gerhard: Einfuhrung in das Programmieren in ASSEMBLER : Systeme IBM, Siemens, Univac, Comparex, IBM-PC/370 / Gerhard Niemeyer. - 6., bearb. u. erw. Aufl. - Berlin ; New York : de Gruyter, 1989 (De-Gruyter-Lehrbuch) ISBN 3-11-012174-3

© Copyright 1989 by Walter de Gruyter & Co., 1000 Berlin 30. Alle Rechte, insbesondere das Recht der Vervielfältigung und Verbreitung sowie der Übersetzung, vorbehalten. Kein Teil des Werkes darf in irgendeiner Form (durch Photokopie, Mikrofilm oder ein anderes Verfahren) ohne schriftliche Genehmigung des Verlages reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden. Printed in Germany. Satz und Druck: Mercedes-Druck, Berlin. Bindearbeiten: Dieter Mikolai, Berlin.

Vorwort Die Programmiersprache ASSEMBLER ist eine maschinenorientierte Sprache für Bytemaschinen der Serien IBM/360, IBM/370, Siemens 4004 und Univac 9000. Aufgrund der außerordentlich großen Verbreitung dieser Anlagen im Bereich der Wirtschaft und der öffentlichen Verwaltung gehört ASSEMBLER zu den meist verwendeten Programmiersprachen fur kaufmännische und verwaltungstechnische Aufgaben. Die von den Herstellern angebotenen problemorientierten Programmiersprachen COBOL (common business oriented language), PL/1 und RPG (report program generator), die ebenfalls auf derartige Aufgabenstellungen zugeschnitten sind und die den Programmieraufwand reduzieren sollen, konnten ASSEMBLER nicht aus seiner führenden Position verdrängen. Dies mag teils mit der absoluten Universalität und dem Testkomfort der ASSEMBLER-Sprache zusammenhängen und teils durch die spürbar längeren Übersetzungszeiten für die in problemorientierten Sprachen geschriebenen Programme begründet sein. Hinzu kommen sicherlich auch „gefühlsmäßige" Präferenzen durch die Programmierer, die an der Programmiersprache ASSEMBLER die größere Freiheit der Programmgestaltung und die größere Transparenz der eigentlichen Datenverarbeitungsvorgänge in der Maschine schätzen. In der Tat erscheinen diese Faktoren geeignet, insbesondere den Neuling auf dem Gebiet der elektronischen Datenverarbeitung für diese Tätigkeit zu interessieren und ihn gründlich in dieses Gebiet einzuführen. Aus diesem Grunde sieht das vom Verfasser konzipierte Informatik-Studium für Studenten der Wirtschaftswissenschaften an der Universität Regensburg u. a. eine Einführung in ASSEMBLER im Grundstudium vor. Über diese didaktischen Überlegungen hinaus muß jedoch auch auf die Bedeutung der ASSEMBLER-Sprache als universelle Basis für „höhere" Programmieraufgaben, wie Systemprogrammierung, Compilerbau und Aufbau von Datenbank· und Informationssystemen hingewiesen werden. Das Erlernen der ASSEMBLER-Sprache schafft also einen idealen Ausgangspunkt für vielerlei berufliche Spezialisierungen im Bereich der elektronischen Datenverarbeitung. Das vorliegende Lehrbuch ist als möglichst umfassende Einführung in ASSEMBLER gedacht und kann darüber hinaus vom Programmierer auch als Nachschlagewerk benutzt werden; letzteres allerdings mit der Einschränkung, daß wegen der Knappheit des verfügbaren Raumes nicht der gesamte Sprachumfang dargestellt werden konnte. Jedoch dürfte das Gebotene für die meisten Aufgabenstellungen ausreichen. Das Lehrbuch ist in vier Hauptabschnitte unterteilt: Der erste Abschnitt behandelt die Datendarstellung in Bytemaschinen, der zweite die Maschineninstruktionen und der dritte die ASSEMBLER-Sprache.

4

Vorwort

Der vierte Abschnitt zeigt die Anwendung anhand mehrerer Beispiele, die von einfachen kaufmännischen Problemen bis hin zu Problemen, wie sie im Compilerbau vorkommen, reichen. Bei der Lektüre des Buches empfiehlt es sich, mit den Beispielen in Hauptabschnitt 4 zu beginnen. Die dabei auftretenden Fragen können dann unter Benutzung des ausführlichen Schlagwortregisters in den Hauptabschnitten 1 bis 3 sowie im Anhang geklärt werden. Vor der Lektüre des Buches sollten allerdings Grundkenntnisse der Elektronischen Datenverarbeitung vorhanden sein, und zwar besonders hinsichtlich des Aufbaus und der Funktion der Zentraleinheit und der wichtigsten Peripherie-Geräte. Regensburg, im Februar 1973

Gerhard Niemeyer

Vorwort zur 6. Auflage Schneller als erwartet war die 5. Auflage vergriffen, so daß eine erneute Bearbeitung des Buches fällig wurde. Der bisher erreichte Reifegrad ließ allerdings nur noch wenige Verbesserungen und Aktualisierungen übrig. Um jedoch den neueren Entwicklungen auf dem Gebiet der Assembler-Programmierung Rechnung zu tragen, wurde ein Kapitel zur Einführung in den 8086/Assembler angefügt. Bei dieser Sprache handelt es sich um den am weitesten verbreiteten Assembler für Mikrocomputer. Er gilt für alle Maschinen, die mit 16-Bit Prozessoren der Intel Familie ausgerüstet und nach dem sogenannten Industriestandard des Marktführers IBM gebaut sind. Für Interessierte dürfte ein Vergleich dieser Sprache mit dem nun schon ,.klassischen" 360/ASSEMBLER wichtige Aufschlüsse und Anregungen für die Weiterentwicklung beider Sprachen bringen. Regensburg, im März 1989

Gerhard Niemeyer

Inhalt 1. Die Darstellung von Daten in Bytemaschinen

9

1.1 Die Organisation des Arbeitsspeichers und der Register 1.2 Der EBCDI-Code 1.2.1 Die Darstellung von Ziffern, Zahlen und Vorzeichen 1.2.2 Die Darstellung von Buchstaben und Sonderzeichen

9 11 11 12

1.2.3 Die sedezimale Schreibweise von bit-Mustern 1.3 Die dezimal gepackte Zahlendarstellung 1.4 Die duale Zahlendarstellung

13 16 17

1.5 Die Zahlendarstellung im Halbwort, Wort und F e s t p u n k t r e g i s t e r . . .

19

1.6 E x k u r s : Zahlensysteme 1.6.1 Die polynomiale Zahlendarstellung

21 21

1.6.2 Die Umrechnung von Zahlen in andere Zahlensysteme 1.7 Die Zahlendarstellung im Gleitpunktregister

23 29

2. Maschineninstruktionen und Operandenadressierung

31

2.1 Allgemeine Vorbemerkungen 2.2 Die Instruktionstypen und ihre Formate 2.3 Die Arbeitsspeicheradressierung 2.3.1 Einfache Adressierung 2 . 3 . 2 Indizierte Adressierung

31 32 38 38 42

2.4 Die Länge der Operanden 2.5 Die Ausrichtung von Operanden im Arbeitsspeicher 2.6 Programmstatuswort, Bedingungsanzeige

44 44 45

3. Die Programmiersprache ASSEMBLER 3.1 Allgemeine Vorbemerkungen 3.2 Die Elemente der Sprache 3 3 Ausdrücke 3.3.1 Symbole 3.3.2 Direktwerte 3 3 3 Der Stand des Zuordnungszähler 3 . 3 . 4 Längenattribute 3.3.5 Literale 3.4 Maschinenbefehle 3.4.1 Die Syntax der Maschinenbefehle 3.4.2 Die relative symbolische Adressierung 3.4.3 Beschreibung der wichtigsten Maschinenbefehle 3.4.3.1

Übertragungsoperationen im Arbeitsspeicher

48 48 49 50 50 51 54 56 56 68 69 79 81 81

Inhaltsverzeichnis

6

3.4.32 Laden von Registern, Speichern von Registerinhalten 3.4.33 Codetransformationen 3.4.3.4 shift-Operationen in Festpunktregistern 3.4.3.5 Dezimalarithmetik 3.4.3.6 Duale Festpunktarithmetik 3.4.3.7 Sedezimale Gleitpunktarithmetik 3.4.3.8 Vergleichsoperationen 3.4.3.9 Verzweigungsoperationen 3.4.3.10 Logische bit-Verknüpfungen 3.5 Assembler-Anweisungen 3.5.1 Anweisungen zur Symbol-, Konstanten- und Felddefinition . . 3.5.2 Anweisungen zur Deklaration und Aufgabe von Basisregistern. 3.5.3 Anweisungen zur Programmsegmentierung und Segment Verknüpfung 3.5.4 Anweisungen zur Steuerung des Zuordnungszählers 3.5.5 Anweisungen zur Modifikation des Übersetzungsprotokolls . . 3.6 Elementare Makroprogrammierung 3.6.1 Die Definition von Makros 3.6.1.1 Die Aufstellung der Instruktionsfolge 3.6.1.2 Die Definition des Makroaufrufs (Musteranweisung). . 3.6.1.3 Steuerung des Assembler 3.6.1.4 Das Eintragen der Makrodefmition 3 . 6 2 Der Aufruf von Makros 3.7 Systemmakros 3.7.1 Systemmakros zur Definition von Datein 3.7 2 Systemmakros zum Öffnen und Schließen von Dateien 3.7.3 Makros zum Lesen und Schreiben von Dateien 3.7.4 Makros zur Steuerung peripherer Geräte 3.7.5 Das „Ende-Makro"

4. Übungsprogramme Übung Übung Übung Übung Übung Übung Übung Übung

1: 2: 3: 4: 5: 6: 7: 8a:

Auflisten von Adreßkarten Ausdrucken des Inhalts eines Festpunktregisters Dezimalarithmetik Dualarithmetik Rechnungsschreibung Sortieren von Adreßkarten numerisch und alphabetisch . . Programmsegmentierung bei Übung 1 Erzeugen einer Banddatei mit statistischen Erhebungsdaten Übung 8b: Auszählen statistischer Merkmale von einer Banddatei . . .

90 113 140 147 157 170 180 195 207 212 213 217 221 227 228 230 231 231 23 1 232 233 234 235 235 240 241 245 247

248 248 251 254 260 266 276 282 285 287

Inhaltsverzeichnis

Übung 9: Ü b u n g 10: Ü b u n g 11:

Sedezimale Gleitpunktarithmetik Einrichten einer Buchhaltung auf einer Magnetplatte . . . . Multiplikation von Inzidenzmatrizen mit

296 306

Zustandsvektoren

306

5. Programmierhilfen

309

5.1 5.2 5.3 5.4

L o c h k a r t e n f o r m a t im ASSEMBLER Tabelle der Maschineninstruktionen Tabelle der 2er-Potenzen Umrechnungstabelle sedezimal - dezimal

309 310 317 318

5.5 5.6 5.7 5.8

Tabelle der möglichen bit-Muster im Byte (sedezimal) Tabelle der m a s c h i n e n i n t e r n e n I n s t r u k t i o n s f o r m a t e Fehleranzeigen des Übersetzerprogramms ( Ü b e r s e t z u n g s p h a s e ) . . . . Fehleranzeigen des Betriebssystems ( A b l a u f p h a s e )

318 324 324 325

6. Einführung in den 8086/Assembler 6.1 6.2 6.3 6.4 6.5 6.6

Die Die Der Der Die Die

80iger Prozessor-Familie von Intel A r c h i t e k t u r des 8 0 8 6 Registersatz Befehlssatz des 8 0 8 6 Segmentierung des Arbeitsspeichers Adressierverfahren im 8086/Assembler

6.7 Beispiel

326 326 326 327 330 331 333 335

Literaturverzeichnis

337

Stichwortverzeichnis

338

1. Die Darstellung von Daten in Byte-Maschinen 1.1 Die Organisation des Arbeitsspeichers und der Register a) Arbeitsspeicher Der Arbeitsspeicher der Byte-Maschinen ist so organisiert, daß je 8 bits1 eine adressierbare Speichereinheit, ein sogenanntes Byte bilden. Die Speicheradresse ist eine Zahl, die die laufende Nummer eines Byte im Speicher angibt. Die Adressierung beginnt mit 0 und endet mit 2" - 1, wobei η von der Größe der jeweiligen Anlage abhängt. Speicherorganisation (logisch): Adressen:

507

508

509

Byte

Byte

xxxxxxxx

Byte

Die Größe des Arbeitsspeichers wird üblicherweise in Kilobytes (KB) ausgedrückt, wobei jedoch ein KB nicht 1000 Bytes, sondern 2 1 0 = 1024 Bytes sind. Für die Zwecke der Datenverschlüsselung ordnet man den einzelnen bits eines Byte sogenannte bit-Positionen zu, und zwar ist es praktisch, dem äußerst rechten bit die Position 0 und dem äußerst linken bit die Position 7 zu geben. Die bit-Positionen im Byte: bit-Positionen:

7 6 5 4 3 2

10

x x x x x x x x

Byte

Jedes bit hat zwei mögliche Zustände, denen man die Werte 1, 0 oder „an", „aus" oder ,ja", „nein" zuordnen kann. Für die nachfolgenden Darstellungen sollen durchgängig die Werte 1 und 0 verwendet werden. Da der Zustand jedes bit unabhängig von den Zuständen der übrigen bits variierbar ist, lassen sich nach den Gesetzen der Kombinatorik aus den 8 bits eines Byte 2* = 256 verschiedene bit-Muster bilden. 1

In Wirklichkeit besteht ein Byte aus 9 bits. Das 9. bit dient jedoch als „parity bit" ausschließlich der maschineninternen Funktionskontrolle bei der Datenübertragung und braucht daher den Programmierer nicht zu interessieren.

10

1. Die Darstellung von Daten in Bytemaschinen

Zur Veranschaulichung sind nachfolgend die 2 3 = 8 möglichen bit-Muster aus 3 bits dargestellt.

0 0 0 0 0 1 0 1 0 0 1 1

1 1 1 1

0 0 1 1

0 1 0 1

Zur Übung bilde man die 2 4 = 16 möglichen bit-Muster aus 4 bits. Ordnet man jedem bit-Muster eine bestimmte Bedeutung zu, so lassen sich in einem Byte 256 verschiedene Informationen verschlüsseln. Für bestimmte Zwecke können auch mehrere Bytes zu größeren logischen Einheiten zusammengefaßt werden, wodurch sich die Zahl der möglichen bitMuster beträchtlich steigern läßt. Die bit-Positionierung läuft dann entsprechend über die Bytegrenzen hinweg (vgl. dazu auch S. 18). Folgende Gruppierungen sind möglich: 2 Bytes (16 bits) = ein Halbwort 4 Bytes (32 bits) = ein Vollwort 8 Bytes (64 bits) = ein Doppelwort Der Zugriff zu diesen Gebilden erfolgt durch die Angabe der jeweils niedrigsten Byteadresse. b) Register Byte-Maschinen verfugen über 20 Operandenregister, zu denen der Programmierer direkten Zugriff hat. Von diesen sind 16 sogenannte Festpunktregister mit je 32 bits und 4 sogenannte Gleitpunktregister mit je 64 bits. Die einzelnen bits der Register werden in der Regel durch Flip-Flop-Schaltungen realisiert mit Kippzeiten im Nanosekundenbereich. Zum Vergleich sei erwähnt, daß die Ummagnetisierungszeiten im Arbeitsspeicher im Mikrosekundenbereich liegen. Die Zustandsänderungen der einzelnen bits vollziehen sich also in den Registern etwa um den Faktor 10 3 mal schneller als im Arbeitsspeicher. Deswegen werden die Register vor allem dann benutzt, wenn hohe Rechenleistungen erzielt werden sollen. Die Adressierung der 16 Festpunktregister geschieht durch die Nummern 0 bis 15 und die Adressierung der Gleitpunktregister durch die Nummern 0, 2, 4 und 6. Die Unterscheidung von Festpunkt- und Gleitpunktregistern mit gleichen Nummern geschieht durch den jeweiligen Befehlscode, mit dem die Register angesprochen werden; d . h . es gibt spezifische Festpunktregister- und spezifische Gleitpunktregisterbefehle.

It

1.2 Der EBCDI-Code

1.2 Der EBCDI-Code Der Extended Binary Coded Decimal Interchange Code ist typisch fur ByteMaschinen. Er basiert auf dem Prinzip: 1 Byte = 1 Zeichen (Ziffer, Buchstabe. Sonderzeichen) Die hauptsächlichen Anwendungen dieses Code liegen bei der Zeichenkettenverarbeitung und bei der Datenein- und Datenausgabe. Zeichenkettenverarbeitung bedeutet Umschichtung von Bytefolgen (oder einzelner Bytes) im Arbeitsspeicher und Vergleichen von Bytefolgen (oder einzelner Bytes) untereinander. Für diese Arbeiten sind die Daten in der Regel EBCDI-verschlüsselt. Die Ein- und Ausgabe ist bei Bytemaschinen so eingerichtet, daß Eingabedaten von Lochkarten oder Lochstreifen zunächst in den EBCDI-Code umgewandelt werden. Umgekehrt können Daten über den Schnelldrucker oder den Bedienungsblattschreiber nur ausgegeben werden, wenn sie im Arbeitsspeicher in EBCDI-Codierung bereitstehen.

1.2.1 Die Darstellung von Ziffern, Zahlen und Vorzeichen Für die Zifferndarstellung werden im Byte nur die bit-Positionen 0 bis 3 benötigt. Die bit-Positonen 4 bis 7 werden mit Einsen aufgefüllt. Zifferndarstellung: EBCDI 1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

7 6 5 4

dezimal 0 0 0 0 0 0 0 1 0 0 10 0 0 11 0 10 0 0 10 1 0 110 O l l i 10 0 0 10 0 1

0 1 2 3 4 5

6 7 8 9

3 2 1 0 (bit-Positionen)

Die Zahlendarstellung im EBCDI-Code erfolgt durch die logische Zusammenfassung mehrerer Ziffernbytes, wobei jedem Byte ein bestimmter dezimaler Stellenwert zugeordnet wird.

12

1. Die Darstellung von Daten in Bytemaschinen

Zahlendarstellung (Beispiel): Adressen:

317

318

319

320

im | oooi 1

im ] oooo

i m ! ooio . 1

im ! ooii 1

Tausender

Hunderter

Zehner

Einer

Legt man fest, daß das Byte Nr. 317 den Stellenwert 1 0 \ das Byte Nr. 318 den Stellenwert 102, das Byte Nr. 319 den Stellenwert 10 l und das Byte Nr. 320 den Stellenwert 10° hat, dann läßt sich die oben dargestellte Bytekette als die Zahl 1023 interpretieren. Die Vorzeichendarstellung geschieht im Byte mit dem niedrigsten Stellenwert in den bit-Positionen 7 6 5 4. Zahlen, die in diesen Positionen die bit-Muster 1 1 1 1 aufweisen, gelten als positiv. Zur besonderen Markierung positiver Zahlen werden jedoch in diesen bit-Positionen auch folgende bit-Muster verwendet: 110 0 10 10 1 1 1 0 ( 1 1 1 1 ) Zur Markierung negativer Zahlen dienen folgende bit-Muster: 110 1 10 11 Vorzeichendarstellung (Beispiele): + 1023

1023

IUI ! 0001

1 i m | oooo

1

0

1 i m ; oooi I

1111 ! oooo I 0

1 im ] ooio 2

i m ! ooio 2

I too ; 0011 +

3

iioi ! oou -

3

1.2.2 Die Darstellung von Buchstaben und Sonderzeichen Buchstaben werden im Byte in der Weise dargestellt, daß die bit-Muster 0 0 0 1 bis 1 0 0 1 zur Darstellung der Ziffern 1 bis 9 in den bit-Positionen 3 2 1 0 mit den bit-Mustern 1 1 0 0, 1 1 0 1 und 1 1 1 0 in den bit-Positionen 7 6 5 4 kombiniert werden. Die Darstellung geschieht in Analogie zum Lochkartencode, wobei die bit-Muster 1 1 0 0, 1 1 0 1 und 1 1 1 0 die Funktionen der Zonenlochungen 12, 11 und 0 übernehmen. In diesem Zusam-

1.2 Der EBCDI-Code

13

menhang nennt man auch die bit-Positionen 7 6 5 4 den „Zonenteil" und die bit-Positionen 3 2 1 0 den „Ziffernteil" des Byte. Buchstabendarstellung bitPos.

3 2 10 3 2 10 3 2 10 3 2 10 3 2 10 32 10

3 2 10 3 2 10 32 10

76 5 4

0001

0010

0011

0100

0101

0110

Olli

1000

1001

1100 1101 1110

A J

Β Κ S

c L Τ

D Μ U

Ε Ν V

F 0 W

G Ρ X

Η Q Y

I R Ζ

Für die Verschlüsselung der Sonderzeichen werden ebenfalls der Zonenteil und der Ziffern teil des Byte benötigt. Eine unmittelbare Analogie zum Lochkartencode läßt sich hierbei jedoch nicht herstellen. Sonderzeichendarstellung bitPos.

32 10

32 1 0

32 10

32 10

32 10

32 10

32 10

32 10

7654

0000

0001

1010

1011

1100

1101

1110

1111

0100 0101 0110 Olli

blank &


=

? II

1.2.3 Die sedezimale Schreibweise von bit-Mustern Bei der Angabe von Byte-Inhalten ist es recht umständlich, die bit-Muster hinzuschreiben. Auch lassen sich diese bit-Muster wegen ihrer Unübersichtlichkeit nur schwer entschlüsseln. Um nun das Schreiben und Lesen von Byte-Inhalten zu erleichtern, wurde die sedezimale Schreibweise geschaffen. Diese Schreibweise beruht auf der Einteilung des Byte in zwei 4-er Gruppen (Tetraden) von bit-Positionen und der Kennzeichnung der bit-Muster in jeder Tetrade durch ein einfaches Zeichen. Die Aufteilung des Byte in zwei Tetraden ergibt sich aus der Natur des EBCDI-Code, bei dem für die Verschlüsselung von Ziffern, Buchstaben und Sonderzeichen die bit-Positionen 7 6 5 4 und 3 2 1 0 als selbständige logische Einheiten zusammenwirken. Für diese logischen Einheiten sind neben den Bezeichnungen „Zonenteil" und ,Ziffernteil" vor allem im Zusammenhang mit der sedezimalen Schreibweise auch die Bezeichnungen „linkes Halbbyte" und „rechtes Halbbyte" gebräuchlich.

1. Die Darstellung von Daten in Bytemaschinen

14

Mit den 4 bits einer Tetrade lassen sich 2 4 = 16 verschiedene bit-Muster erzeugen, denen man je eine Ziffer des Sedezimalsystems, zu Deutsch 16-er System, zuordnet. Die 16 Ziffern des Systems lauten 0 1 2 3 4 5 6 7 8 9 Α Β C D Ε F Die Zuordnung der Ziffern zu den bit-Mustern geschieht nun nicht willkürlich, sondern nach folgendem sinnreichen Prinzip: Die einzelnen bit-Positionen der Tetrade erhalten duale Stellenwerte, und zwar erhält die Position Nr. 0 den Wert 2°, die Position Nr. 1 den Wert 2 1 usw.; allgemein gilt: dualer Stellenwert = 2 bit P o s i , i o n Wichtig ist, daß die bit-Positionen in jeder Tetrade, also auch im linken Halbbyte von 0 bis 3 numeriert werden. Multipliziert man jetzt die Einsen eines bit-Musters mit den entsprechenden Stellenwerten und addiert man die Produkte, so erhält dieses bit-Muster einen bestimmten Dezimalwert. Dabei können sich Dezimalwerte zwischen 0 und 15 ergeben. Diesen Werten ordnet man schließlich die Sedezimalziffern 0 bis F entsprechend den Positionsnummern 0 bis 15 in der oben dargestellten Reihenfolge zu. Beispiel: Das bit-Muster 1011 hat den Dezimalwert 1 · 2 3 + 0 · 2 2 + 1 · 21 + + 1 -2° = 11. Die elfte Sedezimalziffer lautet aber B. Folglich wird dem bitMuster 1011 die Ziffer Β zugeordnet. Zuordnung von Sedezimalziffern zu bit-Mustern bit-Muster 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1

0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1

0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

Dezimalwert

Sedezimalziffer

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

0 1 2 3 4 5 6 7 8 9 A Β C D Ε F

2 3 22 2* 2° (duale Stellenwerte) Anm.: Die Zeichen Α bis F sind hier nicht als Buchstaben, sondern als Sedezimalziffern zu verstehen!

15

1.2 Der EBCDI-Code

Der Vorzug dieses Systems besteht wie gesagt in der Möglichkeit der Kompaktdarstellung von bit-Mustern in Halbbytes. Statt 1 1 1 0 schreibt man einfach E, oder statt 1 0 0 1 einfach 9. Nutzt man dies für die in den vorangehenden Kapiteln dargestellten EBCDI-Verschlüsselungen von Ziffern, Zahlen, Buchstaben und Sonderzeichen aus, so erhält man nunmehr folgende Codiertabellen:

Ziffern dezimal

EBCDI (sedezimal)

0 1 2 3 4 5 6 7 8 9

F0 Fl F2 F3 F4 F5 F6 F7 F8 F9

Zahlen dezimal

EBCDI (sedezimal)

(+) 1023 + 1023

F1F0F2F3 F1F0F2C3 od. F1F0F2A3 od. F1F0F2E3 F1F0F2D3 od. F1F0F2B3

-

1023

Buchstaben linkes Halbbyte

rechtes Halbbyte 1 2 3 4 5 6 7 8 9

C D Ε

Α Β C D Ε F G Η I J Κ L Μ Ν Ο Ρ Q R s τ υ V WΧ Υ Ζ

16

1. D i e D a r s t e l l u n g v o n D a t e n in B y t e m a s c h i n e n

Sonderzeichen linkes Halbbyte 4 5 6 7

0

1

blank &

rechtes Halbbyte A Β C Φ ι

/

* #

< %

D

Ε

F

( )

+

ι Ί 7

-

@

;

> =

ι>

In den nachfolgenden Ausführungen wird ausgiebig von der sedezimalen Schreibweise Gebrauch gemacht. Aus diesem Grund wird empfohlen, sich mit den Grundzügen dieser Schreibweise vertraut zu machen. Vor allem sollte stets beachtet werden, daß mit jeder Sedezimalziffer ein 4-bit-Muster gemeint ist, denn nur in dieser Form befinden sich die Daten in der Maschine.

1.3 Die dezimal gepackte Zahlendarstellung Eine Eigenheit von Bytemaschinen ist, daß arithmetische Operationen nicht im EBCDI-Code, sondern entweder im sogenannten dezimal gepackten oder im dualen Code oder in der sedezimalen Gleitpunktdarstellung vorgenommen werden. Der ASSEMBLER-Programmierer hat dabei für die Umcodierung zu sorgen; d. h. die im EBCDI-Code eingelesenen Zahlen müssen zum Zweck der Dezimalrechnung gepackt werden. Umgekehrt ist zu beachten, daß das Ausdrucken von Zahlen nur im EBCDI-Code möglich ist; d.h. die Resultate irgendwelcher Rechnungen müssen zu diesem Zweck wieder entpackt werden. Soll dual gerechnet werden, so ist zu beachten, daß die Umwandlung vom EBCDI-Code in den Dual-Code nur über den dezimal gepackten Code möglich ist. Das gleiche gilt auch für die Rückumwandlung. Die Code-Umwandlung in die und aus der sedezimalen Gleitpunkt-Darstellung ist nur mit Hilfe größerer Programmstücke möglich. Dabei werden in der Regel sowohl die dezimal gepackte als auch die duale Zahlendarstellung als Zwischenstufen benötigt. Der Vorgang des Packens besteht nun darin, daß die EBCDI-verschlüsselten Zahlen in ein anderes Bytefeld umgespeichert werden, wobei jedoch nur die rechten Halbbytes, also die Ziffernteile übertragen werden. Zugleich wird so übertragen, daß in den neuen Bytes beide Halbbytes mit Ziffern belegt werden; die ohnehin redundanten bit-Muster 1 1 1 1 (sedezimal: F) aus den linken Halbbytes entfallen dabei. Ausgenommen von dieser Regel ist die niederst-

17

1.4 Die duale Zahlendarstellung

wertige (äußerst rechte) Stelle des Zahlenfeldes. Hier wird das bit-Muster 1 1 1 1 (bzw. 1 1 0 1, falls die Zahl negativ ist) zum Zweck der Vorzeichendarstellung mit übertragen, jedoch tauschen Vorzeichen und Ziffer die Halbbytes. Der Vorgang des Entpackens verläuft genau entgegengesetzt, wobei die bitMuster 1 1 1 1 automatisch in die linken Halbbytes eingesetzt werden. Auch das Vorzeichen wechselt wieder das Halbbyte. Beispiele: i m ! oioo 1

i m ! ooio 1

V

1101

; 0011

Packen

oioo | ooio

ooii 1 iioi

I

1

0

oooi ! oooo

. X

Entpacken 1111

\

5

οίοι ! ιιοο

i m ! oooo

0001

ιιοο ! οίοι t

5

In sedezimaler Schreibweise stellen sich diese Vorgänge wie folgt dar: F4

F2

D 3

4

2

3 D

1ι X

Packen

/ IX I

Entpacken Fl

0

5 C

F0

C 5

1.4 Die duale Zahlendarstellung Die duale Zahlendarstellung spielt eine wichtige Rolle bei der Berechnung von Arbeitsspeicheradressen und bei der arithmetischen Verarbeitung numerischer Daten. Für letztere sind die Zahlen von der EBCDI-Verschlüsselung über die dezimal gepackte Form in die duale Codierung zu überfuhren.

18

1. Die Darstellung von Daten in Bytemaschinen

Die duale Zahlendarstellung tritt auf im Halbbyte, Byte, IV2 Byte, Halbwort (2 Bytes), Wort (4 Bytes) und in den Festpunktregistern. Das allgemeine Codierungsprinzip ist, daß man den bit-Positionen dieser Bytegebilde duale Stellenwerte zuordnet, und zwar stets von rechts nach links, wie das folgende Schema zeigt. Χ

0

Χ Κ * 4) OD

t υ « >, Χ χ> £>

1 χ



χ

ι> α

κa >Ν a

χ

χ

Ο

CO 9·

_ ®

11

τ

Ο

χ χ χ x x x

s 9

x

»

x

x

•β

x

x

x

x

x

x

> C>D

x

ν c V § 22 £> r>

£

x

£

x

CO

x

υ>>

3 ι 3 a ::

χ

O

χ χ χ

χ

'

0

1.5 Die Zahlendarstellung im Halbwort, Wort und Festpunktregister

19

Der duale Stellenwert ergibt sich aus dem Ausdruck 2bit-Position Die in diesen Bytegebilden dargestellten Zahlen haben dann folgenden Dezimalwert: z n _ ι · 2 n _ 1 + z n _ 2 · 2 n ~ 2 + . . . + ζ 2 · 2 2 + z l -2 1 + z 0 - 2 ° = Zahl 1 0 Dabei haben die z t die Werte 0 oder 1 und η ist die Anzahl der Dualziffern. Beispiel: 01011001 2 = 0 · 2 7 + 1 ·2 6 + 0 - 2 s + 1 ·2 4 + 1 · 2 3 + 0 · 2 2 + 0 - 2 1 + 1 -2° = 0 + 64 + 0 + 16 + 8 + 0 + 0 + 1 = 89 1 0 Die größte im Halbbyte darstellbare Zahl ist: l l l l j = 2 3 + 2 2 + 2 1 + 2° = 8 + 4 + 2 + 1 = 1 5 1 0 = 2 4 - 1 Die Zahl der möglichen bit-Muster ist hingegen 16 = 2 4 . Die größte im Byte darstellbare Zahl ist: 11111111 2 = 2 7 + 2 6 + 2S + 2 4 + 2 3 + 2 2 + 2 1 + 2° = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 1 0 = 28- 1 Die Zahl der möglichen bit-Muster ist hingegen 256 = 2 S . Die größte in l ' / i Bytes darstellbare Zahl ist: 1111111 l l l l l j = 2 n + 2 1 0 + 2 9 + 2 S + (2 8 - 1) = 2048 + 1024 + 512 + 256 + 255 = 4095,0 = 2 1 2 - 1 Die Zahl der möglichen bit-Muster ist hingegen 4096 = 2 1 2 . Die Zahlen 15, 255 und 4095 treten im Zusammenhang mit der Adreßrechnung sehr häufig auf. Es wird daher empfohlen, sie im Gedächtnis zu behalten.

1.5 Die Zahlendarstellung im Halbwort, Wort und Festpunktregister Halbwort und Wort im Arbeitsspeicher sind Operanden für die Dualarithmetik, die mit Hilfe der Festpunktregister abgewickelt wird. Die in diesen Bytegebilden verschlüsselten Zahlen müssen daher auf die Zahlendarstellung in den Festpunktregistern abgestimmt sein. Gegenüber der rein dualen Zahlendarstellung besteht hierbei insofern ein Unterschied, als im Halbwort, Wort und Festpunktregister die jeweils höchste

20

1. Die Darstellung von Daten in Bytemaschinen

(äußerst linke) bit-Position der Vorzeichendarstellung vorbehalten ist, und zwar gilt: Positive Zahlen beginnen mit einer 0 und negative Zahlen mit einer 1 in der 15. bzw. 31. bit-Position. Ferner gilt für negative Zahlen die Besonderheit, daß sie ausschließlich im sogenannten Zweierkomplement dargestellt werden. Diese Komplementierung geschieht in der Weise, daß von der bit-Position 0 ausgehend alle Nullen (so vorhanden) bis einschließlich der ersten Eins übernommen und daß von da ab alle Dualziffern umgekehrt werden. Also aus Einsen werden Nullen und umgekehrt. Um diese Komplementierung braucht sich jedoch der Programmierer normalerweise nicht zu kümmern, da sie von der Maschine automatisch vorgenommen wird. Allerdings sind diese Maschinenfunktionen auch durch den Programmierer ansprechbar. Beispiele: + 10S l o IS

31

- 105,o 0

IS

31

0

0 . . . . 01101001 => 1 . . . . 10010111 — 76 1 0 15 15 31 0 31 1 . . . . 10110100 => 0

+ 76 1 0 0 01001100

Das letzte Beispiel zeigt, daß die Komplementierung einer negativen Dualzahl (des Zweierkomplements) wieder die ursprüngliche positive Dualzahl ergibt. Die größten im Halbwort und Wort darstellbaren positiven Zahlen sind: 1 5 14 31 30 0 0 11 1, was den Dezimalzahlen 2 ' 5 - 1 = 32767 bzw. 2 3 1 - 1 = 2147483647 entspricht. Die dem Betrag nach größtmöglichen negativen Zahlen im Wort und Halbwort sind: 15 14 31 30 υ 1 00 0, was den Dezimalzahlen - 2 1 5 = - 32768 bzw. - 2 3 1 = - 2147483648 entspricht; dabei wird also die Vorzeichenstelle zugleich auch als Ziffernstelle ausgenutzt. Die Komplemente dieser größten negativen Zahlen ergeben sich nach der genannten Regel ebenfalls zu I5 31

1 00

0

0,

21

1.6 Exkurs: Zahlensysteme

d.h. sie bleiben negativ. Daher ist die Komplementierung der größten negativen 7 in Ion nicht ni^ht möglich. mÄnli^li Zahlen Die Dualzahl 1 5 31

1 1 1

0

1 1

stellt eine dezimale - 1 dar, denn ihr Komplement ist 15 31

Ο

0 0 0

0 1,

15 31 1 1 1

Ο 1 10

also eine dezimale + Die Dualzahl

stellt eine dezimale - 2 dar, denn ihr Komplement ist 15 31 0 0 0

ο 0 1 0,

also eine dezimale + 2. Die Dualzahl 15 31 1 1 1

Ο 10 1

stellt eine dezimale - 3 dar, denn ihr Komplement ist 15 31 ο 0 0 0 O l 1, also eine dezimale +3. Zur Übung stelle man die Zahlen - 4 bis - 10 im Dual-Code dar und überprüfe sie durch Rückkomplementierung.

1.6 Exkurs: Zahlensysteme 1.6.1 Die polynomiale Zahlendarstellung Das allen geläufige dezimale Zahlensystem basiert auf 10 Ziffern, nämlich 0 bis 9. Diese stehen in Gruppen zusammen und bilden durch Zuordnung zu dezimalen Stellenwerten die Dezimalzahlen. Nimmt man also beispielsweise die Zifferngruppe 9172 und ordnet man z.B. der 9 den Stellenwert 1000, der 1 den Stellenwert 100, der 7 den Stellenwert

22

1. Die Darstellung von Daten in Bytemaschinen

10 und der 2 den Stellenwert 1 zu, so erhält man die Dezimalzahl 9 · 1000 + 1 100 + 7 · 10 + 2 -1 ; in Worten: neuntausendeinhundertzweiundsiebzig. Wählt man andere Stellenwerte, z.B. 10, 1, '/io. '/ioo> malzahl

so

ergibt sich die Dezi-

9 1 0 + 1 1 + 7 - 7 , 0 + 2-Vioo; die üblicherweise als 91,72 (in Worten: einundneunzig-Komma-siebenzwei) geschrieben wird. Aus den Beispielen erkennt man, daß es sich bei den Stellenwerten durchweg um 1 Oer-Potenzen handelt. Dezimalzahlen lassen sich daher allgemein als Polynome der folgenden Art beschreiben: Z 1 0 = Z n - i · 1 0 n ~ ' + . . . + z 2 · 102 + ζ , · 101 + z 0 · 10° + z _ , · 1 0 - 1 + . . . . . . + z _ m · 10"m Darin bedeuten: Zl0: Dezimalzahl 10: Basis des Zahlensystems Zj: Dezimalziffer, 0 < Zj < 9 10': Stellenwert der Ziffer Z; n: Zahl der Ziffern „vor dem Komma" m: Zahl der Ziffern „nach dem Komma" Nun läßt sich nicht nur auf der Basis 10, sondern auf der Basis jeder natürlichen Zahl größer 1 ein Zahlensystem aufbauen. Zwei solcher Zahlensysteme, nämlich das duale und das sedezimale, wurden bereits vorgestellt. Die allgemeine Form der Zahlensysteme lautet: Z b = Z n - i - b n - ' + . . . + z 2 b 2 + z, b 1 + z 0 . b ° + z_, b - 1 + . . . • · + z_m • b

w

Darin bedeuten: Zb : b: Zy b': n: m:

Zahl eines bestimmten Zahlensystems Basis des Zahlensystems Ziffer, 0 < z( < b - 1 Stellenwert der Ziffer Zj Anzahl der Ziffern „vor dem Komma" Anzahl der Ziffern „nach dem Komma"

1.6 Exkurs: Zahlensysteme

23

Übersicht über die im ASSEMBLER relevanten Zahlensysteme: Dezimalsystem

Dualsystem2

Sedezimalsystem

Basis

10

2

Ziffern

0 bis 9

0 bis 1

16 0 bis F

Stellenwerte

...10 2 10' 10° ίο- 1 ... . . . 2 3 2 2 2 l 2°

...16 2 16'16° 16"'...

1.6.2 Die Umrechnung von Zahlen in andere Zahlensysteme Der ASSEMBLER-Programmierer wird häufig vor der Aufgabe stehen, Zahlen eines Zahlensystems in Zahlen eines anderen Zahlensystems umzurechnen. Diese Arbeit wird durch die in allen Programmierhandbüchern abgedruckten Umrechnungstabellen erleichtert (vgl. dazu auch Anhang S. 317). Jedoch dekken diese Tabellen zumeist nur einen eng begrenzten Zahlenbereich ab; auch sind diese Tabellen nicht immer zur Hand. Aus diesen Gründen ist es nützlich, die diesen Tabellen zugrundeliegenden Umrechnungsverfahren zu kennen. a) Umrechnung von Dualzahlen und Sedezimalzahlen in Dezimalzahlen Diese Umrechnung benutzt die polynomiale Zahlendarstellung, und zwar ist Z 1 0 = z n _ , b n _ 1 + . . . + z 2 b 2 + z, •b 1 + z 0 b ° + z _ r b _ 1 + . . . • · . + z-m.b"m Darin bedeuten: Z 1 0 : gesuchte Dezimalzahl Zji Dualziffer (Sedezimalziffer) als Dezimalzahl geschrieben bl:

dualer (sedezimaler) Stellenwert als Dezimalzahl geschrieben

Beispiele: (1)

Die Dualzahl 011101 ist in eine Dezimalzahl umzurechnen. 011101 2 = 0 · 2 5 + 1 · 24 + 1 · 2 3 + 1 · 22 + 0 · 2' + 1 - 2 ° = 0 + 1 6 + 8 + 4 + 0 + 1 = 29,o

(2)

Die Sedezimalzahl A2E ist in eine Dezimalzahl umzurechnen. A2E 1 6 = A · 162 + 2 · 16' + E · 16° = 10-250 + 2 · 16 + 14· 1 = 2606, o

2

Gebrochene Dualzahlen sind im Zusammenhang mit der elektronischen Datenverarbeitung nicht üblich.

24

1. Die Darstellung von Daten in Bytemaschinen

(3)

Die Sedezimalzahl E.3 ist in eine Dezimalzahl umzurechnen. E.3 16 = E · 16° + 3 · 1 6 = 14 -1 + 3 - '/ιβ = 14.1875 10

b) Umrechnung ganzzahliger Dezimalzahlen in Dualzahlen und in Sedizimalzahlen Die Umrechnung von ganzzahligen Dezimalzahlen in andere Zahlensysteme geht ebenfalls von der bereits vorgeführten polynomialen Schreibweise aus; jedoch bricht hier wegen der Ganzzahligkeit das Polynom mit dem Stellenwert b° ab. Zio = Zn-i - b " - 1 + . . . + z 3 b 3 + z 2 b 2 + ζ, -b 1 + z 0 b° Bekannt sind jetzt aber die Dezimalzahlen Z 1 0 und die Basis b des Zahlensystems, in das Z 1 0 umgerechnet werden soll. Gesucht werden hingegen die Ziffern z n - i bis z 0 der betreffenden Zahl im b-Zahlensystem. Aus diesem Grunde wird das obige Polynom zunächst mit Hilfe des Hornerschemas dargestellt: Zio = Zo + b(z 1 + b ( z J + b ( z 3 + . . • + b z n _ 1 ) ) ) · · ) Sodann werden die gesuchten Ziffern z ; durch fortgesetzte Modulodivision 3 dieses Polynoms mit der Basis b ermittelt. Dies ist möglich, weil die Ziffern Zj wegen 0 < Zj < b — 1 stets kleiner als die Basis b sind und daher als Divisionsreste herausfallen. Betrachtet man das obige Hornerschema, so ist leicht einzusehen, da£ bei der Division von Z 1 0 durch b das Resultat z, + b(z 2 + b ( z 3 + . . . + b z n _ 1 ) ) . . .) lautet, wobei z 0 als Rest bleibt. Dividiert man dieses Resultat wieder durch b, so erhält man z j + b ( z 3 + . . . + b · z n _ ι ) . . .) und als Rest bleibt z , , usw. Geht man ohne Beschränkung der Allgemeinheit von einem Polynom vierten Grades aus und bezeichnet man alle im Laufe des Algorithmus auftretenden Dividenden mit yj, dann läßt sich dieses Polynom wie folgt auflösen: 3

Modulodivision ist eine Division, bei der als Resultat der jeweilige Divisionsrest genommen wird.

1.6 E x k u r s : Z a h l e n s y s t e m e

25

Ζ,ο = Zo + b ( z , + b(z 2 + b ( z 3 + b · z 4 ))) Ν __v / Yo ^ V ' y, = z, + b(z 2 + b(z 3 + b z 4 ) ) y 2 = z 2 + b(z 3 + b z 4 ) Y3 = z 3 + b • z 4

Der schematische Ablauf des Algorithmus stellt sich dann wie folgt dar: Zio = Yo : b = y,

Rest z 0

y, : b = y 2

Rest z,

yf^C^yi

Rest z 2

y3 : b = y4

Rest z 3

y4 : b = 0

Rest z 4

Die Dezimalzahl Z 1 0 wird also im b-Zahlensystem durch die Ziffernfolge z 4 z 3 z 2 Zj z 0 repräsentiert. Beispiele: (1)

Gegeben sei die Dezimalzahl 38; gesucht wird die entsprechende Dualzahl 38:2=19

Rest 0 (z 0 )

19:2 = 9

Rest 1 (z,)

9:2=

4

Rest 1 (z 2 )

4:2=

2

Rest 0 (z 3 )

2:2=

1

Rest 0 (z 4 )

1:2=

0

Rest 1 (z 5 )

Es ist also 38 1 0 = 100110 2 Probe: 1 · 2 5 + 0 - 2 4 + 0 · 23 + 1 - 22 + 1 · 21 + 0 · 2° = 32 + 0 + 0 + 4 + 2 + 0 = 38,o

26

1. Die Darstellung von Daten in B y t e m a s c h i n e n

(2)

Gegeben sei die Dezimalzahl 38; gesucht wird die entsprechende Sedezimalzahl 38 : 16 = 2

Rest 6 (z 0 )

2:16 = 0

Rest 2 (z,)

Es ist also 38 1 0 = 26, 6 Probe: 2 -16' + 6 · 16° = 32 + 6 = 38 1 0 c) Umrechnung von Dezimalbrüchen in Sedezimalbriiche Diese Umrechnung ist vor allem für das Verständnis der sedezimalen Gleitpunktarithmetik von Bedeutung. Ausgangspunkt der Rechnung ist wieder die polynomiale Darstellung; diese sieht für Dezimalbrüche wie folgt aus: .Z,o = z _ , · b ~ ' + z _ 2 · b - 2 + . . . + z _ m · b " m oder als Hornerschema geschrieben: •Z,o = b - ' i z , ! + b - » ( z - 2 + b - ' ( z _ 3 + · · · + b " 1 • z _ m ) ) ) . . .) Die Ziffern z_, bis z _ m werden nun nicht durch fortgesetzte Modulodivision. sondern durch fortgesetzte Multiplikation mit der Basis b gewonnen. Betrachtet man das obige Hornerschema, so ist leicht einzusehen, daß sich bei der Multiplikation von .Z 10 mit b als Produkt z _ , + b~ 1 (z_2 + b~ 1 (z_3 + . . . + b _ l · z _ m ) ) . . .) ergibt. Spaltet man z_, ab und multipliziert man den Rest wieder mit b, so ergibt sich z_2 usw. Geht man ohne Beschränkung der Allgemeinheit von einem Polynom (minus) dritten Grades aus und bezeichnet man alle im Laufe des Algorithmus auftretenden Multiplikanden mit y j t dann läßt sich dieses Polynom wie folgt auflösen: .Z l 0 = b~ 1 (z_ι + b - 1 (/....2 + b~ ' • z._3)) X.

^

'

y~ ι y

2

=b

l

(z

1

?+b

-z

\ y j - b

3)

' 1

ζ

27

1.6 Exkurs: Zahlensysteme

Der schematische Ablauf des Algorithmus stellt sich dann wie folgt dar: y_!

b = z _ , + y_2

y _ 2 · b = z_2 + y _ 3 y _ 3 · b = z_3 Der Dezimalbruch .Z 1 0 wird also im b-Zahlensystem durch die Ziffernfolge z _ [ z_2 z_3 repräsentiert. Beispiele: (1)

Gegeben sei der Dezimalbruch 0.3; gesucht wird der entsprechende Sedezimalbruch .3 1 6 = 4 + .8

USW.

Schreibt man die gefundenen Werte z_ ι als Sedezimalziffern, so erhält man 0 . 3 l o = 0.4CC (2)

Gegeben sei die Dezimalzahl 213.04; gesucht wird die entsprechende Sedezimalzahl a) Umrechnung des ganzzahligen Teiles: 213 : 16 = 13 13:16=

0

Rest

5

Rest 13(D)

b) Umrechnung des Dezimalbruchs: 0.04-16=

0

+0.64

0.64-^=J0(A)_+0.24 0.84 0 . 8 4 · 16 = 13(D) + 0.44

usw.

28

1. Die Darstellung von Daten in Bytemaschinen

Es ist also 213.04 10 = D5.0A3D . . . . 1 6 Probe: 13 · 161 + 5 · 16° + 0 · 1 6 " 1 + 10·16~ 2 + 3 · 16" 3 + 13 · 16~4 as 208 + 5 + 0 + 0.0391 + 0.0007 + 0.0002 = 213.04,0 d) Umrechnung von Dualzahlen in Sedezimalzahlen Für die Umrechnung einer Dualzahl Z 2 in eine Sedezimalzahl Z, 6 benutzt man am einfachsten wieder die polynomiale Darstellung. Z16 = Zn-i l 6 n _ 1 + . . . + ζ 0 ·16° Die Sedezimalziffern z n _ i bis z 0 erzeugt man sich aus der Dualzahl, indem man diese von rechts nach links in Tetraden einteilt (dabei ist die äußerst linke bit-Gruppe eventuell mit fuhrenden Nullen aufzufüllen) und diese dann in die entsprechenden Sedezimalziffern umcodiert. Beispiel: Gegeben sei die Dualzahl 111011011. Diese wird eingeteilt und umcodiert. 0001 I 11011 1011 ι I 1 D Β Dann ist Z 2 = 1 -16 2 + D · 16* + Β 16°= 1DB 16 Zur Probe werden beide Zahlen in Dezimalzahlen umgerechnet: Zi = 1 · 2 8 + 1 · 2 7 + 1 · 2 6 + 0 · 2 5 + 1 · 24 + 1 • 2 3 + 0 · 22 + 1 · 21 + 1 · 2° = 256 + 128 + 64 + 0 + 16 + 8 + 0 + 2 + 1 = 475,0 oder Z 1 6 = 1 • 162 + D · 16' + B· 16° = 1 256 + 13 -16 + 11 1 = 256 + 208 + 11 = 475,o e) Umrechnung von Sedezimalzahlen in Dualzahlen Für die Umrechnung einer Sedezimalzahl Z 1 6 in eine Dualzahl Z2 empfiehlt sich ein analoges Vorgehen. Z 2 = z n _ , · 2 n _ I + . . . + z 0 - 2°

1.7 Die Zahlendarstellung ίτη Gleitpunktregistei

29

Die Dualziffern z n - \ bis z 0 erzeugt man sich aus den Sedezimalziffern, indem man diese in die entsprechenden Tetraden auflöst. Beispiel: Gegeben sei die Sedezimalzahl 2FA; diese Zahl wird in folgende Tetraden aufgelöst:

ooio Jim! loio I

1

Dann ist Z 1 6 = 1 · 29 + 0 · 2 8 + 1 · 2 7 + 1 · 26 + 1 · 25 + 1 · 24 + 1 · 2 3 + 0 · 22 + 1 · 21 + 0 · 2° = lOlllllOlOj Zur Übung rechne man beide Zahlen in Dezimalzahlen um.

1.7 Die Zahlendarstellung im Gleitpunktregister Eine Gleitpunktszahl setzt sich zusammen aus dem Vorzeichen, dem Exponenten und der Mantisse; dabei enthält die Mantisse die Ziffernfolge und der Exponent gibt den Stellenwert der äußerst linken Ziffer an. Es besteht die Möglichkeit, Zahlen in Gleitpunktregistern in zwei verschiedenen Längen darzustellen und zu verarbeiten, wobei sich diese Längenunterschiede allein auf die Mantisse beziehen. Kurze Gleitpunktzahien ν Exp. 63

62

56 55

32

Es werden nur die bit-Positionen 63 bis 32 des Gleitpunktregisters benutzt. Lange Gleitpunktzahlen V Exp. 63

62

56 55

0

Es werden alle bit-Positionen des Gleitpunktregisters benutzt. Vorzeichen Positive Zahlen haben in der bit-Position 63 eine 0; negative Zahlen haben dort eine 1. Das Vorzeichen-bit ist das einzige Unterscheidungsmerkmal zwi-

30

1. Die Darstellung von Daten in Bytemaschinen

sehen positiven und negativen Gleitpunktzahlen. Eine Komplementierung wie bei den dualen Festpunktzahlen findet nicht statt. Exponent Für die Verschlüsselung der Exponenten stehen 7 bit-Positionen zur Verfügung. Damit lassen sich Dezimalzahlen zwischen 0 und 127 dual verschlüsseln. Um nun aber negative und positive Exponenten zur Verfügung zu haben, wird der 0 der Wert - 65, der 1 der Wert - 64, . . . . , der 65 der Wert 0, der 66 der Wert +1, der 126 der Wert +61 und schließlich der 127 der Wert + 62 zugeordnet. Auf diese Weise gewinnt man Exponenten im Bereich von - 6 5 bis +62. Mantisse Die Mantisse bietet die Besonderheit, daß in ihr Dualzahlen verschlüsselt werden, daß aber die bit-Muster tetradenweise als Sedezimalziffern interpretiert und verarbeitet werden. Der Exponent gibt also den sedezimalen Stellenwert der äußerst linken Sedezimalziffer der Mantisse (bit-Positionen 55, 54, 53, 52) an. Beispiele: 63

32

0 loo: 0001 + 65- 0

0110 6

1110 Ε

00 ..

. . . 0

-1 + 6 16° + Ε · 1 6 = + 6.E, 6 = + 6.875,0

63

32

1 on; Uli 63 - _ 2

1000 8 -

63 0 loo ! 0010 f 66- 1

0 . . .

. . .

0

8 · 16"-2 _ _ 0.08, 6 = - 0.03125,0 32

1101 D

οιοι 5

+ D 161 + 5

0000 0

1010 A

0011 3

1 101 D

16° + 0 · 1 6 - 1 + Α · 16~ 2 + 3 · 16~ 3 + D 16~ 4

= + D5.0A3D, 6 ~ + 213.04,0

2. Maschineninstruktionen und Operandenadressierung 2.1 Allgemeine Vorbemerkungen Bytemaschinen verfugen in der Regel über einen Vorrat von mehr als 140 Maschinenfunktionen, die der Verarbeitung der Daten, also dem Datentransport, dem Datenvergleich, der Datenveränderung und der dynamischen Programm-Modifikation dienen. Diese Funktionen werden durch Maschineninstruktionen ausgelöst; dies sind Bytefolgen im Arbeitsspeicher, deren bitMuster nach der Decodierung durch das Steuerwerk die betreffenden Funktions moduln der Maschine aktivieren. Eine Folge von Maschineninstruktionen bildet das sogenannte Maschinenprogramm (Objektprogramm), mit dessen Hilfe eine entsprechende Folge von Maschinenfunktionen zur automatischen Abwicklung einer Datenverarbeitungsaufgabe gesteuert wird. Die Erzeugung der Maschineninstruktionen und der Objektprogramme im Arbeitsspeicher wird Gegenstand späterer Erörterungen sein. Im folgenden sollen zunächst der Aufbau und die Wirkung der Maschineninstruktionen und insbesondere der in ihnen verankerte Zugriff zu den Operanden behandelt werden. Dazu sei vorweg bemerkt, daß es bei Bytemaschinen 4 verschiedene Arten von Operanden gibt, und zwar Registeroperanden, Arbeitsspeicheroperanden, Direktoperanden und Kanalworte 4 . Registeroperanden werden dadurch adressiert, daß in den Maschineninstruktionen die Nummern der Operandenregister (Festpunktregister 0 bis 15, Gleitpunktregister 0, 2, 4, 6 ) verschlüsselt sind. Speicheroperanden werden durch Basisadreßregister, Distanzadressen und bei bestimmten Instruktionstypen zusätzlich durch Indexregister adressiert; dabei bestimmt sich die Speicheradresse eines Operanden aus dem Inhalt des Basisadreßregisters plus Distanzadresse bzw. aus dem Inhalt des Basisadreßregisters plus dem Inhalt des Indexregisters plus Distanzadresse. Die Registernummern und die Distanzadressen sind in den Instruktionen verschlüsselt. Direktoperanden schließlich sind unmittelbarer Bestandteil der betreffenden Maschineninstruktion, d.h. ihr Wert ist in der Instruktion verschlüsselt; eine Adressierung ist daher nicht erforderlich.

4

Kanalworte werden in dieser Einführung nicht behandelt.

2.2 Die Instruktionstypen und ihre Formate

32

Zur Darstellung des A u f b a u s der Maschineninstruktionen werden üblicherweise Symbole verwendet, deren Bedeutung nachfolgend beschrieben wird. Op.-Code R Β X D

- Operationscode der Instruktion - Operandenregister — Basisadreßregister (Basisregister) — Indexadreßregister (Indexregister) — Distanzadresse (displacement)

I L Μ

— Direktoperand ( i m m e d i a t e o p e r a n d ) - Länge eines Speicheroperanden (in Bytes) — Bedingungsmaske bei Sprungbefehlen

Die Buchstaben R , Β, X, D, I, L u n d Μ werden mit 1, 2 oder 3 indiziert, u m die Operanden zu bezeichnen. Als Besonderheit bei den Registern gilt zu b e a c h t e n , d a ß es sich bei den Basisregistern (B) u n d Indexregistern (X) stets u m die F e s t p u n k t r e g i s t e r 0 bis 15 handelt. Die Operandenregister ( R ) k ö n n e n je nach O p e r a t i o n sowohl Festp u n k t · als auch Gleitpunktregister sein. Die Vergabe der S y m b o l e Β, X u n d R richtet sich n u r nach der aktuellen V e r w e n d u n g : Wenn eines der F e s t p u n k t register als Operandenregister für eine arithmetische o d e r logische O p e r a t i o n b e n u t z t wird, nennt m a n es R ; w e n n es als Basisregister v e r w e n d e t wird, heißt es Β u n d w e n n es als Indexregister fungiert, heißt es X. Die S y m b o l e Β, X u n d R sind somit nur funktionallogische Bezeichnungen. In e i n e m P r o g r a m m kann möglicherweise ein u n d dasselbe Festpunktregister alle 3 F u n k t i o n e n ausüben.

2.2 Die Instruktionstypen und ihre Formate Byte-Maschinen h a b e n 5 I n s t r u k t i o n s t y p e n , die e n t s p r e c h e n d der m i t ihnen angesprochenen O p e r a n d e n a r t e n mit den m n e m o t e c h n i s c h e n Kürzeln R R (Register u n d Register), R X (Register u n d indizierter Speicher), R S (Register und Speicher), SI (Speicher u n d Direktoperand), SS (Speicher u n d Speicher) gekennzeichnet w e r d e n . Bei den SS-Instruktionen unterscheidet m a n die Versionen SS (logisch) u n d SS (arithmetisch), so d a ß m a n insgesamt auch von 6 I n s t r u k t i o n s t y p e n sprechen k a n n . Alle Instruktionen h a b e n einen Operationsteil u n d einen O p e r a n d e n t e i l .

Operationsteil 1 Byte

Operandenteil

2.2 Die I n s t r u k t i o n e n und ihre F o r m a t e

33

Die Verschlüsselung des Operationsteils erfolgt im äußerst linken Byte. Dabei ist von Interesse, daß die bit-Positionen 7 und 6 die Verschlüsselung des Instruktionstyps und der Instruktionslänge übernehmen:

bit-Positionen

ι

6

0 0 0 1 1 0 1 1

Instruktionslänge

Instniktionstyp

2 4 4 6

RR RX RS, SI SS

Bytes Bytes Bytes Bytes

(1 (2 (2 (3

Halbwort) Halbworte) Halbworte) Halbworte)

Durch diese Codierung wird das Steuerwerk u. a. in die Lage versetzt, das Befehlszählregister um die Bytezahl des jeweiligen Befehls zu erhöhen und damit auf die Adresse des nachfolgenden Befehls einzustellen. An das Byte zur Verschlüsselung des Operstionsteils schließen sich je nach Instniktionstyp 1, 3 oder 5 Bytes zur Verschlüsselung des Operandenteils an. Bei den Operanden handelt es sich einmal u m Daten, die mit Hilfe der Instruktionen verarbeitet werden sollen. Diese Daten können in Operandenregistern, im Arbeitsspeicher oder in den Instruktionen selbst stehen. Der betreffende Operandenteil der Instruktionen besteht in diesen Fällen aus der Verschlüsselung der Registernummern oder Speicheradressen. Direktdaten sind in der Instruktion selbst verschlüsselt. Operanden k ö n n e n ferner aber auch Speicheradressen sein, die als Sprungziele dienen oder irgendwelchen Adreßrechnungen unterworfen werden sollen. Diese Adressen können ebenfalls in Operandenregistern stehen oder aber gleichsam als Direktoperanden auftreten. In diesen Fällen besteht der betreffende Operandenteil der Instruktionen ebenfalls aus der Verschlüsselung der Registernummern oder der betreffenden Speicheradressen. Operanden k ö n n e n sodann Steuergrößen für shift-Operationen sein. Sie treten in der F o r m von Speicheradressen als Direktoperanden auf. Es wird jedoch nicht auf eine Speicheradresse zugegriffen, sondern der Wert der „Adresse" bildet die Steuergröße. Operanden k ö n n e n schließlich Bedingungsschlüssel für Verzweigungsoperationen sein. Auch sie treten als Direktoperanden auf, indem sie wie Registernummern erscheinen. Es wird jedoch nicht auf ein Register zugegriffen, sondern die „Registernummer" bildet die Bedingungsmaske. Grundsätzlich haben alle Instruktionstypen zwei Operanden, mit Ausnahme einiger RS-Instruktionen, die drei Operanden haben. Jedoch läßt sich dieser Sonderfall so u m d e u t e n , daß auch hier nur zwei Operanden im Spiel sind.

34

2. Maschineninstruktionen und Operandenadressierung

Ferner gilt, wenn auch mit vielen Ausnahmen, daß nur mit dem ersten Operanden etwas geschieht (Veränderung, Vergleich), während der zweite Operand für die betreffende Operation nur die Information liefert, selbst aber unverändert bleibt. In den Ausnahmefällen ist es genau umgekehrt, d . h . der zweite Operand ist Gegenstand der Operation und der erste Operand liefert die Information. Nachfolgend sollen die Instruktionstypen im einzelnen dargestellt und erläutert werden: RR-Instruktionen RR symbolisiert eine „Register und Register"-Operation, ζ. B. Addieren (Reg. 5> auf (Reg. 3> 5 , d . h . beide Operanden stehen in Operandenregistern. Im Arbeitsspeicher hat dieser Instruktionstyp folgendes Format: R,

Op.-Code 1

Byte

2

Byt«

Die Verschlüsselung der Registeradressen in je einem Halbbyte nutzt die Möglichkeiten des Dual-Code vollständig aus, denn mit 4 bits lassen sich die Dezimalzahlen 0 bis 15 darstellen, also alle möglichen Nummern der 16 Festpunktbzw. 4 Gleitpunktregister. Beispiel für eine RR-Instruktion: Addieren (Reg. 5> auf (Reg. 3> Addieren Register

1

sedezimal:

i A

ooot ! toio ι

hinar:

Reg. 3

3

Ree 5

!

5

0011 ! 0101

RX-lnstruktionen R X b e z e i c h n e t e i n e „ R e g i s t e r u n d i n d i z i e r t e S p e i c h e r " - O p e r a t i o n , ζ . B. s u b t r a h i e r e n S p e i c h e r w o r t v o n ( R e g . 1 0 ) ; d . h . ein O p e r a n d s t e h t in e i n e m R e g i s t e r u n d ein O p e r a n d im A r b e i t s s p e i c h e r . Die I n d i z i e r u n g stellt e i n e b e s o n d e r e F o r i n d e r S p e i c h e r a d r e s s i e r u n g d a r , die in K a p i t e l 2 . 3 . 2 a u s f ü h r l i c h b e h a n d e l t w i r d . Im A r b e i t s s p e i c h e r h a t dieser I n s t r u k t i o n s t y p f o l g e n d e s F o r m a t :

U; r"

Op -OhJl· I. Byte

S

2. Byte

Die Schreibweise ( R e g .

i Bylc

i) b e d e u t e t :

,,Inhalt

4

des

Bylc

Registers

i"

35

2.2 Die Instruktionstypen und ihre Formate

R, ist die Adresse des 1. Operanden (Nummer eines Festpunkt- bzw. Gleitpunktregisters), X 2 und B2 sind Nummern von Festpunktregistern, die als Indexregister und Basisregister zusammen mit der Distanzadresse D 2 die Adresse des 2. Operanden determinieren. Die Verschlüsselung der Distanzadresse in 3 Halbbytes (12 bits) begrenzt ihren Bereich auf 0 bis 4095. Beispiel für eine RX-Instruktion: Subtrahieren Wort von (Reg. 10) Subtrahieren Won

Reg. 10

Reg.:

sedezimaJ

5

Β

A

!

:

8

\

binar

0101

Reg 8

1

\

ο

1

!

F

V Speicherad d Operanden

I

10) 1

Distanzadresse

1

Ί

loio >! ooio

1000 ! 0000

0001 ; IUI

Für Verzweigungsoperationen gilt folgende Sonderform des RX-Formats:

I. Byte

••t

I 1

M]

Op.-Code

J

X,

Β

2. B y t e

I

»

3 Byte

4. Byte

M, ist ein Bedingungsschlüssel, der angibt, welches Resultat einer vorangehenden Vergleichs-, Arithmetik- oder shift-Operation zu einem Sprung zu der mit X 2 , B 2 und D 2 gegebenen Adresse führt. Beispiel: Springen, wenn zwei verglichene Operanden einander gleich sind. bei Springen

Sprungziel

gleich

A

A

0100 J Olli 1

binar.

looo ! loio ι

—- Γ oiii ! oooo

i m «! loio

RS-Instruktionen RS bezeichnet eine „Register und Speicher"-Operation, ζ. B. Laden (mehrfach) Worte in die Register 4 bis 6; d . h . ein Operand (mehrere Speicherworte) steht im Arbeitsspeicher und der andere Operand (ausgedrückt durch den 1. und den 3. Operanden) ist eine zusammenhängende Folge von Registern. Im Arbeitsspeicher hat dieser Instruktionstyp folgendes Format: Op-Code I

Byte

Ri

, :

Rj

Byte

Bj

t*

I

V Byte

• D, 4 4

Byte

2. Maschineninstruktionen und Operandenadressierung

36

R , und R 3 sind die niedrigste und höchste Nummer einer kontinuierlichen Folge von Festpunktregistern ( 1 . Operand). B 2 und D 2 ergeben die Speicheradresse des ersten einer kontinuierlichen Folge von Speicherworten ( 2 . Operand). Beispiel für eine RS-Instruktion: Laden (mehrfach) 3 Worte in die Festpunktregister 4 bis 6. Laden mehrfach

sedezimal:

9

!

Reg. 4 I

8

4

1001 \ 1000

binar:

Speicheradresse des 2. Operanden

Reg. 6

0100

l

r

7

!

6

!

0110

1

; ι

1 !

F

1

Olli ; 0001

im

1

4

S

! oioo

I

Für shift-Operationen gilt folgende Sonderform des RS-Formats: r Op.-Code

R,

1 Byte

1 ι

1 • 0

Β,

2. B y t e

-

iL

Dj

3 Byte

-1 ι Byte

4



R , ist die Nummer eines Festpunktregisters, dessen Inhalt der shift-Operation unterzogen werden soll; + D 2 ist die Steuergröße der shift-Operation. Beispiel: Logischer Links-shift in Register 4 um 7 bit-Positionen; sei gleich 2. Log. Linksshift

Reg. 4

Verschiebezahl



r — — sedezimal:

8

9

4

0

Λ

1

1

1

8

0



1000 i 1001

binar:

0100 i 0000



5

0

1 looo ! oooo

0000 ! 0101

Sl-Instruktionen SI bezeichnet eine „Speicher und Direktoperand"-Operation, ζ. B. Übertragen eines Zeichens in ein Byte im Arbeitsspeicher. Der stets nur 1 Byte (8 bits) umfassende Direktoperand ( 2 . Operand) ist Bestandteil der Instruktion. Im Arbeitsspeicher hat dieser Instruktionstyp folgendes Format: Op.-Code I. Byte

B, 2 Byle

(· 3 Byte

-

1),

1 -,

4 . Byte



2.2 Die Instiuktionstypen und ihre Formate

37

Β, und D, ergeben die Speicheradresse des ersten 1 Byte langen Operanden. I2 ist der ebenfalls 1 Byte lange zweite Operand (Direktoperand), der aus irgendeinem der 256 möglichen bit-Muster bestehen kann. Beispiel für eine Sl-Instruktion: Ubertragen eines ,,+"-Zeichens in ein Byte im Arbeitsspeicher: Ubertragen Direktzeichen A



9

τ ! 1

Speicheradresse des 1 Operanden

4

5



ι

Λ

0

I A I

1

looi I ooio

binär:

1 ! 0 1

0100 I 1110

οίοι ! oooo 1

oooo 1 loio I

SS-Instruktionen SS bezeichnet eine „Speicher und Speicher"-Operation, ζ. B. Addieren < Feld 2 > auf < Feld 1 > oder Vergleichen (Feld 1 > mit < Feld 2 >; d. h. beide Operanden stehen im Arbeitsspeicher. Die SS-Instruktionen treten in zwei Versionen auf, und zwar als SS (arithmetisch) und als SS (logisch). Der Unterschied ist, daß bei SS (arithmetisch) jeder Operand eine besondere Längenangabe hat und daß die Operation jeden Operanden in der angegebenen Länge verarbeitet; ζ. B. wird ein 3 Bytes langer Operand auf einen 5 Bytes langen Operanden addiert. Bei SS (logisch) hat hingegen nur der 1. Operand eine Längenangabe und die Operation verarbeitet beide Operanden in der Länge des 1. Operanden; z.B. wird ein 5 Bytes langer 1. Operand mit einem ebenso langen 2. Operanden verglichen. Im Arbeitsspeicher hat der Instruktionstyp SS (arithmetisch) folgendes Format: SS (arithmetisch)

Op.-Code I.Byte

1 , L, • 2 Byte

B,

r+-

3. Byte

£>2

D, 4. Byte

5 Byte

6

Byte

L) und L 2 sind die Längen (in Bytes) des ersten bzw. zweiten Operanden. Aus Gründen der internen Operationsabwicklung sind die Längenangaben um je 1 kleiner als die tatsächlichen Längen. Die maximalen Längen sind Lf = 16. B,, D) und B2, D 2 ergeben die Speicheradressen der beiden Operanden. Beispiel für eine Instruktion vom Typ SS (arithmetisch): Addieren gepackt auf , wobei L, = 5 und L 2 = 3 ist.

38

2. M a s c h i n e n i n s t r u k t i o n e n u n d Addieren gepackt

L, - 1

Operandenadressierung Speicheradresse des 2. Operanden

Speicheradresse des 1. Operanden

Lj - 1

V sedezimal

4 '

binar:

8

! 2

! 0

1

!

\

8

! 6

;

ι

ο

: A

·

i m ! loio . _. . 1

oioo ' ooio

looo ! oooo

0001 1 0110 1000 ! 0001 I 1

oooo ! loio

Der Instruktionstyp SS (logisch) hat im Arbeitsspeicher folgendes Format: SS (logisch) Op.-Code

L, - 1

1. Byte

2. Byte

D, f"

D,

L 6. Byte

5. Byte

4. Byte

3. Byte

L, ist die Längenangabe des 1. Operanden. Sie bestimmt zugleich auch die Länge des 2. Operanden. Die maximale Länge ist L, = 256. Beispiel für eine Instruktion vom Typ SS (logisch): Vergleichen logisch < Feld 1 > mit < Feld 2 >, wobei Li = 11 ist. Vergleichen logisch A sedezimal:

d ...

:

s

1

uoi ! οίοι 1

Speicheradresse des I. Operanden Λ

L, - 1 A

0

I ι

Α

1 oooo ; loio

7

:

ι

ι

Speicheradresse des 2. Operanden ν



0111 )» 0001

\

1

0

D

"

1101 ; oooo



! I

r^ 0111 >! 0001

r

Β

mi

1 ... ! loio 1

Eine zusammenfassende Übersicht über alle Instruktionsformate befindet sich im Anhang auf Seite 289.

2.3 Die Arbeitsspeicheradressierung 2.3.1 Einfache Adressierung Bei der einfachen Adressierung werden Speicheradressen aus dem Inhalt der Basisregister Bj und aus den Distanzadressen Dj gebildet: Speicheradresse = < B; > + Dj Bj ist die Nummer irgendeines der 16 Festpunktregister, welches durch den Programmierer als Basisregister deklariert worden ist. Ferner muß der Program-

2.3 Die Arbeitsspeicheradressierung

39

mierer dafür sorgen, daß in dieses Basisregister eine absolute Speicheradresse, die sogenannte Basisadresse geladen wird. Das geschieht fur gewöhnlich mit Hilfe der Instruktion BALR

Basisregister-Nr.. 0

während der Ausführungsphase des Programms. Dieser Vorgang läßt sich folgen dermaßen erklären: Beim Laden des Programms erhält der Programmanfang eine absolute Ladeadresse, die das Ladeprogramm in das Befehlszählregister bringt. Angenommen, die BALR-Instruktion sei der Anfang des Programms: Sie lädt in der oben gezeigten Codierung den Inhalt des Befehlszählregisters in das angegebene Basisregister. Bevor jedoch dieser Befehl ausgeführt wird, ist das Befehlszählregister bereits um 2 (Länge der BALR-Instruktion) erhöht worden. Die Basisadresse ist also die Adresse der auf den Ladebefehl BALR folgen den Maschineninstruktion. Dj ist die positive Differenz zwischen der Speicheradresse des Operanden i und der Basisadresse. Die Adressierung der Operanden im Arbeitsspeicher erfolgt also relativ zur Basisadresse. Aus diesem Grunde wird Dj auch relative Adresse, Distanzadresse oder englisch: displacement genannt. Angenommen das Festpunktregister Nr. 7 sei Basisregister und < Reg. 7 > sei nach Ausführung des BALR-Befehls gleich 1000. Ferner möge ein Operand im Arbeitsspeicher die absolute Adresse 1050 haben. 1050 0

!

1

1051 I 3 : 4

1052 5

! C 1

»

/

Operand Dann wird die Speicheradresse dieses Operanden wie folgt dargestellt: (Bj> + Dj = (Reg. 7> + Dj = 1000 + 50. Die Verschlüsselung dieser Adresse in der Maschineninstruktion lautet:

sedezimal:

binar:

0000

0011

0010

allgemein: Für die Verschlüsselung der Distanzadresse stehen bei allen dafür in Betracht kommenden Instruktionstypen 3 Halbbytes = 12 bits zur Verfügung. Damit lassen sich Werte zwischen 0 und 4095 darstellen.

40

2. Maschineninstruktionen und Operandenadressierung

Mit einem Basisregister lassen sich daher alle Operanden adressieren, die im Bereich der Speicheradressen ( B j > + 0 bis ( B j > + 4 0 9 5 liegen, mit den Zahlen des obigen Beispiels also alle Operanden, die absolute Speicheradressen zwischen 1000 und 5 0 9 5 haben. Überschreiten die Operandenadressen den höchsten Wert des Bereiches, so müssen ein oder mehrere zusätzliche Basisregister deklariert werden. Ferner muß der Programmierer dafür sorgen, daß die zusätzlichen Basisregister in der Ausfuhrungsphase des Programms die gewünschten Basisadressen erhalten. Werden beispielsweise die Register 8 und 9 als zusätzliche Basisregister deklariert, so muß der Programmierer Instruktionen vorsehen, die ζ. B. folgende Operationen ausführen: (Reg. 8 ) = + 4 0 9 5 + 1 = 9 1 9 2 Durch Register 8 lassen sich dann alle Operanden mit Adressen zwischen 5 0 9 6 und 9 1 9 1 und durch Register 9 alle Operanden mit Adressen zwischen 9 1 9 2 und 13287 erreichen. Dabei wird weiterhin als Beispiel eine absolute Speicheradresse von 1 0 0 0 in Register 7 angenommen. Diese bei Byte-Maschinen praktizierte Art der Operandenadressierung im Arbeitsspeicher ist zweifellos komplizierter und aufwendiger als die direkte Adressierung, wie sie vorwiegend bei Wortmaschinen verwendet wird. Die relative Adressierung mit variabler Basisadresse und fester Distanzadresse hat jedoch entscheidende Vorteile: Der wichtigste Vorteil ist, daß auf diese Weise eine leichte Verschieblichkeit der Programme und der zugehörigen Datenfelder im Arbeitsspeicher ermöglicht wird. Dies aber ist eine wichtige Voraussetzung für die Realisation eines timesharing-Betriebes, bei dem die absolute Lage der Programme im Arbeitsspeicher variabel sein muß. Durch die leichte Variierbarkeit der Basisadressen in den Basisregistern wird dieses Ziel auf rationelle Weise erreicht. Ein weiterer Vorteil dieser Adressierungsmethode ist, daß der Programmierer in die Adreßrechnung eingreifen und dadurch bei bestimmten Problemen zu eleganten Lösungen kommen kann: der Inhalt von Basisregistern kann durch bestimmte Instruktionen im Programm verändert werden, wodurch sich recht flexible Adressierungsmöglichkeiten für einzelne Operanden ergeben. Normalerweise hat jedoch der Programmierer mit der Adreßrechnung nicht viel zu tun, da im A S S E M B L E R die Operanden im Arbeitsspeicher in der Regel symbolisch, d . h . durch Vergabe sinnreicher mnemotechnischer Kürzel (Namen) adressiert werden. Der Programmierer hat lediglich für die Nominierung der

2.3 Die Arbeitsspeicheradressierung

41

Basisregister und fur das Laden der Basisadressen zu sorgen. Alles andere kann dem Übersetzerprogramm überlassen werden, welches aus den symbolischen Adressen die in den Maschineninstruktionen erforderlichen Distanzadressen Dj ermittelt. Um einen Eindruck von der Wirkungsweise des Übersetzerprogramms zu vermitteln, soll nachfolgend ein kleiner Ausschnitt eines ASSEMBLER-Programms „von Hand" übersetzt werden. Als Basisregister dient das Festpunktregister Nr. 7.

ASSEMBLER-Programm

FELD1 FELD2 ZAHL1 ZAHL2 RESULT WEITER

BALR USING PACK PACK AP MVC Β DS DS DC DC DS CLC

7,0 *,7 FELD1, ZAHL1 FELD2, ZAHL2 FELD1, FELD2 RESULT, FELD1 WEITER CL3 CL3 C'1125' C'21041' CL3 ....

Länge dez.

Distanz- Maschinenprogramm adr. dez. sedez sedezimal 05 70

6 6

k

0

0

6

6 C 12 18

6

'12

6

'18

4. 3

'24

6

'28

•31 4 8 3 T4; '46

m

F2 F2 FA D2 47

23 24 22 02 F0

70gC]70£2j 701F 7026 701C 701F 702B 701C 702E

1F

26

F1F1F2F5 F2F1F0F4F1

2B 2E

D5

Die Instruktion BALR 7,0 sorgt dafür, daß in Register 7 die Adresse der ersten nachfolgenden Maschineninstruktion (F2 23 701C 7022) gebracht wird, und zwar die absolute Arbeitsspeicheradresse, die diese Instruktion nach dem Laden des Programms erhalten hat. Die Instruktion USING «,7 erzeugt keine Maschineninstruktion und belegt daher auch keinen Speicherplatz. Sie ist vielmehr eine Anweisung an das Übersetzerprogramm, das Register 7 als Basisregister in die Maschineninstruktion einzusetzen. Der Ubersetzungsvorgang spielt sich nun so ab, daß zunächst beginnend mit der auf BALR 7,0 folgenden Maschineninstruktion von allen Instruktionen,

42

2. Maschineninstruktionen und Operandenadressierung

Datenfeldern und Konstanten die Längen und daraus die Distanzadressen Dj berechnet werden 6 . Dabei erhält die erste Maschineninstruktion nach BALR 7,0 die Distanzadresse 0, denn diese Adresse wird ja wie gesagt in das Basisregister 7 geladen. In einem zweiten Durchgang werden sodann die Instruktionen und Konstanten übersetzt, wobei in die Maschineninstruktionen die Nummern der Basisregister und die Distanzadressen der Operanden eingesetzt werden. Weitere Einzelheiten werden bei der Behandlung der USING-Instruktion in Kapitel 3.5.2 gebracht.

2.3.2 Indizierte Adressierung Die indizierte Adressierung des Arbeitsspeichers ist fur die jeweils zweiten Operanden in den RX-Instruktionen vorgesehen. Die Speicheradressen werden aus dem Inhalt von Indexregistern X 2 , dem Inhalt von Basisregistern B2 und aus den Distanzadressen D 2 gebildet: Speicheradresse = + < B2> + D 2 X 2 ist die Nummer irgendeines der 16 Festpunktregister, welches der Programmierer als Indexregister benutzt. Wird jedoch das Register Nr. 0 verwendet, so entfällt die Indizierung. Hinsichtlich der Größen B2 und D 2 gilt das unter 2.3.1 Gesagte. Angenommen es sei = 1000 und D 2 = 50, dann ist die Speicher adresse des betreffenden Operanden 10 + 1000 + 50 = 1060. Der Vorteil der indizierten Adressierung ist, daß durch einfache Variation des Inhalts eines Indexregisters eine Folge von Unterfeldern des mit (B 2 > + D 2 adressierten Operanden angesprochen werden kann. Beispiel: Eine Folge von 10 Wortoperanden im Arbeitsspeicher soll in einem Festpunktregister aufaddiert werden. Indexregister sei das Register 2 und Basisregister das Register 7. Ferner wird angenommen, daß das Basisregister nach dem Laden in der Ausführungsphase des Programms den Wert 998 hat. Durch sukzessives Erhöhen des Indexregisters 2 um jeweils 4, werden die Wortgrenzen 1020, 1024, 1028, 1032 usw. adressiert (vgl. S. 43). Eine weitere Möglichkeit einer indizierten Adressierung bei RS-, SI- und SSInstruktionen kann sich der Programmierer schaffen, indem er die Inhalte der bei der Operandenadressierung verwendeten Basisregister entsprechend variiert.

6

Für alle symbolisch adressierten Instruktionen und Operanden werden diese Informationen darüber hinaus in einer sogenannten symbol table gesammelt, die im Übersetzungsprotokoll mit ausgedruckt wird.

2.3 Die Arbeitsspeicheradressierung

43

jj C ^ -C ' d c 3 o S '

; 2 : S '/•'>- iriO Ι·Λ O O Qφ Q©O ο — ν-, υ - i U - i r t r r O O O —



? o c 8 o o o i i S

00

< b « O O C 5 £ τ a t Ο £ Ϊ UJ δ ν > ä

log ο 3

44

2. Maschineninstruktionen und Operandenadressieiung

2.4 Die Länge der Operanden Um die in den Instruktionen angegebenen Operanden verarbeiten zu können, müssen dem Steuerwerk neben den Adressen auch die Operandenlängen bekannt sein. Dies geschieht durch indirekte oder direkte Verschlüsselung der Operandenlängen in den Maschineninstruktionen. Bei den Instruktionstypen RR, RS, RX und SI sind die Längen indirekt durch den Operationscode und die damit angesprochenen Operanden definiert. Bei den Instruktionstypen SS sind die Operandenlängen explizite verschlüsselt, so wie sie durch den Programmierer vorgegeben werden. Im einzelnen gilt für die Instruktionstypen folgendes: Bei RR-Instruktionen ist festgelegt, daß sich die Operation auf den gesamten Inhalt der Operandenregister erstrecken soll, also auf je 32 bits (bzw. bei GP-Registern evtl. 64 bits). Bei RX-Instruktionen gibt es Halbwort-, Vollwort- und Doppelwortoperationen. Das Steuerwerk kann aus dem Operationscode entnehmen, ob die Operandenlänge 2, 4 oder 8 Bytes beträgt. Bei RS-Instruktionen wird die Operandenlänge durch die Operandenadressen R1 und R3 definiert. Die durch diese Adressen beschriebene Folge von Registern ergibt die Anzahl der zu verarbeitenden Worte. Beispiel: R1 = 2 und R3 = 6 bedeutet, daß die Inhalte der Register 2, 3, 4, 5 und 6 an der Operation beteiligt sind. Damit ist zugleich die Länge des 2. Operanden im Arbeitsspeicher auf 5 Worte = 20 Bytes festgelegt. Bei SI-Instruktionen ist die Operandenlänge immer 1 Byte, denn genau so viel Platz ist für den Direktoperanden in der Maschineninstruktion vorgesehen. Damit ist aber zugleich auch die Länge des 1. Operanden im Arbeitsspeicher auf 1 Byte festgelegt. Bei SS-Instruktionen kann die Operandenlänge Byte-weise variiert werden, und zwar bei SS (arithmetisch) zwischen 1 und 16 unabhängig fur jeden Operanden und bei SS (logisch) zwischen 1 und 256 einheitlich für beide Operanden. Die Operandenlängen werden daher in den Maschineninstruktionen ausdrücklich verschlüsselt. Der Programmierer kann die Operandenlängen entweder implizite über die Definition der Daten- bzw. Konstantenfelder oder explizite durch direkte Längenangaben in den ASSEMBLER-Befehlen bestimmen.

2.5 Die Ausrichtung von Operanden im Arbeitsspeicher Bei RX- und RS-Instruktionen müssen die Operanden im Arbeitsspeicher ausgerichtet sein, und zwar je nach Operation auf Doppelwort-, Vollwort- und Halbwortgrenzen. Dies ist eine Eigenart der Byte-Maschinen der 3. Generation

45

2.6 Programmstatuswort, Bedingungsanzeige

und gilt gleichermaßen für die Anlagen IBM 360, Siemens 4004 und Univac 9000. Bei den IBM-Anlagen der Serie 370 ist dieser Zwang zur Ausrichtung entfallen; d . h . Nichtausrichtung führt nicht mehr zu Programmunterbrechungen, die weiterhin mögliche Ausrichtung erspart aber Maschinenzeit. Die Ausrichtung bedeutet, daß Doppelwortoperanden (8 Bytes) eine durch 8 teilbare, Vollwortoperanden (4 Bytes) eine durch 4 teilbare und Halbwortoperanden (2 Bytes) eine durch 2 teilbare Speicheradresse haben müssen. Die Arbeitsspeicheradressierung beginnt mit 0, d . h . das erste Byte hat die Adresse 0. Diese Adresse ist zugleich Halbwort-, Vollwort- und Doppelwortgrenze, da 0 durch jede .Zahl dividierbar ist. O l

:

Η V

Η

D

3

4 Η ν

5

6 Η

7

8 Η V

9

10

Π

Η

D

l: Η V

13

14 Η

Die nächsten Halbwortgrenzen sind die Adressen 2, 4 , 6, 8 usw., die nächsten Vollwortgrenzen die Adressen 4, 8, 12, 16 usw. und die nächsten Doppelwortgrenzen die Adressen 8, 16, 24 usw. Die Ausrichtung der Operanden muß vom Programmierer durch Anweisungen an das Ubersetzerprogramm vorgenommen werden. Das Übersetzerprogramm sorgt aufgrund dieser Anweisungen dafür, daß die Adressen der betreffenden Daten- oder Konstantenfelder auf die entsprechenden Grenzen geschoben werden. Dabei werden gegebenenfalls einige Bytes zwischen einem vorangehenden und einem auszurichtenden nachfolgenden Feld freigelassen.

2.6 Programmstatuswort, Bedingungsanzeige Bei der Ausführung einer Maschineninstruktion können Warte-, Unterbrechungsund Fehlersituationen auftreten. Eine Wartesituation tritt auf, wenn für die betreffende Instruktion ein Betriebsmittel, z.B. ein Übertragungskanal nicht verfügbar ist; Unterbrechung bedeutet, daß durch die betreffende Instruktion ein Vorgang z.B. Input/Output angeregt wurde, auf dessen Beendigung das Programm warten m u ß ; Fehler treten auf, wenn die betreffende Instruktion z.B. in einen geschützten Speicherbereich hineinzuschreiben oder durch Null zu dividieren versucht. Warte-, Unterbrechungs- und Fehlersituationen sowie die Resultate bestimmter Instruktionen werden diagnostiziert. Die Diagnose wird verschlüsselt in ein internes Anzeigenregister, das sogenannte Programmstatuswort (PSW), eingetragen.

46

2.6 Programmstatuswort, Bedingungsanzeige

Während Warte-, Unterbrechungs- und Fehlersituationen in der Regel vom Betriebssystem behandelt werden, interessieren den Programmierer vor allem die Resultatdiagnosen. PSW 31

24 23

V

16

15

13

12

8

7

0

1

1 Byte

V 3 . Byte

2. B y t e

V 4. Byte

Diese finden sich in den bit-Positionen 8 bis 13 des PSW, und zwar enthalten bit-Position 8 9 10 11

— Significance (1 Diagnose; — Exponent underflow (1 ja; - Decimal overflow (1 ja; — fixed-point overflow (1 ja;

0: 0: 0: 0:

keine Diagnose) nein) nein) nein)

1 2 - Ϊ

> Condition code (CC)

13 -

J

Der condition code (Bedingungscode) wird von den meisten Arithmetik-, Test-, bit-Verknüpfungs- und Vergleichsinstruktionen sowie von einigen Lade- und shift-Instruktionen gesetzt und bezieht sich in der Regel auf den ersten Operanden. Die bit-Positionen 12 und 13 können folgende Werte annehmen: 13

dezimales Äquivalent (CC)

12

0 0 1 0 1 0 1 1 —

—— — * -

0 1 2 3

Die Bedeutung der Werte hängt von der betreffenden Instruktion ab. Beispiele: CC (decimal) Operation Add Compare Test under mask

0

1

2

3

zero equal zero

< zero 1. op. low mixed

> zero 1. op. high

overflow ones

2.6 Programmstatuswort, Bedingungsanzeige

47

Die möglichen Codes u n d ihre Bedeutung werden in folgenden bei jeder in Abschnitt 3.4.3 behandelten Instruktion angegeben. Der Programmierer kann mit Hi fe von Verzweigungsoperationen auf diese Bedingungscodes reagieren (vgl. Abschnitt 3.4.3.9). Dazu steht ihm eine Maske von 4 bit-Positionen in der Verzweigungsoperation zur Verfügung, die er explizit oder durch einen erweiterten Befehlscode laden kann. Dabei kann die Maske alle 16 möglichen Sedezimalwerte, also 0 0 0 0 bis 1111 a n n e h m e n .

Maske 3

2

1

0

(bit-Positionen)

Die f u n k t i o n a l e Z u o r d n u n g zwischen Bedingungscode des PSW u n d der Bedingungsmaske Μ in der Verzweigungsinstruktion geschieht wie folgt: Bedingungscode Bedingungscode Bedingungscode Bedingungscode

0 entspricht 1 entspricht 2 entspricht 3 entspricht

einer einer einer einer

1 in 1 in 1 in 1 in

Masken-bit-Pos. Masken-bit-Pos. Masken-bit-Pos. Masken-bit-Pos.

3 2 1 0

Diese Umsetzung erfolgt in einem internen Hilfsfeld, das mit der Maske verglichen wird. Beispiele: a) ( M a s k e ) = 1100

(prüft gleich oder kleiner Null)

Nach Add sei CC = 1 ( < zero) (Hilfsfeld) = 0100 Das Resultat der Vergleiche zwischen Hilfsfeld u n d Maske ist true (wahr), da es zu (mindestens) einer der auf 1 gesetzten bit-Positionen der Maske eine entsprechende auf 1 gesetzte bit-Position des Hilfsfeldes gibt. b ) ( Maske ) = 1000

(prüft auf Null bzw. gleich)

Nach Compare sei: CC = 2 ( 1 . operand high) (Hilfsfeld) = 0010 Das Resultat des Vergleichs zwischen Maske u n d Hilfsfeld ist false (falsch), da es zu keiner der auf 1 gesetzten bit-Positionen der Maske eine entsprechende auf 1 gesetzte bit-Position des Hilfsfeldes gibt.

3. Die Programmiersprache ASSEMBLER 3.1 Allgemeine Vorbemerkungen Die Programmiersprache ASSEMBLER ist eine universelle Sprache zur Erstellung von Quellenprogrammen für Anlagen von IBM, Siemens, Comparex, Univac u.a., die besonders den einheitlichen Vorrat an Maschineninstruktionen und die ByteStruktur dieser Anlagen berücksichtigt. Ein in ASSEMBLER geschriebenes Quellenprogramm wird durch ein Umwandlungsprogramm, welches ebenfalls Assemblerprogramm heißt7, in ein Objektprogramm (Maschinenprogramm) übersetzt. Eine derartige Umwandlung wurde bereits unter 2.3.1 und 2.3.2 anhand einfacher Beispiele demonstriert. Der Vorteil der Sprache ASSEMBLER gegenüber dem reinen Maschinencode besteht vor allem in der Nähe zur menschlichen Sprache. Während also beispielsweise das sedezimal geschriebene bit-Muster F2 23 701C 7022 keinerlei Ähnlichkeit zu einem menschlichen Sprachgebilde aufweist, ist die zugehörige Instruktion in ASSEMBLER, nämlich P A C K F E L D 1 , Z A H L 1 , nach dem Erlernen primitiver Syntaxregeln leicht verständlich: Sie besagt, daß der Inhalt des mit Z A H L 1 adressierten Datenfeldes in ein mit F E L D 1 adressiertes Datenfeld gepackt werden soll. Die Transformation des ASSEMBLER-Programms in ein Maschinenprogramm besorgt wie gesagt das Assemblerprogramm. Die Funktionen dieses Umwandlungsprogramms sind im einzelnen die folgenden: ( 1 ) Umwandlung der symbolischen Maschinenbefehle des ASSEMBLER in echte Maschineninstruktionen, z.B. AP F E L D 1 , F E L D 2 in FA 22 701C 701F oder binär geschrieben in 1111 1010 0010 0010 0111 0000 0001 1100 0111 0000 0001 1111. ( 2 ) Umwandlung von symbolischen in echte Arbeitsspeicheradressen, ζ. B. WEITER in 702E, d.h. (Reg. 7> + 46 10 . (3) Reservierung von Datenfeldern im Arbeitsspeicher; ζ. B. wird durch die Anweisung FELD1 DS CL3 ein Feld von 3 Bytes Länge ab der Adresse 701C, d.h. (Reg. 7 ) + 28 10 , reserviert. 7

Der Name A S S E M B L E R für eine bestimmte Programmiersprache führt o f t zu Mißverständnissen, da im allgemeinen diese Bezeichnung für die Übersetzerprogramme von maschinenorientierten Programmiersprachen aller möglichen Computersysteme verwendet wird. Um Verwechslungen auszuschließen, wird in dieser Arbeit die Programmiersprache durch die Buchstabenfolge A S S E M B L E R und das Übersetzei-programm durch das Wort Assembler gekennzeichnet.

3.2 Die Elemente der Sprache

49

(4) Erzeugung von Konstanten im Arbeitsspeicher; z . B . wird durch die Anweisung ZAHL1 DC C"I125' eine Konstante von 4 Bytes Länge ab der Adresse 7022, d . h . (Reg. 7> + 3 4 1 0 , erzeugt. Diese Konstante lautet F 1 F 1 F 2 F 5 oder binär ausgeschrieben 1111 0001 1111 0001 1111 0010 1111 0101. Das Umwandlungsprogramm erzeugt das echte Maschinenprogramm (Objektprogramm) im Arbeitsspeicher. Von hier aus kann es auf Lochkarten, Magnetplatten oder Magnetbänder ausgegeben und, falls es fehlerfrei ist, nach dem ο Durchlaufen einer Binde- und Ladephase gestartet werden.

3.2 Die Elemente der Sprache Die Programmiersprache ASSEMBLER besteht aus folgenden Elementen: (1) Maschinenbefehle (2) Assembleranweisungen (3) Makroaufrufe Die Maschinenbefehle bilden den Kern des vom Programmierer zu erstellenden Quellenprogramms. Sie werden im Verhältnis 1 : 1 in echte Maschineninstruktionen umgewandelt, d . h . für jeden in ASSEMBLER geschriebenen Maschinenbefehl wird eine Instruktion im Objektcode erzeugt. Die Assembleranweisungen sind Instruktionen für das Umwandlungsprogramm, mit denen der Programmierer den Übersetzungsvorgang steuern kann; z . B . k a n n der Programmierer mit diesen Anweisungen dem Übersetzerprogramm mitteilen, welches bzw. welche Register als Basisregister verwendet werden sollen oder daß bestimmte Speicherbereiche reserviert und bestimmte Konstanten erzeugt werden sollen. Assembleranweisungen erzeugen grundsätzlich keine echten Maschineninstruktionen. Makroaufrufe sind Instruktionen für das Umwandlungsprogramm, an die Stelle des Makroaufrufs ein ganzes Programmstück (Folge von Maschinenbefehlen, Assembleranweisungen und anderen Makroaufrufen) in das Quellenprogramm einzusetzen, welches entweder vom Programmierer oder vom Maschinenhersteller vorprogrammiert ist. Der Hauptsinn der Makros besteht darin, häufig wiederkehrende Routinen aus dem Quellenprogramm gleichsam auszuklammern, indem man sie mit einer einzigen Instruktion a u f r u f t . Auf diese Weise läßt sich der Programmieraufwand vielfach entscheidend reduzieren. Die Bindephase sorgt dafür, daß andere separat übersetzte Programm-Moduln, die durch das Programm angesprochen werden, mit dem erstgenannten Programm(-Modul) zu einem lauffahigen Programm verknüpft werden. Die Ladephasc speichert das gebundene Programm ab einer bestimmten Ladeadrcsse in den Arbeitsspeicher.

50

3. Die Programmiersprache ASSEMBLER

3.3 Ausdrücke Ausdrücke sind jene Bestandteile der ASSEMBLER-Sprache, mit denen der Programmierer im Rahmen bestimmter syntaktischer Regeln beim Niederschreiben von Befehlen die von ihm gewünschten Arbeitsspeicheradressen, Registernummern, Distanzadressen, Direktoperanden, Konstanten und Längenschlüssel angeben kann. Man unterscheidet einfache Ausdrücke (terms) und komplexe Ausdrücke. Bei letzteren sind mehrere terms durch die arithmetischen Operatoren + - * ( ) miteinander verknüpft. Komplexe Ausdrücke werden selten benötigt, da sie eigentlich nur der Erstellung ganz allgemein gehaltener Quellenprogramme dienen. Bei der Übersetzung in Objektprogramme erhalten einfache wie komplexe Ausdrücke bestimmte feste Werte (Adressen, Registernummern etc.) zugeordnet. Eine größere Flexibilität der Objektprogramme läßt sich also durch die Verwendung komplexer Ausdrücke nicht erzielen. Aus diesem Grunde werden in dieser Einführung nur die einfachen Ausdrücke behandelt. Einfache Ausdrücke sind die folgenden: (1) Symbole, (2) Direktwerte, (3) der Stand des Zuordnungszählers, (4) die Längen von Instruktionen, Datenfeldern und Konstantenfeldern, (5) Literale. Um diese Ausdrücke bei der Erstellung von ASSEMBLER-Programmen sicher handhaben zu können, ist eine etwas ausführlichere Behandlung erforderlich.

3.3.1 Symbole Symbole sind Kombinationen aus 1 bis 8 zulässigen Zeichen. Zulässige Zeichen sind die Buchstaben Α bis Z, die Sonderzeichen @, # und die Ziffern 0 bis 9. Das erste Zeichen m u ß ein Buchstabe oder eines der drei zulässigen Sonderzeichen sein. Leerzeichen innerhalb eines Symbols sind nicht erlaubt. Das Umwandlungsprogramm ordnet jedem Symbol einen Wert zu; dies geschieht entweder automatisch oder auf Veranlassung des Programmierers. (1) automatische WertzuWeisung: In diesem Fall stellen die Symbole stets relative Arbeitsspeicheradressen von Datenfeldern, Konstantenfeldern und Maschineninstruktionen dar; dabei handelt es sich um jene Adressen, auf denen die Felder und Instruktionen relativ zum Programmanfang abgesetzt werden. (2) Wertzuweisung durch den Programmierer: In diesem Fall werden die Symbole in der Regel zur expliziten Bezeichnung von Registern, Distanzadressen und Längenangaben benutzt. Die Wertzuweisung erfolgt aufgrund einer entsprechenden Assembleranweisung. Der Programmierer hat jedoch darauf zu achten, daß der zuzuweisende Wert nicht negativ und nicht größer als 2 2 4 - 1 ist.

51

3.3 Ausdrucke

Beispiele für Symbole: (&Ί 23, DP, L1, BASIS1, FELD, F1@#

Beispiele für die Wertzuweisung durch den Programmierer: DP BASIS1 L1

EQU EQU EQU

5 9 200

Beispiele für die Verwendung von Symbolen: @123 FELD

MVC DS

DP(L1,BASIS1),FELD CL256

Den Symbolen @123 und FELD werden vom Assembler automatisch Arbeitsspeicheradressen zugeordnet. Die Symbole DP, L1 und BASIS1 erhalten ihre Werte über die Assembleranweisung EQU. Sämtliche Symbole werden vom Assembler in einer Symboltabelle zusammengestellt, die mit dem Übersetzungsprotokoll ausgedruckt wird und die für jedes Symbol den Wert und ein Längenattribut enthält: Stellt ein Symbol eine Arbeitsspeicheradresse dar, so wird als Wert die auf den Programmanfang bezogene Adreßdifferenz und als Längenattribut die Länge der betreffenden Maschineninstruktion oder des Datenfeldes oder des Konstantenfcldes genannt. Bekommt ein Symbol einen Wert über die EQU-Anweisung, so wird dieser Wert und das Längenattribut 1 in der Symboltabelle ausgedruckt. 3.3.2 Direktwerte Direktwerte sind nach bestimmten syntaktischen Regeln gebildete Ziffern- oder Buchstabenkombinationen, die vom Assembler bei der Übersetzung in die entsprechenden binären Äquivalente umgewandelt werden. Direktwerte werden u. a. zur expliziten Angabe von Distanzadressen, Längenattributen und Registern verwendet. Beispiel: MVC

0(7,8),FELD

Darin sind: Di = 0, L, = 7 und B, = 8. Bei der relativen symbolischen Arbeitsspeicheradressierung dienen Direktwerte der Angabe der Adreßdifferenzen zu den symbolischen Adressen. Beispiel: MVC

ZAHL1 ,ZAHL3+5

3. Die Programmiersprache ASSEMBLER

52

Der zweite Operand beginnt bei der symbolischen Adresse ZAHL3 plus 5 Bytes. Bei der Zuordnung von Werten zu Symbolen mit Hilfe der EQUAnweisung dienen Direktwerte als Operanden. Beispiel: DP

EQU

5

Schließlich werden 1 Byte lange Direktwerte bei den Sl-Instruktionen als Direktoperanden verwendet. Beispiel: MVI

BYTE,C'1'

Es gibt dezimale, sedezimale, binäre und Zeichen-Direktwerte. a) Dezimale Direktwerte Dezimale Direktwerte sind natürliche Zahlen zwischen 0 und 16 777 215 (= 2 2 4 - 1). Sie sind bei der expliziten Angabe von Distanzadressen, Längenattributen und Registern die am häufigsten verwendeten Ausdrücke. Dabei sind je nach Verwendungszweck bestimmte Wertgrenzen zu beachten. Sollen beispielsweise Registernummern angegeben werden, so dürfen nur dezimale Direktwerte zwischen 0 und 15 benutzt werden. Bei Distanzadressen dürfen nur Werte zwischen 0 und 4095 und bei Längenattributen nur Werte zwischen 0 und 255 bzw. zwischen 0 und 15 verwendet werden. Bei Angabe des Direktoperanden in Sl-Instruktionen dürfen Werte zwischen 0 und 255 eingesetzt werden, denn4 dieser Zahlenbereich läßt sich gerade mit den 256 möglichen bit-Mustern in einem Byte darstellen. Bei der Wertzuweisung zu Symbolen dürfen Werte zwischen 0 und 16 777 215 benutzt werden. Beispiele: CLI

BYTE,255

Darin ist: I 2 = 255 MVC

2(200,8),0(7)

Darin sind: Ü! = 2, L, = 200, Bj = 8, D 2 = 0, B2 = 7 SR

15,4

Darin sind: R, = 15, R 2 = 4 A

4,3(5,8)

Darin sind: R, = 4, D 2 = 3, X 2 = 5, B2 = 8 ADR

EQU

10000

53

3.3 Ausdrücke

b) Sedezimale Direktwerte Sedezimale Direktwerte sind vorzeichenlose Sedezimalzahlen zwischen 0 und FF FF FF, die zur besonderen Kennzeichnung ein X vorangestellt bekommen und in Hochkommas eingeschlossen werden. Beispiel: X'1FB'. Der jeweilige Verwendungszweck bestimmt die aktuelle Größe; dabei gelten die Bereiche X'O' bis X'F' für die Registerbezeichnung, ΧΌ' bis X ' F F F ' für die Angabe von Distanzadressen, ΧΌ' bis X'FF' (bzw. X'F') für Längenangaben und X'O' bis X'FF' für die Darstellung von Direktoperanden in SIInstruktionen. Beispiele: CLI MVC SR A EQU

BYTE,X'FF' X'2'(200,X'8'),0(7) X'F',4 4,X'3'(5,8) X'ABFT

c) Binäre Direktwerte Binäre Direktwerte sind vorzeichenlose Dualzahlen im Bereich von 0 bis 11

1 24

24

(dezimal: 2 — 1). Sie werden durch ein vorangestelltes Β gekennzeichnet und in Hochkommas eingeschlossen. Beispiel: Β Ί 0 1 ' . Der jeweilige Verwendungszweck bestimmt die aktuelle Größe; dabei gelten die Bereiche ΒΌ' bis Β Ί 1 1 Γ fur die Registerbezeichnung, ΒΌ' bis Β Ί 1 1 1 1 1 1 1 1 1 1 1 ' für die Angabe von Distanzadressen, B'O' bis ΒΊ1111111* (bzw. Β Ί 1 1 1 ' ) für Längenangaben und B'O' bis Β Ί 1 1 1 1 1 1 Γ für die Darstellung von Direktoperanden in Sl-Instruktionen. Beispiele:

WERT

CLI MVC EQU

ΒΥΤΕ,ΒΊ 1111111' 2(200,8),0(B'111') ΒΊ11011110001'

d) Zeichendirektwerte Hin Zeichendirektwert besteht aus I bis 3 Zeichen (Buchstaben, Ziffern, Sonderzeichen), die durch ein vorangestelltes C gekennzeichnet werden und in Hochkommas eingeschlossen sind. Beispiel: C'AIB'; dabei ist A1B eine Zeichenkette, die im Arbeitsspeicher durch das bit-Muster C1 Fl ( 2 dargestellt wird.

54

3. Die Programmiersprache ASSEMBLER

Ihre hauptsächliche Verwendung finden Zeichendirektwerte in Sl-Instruktionen, wobei jedoch stets nur ein Zeichen eingesetzt werden darf. Beispiele: CLI

0(7),C'+'

CLI

F E L D + 1 ,C'A'

MVI

BYTE.C'I'

MVI

7(8),C'

'

3.3.3 Der Stand des Zuordnungszählers Der Zuordnungszähler ist ein Bestandteil des Assembler (Umwandlungsprogramm), dessen Stand bei der Programmierung als Ausdruck verwendet werden kann. Während der Umwandlung wird das echte Maschinenprogramm im Arbeitsspeicher aufgebaut. Dabei zeigt der Zuordnungszähler relativ zum Programmanfang jeweils die nächste freie Speicheradresse an, in die der Assembler die nächste Maschineninstruktion, das nächste Konstantenfeld oder das nächste Datenfeld absetzen kann. Während des Absetzens wird die Länge der betreffenden Instruktion oder des Feldes auf den Zuordnungszähler addiert, so daß danach wieder die nächste freie Speicheradresse angezeigt wird. Der Programmierer kann den Zuordnungszähler zur relativen symbolischen Speicheradressierung benutzen. Dies geschieht durch das Setzen eines „»"-Zeichens, für das der Assembler den um die relative Basisadresse9 verminderten Stand des Zuordnungszählers einsetzt. Beispiel: Adressen (rel. zum Programmanfang)

Distanzadressen (rel. zur Basisadresse)

18 22 28

10

BE

14

AP

FELD1.ZAHL1

20

MVC

DRBER,FELD1

ASSEMBLERBefehle *+10

Der Befehl BE *+10 bewirkt, daß das Programm zur Instruktion MVC DRBER,FELD1 verzweigt (springt), sofern eine bestimmte Bedingung erfüllt ist. Der Assembler übersetzt diese Befehlsfolge in folgender Weise: 9

Die relative Basisadresse ist die auf den Programmanfang bezogene relative Speicheradresse, auf der die erste auf „BALR Basisreg., 0 " folgende Maschineninstruktion in der Umwandlungsphase abgesetzt wird. In der Ausführungsphase ist die Basisadresse die absolute Speicheradresse dieser Maschineninstruktion.

55

3.3 Ausdrücke

Im Augenblick der Ubersetzung des BE-Befehls hat der Zuordnungszähler den Wert 18; er zeigt also auf die (relative) Speicheradresse, auf die der BE-Befehl sogleich abgesetzt werden wird. Der * im BE-Befehl ist also die relative Speicheradresse des ersten Byte der umgewandelten Instruktion. Der Assembler berechnet aus der Angabe *+10 die relative Speicheradresse 28 und zieht davon die relative Basisadresse ab, die hier 8 betragen soll; also 28 — 8 = 20 (sedezimal: 14). Wird als Basisregister das Register 10 deklariert, so wird als Sprungadresse AO 14 in die Maschineninstruktion eingesetzt. relative Adressen (dezimal, dezimal und relativ zum *) 18 * 1

19 +1

Τ —

20 +2

21 +3

22 +4

23 +5

Τ

4 ! 7 8 I 0A|O

1! 4 F ; A Λ

5 I 5

I

24 +6 • Ί

25 +7 • "Τ

1

A I 0 s! ι

BE

26 +8

27 28 +9 +10

1 —I— —Ι— Α Ί 0 6 ! 7 D\2 1 A

I

"1

0 ! 5 A|O 1

AP

4 : 3 A ! 0

Sil

MVC

Beispiel: Adressen (rel. zum Programmanfang)

Distanzadressen (rel. zur Basisadresse)

26 30 36 40

10 14 20 24

ASSEMBLERBefehle LA MVC CLI BNE

5,1(0,5) A,0(5) A,C'+' *—14

Der Befehl BNE * - 1 4 bewirkt, daß das Programm zur Instruktion LA 5,1(0,5) verzweigt, sofern eine bestimmte Bedingung erfüllt ist. Der Assembler berechnet aus der Angabe *—14 die relative Speicheradresse 26 und zieht davon die relative Basisadresse ab, die hier mit 16 angenommen wird; also 26 - 16 = 10 (sedezimal: A). Wird als Basisregister das Register 8 deklariert, so wird als Sprungadresse 800A in die echte Maschineninstruktion eingesetzt. relative Adressen (dezimal, dezimal und relativ zum *):

26 27 28 29 30 31 32 33 34 35 36 37 38 39 4 0 -14-13-12-11-10-9 -8 -7 -6 -5 -4 -3 -2 -1 * τ I — Ι — • τ I • I I 1 4 Ι 1 s; ο 5 ! 0 Ο ! Ι D ; 2 ! 14 ; 7 1 8 \ 1 F | 1 S : Ο ο; ο 9 ! 5 4; Ε 8 | 1 F « « °! 1 1 1 ι Λ -ν ν " LA

MVC

CLI

• Τ 7

;O

8 J 0 O; A • »

ν BNE

3. Die Programmiersprache ASSEMBLER

56

Der Sinn der Verwendung des Zuordnungszählers bei der symbolischen Adressierung besteht vor allem darin, dem Programmierer das Erfinden von Symbolen zu ersparen. Im übrigen ist jedoch vor dieser Adressierweise zu warnen; denn einmal können dem Programmierer bei der Berechnung der relativen Speicheradressen sehr leicht Fehler unterlaufen, zum anderen kommt durch diese Adressierweise eine gewisse Starrheit in das ASSEMBLER-Programm, da die Distanzen nach jeder Einfügung, Herausnahme oder Typenänderung von Instruktionen im Zuge von Programmkorrekturen neu berechnet werden müssen. 3.3.4

Längenattribute

Der Programmierer kann bei der Erstellung von ASSEMBLER-Programmen auf die Längenattribute von Datenfeldern, Konstantenfeldern und Maschineninstruktionen Bezug nehmen. Dies geschieht mit Hilfe der Ausdrücke L' Symbol und L' *± Distanz. Die mit diesen Ausdrücken erzeugten Werte werden vom Programmierer vor allem für die explizite Angabe von anderen Längenattributen und von Distanzadressen in Maschinenbefehlen verwendet. Wird die Form L' Symbol verwendet, so bekommt dieser Ausdruck einen Wert, der der Länge des (bzw. der) mit „Symbol" symbolisch adressierten Feldes (bzw. Instruktion) entspricht. Wird die Form L' *± Distanz benutzt, so bekommt dieser Ausdruck einen Wert, der der Länge des (bzw. der) mit „*± Distanz" relativ adressierten Feldes (bzw. Instruktion) entspricht. Beispiele: MVC

FELD1 (L'FELD2),FELD2

d . h . der Inhalt des mit FELD2 adressierten Feldes soll in dessen Länge in das mit FELD1 adressierte Feld übertragen werden. PACK

FELD,L'FELD(5,8)

d . h . der Inhalt des mit + Länge von FELD adressierten Feldes soll in der Länge 5 nach FELD gepackt werden. 3.3.5

Literale

Literale sind nach bestimmten syntaktischen Regeln zu bildende Direktkonstanten, die bei der Erstellung des ASSEMBLER-Programms bei bestimmten Maschinenbefehlen direkt als zweiter Operand anstelle einer Operandenadresse verwendet werden können. Das Umwandlungsprogramm setzt die Literale im Arbeitsspeicher ab und setzt in die betreffenden echten Maschineninstruktionen die entsprechenden Speicher-

57

3.3 Ausdrücke adressen ein. Literale werden also nicht, wie etwa die Direktwerte, unmittelbare Bestandteile der echten Maschineninstruktionen. Beispiel: MVC

FELD ,=C'ABCDEF'

Wird als Basisregister das Festpunktregister Nr. 8 verwendet und wird beispielsweise dem Literal = C ' A B C D E F ' vom Assembler die Distanzadresse 179 (sedezimal: B 3 ) und der symbolischen Adresse F E L D die Distanzadresse 4 7 (sedezirnal: 2 F ) zugewiesen, so lautet der obige Befehl als echte Maschineninstruktion (sedezimal geschrieben) wie folgt: D 2 Op.-

0 5 Lj -

1

8

02F

8

0B3

B,

D,

B2

D2

Code Dabei sei a n g e n o m m e n , daß die Länge von F E L D

L{ = 6 ist.

Mit den folgenden Beispielen soll der Unterschied zwischen Direktwerten und Literalen deutlich gemacht werden: Direktwerte werden mit der Übersetzung Bestandteile der echten Maschineninstruktionen. Der Befehl LA

X'4'

•—.—·

.

V^

R,

Op, Code

(4, 7)

,B'10V '

'

X2

D2

B2

wird u m g e w a n d e l t in 4

4

7

005

Op, Code

R,

X2

B2

D2

MVI

4

Op.-

D,

41

Der Befehl (8),C.' B,

I2

Code wird u m g e w a n d e l t in 92^ Op.Code

I2

8

004

B,

D,

58

3. Die Programmiersprache ASSEMBLER

Literale werden dagegen mit der Umwandlung nicht Bestandteile der echten Maschineninstruktionen; vielmehr werden nur die zugehörigen Speicheradressen in die Maschineninstruktionen eingesetzt. Der Befehl MVC

4

Op.Code

D,

(1,8) =C'. ' L, B,

LT

wird umgewandelt in D2

00

Op.- L, - 1 Code

8

004

8

0F7

B,

D,

B2

D2

Dabei sei 0F7 die dem Literal vom Assembler zugewiesene Distanzadresse.

Literale sind nach bestimmten syntaktischen Regeln zu bilden. Der allgemeine Aufbau eines Literais lautet: = kTLn'z Darin bedeuten: = k

Τ Ln

— Erkennungszeichen für den Assembler, daß ein Literal folgt (dieses Zeichen ist obligatorisch), - Duplizierfaktor; die in Hochkommas eingeschlossene Konstante wird, unter Berücksichtigung etwaiger expliziter Längenangaben, k mal abgespeichert (k ist wahlweise; bei Fehlen dieser Angabe setzt der Assembler k = 1), — Typenangabe; sie zeigt dem Assembler an, um welche Art von Konstante es sich handelt (T ist obligatorisch), — expliziter Längenschlüssel; anzugeben ist L und eine natürliche Zahl n, die die Länge in Bytes bezeichnet. (Ln ist wahlweise; bei Fehlen dieser Angabe ermittelt der Assembler aus der vom Programmierer angegebenen Zeichenfolge z, z m oder aus dem Konstantentyp Τ einen sogenannten implizite Länge), - Zeichenfolge, die die Konstante beschreibt. Je nach Konstantentyp Τ gibt es unterschiedliche Zeichenvorräte.

Für die Angabe des Konstantentyps Τ steht dem Programmierer ein fixierter Zeichenvorrat zur Verfügung.

59

3.3 Ausdrücke

implizite Länge (in Bytes)

Konstantentyp Τ C X Β F H Ε D Ρ Ζ A

Zahl der Zeichen Zahl der angefangenen Bytes Zahl der angefangenen Bytes 4

- Zeichenkonstante — Sedezimalkonstante - Binärkonstante - Vollwortkonstante 1 Festpunkt- Halbwortkonstante ) arithmetik — Vollwortkonstante 1 Gleitpunkt— Doppelwortkonstante ] arithmetik — gepackte Dezimalkonstante — gezonte Dezimalkonstante - Adreßkonstante (Vollwort)

2

4

8 Zahl der belegten Bytes Zahl der Ziffern 4 2 4

Y - Adreßkonstante (Halbwort) V — Adreßkonstante (fur die Bezugnahme auf andere Programm-Moduln)

Im folgenden sollen die einzelnen Literaltypen etwas ausführlicher behandelt werden, wodurch zugleich die später zu behandelnden Konstantendefinitionen vorbereitet werden. a) Literal mit Zeichenkonstante Allgemeines Format:

= kCLn'z,

zm'

Für Zj können alle schreibbaren Zeichen eingesetzt werden, fiir die es eine EBCDI-Verschlüsselung gibt, also praktisch alle auf Kartenlochern vorhandenen Zeichen. Jedes Zeichen z; belegt ein Byte. Die implizite Länge richtet sich nach der Zahl m der dargestellten Zeichen; m darf maximal 256 sein. Die explizite Längenangabe dominiert; d.h., wenn η < m ist, dann werden vor dem Absetzen und vor einer etwaigen Duplizierung die rechten Zeichen abgeschnitten. Beispiel: Das Literal wird abgesetzt als

=3CL4'ABCDE' A B C D A B C D A B C D

Ist hingegen η > m, dann werden vor dem Absetzen und vor einer etwaigen Duplizierung rechts η - m Leerstellen angefügt. Beispiel: Das Literal wird abgesetzt als

=3CL6'ABCDE' Λ

Β (

I) ι: !_. Λ Β (' D t

ι_> Λ

Β

('

I) Κ

3. Die Programmiersprache ASSEMBLER

60 Weitere Beispiele: Das Literal wird abgesetzt als

=CL1'J0E'

Das Literal wird abgesetzt als

=C'ABC+1'

IE ΑΒC+1

und erhält die implizite Länge 5. Das Literal wird abgesetzt als

=CL3'A

b) Literal mit Sedezimalkonstante Allgemeines Format:

=kXLn'z,

zm'

Für z; kann jede Sedezimalziffer zwischen 0 und F eingesetzt werden. Je zwei Sedezimalziffern belegen ein Byte. Die implizite Länge richtet sich daher nach der Zahl der belegten Bytes, und zwar ist L = [(m + l)/2] , 1 0 Beispielsweise belegen m = 4 Sedezimalziffern L = [(4 + l)/2] = 2 Bytes und m = 5 Sedezimalziffern L = [(5 + l)/2] = 3 Bytes. Ist m ungerade, dann wird im äußerst linken Byte des Konstantenfeldes das linke Halbbyte mit einer sedezimalen Null aufgefüllt. Beispiele: Das Literal wird abgesetzt als

=X'B1FC'

ιι I Das Literal wird abgesetzt als

=X'C1 F 0 3 '

—1 r— 1— 0|C I ; F 0I3 _i I L_

Die Zahl der belegten Bytes d a r f 2 5 6 nicht überschreiten; m darf also maximal 5 1 2 sein. Bei V e r w e n d u n g eines expliziten Langenschlüssels dominiert dieser; d . h . w e n n η kleiner als die Zahl der belegten Bytes ist, dann werden vor d e m Absetzen 10

Das Zeichcn | . . . . | bcdeutcl „ganzzahliger Teil von . . . .".

3.3 Ausdrücke

61

und vor einer etwaigen Duplizierung die äußerst linken Bytes der Konstante abgeschnitten. Beispiele: Das Literal wird abgesetzt als

=XL2'F0C1B' ο ,r

Das Literal wird abgesetzt als

=2XL1 Ί 1 FO' Fι 0 Fι 0 _J

Wenn die Länge η größer angegeben wird als für die in Hochkommas eingeschlossene Konstante Speicherplatz beansprucht wird, dann werden vor dem Absetzen und vor einer etwaigen Duplizierung die linken Bytes mit Nullen aufgefüllt. Beispiele: Das Literal wird abgesetzt als

=XL3'F01' 0 !o 0

Das Literal wird abgesetzt als

! F

0ί 1

=2XL2'FF' 0 ! 0 F ! F ο •|o

F IF

c) Literal mit Binärkonstante Allgemeines Format:

=kBLn'z,

zm'

Für Zj können die Dualziffern 0 und 1 eingesetzt werden. Je 8 Dualziffern belegen 1 Byte. Die implizite Länge des Literais richtet sich nach der Zahl der tatsächlich belegten Bytes; und zwar ist L = [(m + 7)/8]. Ist m nicht durch 8 teilbar, dann wird das angefangene äußerst linke Byte mit dualen Nullen aufgefüllt. Beispiele: Das Literal

=B'11010001'

wird abgesetzt als -L.

Das Literal wird abgesetzt als

oooi

=B'110011110' 0000 I' 0001

uio

Die Zahl der belegten Bytes darf maximal 256 betragen.

62

3. Die Programmiersprache ASSEMBLER

Wird ein expliziter Längenschlüssel angegeben, so gilt dieser vor der impliziten Lange; d . h . wenn η kleiner angegeben wird als die Zahl der sonst belegten Bytes, dann werden vor dem Absetzen u n d vor einer etwaigen Duplizierung die äußerst linken Bytes abgeschnitten. Beispiele: Das Literal wird abgesetzt als

=BL1'1000101 I I I ' 0010

Das Literal wird abgesetzt als

1111

=2BL1'111010000' 1101 ; 0000 I

lioi ; oooo

Wenn η größer angegeben wird, als die Zahl der durch die Konstante belegten Bytes, dann werden vor dem Absetzen und vor einer etwaigen Duplizierung die äußerst linken Bytes mit dualen Nullen aufgefüllt. Beispiele: Das Literal wird abgesetzt als

=BL2'101' 0000

Das Literal wird abgesetzt als

0000

oooo

0101

=2BL2'11101101' oooo ! oooo ι

1110

lioi

oooo

oooo

1110

1101

d) Literale mit Festpunktkonstanten (F und H) Allgemeines Format (Vollwort):

= k F L n ' t Zj

zm'

Allgemeines Format (Halbwort):

= kHLn'tz,

zm'

11

Für Z; können die Dezimalziffern 0 bis 9 eingesetzt werden. Zur Bezeichnung negativer Konstanten muß ein „ - " - Z e i c h e n und zur Bezeichnung positiver Konstanten kann ein ,,+"-Zeichen angegeben werden. Die damit dargestellten Dezimalzahlen werden bei der Ubersetzung des Programms in Dualzahlen umgewandelt und in Bytes gespeichert, die sich auf Wort- bzw. Halbwortgrenzen befinden. 11 Es handelt sich um vereinfachte, aber voll funktionsfähige Formate, die für diese Einführung gewählt wurden. Die vollständigen Formate sehen darüber hinaus Präzisionsfaktoren und Exponenten vor, mit denen Einfluß auf den dargestellten Zahlcnumfang genommen werden kann. Einzelheiten sind den einschlägigen Handbüchern zu entnehmen.

3.3 Ausdrücke

63

Bei der Niederschrift der Konstanten sind die im Wort und Halbwort bestehenden Größenbeschränkungen zu beachten. Der im Wort (Halbwort) darstellbare Zahlenbereich erstreckt sich von - 2 3 1 = - 2 1 4 7 4 8 3 6 4 8 bis + 2 3 1 - 1 = = + 2 1 4 7 4 8 3 6 4 7 (bzw. von - 2 ' 5 = - 32768 bis + 2 1 S - 1 = + 3 2 7 6 7 ) . Die implizite Länge beträgt 4 für Wortkonstanten und 2 für Halbwortkonstanten. Wird ein expliziter Längenschlüssel verwendet, so unterbleibt die Ausrichtung der Konstanten auf Wort- bzw. Halbwortgrenzen, selbst wenn η = 4 bzw. η = 2 vorgegeben wird. Der explizite Längen schlüsse 1 ist für beide Typen Η und F begrenzt auf 1 < η < 8. Erlauben der explizite Längenschlüssel oder die implizite Länge die Darstellung größerer Zahlen (bis zu den oben genannten Grenzen) als die tatsächlich angegebenen, so k o m m t es zu einer Auffüllung mit führenden Nullen (bzw. bei den im Zweierkomplement dargestellten negativen Zahlen mit führenden Einsen). Überschreitet die Zahl die im Rahmen der impliziten oder expliziten Länge darstellbare Größe, so werden links bits einschließlich des Vorzeichens abgeschnitten. Beispiele: Das Literal wird abgesetzt als

=H'-1' I nil

Das Literal wird abgesetzt als

:

1 1111

IUI

!

1111

(ausgerichtet)

=F'10' oooo I oooo

oooo ! oooo

oooo ! oooo

oooo ! loio (ausgerichtet)

Das Literal wird abgesetzt als

=HL4'2' •

oooo ! oooo

oooo ! oooo

oooo ! oooo

oooo ! ooio 1 (nicht ausgerichtet)

Ein etwaiger Duplizierfaktor wird erst nach der Umwandlung in eine Dualzahl wirksam. Beispiel: Das Literal wird abgesetzt als

=2H'2'

oooo I oooo

oooo ; ooio

oooo ! oooo

oooo : ooio (ausgerichtet)

64

3. Die Programmiersprache ASSEMBLER

e) Literale mit Gleitpunktkonstanten (Ε und D) Allgemeines Format (kurze Mantisse): =kELn'± z,

z m E ± y,y2'

Allgemeines Format (lange Mantisse): =kDLn'+z,

z m E ± y,y2'

Für Zj sind die Dezimalziffern 0 bis 9 einzusetzen. Davor, dazwischen oder danach kann ein Dezimalpunkt gesetzt werden. Zur Bezeichnung negativer Konstanten muß ein „-"-Zeichen und zur Bezeichnung positiver Konstanten kann ein „+"-Zeichen vor die Ziffer z, geschrieben werden. Auf die Ziffer z m kann ein positiver oder negativer Exponent im Bereich von — 75 bis + 75 folgen. Zur Bezeichnung eines negativen Exponenten muß ein „-"-Zeichen und zur Bezeichnung eines positiven Exponenten kann ein „+"-Zeichen vor die Exponentenziffer y! geschrieben werden. Gleitpunktkonstanten im Ε-Format belegen 4 Bytes und werden auf Vollwortgrenzen ausgerichtet. Gleitpunktkonstanten im D-Format belegen 8 Bytes und werden auf Doppelwortgrenzen ausgerichtet. Wird der explizite Längenschlüssel Ln verwendet, so unterbleibt die Ausrichtung. Gleitpunktkonstanten, die in der oben angegebenen Weise geschrieben werden, werden vom Assembler im Zuge der Umwandlung des Quellenprogramms in die in Kapitel 1.7 beschriebene Form gebracht; d.h. die Mantisse wird in eine Sedezimalzahl umgewandelt und der Exponent wird auf die Basis 16 umgerechnet. Beispiel: Die Literale

=E'+213.04' =E'21304E—2' =E'+.21304E3' =E'.21304E+3'

stellen ein und dieselbe Konstante dar; sie werden daher abgesetzt als

(vgl. dazu Seite 24 ff.). f) Literale mit Dezimalkonstanten (P und Z) Allgemeines Format (gepackt): = kPLn'± z,

zm'

Allgemeines Format (gezont):

zm'

= kZLn'+Ζ!

65

3.3 Ausdrücke

Für Zj können die Dezimalziffern 0 bis 9 eingesetzt werden. Negative Zahlen müssen durch ein .. "-Zeichen und positive Zahlen können durch ein ,.+"-Zeichen gekennzeichnet werden. Die auf diese Weise dargestellten positiven oder negativen Dezimalzahlen werden in gepackter bzw. gezonter ( E B C D I ) F o r m abgespeichert. J e 2 gepackte und je 1 gezonte Ziffer belegen ein Byte; allerdings wird bei gepackten Zahlen im äußerst rechten B y t e das rechte Halbbyte für die Vorzeichendarstellung benötigt, so daß gepackte Zahlen mit m Ziffern stets [ m / 2 ] + 1 Bytes belegen. Die Vorzeichendarstellung bei den gezonten Zahlen erfolgt im linken Halbbyte des äußerst rechten Byte. Wird kein Vorzeichen angegeben, so gelten die Dezimalkonstanten als positiv, und es wird bei der internen Darstellung an der betreffenden Vorzeichenstelle das bit-Muster C erzeugt. Wird ein Vorzeichen angegeben, so wird bei der internen Darstellung an der betreffenden Vorzeichenstelle bei „ + " das bit-Muster C und bei „ - " das bitMuster D erzeugt. Beispiele: Das Literal wird abgesetzt als

=P'+12' ο]ι : ίc ι ι

Das Literal

=P'—123'

wird abgesetzt als 3 ;D

Das Literal wird abgesetzt als

=P'1234' ο; ι

! 13 4 ;c 1

Das Literal wird abgesetzt als

=Z'+12'

Das Literal wird abgesetzt als

=Z'1234'

Κ l Ic ; : I

Fι I

κ; ι f ; 4 1 I

Die implizite Länge richtet sich nach der Zahl der tatsächlich belegten Bytes. Maximal dürfen 16 Bytes belegt werden. Wird ein expliziter Längenschlüssel verwendet, so dominiert dieser. Ist η kleiner als die Zahl der von der betreffenden Konstante benötigten Bytes, dann werden die linken (höchstwertigen) Dezimalziffern nicht dargestellt. Ist η größer

66

3. Die Programmiersprache ASSEMBLER

als die Zahl der benötigten Bytes, so werden die linken überschüssigen Bytes mit gepackten bzw. gezonten Nullen aufgefüllt. Beispiele: Das Literal wird abgesetzt als

=PL3'125735' 2 iS 7 i 3 S iC J-

Das Literal wird abgesetzt als

=PL3'—12' -T—1

1

1

0 ί 0 Oll 2 ] D I

Das Literal wird abgesetzt als

1

l_

=ZL3'125735' F!7 F!3 C|5

Das Literal wird abgesetzt als

=ZL3'—12' F0

Dι2 I

Bei den Dezimalkonstanten kann an beliebiger Stelle ein Dezimalpunkt angegeben werden, der allerdings bei der internen Darstellung als nicht existent behandelt wird. Beispiel: Das Literal wird abgesetzt als

=P'—13.75' 0! 1 3 !7 5 JD

g) Literale mit Adrefikonstanten (Α, Y und V) Adreßkonstanten dienen in der Hauptsache zur symbolischen Adressierung von Programmteilen (Instruktionen, Daten- und Konstantenfelder), für die kein Basisregister zur Verfügung steht, bzw. die mit den Basisregistern des aufrufenden Programmteils nicht erreicht werden können. Dies gilt insbesondere auch fur die Adressierung (fur das Aufrufen) separater Programm-Moduln. Auf diese Verwendungszwecke sind die nachfolgenden vereinfachten Formatangaben abgestimmt. Allgemeine Formate:

= Α (Ausdruck) = Y (Ausdruck) = V (Ausdruck)

3.3 Ausdrücke

67

Als Ausdrücke können eingesetzt werden: CD

Symbole mit und ohne Distanz. Beispiele: = A(FELD); = A(FELD+200), = A ( B 2 - 7 )

(2)

Zuordnungszähler mit und ohne Distanz. Beispiele: = A(*),· = A ( * - 1 7 ) ; = A(*+5000) .

Für die Adreßkonstanten gilt folgendes: Bei der Übersetzung werden den in Klammern angegebenen Ausdrücken Werte zugeordnet, die bei der Verwendung von Symbolen die Adreßdifferenzen von der relativen Adresse 0 (Programmanfang) bis zu der Adresse des Symbols ± Distanz darstellen. Bei der Verwendung des Zuordnungszählers wird dessen Wert *± Distanz zugewiesen; dabei stellt der Zuordnungszähler selbst die Adreßdifferenz von der relativen Adresse 0 bis zum ersten Byte der Instruktion dar, die das betreffende Literal verwendet. Beim Laden des Programms werden aus diesen relativen Adressen absolute Adressen gemacht. Die programmtechnische Realisation erfolgt in der Weise, daß bei der Umwandlung des ASSEMBLER-Programms in ein Objektprogramm eine Tabelle der Adreßkonstanten erzeugt wird, auf deren Werte das Ladeprogramm später die absolute Ladeadresse des Objektprogramms (absolute Adresse der relativen Adresse 0) addiert. Ihre besondere Effizienz erhalten die Adreßkonstanten durch die Tatsache, daß ihre Werte bis 2 3 1 - 1 bei Α und V bzw. bis 2 1 5 - 1 bei Y gehen können, also weiter als jede bisher existierende Arbeitsspeichergröße. Man ist also nicht an die enge Begrenzung der relativen Adressen auf 4095 gebunden, wie sie bei der Operandenadressierung in den Maschineninstruktionen besteht. Die Verwendung der Adreßkonstanten geschieht zumeist so, daß man ihre Werte per Instruktion in irgendwelche Festpunktregister lädt, die man dann entweder als Sprungadreßregister in bestimmten Verzweigungsinstruktionen oder als explizite Basisregister verwendet. Beispiele: L

5,=A(FELD)

Laden des Wertes der Adreßkonstante in das Register Nr. 5. BR

5

Verzweigen zu der Adresse, die in Register Nr. 5 steht.

3. Die Programmiersprache ASSEMBLER

68 L

4,=A(RECHFLD—1)

Laden des Wertes der A d r e ß k o n s t a n t e in das Register Nr. 4. MVC

0(200,4),ZAHL

Übertragen des Inhaltes des Feldes ZAHL in der Länge 2 0 0 in das mit = ( R e g . 4> adressierte Feld. Für die Adreßkonstante des Typs V gilt speziell, daß sie den Zugriff zu externen Adressen (Adressen anderer Programm-Moduln) ermöglicht, sofern es sich u m symbolische Adressen von Instruktionen handelt. In diesen Fällen entfällt die EXTRN-Definition dieser Symbole. Beispiel: L BALR

5,=V(EING1) 7,5

ist äquivalent mit EXTRN EING1

L BALR

5,=A(EING1) 7,5

Im übrigen ist zu den K o n s t a n t e n noch a n z u m e r k e n , daß die T y p e n Α u n d V in Wortlänge (4 Bytes) abgesetzt werden u n J d a ß sie auf Wortgrenzen ausgerichtet sind. Die K o n s t a n t e n des T y p s Y werden in Halbwortlänge (2 Bytes) abgesetzt u n d sind auf Halbwortgrenzen ausgerichtet. Die Ausrichtung entfällt bei allen T y p e n , wenn ein expliziter Längenschlüssel verwendet wird, z . B . = AL4(Ausdruck).

3.4 Maschinenbefehle Die symbolischen Maschineninstruktionen der Programmiersprache ASSEMBLER, die zur Unterscheidung von den echten Maschineninstiuktionen als Maschinenbefehle bezeichnet werden, bestehen aus folgenden K o m p o n e n t e n : (1) (2) (3)

Symbolische Adresse (als Sprungziel wahlweise) Operationscode (fixiert) Operanden (Anzahl je nach Operation fixiert)

3.4 Maschinenbefehle

69

Im folgenden soll gezeigt werden, wie sich diese K o m p o n e n t e n bei den einzelnen Befehlen aneinanderfügen, insbesondere aber, wie die O p e r a n d e n gebildet werden und was sie bedeuten. Bei der Operandenbildung und der symbolischen Adressierung dienen die zuvor behandelten Ausdrücke zur Angabe von Arbeitsspeicheradressen, Registernummern, Distanzadressen, Direktoperanden, Konstanten u n d Längenschlüsseln durch den Programmierer. Allerdings sind einige der Ausdrucksarten auf bestimmte Verwendungen beschränkt, was bei der Darstellung des Befehlsaufbaus entsprechend angezeigt wird. Wenn also im folgenden beispielsweise der A u f b a u eines Befehls durch Symbol Op.-Code Symbol 1, Direktwert 2 oder abgekürzt durch S

Op.-Code S ^ I 2

beschrieben wird, so bedeuten die Buchstaben S und I, daß an den betreffenden Stellen des Befehls Symbole bzw. Direktwerte stehen müssen. Im einzelnen werden folgende Abkürzungen verwendet: Β D I L LT

— N u m m e r eines expliziten Basisregisters — explizite Distanzadresse — Direktoperand - expliziter Längenschlüssel - Literal

Μ R S X

— explizite Bedingungsmaske (bei bedingten Verzweigungsbefehlen) — N u m m e r eines Operandenregisters — symbolische Adresse — N u m m e r eines Indexregisters.

Die bei diesen Abkürzungen verwendeten Indizes ι , 2 u n d 3 bezeichnen die N u m m e r des O p e r a n d e n .

3.4.1 Die Syntax der Maschinenbefehle Im folgenden werden für alle Instruktionsarten die gebräuchlichsten Möglichkeiten der Operandenbildung und die daraus resultierenden F o r m a t e dargestellt. Zur Abkürzung werden dabei die Pfeile => u n d -+ verwendet ; => steht für ,,bezeichnet" und -»· steht für „wird dargestellt d u r c h " . RR-Instniktionen Allgemeines F o r m a t : Symb.Adr.

Op.Code Operand I, O p e r a n d 2

70

3. Die Programmiersprache ASSEMBLER

Operandi => Registernummer R, -»• Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand 2 => Registernummer R 2 Ausdruck vgl. oben!

Ausdruck

Das symbolische Befehlsformat lautet: S

Op.Code R,, R 2

Einfaches Beispiel: LR

1,5

Der Inhalt des Registers Nr. 5 wird in das Register Nr. 1 geladen. RX-Instruktionen Allgemeines Format: Symb.Adr.

Op.Code Operand 1, Operand 2

Operandi => Registernummer R, -»• Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand2 => indiz. Speicheradr. D 2 (X 2 , B 2 ) -»• Ausdr. 1 (Ausdr.2, Ausdr.3) Ausdruck 1 ist meistens ein Direktwert, ein Symbol, ein Längenattribut (L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 und Ausdruck 3 sind meistens Direktwerte oder Symbole. oder Operand 2 => nicht indizierte Speicheradr. D 2 (,B 2 ) Ausdruck 1 und Ausdruck 3 vgl. oben!

Ausdr. 1 (,Ausdr. 3)

oder Operand2 =» Inhalt Indexreg. + Distanzadr. D 2 (X 2 ).-> Ausdr. 1 (Ausdr.2) Ausdruck 1 und Ausdruck 2 vgl. oben! oder Operand 2 => indizierte Speicheradr. S 2 (X 2 ) ->• Symbol (Ausdruck) Ausdruck ist meistens ein Direktwert oder ein Symbol. oder Operand 2 => nicht indizierte Speicheradr. S 2 -»· Symbol uJci Operand 2 => Direktkonstante LT 2 -> Literal Die symbolischen Befehlsformate lauten: a) bei expliziter Adressierung (d.h. die Speicheradresse wird vom Programmierer durch D, Β und evtl. X dargestellt)

3.4 Maschinenbefehle S S S

Op.Code Op.Code Op.Code

71 R „ D 2 ( X 2 , B2) R1; D2(,B2) R,,D2(X2)

indiziert nicht indiziert indiziert ohne Basisregister

Einfache Beispiele: L

5,0(10,2)

Der Inhalt des mit + (B 2 > + D 2 = (Reg. 10> + (Reg. 2> + 0 adressierten Speicherfeldes wird in das Register 5 geladen. NEU

A

5,4(,2)

Der Inhalt des mit ( B 2 ) + D 2 = < Reg. 2) + 4 adressierten Speicherfeldes wird auf den Inhalt des Registers 5 addiert. LA

3,10(3)

Der Inhalt des Registers 3 wird um 10 erhöht. b) bei impliziter Adressierung ( d . h . die Speicheradresse wird vom Programmierer durch ein Symbol und evtl. X dargestellt) S S

Op.Code Op.Code

R,.S2(X2) R,, S 2

indiziert nicht indiziert

Einfache Beispiele: AB

S

5,W0RT(1O)

Der Inhalt des mit Symbol + (X 2 > = W0RT + (Reg. 10> adressierten Speicherfeldes wird vom Inhalt des Registers 5 subtrahiert. Dem Symbol W0RT wird bei der Übersetzung ein Basisregister und eine Distanzadresse zugeordnet, so daß die Adresse intern aus D 2 , X 2 und B 2 berechnet wird. C

3,K0NST

Der Inhalt des Registers 3 wird mit dem Inhalt des mit dem Symbol K0NST adressierten Speicherfeldes verglichen. Dem Symbol K0NST wird bei der Übersetzung ein Basisregister und eine Distanzadresse zugeordnet, so daß die Adresse intern aus D 2 und B2 berechnet wird. c) bei Literalverwendung S

Op.Code

R , , LT 2

Einfaches Beispiel: L0ESCH

L

7,=F'0'

In das Register 7 wird eine Null geladen. Statt einer Operandenadresse wird hier eine Direktkonstante verwendet, die bei der Übersetzung irgendwo im Arbeitsspeicher dargestellt wird. Die echte Maschineninstruktion erhält zur Berechnung der betreffenden Speicheradresse ein Basisregister und eine Distanzadresse; das Indexregister wird mit Null eingesetzt.

3. Die Programmiersprache ASSEMBLER

72

RX-Instruktionen in der Sonderform als Sprungbefehle Allgemeine Formate a) normal mit explizitem Bedingungsschlüssel: S

Op.Code Operand 1, Operand 2

b) erweiterter Bedingungscode: S

Op.Code Operand 2

Operand 1 =» Bedingungsschlüssel Μ! ->• Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand2 =» indiz. Speicheradr. D 2 (X 2 , B 2 ) -»· Ausdr. 1 (Ausdr.2, Ausdr.3) Diese Version ist selten. Ausdruck 1 ist meistens ein Direktwert, ein Symbol, ein Längenattribut (L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 und Ausdruck 3 sind meistens Direktwerte oder Symbole. oder Operand 2 => nicht indizierte Speicheradr. D 2 (,B 2 ) -» Ausdr. 1 (,Ausdr. 3) Diese Version ist selten. Ausdruck 1 und Ausdruck 3 vgl. oben! oder Operand 2 => indizierte Speicheradr. S 2 (X 2 ) ->• Symbol (Ausdruck) Diese Version ist sehr selten. Ausdruck ist meistens ein Direktwert oder ein Symbol. oder Operand 2 =*· nicht indizierte Speicheradr. S 2 ->· Symbol Diese Version wird fast ausschließlich benutzt. Die symbolischen Befehlsformate fur diesen letzten Fall lauten: a) normal mit Bedingungsschlüssel S

Op.Code

M1( S 2

b) erweiterter Bedingungscode S

Op.Code

S2

Einfache Beispiele: BC BE

8,NEU NEU

Beide Instruktionen bewirken dasselbe: Nach einer Vergleichsoperation wird bei Gleichheit (equality) zu der symbolischen Adresse NEU verzweigt. Bei Ungleichheit setzt das Programm mit der nächsten Instruktion fort.

3.4 Maschinenbefehle

73

Der erweiterte Bedingungscode impliziert den Bedingungsschlüssel M , . Bei der Übersetzung wird dieser zunächst aus dem Befehlscode ermittelt und dann in die betreffende echte Maschineninstruktion eingesetzt ( v g l . S . 1 9 6 ) . RS-Instruktionen Allgemeines F o r m a t : S y m b . A d r . Op.Code Operand 1. Operand 3 , Operand 2 Operand 1 => Registernummer

R , -» Ausdruck

Ausdruck ist meistens ein Direktwert oder ein S y m b o l . Operand 3 => Registernummer

R3

Ausdruck

Ausdruck vgl. o b e n ! Operand 2 =» Speicheradr. D 2 ( B 2 ) -*· Ausdruck 1 (Ausdruck 2) Ausdruck 1 ist meistens ein Direktwert, ein S y m b o l , ein Längenattribut ( L ' S y m b o l ) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 ist meistens ein Direktwert oder ein S y m b o l . oder Operand 2 => Speicheradresse

S2

Symbol

oder Operand 2 => Direktkonstante L T 2

Literal

Die symbolischen Befehlsformate lauten a) bei expliziter Adressierung: S

Op.Code

R,, R3, D 2 ( B 2 )

Einfaches Beispiel:

L A D E N LM

5,7,12(9)

In die Register 5 , 6 und 7 werden 3 Speicherworte geladen, deren Adresse aus < R e g . 9 > + 12 berechnet wird. b) bei impliziter Adressierung: S

Op.Code

R , , R 3 . S2

Einfaches Beispiel:

STM

5,7,WORTE

Die Inhalte der Register 5 , 6 und 7 werden in 3 S p e i c h e r w o r t e gebracht, deren symbolische Adresse W 0 R T E lautet. Bei der Übersetzung wird dem S y m b o l W 0 R T E ein Basisregister und eine Distanzadresse zugeordnet, so daß die Adresse intern aus D ? und B 2 berechnet wird.

3. Die Programmiersprache ASSEMBLER

74

c) bei Literalverwendung: S

Op.Code

R „ R 3 , LT 2

Einfaches Beispiel: LM

3,5,=3F'0'

In die Register 3, 4 und 5 werden Nullen geladen. Statt einer Operandenadresse wird hier eine Direktkonstante verwendet, die bei der Übersetzung irgendwo im Arbeitsspeicher dargestellt wird. Die echte Maschineninstruktion erhält zur Berechnung der betreffenden Speicheradresse ein Basisregister und eine Distanzadresse.

RS-Instruktionen in der Sonderform als shift-Befehle Allgemeines Format: Symb.Adr. Op.Code Operand 1, Operand 2 Operand 1 =» Registernummer R, ->• Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand 2 =» Verschiebezahl D 2 (B 2 ) -»• Ausdruck 1 (Ausdruck 2) Ausdruck 1 ist meistens ein Direktwert oder ein Symbol. Ausdruck 2 wie Ausdruck 1! Die folgenden symbolischen Befehlsformate sind gebräuchlich: S

Op.Code

R,,D2(B2)

Op.Code

R|, D 2

und S

Einfache Beispiele: SH

SRL

3,5(8)

Der Inhalt von Register 3 wird um 5 + < Reg. 8) bit-Positionen nach rechts verschoben. SLDL

4,6

Der Inhalt des Registerpaares 4, 5 wird um 6 bit-Positionen nach links verschoben. Sl-Instruktionen Allgemeines Format: Symb.Adr. Op.Code Operand 1, Operand 2 Operand 1 => Speicheradresse Ü! (B 2 ) -» Ausdruck 1 (Ausdruck 2) Ausdruck 1 ist meistens ein Direktwert, ein Symbol, ein Längenattribut

3.4 Maschinenbefehle

75

(L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 ist meistens ein Direktwert oder ein Symbol. oder Operand 1 => Speicheradresse S,

Symbol

Operand 2 => Direktkonstante I2 -»· Direktwert (1 Byte) Die symbolischen Befehlsformate lauten a) bei expliziter Adressierung: S

Op.Code

D , ( B , ) , I2

Einfaches Beispiel: M0VE MVI 5(8),C'A' Die Direktkonstante Α wird in das mit < Reg. 8 > + 5 adressierte Byte übertragen. b) bei implizierter Adressierung: S

Op.Code

S], I2

Einfaches Beispiel: CLI

BYTE.X'OC'

Der Inhalt des mit BYTE adressierten Byte wird mit der sedezimalen Direktkonstante OC, also mit dem bit-Muster 0000 1100, verglichen. SS-Instruktionen (arithmetisch) Allgemeines Format: Symb.Adr. Op.Code Operand 1, Operand 2 Operand 1 und Operand 2 =» Speicheradr. u. Längenschi. Dj(Lj, Β;) Ausdr. 1 (Ausdr.2, Ausdr.3) Ausdruck 1 ist meistens ein Direktwert, ein Symbol, ein Längenattribut (L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 ist meistens ein Direktwert, ein Symbol oder ein Längenattribut (L' Symbol). Ausdruck 3 ist meistens ein Direktwert oder ein Symbol. oder Operand 1 und Operand 2 =» Speicheradresse u. Längenschlüssel Sj(Lj) ->· Symbol (Ausdruck) Ausdruck ist meistens ein Direktwert, ein Symbol oder ein Längenattribut (L' Symbol). oder

3. Die Programmiersprache ASSEMBLER

76 Operandi und Operand2

Speicheradresse Sj -»· Symbol

oder Operand 2 => Direktkonstante LT 2

Literal

Die symbolischen Befehlsformate lauten a) bei expliziter Adressierung und explizitem Längenschlüssel: S

Op.Code

D, ( L „ B , ) , D 2 (L 2 ) B 2 )

Einfaches Beispiel: PACK

0(2,71,5(4,7)

Der Inhalt des mit < Reg. 7 > + 5 adressierten 4 Bytes langen Feldes wird in das mit (Reg. 7 ) + 0 adressierte 2 Bytes lange Feld gepackt. b) bei impliziter Adressierung und implizitem Längenschliissel (der Längenschlüssel der Felddefinition ist maßgebend): S

Op.Code

S,, S 2

Einfaches Beispiel: PACK

FELD1,FELD2

Der Inhalt des mit FELD2 adressierten Feldes wird in das mit FELD1 adressierte Feld gepackt. c) bei impliziter Adressierung und explizitem Längenschlüssel (der explizite Längenschlüssel dominiert): S

Op.Code

S, ( L , ) , S 2 ( L 2 )

Einfaches Beispiel: PACK

A l (3),B1 (4)

Der Inhalt des mit B1 adressierten und 4 Bytes langen Zahlenfeldes wird in der Länge 3 in das mit A l adressierte Feld gepackt. d) Mischformen (jeder Operand kann unabhängig vom anderen jede unter a) bis c) dargestellte Form haben): Einfache Beispiele: ADD PACK

AP SP PACK

0(2,7),FELD2 F E L D 1 (3),0(3,7) FELD1,FELD2(4)

e) bei Literalverwendung: S S S

Op.Code Op.Code Op.Code

D, (L,, B , ) , LT 2 S,, LT 2 S,(L,),LT2

oder oder

3.4

77

Maschinenbefehle

Einfache Beispiele: AP

SUMME,=X'710C'

Die als Sedezimalkonstante dargestellte gepackte Dezimalzahl + 7 1 0 wird auf den Inhalt des mit SUMME adressierten Feldes addiert. SUBTR SP

FELD(3),=B'01111100'

Die als Binärkonstante dargestellte gepackte Dezimalzahl + 7 wird vom Inhalt des 3 Bytes langen und mit FELD adressierten Feldes subtrahiert. PACK

4(3,8) ,=C'12345'

Die als Zeichenkonstante dargestellte Zahl 12345 wird in ein 3 Bytes langes mit (Reg. 8> + 4 adressiertes Feld gepackt. SS-Instruktionen (logisch) Allgemeines Format: Symb.Adr. Op.Code Operand 1, Operand 2 Operand 1 => Speicheradr. u. Längenschi. D i ( L 1 ; Bj) Ausdr. 1 (Ausdr. 2, Ausdr.3) Ausdruck 1, Ausdruck 2 und Ausdruck 3 vgl. bei SS (arithmetisch) oder Operand 1 => Speicheradr. u. Längensch]. S! ( L ^ -*• Symbol (Ausdruck) Ausdruck vgl. bei SS (arithmetisch) oder Operand 1 => Speicheradresse S,

Symbol

Operand 2 =» Speicheradresse D 2 (B 2 ) Ausdruck 1 (Ausdruck 2) Ausdruck 1 ist meistens ein Direktwert, ein Symbol, ein Längenattribut (L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 ist meistens ein Direktwert oder ein Symbol. oder Operand 2 => Speicheradresse S 2

Symbol

oder Operand 2 => Direktkonstante LT2 -*• Literal Die symbolischen Befehlsformate lauten: a) bei expliziter Adressierung und explizitem Längenschlüssel: S

Op.Code

D, (L,, B,), D 2 (B 2 )

78

3. Die Programmiersprache ASSEMBLER

Einfaches Beispiel: M0VE

MVC

10(200,12),310(12)

In das 200 Bytes lange und mit (Reg. 12) + 10 adressierte Feld werden 200 Bytes ab der Adresse (Reg. 12) + 310 übertragen. b) bei impliziter Adressierung und implizitem Längenschlüssel (der Längenschlüssel der Felddefinition ist maßgebend): S

Op.Code

S,, S 2

Einfaches Beispiel: MVC

FELD1.FELD2

In das mit FELD1 adressierte Feld werden in der Länge von FELD1 Bytes ab der mit FELD2 adressierten Speicherstelle übertragen. c) bei impliziter Adressierung und explizitem Längenschlüssel (der explizite Längenschlüssel dominiert): S

Op.Code

S , ( L , ) , S2

Einfaches Beispiel: C0MP

CLC

A(5),ZAHL

Der Inhalt des mit Α adressierten Feldes wird in der Länge 5 (beginnend bei A) mit dem Inhalt des mit ZAHL adressierten Feldes verglichen. d) Mischformen (jeder Operand kann unabhängig von anderen jede unter a) bis c) dargestellte Form annehmen): Einfache Beispiele: MVC CLC MVC

RECHF(5),201 (8) 0(20,7),FELD A,0(7)

e) bei Literalverwendung S S S

Op.Code Op.Code Op.Code

D, (L,, BO, LT 2 S, (L,), LT 2 Sj, LT 2

oder oder

Einfache Beispiele: MVC

17(3,11),=C'A11'

Die Zeichenkonstante A l l wird in ein 3 Bytes langes mit (Reg. 11 > + 17 adressiertes Feld übertragen. MVC

DRUCK(4),=C'NAME'

79

3.4 Maschinenbefehle

Die Zeichenkonstante NAME wird in der Länge 4 in das mit D R U C K adressierte Feld übertragen.

FELD

MVC

FELD,=X'00000C'

DS

CL3

Die als Sedezimalkonstante dargestellte gepackte Dezimalzahl + 0 wird in das mit FELD adressierte Feld übertragen.

3.4.2 Die relative symbolische Adressierung U m die Vergabe symbolischer Speicheradressen einzuschränken, kann relativ zu symbolischen Adressen adressiert werden. Die relative symbolische Adressierung ist also nur im Zusammenhang mit der impliziten Adressierung, also nur in Verbindung mit der Verwendung von Symbolen Sj möglich. Das allgemeine Operandenformat bei den dafür in Betracht kommenden Instruktionstypen lautet: Sj ± Ausdruckj Ausdruck ist meistens ein Direktwert, ein Symbol oder zuweilen auch ein Längenattribut ( L ' Symbol). Die Distanz , + Ausdruckj" bewirkt, daß bei der Ubersetzung die Distanzadresse des Adreßsymbols Sj um den Wert von „Ausdruckj" vergrößert bzw. verringert wird und so in die echte Maschineninstruktion eingesetzt wird. Im einzelnen gelten folgende Operandenformate:

RX- und RS-Instruktionen S 2 ± Ausdruck 2 Einfache Beispiele: L

5.W0RT+4

Der Inhalt des mit W 0 R T + 4 adressierten Speicherwortes wird in das Register 5 geladen. ST

3,W+4(6)

Der Inhalt des Registers 3 wird in das mit W + 4 + (Indexreg. 6> adressierte Wort im Arbeitsspeicher gespeichert. ST Μ

4,7.W0RTE+X'1O'

Die Inhalte der Register 4, 5, 6 und 7 werden in 4 aufeinanderfolgende Speicherworte gebracht, deren erstes mit W 0 R T E + 1 6 adressiert ist.

80

3. Die Programmiersprache ASSEMBLER

Sl-Instniktionen S! ± Ausdruck! Einfaches Beispiel: CLI

F E L D - 3 ,X'40'

Der Inhalt des mit FELD—3 adressierten Byte wird mit dem als Sedezimalkonstante dargestellten „blank", also mit dem bit-Muster 0100 0000, verglichen.

SS (arithmetisch)-Instruktionen a) impliziter Längenschlüssel (ungeachtet der Adreßmodifikation gelten die Längenschlüssel der Feidde finition): S, ± A u s d r u c k ^ S 2 ± Ausdruck 2 Einfaches Beispiel: AP

FELD—1,ZAHL+3

Der Inhalt des mit ZAHL+3 adressierten Feldes wird in der Länge des Feldes ZAHL auf den Inhalt des mit FELD—1 adressierten Feldes addiert, wobei letztgenanntes die Länge des Feldes FELD hat. b) expliziter Längenschlüssel (die impliziten Längenschlüssel der Felddefinition werden ersetzt): S, ± Ausdrucki ( L i ) , S 2 ± Ausdruck 2 ( L 2 ) Einfaches Beispiel: SP

A—3(5),B+6(2)

Der Inhalt des 2 Bytes langen und mit B+6 adressierten Feldes wird vom Inhalt des 5 Bytes langen und mit A—3 adressierten Feldes subtrahiert. c) Mischformen (Beispiele): PACK SP AP

ZAHL(5),EING+2 A+3(3),B-1 0(16,7),ZAHL+3(10)

SS (logisch)-Instruktionen a) impliziter Längenschlüssel (ungeachtet der Adreßmodifikation gilt beim ersten Operanden der Längenschlüssel der Felddefinition): S, ± Ausdruck!, S 2 ± Ausdruck 2 Einfaches Beispiel: MVC

FELD+13,ZAHL—4

Der Inhalt des mit Z A H L - 4 adressierten Feldes wird in das mit FELD+13 adressierte Feld übertragen, und zwar in der Länge von FELD.

3.4 Maschinenbefehle

81

b) expliziter Längenschlüssel (der implizite Längenschlüssel der Felddefinition wird bei ersten Operanden ersetzt): S! ± Ausdruck! ( L t ) , S 2 ± Ausdruck 2 Einfaches Beispiel: MVC

FELD+13(5),ZAHL-4

Der Inhalt des mit Z A H L - 4 adressierten Feldes wird in der Länge 5 in das mit FELD+13 adressierte Feld übertragen. c) Mischformen (Beispiele): CLC MVC CLC

7(5,8),A—10 FELD+13,FELD A—3(200),0(8)

3.4.3 Beschreibung der wichtigsten Maschinenbefehle 3.4.3.1 Übertragungsoperationen im Arbeitsspeicher Befehl: MVC Typ:

(move characters; Übertragen Zeichen)

SS (logisch)

Formate symbolisch: MVC MVC MVC

D ^ L , , B,), D 2 ( B 2 ) S ^ L , ) , S2 S„ S 2

Format maschinenintern: L, - l

I. Byle

2 Byle

B,

f -

3. Byle

T 4. Byte

S. Byte

6. Byte

Wirkungsweise: Übertragung von L, Bytes ab der durch (B 2 > + D 2 angegebenen Adresse in das mit + Di adressierte Feld. Maximal können 256 Bytes übertragen werden. Die Übertragung beginnt mit den Bytes, die die kleinsten Speicheradressen haben und geht von links nach rechts. Bedingungscode: Wird nicht verändert.

82

3. Die Programmiersprache ASSEMBLER

Codiemngsbeispiele: MVC

FELD1,FELD2

Übertragen von Bytes ab der symbolischen Adresse FELD2 in das mit FELD1 adressierte Feld. Es werden so viele Bytes übertragen, wie der implizite Längenschlüssel von FELD1 angibt. (Dieser sei beispielsweise gleich 3.)

nachher:

ΓΕΙ DI 1

— c ι ι

1

c ; 2 t

MVC

I

1— c ι 3 I

7(200,8),FELD2

Übertragen von 2 0 0 Bytes ab der symbolischen Adresse FELD2 in das mit + 7 adressierte Feld. MVC FELD1+3,208(8) Übertragen von Bytes ab der expliziten Adresse + 301 in das mit (Reg. 8> + 10 adressierte Feld. MVC FELD1 (30),FELD2—215 Übertragen von 30 Bytes ab der symbolischen Adresse FELD2—215 in das mit FELD1 adressierte Feld. Der explizite Längenschlüssel 30 rangiert vor dem impliziten Längenschlüssel von FELD1. MVC

FELD1+65(10),FELD2+74

Übertragen von 10 Bytes ab der symbolischen Adresse FELD2+74 in das mit FELD1+65 adressierte Feld. Der explizite Längenschlüssel 10 rangiert vor dem impliziten Längenschlüssel von FELD1. MVC

DRBER(3),DRBER—1

Löschen eines mit DRBER adressierten Feldes auf einer Lange von 3 Bytes. Das mit D R B E R - 1 adressierte Byte enthält ein „blank".

3.4 Maschinenbefehle

83

2. Operand

]. Operand (dieselbe DRBER Adresse)

Befehl: MVCL

Typ:

(move characters long; Übertragen Zeichen bei Langfeldern, ab System /370)

RR

Format symbolisch: MVCL

R,,R2

Format maschinenintern: 0



Ε

1I

1. Byte

R,

1!

R:

2.Byte

Wirkungsweise: Übertragung von bis zu 16,777,215 Bytes aus einem mit R 2 spezifizierten Sendefeld in ein mit R] spezifiziertes Empfangsfeld. R j und R 2 adressieren zwei Registerpaare R i , Ri + 1 und R 2 , R 2 + 1, wobei R, und R 2 jeweils gerade Zahlen größer 1 und kleiner 15 sein müssen.

Spezifikation des Empfangsfeldes: 31

23

0

31

23

0

K,

Für die Verschlüsselung von Adresse und Länge werden nur die jeweils 24 niederstwertigen bits benutzt, so daß die größte darstellbare Zahl auf 2 2 4 - 1 = 16777215 begrenzt ist. Eine Abstimmung auf die Verwendung des LA-Befehls ist unverkennbar (vgl. S. 90).

84

3. Die Programmiersprache ASSEMBLER

Spezifikation des Sendefeldes: 31

23

0

31

23

0

Die höchstwertigen 8 bits des Registers R 2 + 1 werden zur Verschlüsselung eines Füllzeichens z.B. blank (sedezimal: 40) benutzt; dies ist dann von Bedeutung, wenn die Länge des Sendefeldes kürzer ist als die des Empfangsfeldes. Die Verarbeitung erfolgt wie beim MVC-Befehl von links nach rechts in der Lange des Empfangsfeldes. Die Registerinhalte sind nach der Befehlsausführung verändert und müssen bei Wiederverwendung neu geladen werden.

Bedingungscode: 0: 1: 2: 3:

Länge beider Operanden ist gleich Länge 1. Operand < Länge 2. Operand Länge 1. Operand > Länge 2. Operand keine Befehlsausführung, da destruktive Feldüberlappung

Codierbeispiel: Empfangsfeld Sendefeld

FL2

FELD1, FELD2,

Länge, 4000 By tes Länge2 3600 Bytes

LA LA LA ICM MVCL

4,FELD1 5,4000 2,FELD2 3,15,FL2 4,5

DC DC

X'40' F '3600'

Eine Ausrichtung des Operanden FL2 auf Vollwortgrenze ist ab Modell /370 nicht mehr erforderlich. Zur Wirkungsweise von ICM vgl.S.y7. Die restlichen 400 Bytes des Empfangsfeldes werden mit dem Füllzeichen aufgefüllt.

3.4 Maschinenbefehle

_

4000 Bytes -

~

_ ..

3600 Bytes



Programmierhinweis: Ist die Adresse FELD2 kleiner als die von FELD1 und überlappen sich die Felder, so wird der MVCL-Befehl nicht ausgeführt (destruktive Überlappung)

Befehl: MVI Typ:

(move immediate; Übertragen Direktkonstante)

SI

Formate symbolisch: MVI MVI

D , ( B , ) , I2 S,, I j

Format maschinenintern: 9

|

:

U

._ .. I Byte

Β,

1 . Byte

Η

-

D, -1



>

3 Byte

4

Byte

Wirkungsweise: Das direkt im Befehl gespeicherte 8-bit-Muster I 2 wird in das mit + D adressierte Byte übertragen. Bedingungscode: Wird nicht verändert. Codierungsbeispiele: MVI

STELLE,C' '

In das mit STELLE adressierte Byte wird ein blank übertragen. MVI

0(7),P'-1'

86

3. Die Programmiersprache A S S E M B L E R

In das mit < Reg. 7 > + 0 adressierte Byte wird eine dezimal gepackte - 1 übertragen. MVI

BYTE+3,X'F1'

In das mit B Y T E + 3 adressierte Byte wird eine gezonte 1 übertragen, die hier durch eine Sedezimalkonstante dargestellt ist.

Befehl: MVN Typ:

(move numerics; Übertragen Ziffernteile)

SS (logisch)

Formate symbolisch: MVN MVN MVN

ϋ , α , , Β , ) , D2(B2) S , ( L , ) , S2 S,, S2

Format maschinenintern: D

:

L, - 1

.

1. Byte

2. Byte

B,

-1 r

Γ) '

3. Byte

1 1 4 Byte

·. *

Β



5 Byte

Γ\

1

»

6. Byte

Wirkungsweise: Die Instruktion bewirkt die Übertragung von L , rechten Halbbytes (Ziffern) ab der durch ( B 2 > + D 2 angegebenen Adresse in das mit + D, adressierte Feld, und zwar ebenfalls in die rechten Halbbytes. Die Übertragung erfolgt von links nach rechts. Maximal können 2 5 6 Halbbytes übertragen werden. Bedingungscode: Wird nicht verändert.

Codierungsbeispiele: MVN

BETRAG+311) ,=XOD'

Das rechte Halbbyte der als Literal definierten Sedezimalkonstante OD, also das bit-Muster 1101, wird in das rechte Halbbyte des mit B E T R A G + 3 adres-

3.4 Maschinenbefehle

87

sierten Byte übertragen. Der Längenschlüssel 1 ist explizite anzugeben, wenn BETRAG einen anderen impliziten Längenschlüssel als 1 hat. MVN

FELD1 ,FELD2

FELD1 habe die implizite Länge 3. FELD2

FELD1

nachher:

Weitere Codierungsmöglichkeiten wie bei Μ VC!

Befehl: MVZ Typ:

(move zones; Übertragen Zonenteile)

SS (logisch)

Formate symbolisch: MVZ MVZ MVZ

D, (L,, B,), D 2 ( B 2 ) S , ( L , ) , S2 S „ S2

Format maschinenintern: D,

L, I I Byte

: Byte

3 Byte

4 Byte

5 . Byte

6 . Byte

Wirkungsweise: Die Instruktion bewirkt die Übertragung von L, linken Halbbytes (Zonen) ab der durch 1 hat, weswegen hier explizite der Längenschlüssel 1 angegeben werden m u ß MVZ

FELD1,FELD2

F E L D 1 h a b e die implizite L ä n g e 3. FELD 1

nachher:

D

ι

FELD

2

5

Weitere C o d i e r u n g s m ö g l i c h k e i t e n wie bei M V C !

Befehl: MV0

Typ:

( m o v e with o f f s e t ; U b e r t r a g e n versetzt)

S S (arithmetisch)

Formate symbolisch: MV0 MV0 MV0

D, ( L „ B,), D 2 ( L 2 , B 2 ) S, (L,), S 2 ( L 2 ) S „ S2

Format maschinenintern: —I ι : L. I. Byte

2 Byte

B,

B, 3. Byte

4 Byte

S.Byte

6 . Byte

Wirkungsweise: Der d u r c h ( B , > + D 2 adressierte zweite O p e r a n d wird, u m ein H a l b b y t e nach links versetzt, in d e n mit < B , > + D , adressierten ersten O p e r a n d e n übertragen. Die V e r a r b e i t u n g verläuft von r e c h t s nach links.

89

3.4 Maschinenbefehle

Ist der 1. Operand zu kurz, so werden die höherwertigen Bytes des 2. Operanden nicht übertragen. Ist der 1. Operand länger als erforderlich, so wird er mit führenden Nullen aufgefüllt.

Bedingungscode: Wird nicht verändert.

Codierungsbeispiele: MV0

FELD1,FELD2

Die Länge von FELD1 sei L, = 3, die Lange von FELD2 sei L2 = 3. FELD2

FELD1 MV0

0(2,8),0{3,7)

(Reg. 7>

(Reg. 8> MV0

0(4,9),11(2,9) (Reg.

• 11 4

I ü ι 0 1 < Rtg. y > •o

I ι

4

Η

7777

1 U!4

1 1 !4

11

l· ;

3. Die Programmiersprache ASSEMBLER

90 MV0

RESULT(3),RESULT(2)

Wegbringen der letzten pezimalstelle: RESULTI2I

RESULT

3.4.3.2 Laden von Registern, Speichern von Registerinhalten Befehl: LA Typ:

(load address; Laden Adresse)

RX

Formate symbolisch 1 2 : LA

R1;D2(X2,B2)

LA

R,,S2(X2)

LA

R „ S2

Format maschinenintern: T· 4

: I

R)

.

Byte

ι

'T X,

B,

2. Byte

'C ι 3. Byte

-

D,

J



4. Byte

Wirkungsweise: In die 2 4 niederstwertigen bits des mit R , adressierten Registers wird die durch + ( R e g . B 2 > + D 2 angegebene Speicheradresse geladen. Die 8 höherwertigen bits von R , werden gleich Null gesetzt. 12

N e b e n diesen S t a n d a r d - l - o r m a t e n gibt es bei R X - I n s t r u k t i o n e n n o c h f o l g e n d e S o n d e r f o r m e n , d e r e n E i n s a t z i n s b e s o n d e r e b e i m L A - B e f e h l s i n n v o l l sein k a n n : Rl,D2(,B2)

statt

Rι, D2(X2)

statt

R|, D2

statt

R,,D2(0,

B2)

R|,D2(X2,0) R , , D 2 (0, 0)

91

3.4 Maschinenbefehle

Bedingungscode: Wird nicht verändert. Programmierhinweis: Die Angabe von X 2 oder B2 oder von beiden kann unterbleiben. Im letzteren Falle wird in das Register R, der Wert D2 geladen. Codierungsbeispiele: LA

3,FELD

Der Wert der Adresse FELD, d . h . 0 3:

Befehl: L Typ:

RX

(load; Laden Voll wort)

94

3. Die Programmiersprache ASSEMBLER

Formate symbolisch: L L L

R,, D 2 (X„ B 2 ) R,,S2(X2) R,,S2

Format maschinenintern: 5

:

s

R,

l.Byte

ι

Xj

Β,

2. Byte

ι* 3. Byte

1

r. Di ι

fr9

4. Byte

Wirkungsweise: In das mit R, adressierte Register wird der gesamte Inhalt (32 bits) des durch + + D2 adressierten Wortes geladen. Bedingungscode: Wird nicht verändert.

Programmieihinweis: Die Speicheradresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44 f.). Codierungsbeispiele: L

2,W0RT(3)

Der Inhalt des Wortes mit der (durch das Indexregister 3 modifizierten) symbolischen Adresse W0RT wird in das Register 2 geladen. L

5,15(7,9)

Der Inhalt des durch + + < B 2 > + D 2 adressierte Wort gespeichert. Bedingungscode: Wird nicht verändert. Programmierhinweis: Die Adresse des 2. Operanden muß a u f eine Voll wortgrenze ausgerichtet sein (vgl. Seite 4 4 f . ) . Codierungsbeispiele ST

2,W0RT

Der Inhalt des Registers 2 wird in das mit W 0 R T adressierte Vollwort im Arbeitsspeicher übertragen. ST

5,W(7)

Der Inhalt des Registers 5 wird in das mit W + ( I n d e x r e g . 7 ) adressierte Wort im Arbeitsspeicher übertragen.

Befehl: STH Typ:

(store halfword; Speichern Halbwort)

RX

F o r m a t e symbolisch: STH

R,,D3(X2,

STH

R|, S 2 ( X 2 )

STH

R,,S2

B2)

F o r m a t maschinenintem: 4

;



κ,

!

χ.

B.

>

|) :

-! 1

I. B y i e

?.Bvlf

.!

Byte

4

Byte



104

3. Die Programmiersprache ASSEMBLER

Wirkungsweise: Die niederstwertigen 16 bits des mit R, adressierten Registers werden in das mit (X 2 > + + D 2 übertragen.

106

3. Die Programmiersprache ASSEMBLER

Bedingungscode: Wird nicht verändert. Codierbeispiel: STCM

5,11,FELD

In diesem Fall sei = 11 1 0 = 1011 2 Reg. 5

FELD

+1

+2

Befehl: STM Typ:

(store multiple; Speichern mehrfach)

RS

Formate symbolisch: STM STM

R „ R3, D 2 ( B 2 ) R | , R3, S2

Format maschinenintern: 9

! ο l.Byie

R, ! R, : Byre

Β, Ι*" 3 Bytt

1 ' - D, ^ 4. Byte



Wirkungsweise: Die Inhalte der aufeinanderfolgenden Register R, bis R 3 werden in entsprechend viele Vollworte gespeichert, deren erstes mit (B2> + D 2 adressiert ist. Bedingungscode: Wird nicht verändert.

107

3.4 Maschinenbefehle

Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44 f.). Codierungsbeispiel: ST Μ

5,7,W0RTE

Reg. 5

Reg. 6

Reg

7

Befehl: LER Typ:

(load register single precision; Umladen kurz)

RR

Format symbolisch: LER

R,, R 2

Format maschinenintern: 3

!

ι

8

R,

I Byte

2

I

R,



Byte

Wirkungsweise: Der Inhalt des Gleitpunktregisters R 2 wird in das Gleitpunktregister R! geladen, und zwar nur der Inhalt der bit-Positionen 63 bis 32. Die bit-Positionen 31 bis 0 bei R, sind nach dieser Operation unverändert. Bedingungscode: Wird nicht verändert. Codierungsbeispiel: LER

0,6

108

3. Die Programmiersprache ASSEMBLER

GP-Regisler 6 63

55

63

55

C P Register 0

Befehl: LDR Typ:

(load register double precision; Umladen lang)

RR

Format symbolisch: LDR R,, R 2 Format maschinenintern: 2

8

R,

I Byte

2. Byte

Wirkungsweise: Der Inhalt des Gleitpunktregisters R 2 wird in voller Länge in das Gleitpunktregister R[ umgeladen. Bedingungscode: Wird nicht verändert. Codierungsbeispiel: LDR GP· Register 2 63

GP-Register 4

55

4,2

109

3.4 Maschinenbefehle

Befehl: LE Typ:

(load single precision ; Laden GP-Wort)

RX

Formate symbolisch: LE LE LE

R„ D2(X2,B2) R„S2(X2) R[, S 2

Format maschinenintem:

1 Byte

2 Byte

3 Byte

4. Byte

Wirkungsweise: Der Inhalt des mit + + D 2 adressierten Speicherwortes (32 bits) wird in die bit-Positionen 63 bis 32 des Gleitpunktregisters R! geladen. Die bitPositionen 31 bis 0 von R, sind nach dieser Operation unverändert. Bedingungscode: Wird nicht verändert. Programmierhinweis: Die Adresse des 2. Operanden ist auf eine Wortgrenze auszurichten (vgl. Seite 44 f.). Codierungsbeispiel: LE

2,W0RT

WORT

( ; P Register J

V

unverändert

110

3. Die Programmiersprache ASSEMBLER

Befehl: LD Typ:

(load double precision; Laden GP-Doppelwort)

RX

Formate symbolisch: LD LD LD

R „ D 2 (X 2 , B 2 ) R„S2(X2) R,,S2

Format maschinenintern: 6

:




CP-Regisler 4

4,DW0RT(1)

111

3.4 Maschinenbefehle

Befehl: ST Ε Typ:

(store single precision; Speichern GP-Wort)

RX

Formate symbolisch: STE STE STE

R„ D 2 (X 2 , B,) R,, S 2 ( X 2 ) R„ S 2

Format maschinenintem: -

7

—1 ; ο

•τ R, ; x :

I Byte

2. Byte

B,

"Ί— _ > 3. Byte

1 • D, π «4 Byte

Wirkungsweise: Der Inhalt der bit-Positionen 63 bis 32 des Gleitpunktregisters R, wird in das mit (X 2 > + + D 2 adressierte Speicherwort gespeichert. Bedingungscode: Wird nicht verändert. Progranunierhinweis: Die Adresse des 2. Operanden ist auf eine Wortgrenze auszurichten (vgl. Seite 44 f.).

Codierungsbeispiel: STE

0,W+4

GP-Register 0 63 55

32 31

W+4

ι 1 1 ι

ι 1

1 1 .1

1 1

0

112

3. Die Programmiersprache ASSEMBLER

Befehl: STD Typ:

(store double precision; Speichern GP-Doppelwort)

RX

Formate symbolisch: STD STD STD

R „ D j ( X 2 , BJ) R„ Sj(XJ) R,, S 2

Format maschinenintern: 6

!

1

1 Rj , X]

0

1 Byte

1 • D, i

b>

2 Byte

3 Byte

4

Byte

Wirkungsweise: Der Inhalt des Gleitpunktregisters R] wird in das mit + (B 2 > + D 2 adressierte Doppelwort im Arbeitsspeicher gespeichert.

Bedingungscode: Wird nicht verändert. Programmierhinweis: Die Adresse des 2. Operanden ist auf eine Doppelwortgrenze auszurichten (vgl. Seite 44 f.).

Codierungsbeispiel: STD

6,D+8(7)

GP- Register 6 63

55

32 31

0

v D+8+ (Indexreg. 7)

ι I I·

Ι

ι

1 · I

ι

1

·

I

ι

ι

I

I


B 2 ) S,(L,), S2(L2) S,, S 2

Format maschinenintern:

I Byte

2 Byte

3 Byte

4. Byte

S.Byte

6. Byte

Wirkungsweise: Der durch + D 2 adressierte 2. Operand wird (normalerweise) in der Länge L 2 aus der gezonten in die gepackte Form überfuhrt und in das durch (Β ι) + D j adressierte Feld gespeichert. Die Verarbeitung verläuft byteweise von rechts nach links, also entgegengesetzt wie ζ. B. bei MVC. Das Vorzeichen wird aus dem Zonenteil (linkes Halbbyte) des niederstwertigen Byte des 2. Operanden genommen und unverändert in den Ziffernteil (rechtes Halbbyte) des niederstwertigen Byte des 1. Operanden gespeichert. Beispiele für gezonte und gepackte Zahlenfelder:

F;O

gezonte Zahl - 1 — —RF;O F : 7 F[2 •

gepackte Zahl

D [5

Vorzeichen

-1——ι— ι I ι; ο 4; 3 ι; f ι

Vorzeichen

Ist der erste Operand (empfangendes Feld) länger als erforderlich, um alle Ziffern aufzunehmen, so wird er (links) durch führende Nullen aufgefüllt. Ist das empfangende Feld zu kurz, um alle Ziffern aufzunehmen, so werden die (linken) höherwertigen Ziffern des 2. Operanden (sendendes Feld) nicht berücksichtigt. Bedingungscode: Wird nicht verändert.

3. Die Programmiersprache ASSEMBLER

114

Programmierhinweis: Die genau passende Länge des empfangenden Feldes errechnet sich wie folgt: Länge des empfangenden Feldes = [(Länge des sendenden Feldes + 2)/2] oder kürzer: L, = [(L2 + 2)/2]. Ist die Länge des sendenden Feldes eine gerade Zahl, dann werden im empfangenden Feld L 2 Halbbytes mit Ziffern, 1 Halbbyte mit dem Vorzeichen und 1 Halbbyte mit einer fuhrenden Null belegt. Ist die Länge des sendenden Feldes eine ungerade Zahl, dann werden L 2 Halbbytes mit Ziffern und 1 Halbbyte mit dem Vorzeichen belegt. Die maximalen Werte fur L, und L 2 sind je 16.

Beispiele: a) ist die Länge des sendenden Feldes = 5, dann ist die Länge des empfangenden Feldes = [(5 + 2)/2] = 3 b) ist die Länge des sendenden Feldes = 6, dann ist die Länge des empfangenden Feldes = [(6 + 2)/2] = 4. Codierungsbeispiele: PACK

REFE.ZAHLEN

Die Länge von REFE sei 3, die Länge von ZAHLEN sei 5 ZAHLEN 2. Operand

I. Operand

PACK

REFE1.ZAHLEN

Die Länge von REFE1 sei 4, die Länge von ZAHLEN sei 5 ZAHLEN

r—ι—Γ—I—I——I— 2 Operand

I. Operand (wird mit fuhrenden Nullen aufgefüllt) REFE1

3.4 Maschinenbefehle

PACK

115

REFE2,ZAHLEN

Die Länge von R E F E 2 sei 2, die Lange von ZAHLEN sei 5 ZAHLEN

PACK

REFE1,ZAHLEN1

Die Länge von R E F E 1 sei 4 , die Länge von ZAHLEN1 sei 6 ZAHLEN1 2. Operand

1. Operand (wird mit einer führenden NuU aufgefüllt).

PACK

FELD(3),BETRAG(5)

In das Feld mit der symbolischen Adresse FELD und der expliziten Länge L , = 3 sollen L 2 = 5 Bytes aus dem Feld mit der symbolischen Adresse B E T R A G gepackt werden. Anm.: Bei Befehlen des Typs SS (arithmetisch) ist auch die implizite oder explizite Länge des 2. Operanden relevant. Daher ist die explizite Länge L 2 anzugeben, wenn sie von der impliziten Länge des 2. Operanden abweichen soll. PACK

0(4,81,3(6,8)

In das mit ( R e g . 8 > + 0 adressierte Feld der Länge 4 sollen 6 Bytes aus dem mit + 3 adressierten Feld gepackt werden. PACK

FELD+27(5),BETRAG

116

3. Die Programmiersprache ASSEMBLER

In das mit FELD+27 adressierte Feld der Länge 5 sollen soviele Bytes aus dem mit BETRAG adressierten Feld gepackt werden, wie dessen implizite Länge angibt.

Befehl: UNPK Typ:

(unpack; Entpacken von gepackten Dezimalzahlen)

SS (arithmetisch)

Formate symbolisch: UNPK UNPK UNPK

D , ( L „ BO, D 2 ( L 2 , Bj) S, (L,), S 2 ( L 2 ) S„ S 2

Format maschinenintern:

1 Byte

2. Byte

3 Byte

4 Byte

S.Byte

6 Byte

Wirkungsweise: Der durch + D 2 adressierte 2. Operand wird (normalerweise) in der Länge L j aus der gepackten in die gezonte Form überfuhrt und in das durch + Di adressierte Feld gespeichert. Die Verarbeitung verläuft von rechts nach links, also entgegengesetzt wie ζ. B. bei MVC. Das Vorzeichen wird aus dem Ziffernteil (rechtes Halbbyte) des niederstwertigen Byte des 2. Operanden unverändert in den Zonenteil (linkes Halbbyte) des niederstwertigen Byte des 1. Operanden übertragen. Ist der 1. Operand (empfangenes Feld) länger als erforderlich, um alle Ziffern aufzunehmen, so wird er (links) durch fuhrende (gezonte) Nullen aufgefüllt. Ist der 1. Operand zu kurz, um alle Ziffern aufzunehmen, so werden die (linken) höherwertigen Ziffern des 2. Operanden nicht berücksichtigt. Bedingungscode: Wird nicht verändert. Programmierhinweis: Die genau passende Länge des empfangenden Feldes errechnet sich wie folgt:

3.4 Maschinenbefehle

117

Länge des empfangenden Feldes = Länge des sendenden Feldes * 2 — 1 oder kürzer: Li = 2 * L 2 - 1. Die maximalen Werte fur L , und L 2 sind j e 16! Codierungsbeispiele: UNPK

ZAHLEN,REFE

Die Länge von ZAHLEN sei 5, die Länge von R E F E sei 3. REFE 5

:

3

Λ -

ρ : 5

£§ I

5

1 D

F ; 3

F

I 1 l _ ..

7

!

ZAHLEN

UNPK

2. Operand

Γ F

!

1

D

Τ ;

5

1. Operand

ZAHLEN1,REFE

Die Länge von ZAHLEN1 sei 6, die Länge von REFE sei 3.

2. Operand

1. Operand (wird mit einer führenden Null aufgefüllt).

ZAHLEN!

UNPK

ZAHLEN2,REFE

Die Länge von ZAHLEN2 sei 4 , die Länge von REFE sei 3 . REFE

7

τ

! '

3

ι |

v

:

ι

8

1 \

Ä •. X

\ F

1

F

!

3

D

2. Operand

2

F

1 ]

1

D

|

8

1. Operand (die Ziffer 7 des 2. Operanden wird nicht

2AHLEN2

berücksichtigt).

UNPK

FELDA+4(7),FELDB+2(4)

In das Feld mit der symbolischen Adresse F E L D A + 4 und der Länge 7 sollen 4 Bytes aus dem Feld mit der symbolischen Adresse F E L D B + 2 entpackt werden.

118

3. Die Programmiersprache ASSEMBLER

Befehl: ED

Typ:

(edit packed data; Aufbereiten gepackter Zahlen zum Drucken)

SS (logisch)

Formate symbolisch: ED ED ED

ϋ , α , , Β , ) , D2(B2) S.iLO.Sj S„ S 2

Format maschinenintern: Li " I I

Byte

:

Byte

D, 3

By te

4

Byte

5

Byte

6

Byte

Wirkungsweise: Die dezimal gepackten Zahlen des mit + D 2 adressierten Feldes werden entpackt und zusammen mit einer Aufbereitungsmaske zur Erzeugung eines bestimmten Druckbildes verarbeitet. Die Maske ist zuvor in das mit (B,> + D, adressierte Feld zu übertragen. Die Verarbeitung verläuft von links nach rechts; dabei können u.a. Vorzeichen berücksichtigt, Dezimalpunkte oder Kommas eingefügt, führende Nullen unterdrückt und führende Nullen durch Füllzeichen ersetzt werden. Die Maske (Schablone) kann aus folgenden Zeichen bestehen: (1)

Einfügungszeichen (alle druckbaren Zeichen und blank)

(2)

Ziffernzeichen (Symbol: V ; Lochkombination: 11-0-1-8-9; sedezimal: X'20')

(3)

Startzeichen für Nullen (Symbol: [; Lochkombination: 0-1-9; sedezimal: X'2l')

(4)

Ende-Zeichen für Nullen (Symbol: ]; Lochkombination: 0-2-9; sedezimal: X'22')

Das äußerst linke Byte der Maske muß ein Einfügungszeichen sein. Es hat die Funktion eines Füllzeichens; d . h . es ersetzt etwaige führende Nullen. Die Dezimalziffern des 2. Operanden werden wegen des Füllzeichens erst ab dem 2. Byte der Maske abgesetzt. Im einzelnen wirken die Zeichen wie folgt: (1)

Die Unterdrückung führender Nullen ist automatisch wirksam.

3.4 Maschinenbefehle

119

(2)

Die Nullenunterdrückung wird aufgehoben durch a) die Ziffern 1 - 9 im Zahlenfeld (2. Operand) b) das Maskenzeichen [ (Startzeichen für Nullen); dabei erscheint die erste führende Null eine Schreibstelle rechts vom [-Zeichen!

(3)

Die Nullenunterdrückung wird wieder wirksam durch a) ein Byte im Zahlenfeld (2. Operand), welches aus einer Ziffer und einem positiven Vorzeichen besteht b) das Maskenzeichen ] (Endezeichen für Nullen); dabei erscheint an der Stelle des ]-Zeichens im Druckbild das Füllzeichen und die Nullenunterdrückung beginnt eine Schreib stelle rechts vom ]-Zeichen!

(4)

Während die Nullenunterdrückung wirksam ist, ersetzt das Füllzeichen (Einfügungszeichen) aus dem äußerst linken Byte der Maske die führenden Nullen und etwaige andere Einfügungszeichen.

(5)

Ist die Nullenunterdrückung aufgehoben, so werden u. a. alle Einfugungszeichen gedruckt. Da Bytes mit positiven Vorzeichen die Nullenunterdrückung wieder wirksam machen, Bytes mit negativen Vorzeichen dagegen nicht, können negative Beträge rechts anschließend mit Einfugungszeichen gekennzeichnet werden.

(6)

Die Maske muß stets genau soviele V - und [-Zeichen haben, wie das Zahlenfeld (2. Operand) Ziffern (ohne Vorzeichen) hat, denn diese Zeichen werden durch die Ziffern ersetzt. Eine Maske der Länge Li kann höchstens L, — 1 Ziffern aufnehmen, da das I. Byte für das Füllzeichen reserviert ist.

Bedingungscode: 0: letzte ausgegebene Ziffer = 0 1: letzte ausgegebene Ziffer hat negatives Vorzeichen 2: letzte ausgegebene Ziffer hat positives Vorzeichen 3:

Codierungsbeispiele: (1)

Maske u_> VWV

MASKE ZAHLEN

MVC ED

DRBER+1(5),MASKE DRBER+1(5),ZAHLEN

DC DS

X'4020202020' CL4

120

3. Die Programmiersprache ASSEMBLER

ZAHLEN 1 ο. 1; ο

4 ; ο DRBER + 1

2 :ο

4 ;ο

4 ! 0

I 4 ι5

:

:

:ο

\ο

7 ! C

2. Operand

:

1. Operand (nach MVC I

Λ ο \

\

^ w l 4 ;ο

Druckbild:

(2)

1 ι : ι

ι F ; ι

1- Operand (nach ED)

11

Maske

MASKE REFE

1 F •! ι

i_/V,V[V.VV

MVC ED

DRBER+K9), MASKE DRBER+1(9),REFE

DC DS

X'40206B2021204B2020' CL4

REFE ι

. . .. , ; *

» :

7

Τ1" 1 ! 3

1 5 ; f

: λ ο

2

_

DRBER+1 6 ! Β

4 ;ο



·

DRBER+1 " Ν 1 4 ! 0 ι- ; ι

6 ; Β

Druckbild:

1.987.13

F : 4

\

1

W F ! Κ —ι-

:

\ο Μ

\ ι ; 7

1 4 IΒ

: ^0

\

^ 4 :Β I

: λο

\

W

'

: ι

ι

1 ; i

3.4 Maschinenbefehle (3)

121

Maske vgl. (2) REFE

τ

0

-

ο

ι

ϊ\

\/

: ο ι

3

—r !

1

7

r \

! D

5

6

DRBER+1 4

; ο

2

0

6

Β

2

4

:

*

ο

4

0

4

ο

2

\

1

2

Ν t\ ο

Druckbild:

(4)

0

F

I ι 1

I

\° I

F

! I

4

; Β

4

ί r

1 0

Ν

10.31

Maske vgl. (2) REFE

Druckbild:

0.01

Kennzeichnung von negativen Beträgen (5)

Maske:

BETRAG

2

l_,[v.wv-

MVC ED

D R B E R + 1 (8),=X'4021204B20202060' D R B E R + 1 (8),BET R A G

DS

CL3

Β

F

\

1

I

0

2

U 3

f

\

1 • : ι

0

122

3. Die Programmiersprache ASSEMBLER BETRAG

Druckbild:

13.578-

Die Nullenunterdrückung wird nicht wieder eingeschaltet, da hier ein negativer Betrag vorliegt; also werden alle nachfolgenden Zeichen gedruckt.

Maske vgl. (5) BETRAG Γ'

!

1 / /

\

4 ; 0

4 ; ο 1 DRBER+1

4 ! C

ι

2/

2

\

1

F ; ι

Druckbild:

2



\ F ! 1 ι

u

ORBER+1

ι !

'

:

OD

(6)

λ 4 •; Β

ο

\ F ; ι 1

:

\

0

: 10

6 ; ο

\TH^

F ; 7

F ! 4 ι

1 4 ; ο

11.174

Die N u l l e n u n t e r d r ü c k u n g w i r d w i e d e r e i n g e s c h a l t e t , da hier ein positiver Betrag v o r l i e g t ; also w e r d e n a u c h alle n a c h f o l g e n d e n E i n f ü g u n g s z e i c h e n d u r c h das Füllzeichen (hier b l a n k ) ü b e r s c h r i e b e n .

Schreiben von Schutzsternen: (7)

Maske: * V W [ V . W *

MVC

DRBER+1 (10),MASKE

3.4 Maschinenbefehle

SUMME MASKE

123

ED

DRBER+1(9),SUMME

DS DC

CL4 X'5C20202021204B20205C'

ο ; ο 1

ο ; .ι I

1 .' 4 1

ι 1 c 1

IBER-1 Druckbüd.

. . . 31.41 .

Der letzte Stern wird von der Wiedereinschaltung der Nullenunterdrückung durch den positiven Betrag nicht berührt; denn die EDOperation geht hier nur über 9 Bytes. Einfügen von Texten: (8)

Maske: i _ j V W B I S V [ v

ERGEBN SCHABL

MVC ED

DRBER+1 (10),SCH ABL DRBER+1 (10), ERG Ε BN

DS DC

CL4 X'40202020C2C9E2202120'

ERGEBN

Druckbüd:

141BIS041

3. Die Programmiersprache ASSEMBLER

124

(9)

Maske:

ERGEBN MASKE

V W BIS]V[V

MVC ED

DRBER+1111),MASKE DRBER+1(11),ERGEBN

DS DC

CL4 X'40202020C2C9E222202120'

ERGEBN

Druckbild:

(10) Maske vgl. (9) ERGEBN

14 IBIS

41

3.4 Maschinenbefehle

125

Der Text wird durch das Füllzeichen überschrieben, weil die Nullenunterdrückung noch wirksam ist. Druckbild:

141

Befehl. CVB

Typ:

(convert to binary; Umwandeln gepackte Dezimalzahl in Dualzahl)

RX

Formate symbolisch: CVB CVB CVB

R „ D 2 (X 2 , B 2 ) R „ S 2 (X 2 ) R „ S2

Format maschinenintem:

1. Byte

: Byte

3. Byte

4. Byte

Wirkungsweise: Der Inhalt des mit + + D 2 adressierten Doppelwortoperanden wird aus der dezimal gepackten Form in die duale Form umgewandelt und im Register R, gespeichert. Der ursprüngliche Inhalt des Doppelwortes bleibt erhalten. Bedingungscode: Wird nicht verändert. Programmierhinweise: Die gepackte Dezimalzahl muß rechtsbündig mit Vorzeichen im Doppelwort stehen; sie darf maximal +2147483647 oder - 2 1 4 7 4 8 3 6 4 8 groß sein, weil in einem 32-bit-Register größere Zahlen nicht darstellbar sind. Der 2. Operand muß auf eine Doppelwortgrenze ausgerichtet sein (vgl. Seite 44 f.).

126

3. Die Programmiersprache ASSEMBLER

Codierangsbeispiel:

DW

CVB

5,DW

DS

D

Reg. 5 Anm.: Negative Zahlen werden im 2er-Komplement dargestellt und haben im Vorzeichenbit eine 1 (vgl. Seite 20).

Befehl: CVD

Typ:

(convert to decimal; Umwandeln Dualzahl in gepackte Dezimalzahl)

RX

Formate symbolisch: CVD CVD CVD

Rj, D 2 (X 2) B 2 ) R„ S2(X2) R „ S2

Format maschinenintern: 4

I»: t I Byle

κ,

—ι »; x, 2 Byte

I Hj »!·» 1 Byte

• 1), -1 4 Byte



Wirkungsweise: Der Inhalt des mit R, adressierten Registers wird aus der dualen in die dezimal gepackte Form umgewandelt und rechtsbündig mit Vorzeichen in den durch

127

3.4 Maschinenbefehle

+ + D2 adressierten Doppelwortoperanden gespeichert. Der Inhalt des Registers R j bleibt erhalten. Bedingungscode: Wird nicht verändert. Programmierh inweis: Der 2. Operand muß auf eine Doppelwortgrenze ausgerichtet sein (vgl. Seite 44 f.) Codierungsbeispiel:

D0W0RT

CVD

6.D0W0RT

DS

D

Reg. 6

Unterprogramme: CNVTDEGP CNVTGPDE Für die Codetransfonnationen von Dezimal- oder Dualzahlen in sedezimale Gleitpunktzahlen und zurück gibt es keine einfachen Instruktionen. Diese Transformationen müssen per Programm vorgenommen werden. Zwar enthält das Übersetzungsprogramm eine Routine für die Transformation von dezimal geschriebenen Gleitpunktkonstanten (Typen Ε und D) in den sedezimalen Gleitpunktcode, jedoch steht diese Routine dem Programmierer nicht zur Verfügung. Im folgenden werden zwei Routinen für derartige Codetransformationen vorgeschlagen, und zwar eine für die Transformation von EBCDI-verschlüsselten Dezimalzahlen in sedezimale Gleitpunktzahlen und eine für die Rücktransformation.

128

3. Die Programmiersprache ASSEMBLER

Da man diese Routinen in der Regel zusammen benötigt, werden sie programmtechnisch zu einem einzigen intramodularen Unterprogramm mit zwei symbolischen Adreßeingängen vereinigt. Der Adreßeingang CNVTDEGP gehört zur Routine für die Umwandlung von Dezimalzahlen in sedezimale Gleitpunktzahlen und der Adreßeingang CNVTGPDE zur Routine für die entsprechende Rückumwandlung. Vor dem Aufruf des Unterprogramms CNVTDEGP muß die umzuwandelnde Dezimalzahl, die bis zu 16 gezonte Ziffern, einen Dezimalpunkt und einen Exponenten haben kann, normalisiert und aufbereitet werden: (1)

Ein etwaiger Dezimalpunkt und etwaige führende Nullen sind zu entfernen, um eine Mantisse zu erzeugen, die mit einer Ziffer Φ 0 beginnt.

(2)

Der Dezimalpunkt wird links vor der höchstwertigen Ziffer der Mantisse angenommen. Der Exponent ist entsprechend der Rechts- oder Linksverschiebung des Dezimalpunktes zu vermindern bzw. zu vergrößern.

(3)

Die Mantisse ist als positive, ungepackte Dezimalzahl rechtsbündig in einem 16 Bytes langen Feld mit der symbolischen Adresse F16, das Vorzeichen als Zeichenkonstante ( „ + " oder „ - " ) in einem Byte mit der symbolischen Adresse VZ und der Exponent als positive oder negative Dualzahl im Festpunktregister 4 zur Verfügung zu stellen. Die umgewandelte sedezimale Gleitpunktzahl steht dann mit langer Mantisse im Gleitpunktregister 0 bereit.

Vor dem Aufruf des Unterprogramms CNVTGPDE muß die umzuwandelnde sedezimale Gleitpunktzahl normalisiert und mit langer Mantisse im Gleitpunktregister 6 bereitgestellt werden. Die umgewandelte Dezimalzahl erscheint dann ebenfalls in Gleitpunktdarstellung, und zwar erscheint die Mantisse als vorzeichenlose (positive) ungepackte Dezimalzahl linksbündig mit 16 Stellen in Feld F16; der Dezimalpunkt ist links vor der höchstwertigen Ziffer der Mantisse anzunehmen; die Vorzeichen der Dezimalzahl und des dezimalen Exponenten erscheinen als Zeichenkonstanten ( „ + " oder „ - " ) in den Feldern VZ bzw. VZE; der Exponent steht als positive Dualzahl im Festpunktregister 4 zur Verfügung. Der mathematische Hintergrund der Umwandlungen ist der folgende: (1)

Bei der Umwandlung einer dezimalen Gleitpunktzahl ± O.xx . . . x* 1 0 ± d in eine sedezimale Gleitpunktzahl ± O.yy . . . y * 1 6 i s

129

3.4 Maschinenbefehle

wird z u n ä c h s t die dezimale Mantisse als eine Dezimalzahl O.xx . . . x * 1 0 " v e r a r b e i t e t . Die U m w a n d l u n g in das sedezimale Ä q u i v a l e n t ergibt eine S e d e z i m a l z a h l der F o r m O.yy . . . y * 1 6 ° . S o d a n n wird in e i n e r T a b e l l e die zur w a h r e n Z e h n e r p o t e n z der Dezimalzahl gehörige sedezimale Gleitp u n k t z a h l a u f g e s u c h t . Nun wird O.yy . . . y * 1 6 ° in e i n e m G l e i t p u n k t register m i t dieser S e d e z i m a l z a h l multipliziert, und m a n erhält die gesuchte Sedezimalzahl. (2)

B e i der U m w a n d l u n g einer sedezimalen in eine dezimale G l e i t p u n k t z a h l wird die S e d e z i m a l z a h l mit den S e d e z i m a l z a h l e n in der b e r e i t s o b e n g e n a n n t e n T a b e l l e verglichen. Die u m z u w a n d e l n d e S e d e z i m a l z a h l wird d u r c h die erste S e d e z i m a l z a h l in der T a b e l l e , die g r ö ß e r als die u m z u w a n d e l n d e ist, dividiert. Hierbei sind zwei F ä l l e m ö g l i c h : E n t w e d e r hat die erste g r ö ß e r e T a b e l l e n z a h l eine kleinere Mantisse und einen u m 1 g r ö ß e r e n E x p o n e n t e n o d e r bei gleichen E x p o n e n t e n eine g r ö ß e r e Mantisse als die u m z u w a n d e l n d e Z a h l . A u f j e d e n F a l l e n t s t e h t a b e r bei der Division eine S e d e z i m a l z a h l m i t dem E x p o n e n t e n 0 zur Basis 1 6 , also entweder O.uu . . . u * 1 6 ± s / 0 . t t . . . t * 1 6 - s + 1 = O.yy . . . y * 1 6 ° bei

O.uu . . . u > O.tt . . . t

oder O.uu . . . u * 1 6 ± s / 0 . t t . . . t * 1 6 ± s = O.yy . . . y * 1 6 ° bei

O.uu . . . u < O.tt . . . t

Z u g l e i c h ist m i t der T a b e l l e n z a h l O.tt . . . t » 1 6 ± s ( + 1 ) der e n t s p r e c h e n d e E x p o n e n t ± d zur Basis 1 0 b e k a n n t . Die U m w a n d l u n g O.yy . . . y * 1 6 ° ergibt e i n e Dezimalzahl O.xx . . . x * 10°. Diese wird m i t 1 0 h o c h ± d m u l t i p l i z i e r t , und m a n erhält die gesuchte D e z i m a l z a h l .

UMWANDLUNG V0N DEZIMALZAHLEN CNVTDEGP

PCK

STM LA MV I MVC CLI BE MVI PACK MVC ZAP MV0 CVB ST MVC

2.7.RETT27 6 , PTABLE+600 GW,X 1 48' GW+5(3) ,» 3X 1 0 0 ' VZ,C'+' PCK GW , X 1 C 8 ' F9.F16 MV IGW+1(1),GW DW , » P 1 0 ' DW+3(5),F9(5) 3,DW 3,FW GW+1(4),FW

IN GP-ZAHLEN (1) (2)

(3) (4) (5) (6) (7) (8)

(9) (10) ( Π )

Iii! (14)

3. Die Programmiersprache A S S E M B L E R

130

MVIGU

TAB

DIV ID EXITTAB

LD S BAL LDR MV I ZAP CVB ST MVC LD S BAL ADR LM BR

2,GW 4 , = F' 9' 7 .TAB 0,2 GW ,X ' 48 1 DW,F9+5(4) 3 ,DW 3 ,FW GW+1(4),FW 2.GW 4 ,»F ' 7 ' 7 ,ΤΑΒ 0,2 2.7.RETT27 11

15) (16) (I7) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29)

LPR Μ C BL MD Β DD BR

3,4 2,=F'8' 4 ,»F 1 0 1 DIVID 2,0(3,6) EXITTAB 2.0(3,6) 7

(30) (31) (32) (33) (34) (35) (36) (37)

« U M W A N D L U N G V0N G P - Z A H L E N CNVTGPDE

CD1

SUCHTAB CD

GEFUNDEN

STM MVC L CD BNL MV I LPDR CD BNL MV I SR L CD BL LA BCT DD SRDA D S BAL MVC MVN ZAP MVC LD BAL AP UNPK MVZ TM BM MVC S

IN

DEZIMALZAHLEN

2 ,7 ,RETT27 V Z ( 2 ) ,=C'++' 4 , = F 1600' 6 ,=D ' 0 ' CD 1 VZ,C'-' 6,6 6 , = D 1 11 SUCHTAB V Z E ,C ' - ' 4,4 7 , = F176' 6 ,PTABLE(4) GEFUNDEN 4,8(4) 7 ,CD 6 , P T A B L E (4) 4,32 4 , = F1 81 5,=F'75' 2,MANTISSE F 9 ( 5 ) ,DW+3 F9 + 4 ( 1 ) , = X ' 0 0 ' F 9 + 5 ( 4 ) , = P'0' GW+1(7),FW7 6 ,GW 2,MANTISSE F9 ,DW + 3(5) F16.F9 F16 + 15(1) , = X ' F F 1 Fie.B'OOOOllll' LPR45 F 1 6 ( 1 6 ) .F16 + 1 5 , = F ' 1'

(38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49) (50) (51) (52) (53) (54) (55)

iffl (58)

(59) (60) (61) (62) (63) (64) (65) (66) (67) (68) (69) (70) (71)

131

3.4 Maschinenbefehle LPR45

MANTISSE

ST7

»

I PR LM LM BR

4,5 2,3,RETT27 5 , 7 . R E T T 2 7 + 12

(72) (73) (74) (75)

MO STD LM SIDL SRDL CD BNL SRDL ST CVD BR

6 , P T A 8 L E + 664 6 ,GW 6 , 7 ,GW 6,8 6,4 6,K0N471 ST7 6,4 7 ,FW7 6 ,DW 2

(76) (77) (78) (79) (80)

K O N S T A N T E N UND

PTABLE

K0N471 GM DU FW FW7 F16 F9 VZ VZE RETT27

11

(81) (82) (83) (84) (85) (86)

BEREICHE

DC DC DC

D·1E-75 ' D'1E-74' D'1E-73'

DC DC DC OS DS DS DS DC DS DC DS OS DS DS

D'1E74 D' 1 E 7 5 X·4710 D D F F 3X100' CL16 X' FO' CL9 CL 1 CL1 6F

Kommentare zu den Instruktionen der Programmstücke CNVTDEPG und CNVTGPDE: (1)

Retten der Registerinhalte 2 bis 7 in das Feld R E T T 2 7 .

(2)

Laden der Adresse von 10° in der Potenztabelle nach Register 6 .

(3)

Im Feld GW soll die sedezimale Gleitpunktzahl aufgebaut werden. Daher wird das bit-Muster 0 1 0 0 1000 (sedezimal: 4 8 ) in das erste Byte von GW gebracht, um vorab ein positives Mantissen Vorzeichen und den Exponenten 72 ~ 7 zur Basis 16 darzustellen. Letzteres ist nötig, weil bei der Umwandlung der dezimalen Mantisse im Festpunktregister zunächst eine Zahl y · 16 7 entsteht.

(4)

Die letzten 3 Bytes von GW werden mit sedezimalen Nullen aufgefüllt, weil diese Stellen nicht benötigt werden.

132

3. Die Programmiersprache ASSEMBLER

(5) Prüfen, o b die Dezimalzahl tatsächlich positiv ist. (6) Wenn j a , dann Sprung nach PCK. (7) Andernfalls wird in das erste Byte von GW das bit-Muster 1 1 0 0 1000 (sedezimal: C8) gebracht, um ein negatives Mantissenvorzeichen und den E x p o n e n t e n 72 ~ 7 zur Basis 16 darzustellen (vgl. (3)). (8) Die Mantisse der Dezimalzahl wird aus F16 nach F9 gepackt. (9) Übertragen der Charakteristik als Direktwert in die I n s t r u k t i o n mit der Adresse MVIGW. ( 1 0 )

DW

"T 0 11 0

(11)

DW (12)

— r o ; ο t

0 ; 0

'T 0 > [ 0

1 o ; ο

0 1'< 0 .L -

0 j 0 1

0

1 I c

Die ersten 5 Bytes (9 Dezimalziffern und eine f ü h r e n d e Null) werden aus F9 um ein Halbbyte nach links versetzt nach DW gebracht.

+1

*3

»4

+5

+6

+7

Konversion der gepackten Dezimalzahl aus DW in eine Dualzahl und Laden in Register 3.

(13) Speichern der Dualzahl aus Register 3 in das Feld FW. (14)

Übertragen der Dualzahl aus FW in das 2., 3., 4. u n d 5. Byte von GW.

(15)

Laden der sedezimalen Gleitpunktzahl aus GW in das Gleitpunktregister 2.

(16)

Vermindern des dezimalen E x p o n e n t e n in Register 4 u m 9 . Dies geschieht für den späteren Ausgleich des Fehlers, der d a d u r c h e n t s t e h t , daß die ersten 9 Mantissenstellen der Zahl 0 . x . . .x · 10° bei der Konvertierung in eine Dualzahl (Sedezimalzahl) wie eine Dezimalzahl der F o r m x x x x x x x x x oder 0 . x x x x x x x x x · 10^ behandelt werden. Später wird die zu dieser Dezimalzahl equivalente Sedezimalzahl in GP-Register 2 d u r c h 10 9 dividiert.

(17)

Sprung in das Programmstück TAB, um die z u m E x p o n e n t e n der Dezimalzuhl gehörige sedczimale Gleitpunktzahl zu e r m i t t e l n , mit der dann der Inhalt des Gleitpunktrcgisters 2 im Wege der Multiplikation bzw. Division korrigiert wird.

3.4 Maschinenbefehle (18)

133

U m l a d e n d e s I n h a l t s des G l e i t p u n k t r e g i s t e r s 2 in d a s G l e i t p u n k t r e g i s t e r 0 , weil d o r t die s e d e z i m a l e G l e i t p u n k t z a h l e r s c h e i n e n soll.

(19)

vgl. ( 3 ) b z w . ( 7 ) .

(20)

Ü b e r t r a g e n d e r l e t z t e n 4 B y t e s (7 D e z i m a l z i f f e r n u n d V o r z e i c h e n ) a u s F 9 r e c h t s b ü n d i g u n d mit f ü h r e n d e n N u l l e n n a c h DW.

F9

»5 +6 — 1»7 1 κ 1 X Χ ι X χ ; χ 1 Γ 1 j

Λ

\ \ι \ I\ o | ο ο ' ο

\ ι \ o j ο

\ I o ;η

Ο

β

J. \

1 »

DW

•!

»4

] X

\ > . » ! * ι +5

+8 X!C


wird um eine Eins vermindert und auf Null geprüft; wenn (Reg. 7) Φ 0 ist, dann Sprung nach CD; auf diese Weise wird die Schleife (50) bis (52) maximal 76mal durchlaufen.

135

3.4 Maschinenbefehle

(54) Division des Inhalts von GP-Register 6 durch den Tabellenwert, wodurch eine Sedezimalzahl der Form O.yy.. .y · 16° entsteht. (55) In FP-Register 4 steht der dem Tabellenwert entsprechende Exponent zur Basis 10, allerdings um 75 zu groß und mit 8 multipliziert; daher Vorbereitung einer Division durch shift (Reg. 4 ) nach Register 5. (56) Division des Doppelregisters 4, 5 durch 8. (57) Vermindern des Quotienten in Register 5 um 75. (58) Sprung in das Unterprogramm MANTISSE zur Konversion des ersten Teils der sedezimalen Mantisse. (59) Übertragen des ersten Teils der umgewandelten Mantisse nach F9. F9 1

0 ' X __l___l

*l

+:

1

X |1X 1

x j x 1

»3 Χ 1ι — χ 1

+4 x ![ — t 1

(60) Überschreiben des Vorzeichens in F9 durch eine Null. (61) Übertragen einer gepackten Null (mit Vorzeichen) in die letzten 4 Bytes von F9. (62) Übertragen des zweiten Teils der sedezimalen Mantisse (der bereits im Unterprogramm MANTISSE korrigiert und nach FW7 gebracht wurde) zusammen mit sedezimalen Nullen in das GP-Wort GW. (63) Laden des zweiten Teils der Mantisse nach GP-Register 6. (64) Sprung in das Unterprogramm MANTISSE zur Konversion des zweiten Teils der sedezimalen Mantisse. (65) Addieren des zweiten Teils der umgewandelten Mantisse auf den Inhalt von F9. F9 ο ; χ

+1 τ— Χ ιX

+:

+3

+4

Χ| X

* i X

χ 1 0

DW+ +

3 (xl • !' X

+5 +6 - τ— - —1 ο ; ο ο : ο

+7

+8

ο : ο

ο '! r

+4 XJ X

+6 I X [ X

χ ;
+1

+2

0 ] 9 9 •[8 ο !

+3 ι! c

MP < Reg. 9) +1 1 —ι—

0(5,9) =P'-13'

•2

—ι—

ο! ο o; ο 0 | 0 ο: ι ι ; r

ο; 1 3 I d

V (MP]

L,

(Reg. 9) +1

+2

o;o

0 ' 0

0 J 0

1

+3

ι

+4 3|D

ZAHLl +1

PACK ZAP MP

PR0D.ZAHL1+1 (3) M0R.ZAHL2 PR0D,M0R

F:ο I

4-2

(PACK! 1 0 | 0 ο ; ο ' 1' I p Rao

PR0D ZAHL1 ZAHL2

M0R

DS DS DS DS

+3

F 1 1 Fl 3

3] F I

CL4 CL4 CL2 CL2

MOR (MP) PROD

—1— 0 I 0 0|4

6|3 1

3|(

153

3.4 Maschinenbefehle

Befehl: DP

Typ:

(divide packed; Dividieren dezimal)

SS (arithmetisch)

Formate symbolisch: DP DP DP

D , ( L „ B,), D 2 (L 2 , B 2 ) S,(L,),S2(L2) S„ S 2

Format maschinenintem: 1 F

!

Γ

1 D

L, -

I.Byte

1

L, - 1

2 Byte

Β,

t*

3. B y t e

I D,

! 4 Byte

Γ

ι •

B,

r· S Byte

D,

i '

·

6. B y t e

Wirkungsweise: Der mit + D, adressierte 1. Operand (Dividend) wird durch den mit + D 2 adressierten 2. Operanden (Divisor) dividiert. Das Resultat (Quotient und Rest) wird im Feld des 1. Operanden gespeichert. Der Quotient steht links und der Rest, der die Länge L 2 hat, steht rechts. Quotient und Rest haben je ein Vorzeichen und beide stehen rechtsbündig. Das Vorzeichen des Quotienten wird nach den algebraischen Regeln gebildet. Der Rest hat stets das Vorzeichen des Dividenden. Die Adresse des Restes ergibt sich aus + D, + (L t - L 2 ). Bedingungscode: Wird nicht verändert. Programmierhinweise: Beide Operanden müssen dezimal gepackt sein. Der zweite Operand muß kürzer sein als der erste und darf höchstens 8 Bytes (15 Ziffern plus Vorzeichen) lang sein. Der Dividend muß mindestens eine führende Null haben.

Codierungsbeispiele: ZAP DP

REPE,DIVIDEND REFE,DIVIS0R

154

3. Die Programmiersprache ASSEMBLER

Die Länge von REFE sei L t = 5, die Länge von DIVIS0R sei L 2 = 2, die Länge von DIVIDEND sei L 2 = 4 (bzw. 5, bzw. 2). (1)

Division von 1,000,000 : 3 0 0 DIVIDEND —ι— i ; o ο ;o

(2)

Division von 10,000,000 : 3 0 0

—1—

o;o o;c

o;i

—ί- I - Τ ο |0 o ;o Ο |0 ο ;c

(ZAP)

(ZAP)

REFE

REFE

0 ! 0 ι : ο ο: ο ο; ο o! c

0 ! 1 ο ;o

I

ο; ο

DIVISOR

ο! 1

3 ;o 0 ]c

I

(DP)

(DP)

REFE

REFE

0 ! 3 3 ! 3 3 ! c ι! ο o',c 1 1

(3)

1

DIVISOR

3|0 ο! c

Quotient

0 Ic

Rest

Division von 3 0 0 : 3 0 0

I

3 ; 3 3 ' 3 3 !c ι : ο o!c I ι l_. , ι Quotient

(4)

Division von 99 : 3 0 0

DIVIDEND ~Γ" Τ 3 10 ο !c

DIVIDEND

ί-

ο

(ZAP)

ο; ο 0 ] 0 ο; ο 3 1 0 o; c

9

9 iC L_

(ΖΑΡΙ ο |o ο! ο ο: ο

—I— 0 ! 9

1

9!c ι

DIVISOR

DIVISOR

3 :o

3 JO o;c

_L_

0

C

(DP)

(DP) REFE —Γ Τ-τ—

REFE

o;o » ο; ο I ιχ- ο ιΙ οL _oj ;—c ν— Quotient

ο; ο ο; ο o ! r 0 j ν ;c \

ν Quotient

/

Rest

155

3.4 Maschinenbefehle

Befehl: SRP

(shift and round packed; Verschieben und Runden gepackt;ab System /370)

Typ:

SS

(arithmetisch; Sonderform)

Formate symbolisch: SRP SRP SRP

D] (L,, B,), D 2 (B 2 ), I3 S, ( L ^ , S 2 , I 3 S,, S2,13

Format maschinenintem: 1 F

] «

1

Τ D U

0

I.Byte

1 :

Byte

1 3 Byte

1

'

1« 4. Byte

»

R 3

I

U 1 S.Byte

τ 1P

,i



1

1



6. B y t e

Wirkungsweise: Eine gepackte Zahl mit der Adresse ( B j ) + D] und der Länge Li wird um (B 2 > + D 2 Stellen verschoben und mit dem Wert I 3 auf der (virtuellen) Stelle (Β1) Ι- D1 + L, gerundet. > 0 2: < l . O p e r a n d X O 3: links wurden Ziffern herausgeschoben. Programmierhinweis: Positive Verschiebezahlen erzeugt man leicht durch explizite Angaben des Displacement und Angabe des Basisregisters B2 = 0; selbstverständlich kann auch ein positiver Wert in ein Basisregister B2 > 0 geladen werden und alleine oder mit

3. Die Programmiersprache ASSEMBLER

156

einem Displacement D 2 die Verschiebezahl bestimmen. Negative Verschiebezahlen erhält man am besten durch Laden einer negativen Konstante oder durch Negativladen einer positiven Konstante oder durch Negativumladen in ein Basisregister B 2 > 0 und ein Displacement D 2 = 0. Für den Rundungswert I 3 können Zahlen von 0 bis 5 angegeben werden. Codierungsbeispiele: a) SRP

RESULT,3(0),0

Verschieben des Inhalts des Feldes RESULT um drei Ziffernstellen nach links ohne Rundung. RESULT

b) L SRP

6,F'—4' RESULT,0(6),0

Laden einer negativen Verschiebezahl in das Register 6, Verschieben des Inhalts von RESULT um 4 Stellen nach rechts.

c) L LNR SRP

4,F'3' 4,4 ZAHL,1 (4),5

Laden des Registers 4 mit einer 3; Umwandeln in eine - 3; Verschieben des Inhalts von ZAHL um 1 - 3 = - 2 Stellen (also nach rechts) und A u f r u n d e n .

157

3.4 Maschinenbefehle ZAHL

ο ! ο

9 ! 8

7

1 : 6

ι

: D

vorher

wird abgeschnitten

ο |ο

0 Ii 0

1 9 ; 8 1

wird zur Rundung benutzt und dann abgeschnitten

7 : D

6 +(!))= 11

ZAHL

Der Überlauf 1 wird auf die niederstwertige Ziffer addiert.

0

;

0

ο

1 ! 1

ο

9

1 ;

8

8

τ i

D

nach dem Runden

3.4.3.6 Duale Festpunktarithmetik Befehle: AR SR Typ:

(add registers; Addieren Register) (subtract registers; Subtrahieren Register)

RR

Formate symbolisch: AR

R „ R2

SR

R,, R 2

Formate maschinenintern: κ, _1_ I Byte

Byle

K) I Byte

(SR!

. Byu·

Wirkungsweise: Der Inhalt des durch R 2 adressierten Registers wird zum (vom) Inhalt des durch R, adressierten Registers addiert (subtrahiert). Das Resultat steht in Register R,.

3. Die Programmiersprache ASSEMBLER

158

Bedingungscode: 0: 1: 2: 3:

Summe (Differenz) = 0 Summe (Differenz) < 0 Summe (Differenz) > 0 Überlauf

Codierungsbeispiele: AR

4,5

Der Inhalt des Registers 5 wird zum Inhalt des Registers 4 addiert. Die Summe steht in Register 4. SR

14,3

Der Inhalt des Registers 3 wird vom Inhalt des Registers 14 subtrahiert. Die Differenz steht in Register 14. SR

2,2

Der Inhalt des Registers 2 wird vom Inhalt des Registers 2 subtrahiert, d.h. das Register 2 wird gelöscht.

Befehle: A S

Typ:

(add; Addieren Vollwort) (subtract; Subtrahieren Vollwort)

RX

Formate symbolisch: A A A

R „ D 2 (X 2 , B 2 ) R„S2(X2) R „ S2

S S S

R,, D 2 (X 2 , B 2 ) R.,S2(X2) R|, S 2

159

3.4 Maschinenbefehle

Formate maschinenintern: I 5

> 1

R,

A

|

X,

2. B y t e

1 Byte

ή

Bj



3. B y t e

D,

τ

·

4. Byte

1 5

I 1

; x,

r,

Β

1. B y t e

Β,

1 Byte

!·« 3 Byte

-

_

d3

Τ I

*

4. Byte

Wirkungsweise: Der Inhalt des mit (X 2 > + < B2 > + D 2 adressierten Vollwortes wird zum (vom) Inhalt des mit R! adressierten Registers addiert (subtrahiert). Das Resultat steht in Register R,.

Bedingungscode: 0: 1: 2: 3:

Summe (Differenz) = 0 Summe (Differenz) < 0 Summe (Differenz) > 0 Überlauf

Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44 f.). Codierungsbeispiele: A

5,200(0,12)

Der Inhalt des mit < Basisreg. 1 2 ) + 200 adressierten Vollwortes wird zum Inhalt des Registers 5 addiert. Die Summe steht in Register 5. S

3,0(,9)

Der Inhalt des mit < Basisreg. 9 > + 0 adressierten Vollwortes wird vom Inhalt des Registers 8 subtrahiert. Die Differenz steht in Register 8. S

5,14(3,8)

Der Inhalt des mit (Indexreg. 3) + (Basisreg. 8> + 14 adressierten Vollwortes wird vom Inhalt des Registers 5 subtrahiert. Die Differenz steht im Register 5.

160

3. Die Programmiersprache ASSEMBLER

A

1O.W0RT

Der Inhalt des mit W0RT adressierten Vollwortes wird zum Inhalt des Registers 10 addiert.

Befehle: AH SH Typ:

(add halfword; Addieren Halbwort) (subtract halfword; Subtrahieren Halbwort)

RX

Formate symbolisch: AH AH AH

R „ D 2 ( X 2 , B2) R„S2(X2) R „ S2

SH SH SH

R „ D 2 ( X 2 , B2) R„S,(X2) R „ S2

Formate maschinenintern: 1 4

!

A

R,

;

x,

B,

2 . Byie

I.Byle

' 0 Überlauf

161

3.4 Maschinenbefehle

Programmierhinweis: Die Adresse des 2. O p e r a n d e n m u ß auf eine H a l b w o r t g r e n z e ausgerichtet sein (vgl. Seite 4 4 f.).

Codierungsbeispiele: AH

7,H(5)

Reg. 7

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0

0 0 0 0 0 0 0 0

0010

0 0 0 0

1 0 1 0 1 1 1 0

0 0 1 1

(AH)

Reg. 7 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

SH

8,HALFW0RD+2

Der Inhalt des mit HALFW0RD+2 adressierten Halbwortes wird v o m Inhalt des Registers 8 subtrahiert. Die Differenz steht in Register 8.

Befehle:

Typen:

AL

(add logical;

ALR

Addieren logisch V o l l w o r t e ) (add logical registers; Addieren logisch Register)

RX RR

162

3. Die Programmiersprache ASSEMBLER

Format symbolisch: AL

R,,D2(X2;B2)

AL

R „ S2 ( X 2 )

Al

P,,S2

ALR

R,,R2

Format maschinenintern: S

! Ε 1

;

ι

:

R,

I.Byte

x,

2. B y t e

Ε

ι

R,

1 Byte

[

2

!3. Byte

R;

ι

Bj

" D, Ι1 4. Byte

(ALR)

Byte

Wirkungsweise: Der Inhalt des Speicherwortes mit der Adresse < B 2 > + < X 2 > + D 2 (bzw. des Registers mit der Adresse R 2 ) wird auf den Inhalt des Registers R ! addiert; das Resultat steht in R , . Der Unterschied zur arithmetischen Addition besteht darin, daß hier die höchstwertige bit-Position nicht als Vorzeichen sondern als Dualziffer behandelt wird. Entsprechend anders werden die Bedingungsanzeigen gesetzt. Bedingungscode: 0 : die Summe ist Null

und hat keinen Überlauf

1: die Summe ist nicht Null und hat keinen Überlauf 2 : die Summe ist Null

und hat einen Überlauf

3 : die Summe ist nicht Null und hat einen Überlauf. Programmierhinweis: Die Adresse des 2. Operanden bei A L muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 4 4 f.).

Befehle: SL

(substract logical;

SLR

(subtract logical registers;

Subtrahieren logisch Vollworte) Subtrahieren logisch Register)

3.4 Maschinenbefehle

Typen:

RX RR

Formate symbolisch: SL SL SL

R,,D2(X2,Bj) R,,S2(X2) R,,S2

SLR

R,,R2

Formate maschinenintern:

! •

- !

5

R, I X,

1 F I

Byte

2. B y t e

B:

1 I ' , · « — - D; -j 3. B y t e



4. Byte

R, . Byte

1. B y t e

Wirkungsweise: Der Inhalt des mit < B2> + (X2> + D 2 adressierten Speicherwortes (bzw. mit R 2 adressierten Registers) wird vom Inhalt des Registers R! subtrahiert; das Resultat steht in R ! . Der Unterschied zur arithmetischen Subtraktion besteht auch hier in der andersartigen Setzung der Bedingungsanzeigen. Bedingungscode: 0: 1: die Differenz ist Null und hat keinen Überlauf 2: die Differenz ist Null und hat einen Überlauf 3: die Differenz ist nicht Null und hat einen Überlauf. Programmierhinweis: Die Adresse des 2. Operanden bei SL muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44 f.).

Befehl: MR

(multiply registers; Multiplizieren Register mit Register)

164

3. Die Programmiersprache ASSEMBLER

Typ:

RR

Format symbolisch: MP

R., R 2

Format maschinenintern:

ι

'; c

r,

I Byte

|• R, 2. B y t e

Wirkungsweise: Der Inhalt des Registers R j + 1 (Multiplikand) wird mit dem Inhalt des durch R 2 adressierten Registers (Multiplikator) multipliziert. Der Inhalt des mit R, adressierten Registers wird bei der Multiplikation ignoriert und durch das Produkt überschrieben, denn dieses steht anschließend rechtsbündig im Registerpaar R l R, + 1.

Bedingungscode: Wird nicht verändert.

Programmierh inweise: R, muß eine gradzahlige Registernummer sein. Der Multiplikand ist in das ungradzahlige Register R, + 1 zu laden. Im Multiplikationsbefehl ist jedoch R, anzugeben.

Codierungsbeispiel: L L MR

5,MKAND 1O.MKAT0R 4,10

Reg. 5

0

0 0 0 0 0 0 0 0 0 0 0

0

0

0

0

0

0

0

0

0

1

0 0

Multiplikand

165

3.4 Maschinenbefehle Reg

10 Multiplikator

Reg

4

Reg. 5

Produkt

Befehl: Μ Typ:

(multiply; Multiplizieren Register mit Vollwort)

RX

Formate symbolisch: Μ Μ Μ

R „ D 2 ( X 2 , BJ) R „ S2(X2) R „ S2

Format maschinenintern: •

s

'

Τ

?

;

r

R,

1 Byte

I Byte

I

X:

β,

• .V B y t e

D:

-Ι ι 4. Byte

.

Wirkungsweise: Der Inhalt des Registers R , + 1 (Multiplikand) wird mit d e m Inhalt des d u r c h + (B 2 > + D 2 adressierten Vollwortes (Multiplikator) multipliziert. Der Inhalt von R , wird bei der Multiplikation ignoriert und d u r c h das P r o d u k t überschrieben, denn dieses steht anschließend rechtsbündig im Registerpaar R „ R , + 1. Bedingungscode: Wird nicht verändert.

Programmierhinweise: R, m u ß eine gradzahlige Registernummer sein. Die Adresse des 2. O p e r a n d e n m u ß auf eine Vollwortgrenze ausgerichtet sein (vgl. S. 4 4 f.). Der Multiplikand

166

3. Die Programmiersprache ASSEMBLER

ist in das ungradzahlige Register R, + 1 zu laden; im Multiplikationsbefehl ist jedoch R, anzugeben. Codiemngsbeispiele: L Μ

7, F iC 6,= F'5'

Laden des Multiplikanden 10 nach Register 7 und multiplizieren des Registerpaares 6, 7 mit 5. L Μ

9,MKAND 8,MKAT0R

Laden des Multiplikanden nach Register 9 und multiplizieren des Registerpaares 8, 9 mit dem Multiplikator aus dem durch MKAT0R adressierten Vollwort.

Befehl: MH Typ:

(multiply halfword; Multiplizieren Register mit Halbwort)

RX

Formate symbolisch: MH MH MH

R,, D 2 (X 2 , B 2 ) R,,S2(X2) R „ S2

Format maschinenintern:

1. B y t e

2. B y t e

3 Byte

4. Byte

Wirkungsweise: Der Inhalt des durch R, adressierten Registers (Multiplikand) wird mit dem Inhalt des durch + + D 2 adressierten Halbwortes (Multiplikator) multipliziert. Das Produkt steht in R,. Bedingungscode: Wird nicht verändert.

167

3.4 Maschinenbefehle

Programmierhinweise: Die Adresse des 2. Operanden muß auf eine Halbwortgrenze ausgerichtet sein (vgl. Seite 44 f.). Das Produkt hat maximal 47 bits, von denen die höherwertigen 15 Stellen verloren gehen. Sinnvollerweise sollten daher die Faktoren so bemessen sein, daß das Produkt in das Register R! hineinpaßt. Codierungsbeispiel: LH MH

4,=ΗΊ12' 4,MKAT0R(3)

Das Register 4 wird mit dem Halbwortmultiplikanden Η Ί 1 2 ' geladen und mit dem durch MKAT0R + (Indexreg. 3> adressierten Halbwortmultiplikator multipliziert. Das Produkt steht in Register 4.

Befehl: DR Typ:

(divide registers; Dividieren Register durch Register)

RR

Format symbolisch: DR

R|, R 2

Format maschinenintern: Rj ! R2 I Byte

2. Byte

Wirkungsweise: Der Inhalt des mit R, adressierten Registerpaares R,, R, + 1 wird durch den Inhalt des mit R 2 adressierten Registers dividiert. Der Quotient steht danach im Register R, + 1 und der Rest im Register R,. Der Dividend besteht aus maximal 63 Ziffernbits und einem Vorzeichenbit. Der Divisor in R 2 besteht aus maximal 31 Ziffernbits und einem Vorzeichenbit. Quotient und Rest bestehen aus je maximal 31 Ziffernbits und je einem Vorzeichenbit. Überschreitet der Quotient diese Stellenzahl, so tritt eine Programmunterbrechung mit „Divisionsfehler" auf. Das Vorzeichen wird nach den algebraischen Regeln gebildet und ist bei Quotient und Rest gleich.

168

3. Die Programmiersprache ASSEMBLER

Bedingungscode: Wird nicht verändert. Programmierhinweise: R! muß eine gradzahlige Registernummer sein. Der Dividend muß vor der Division rechtsbündig in das Registerpaar Rj, R! + 1 gebracht werden und ein Vorzeichenbit in R, haben. Codierungsbeispiel: L

31

Rest = + 1

4.DIVIDEND

η

31

Q u o t i e n t = +3

Befehl: D

Typ:

(divide; Dividieren Register durch Vollwort)

RX

Formate symbolisch: D D D

R „ D 2 ( X 2 , BJ) R„S2(X2) R„ S2

ο

3.4 Maschinenbefehle

169

Format maschinenintern: I 5

1

-

R,

D

;

1

I Byte

x,

Ι B,

2 Byte

T — -

3. Byte

D,

-I

.

4 Byte

Wirkungsweise: Der Inhalt des mit R[ adressierten Registerpaares R,, R, + 1 wird durch den Inhalt des mit + + D 2 adressierten GP-Wortes bzw. GP-Doppelworles wird vom Inhalt des GP-Registers R, subtrahiert. Das Resultat erscheint normalisiert in R,. Im übrigen gilt das gleiche wie für SER und SDR.

3.4 M a s c h i n e n b e f e h l e

175

Bedingungscode: 0: Differenz = 0 1: Differenz < 0 2: Differenz > 0 3: Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Wortgrenze bzw. Doppelwortgrenze ausgerichtet sein (vgl. S. 44 f.).

Befehle: MER

(multiply registers normalised single precision; Multiplizieren Register kurz und Normalisieren des Resultats) (multiply registers normalised double precision; Multiplizieren Register lang und Normaliseren des Resultats)

MDR

Typ:

RR

Formate symbolisch: MER

Ri, R2

MDR

R„ R2

Formate maschinenintern:

-L. I Byle

R, 2 Byte

K,

(MERI

(MDR)

Wirkungsweise: Der Multiplikand im Gleitpunktregister R, wird mit dem Multiplikator, der im Gleitpunktregister R 2 steht, multipliziert. Das Resultat wird normalisiert und erscheint in R,.

176

3. Die Programmiersprache ASSEMBLER

Der Multiplikationsvorgang spielt sich so ab, daß die Mantissen multipliziert und die Exponenten addiert werden. Die Summe der Exponenten wird um 65 vermindert, weil einerseits die Exponenten zur Basis 16 in der hier vorliegenden Gleitpunktdarstellung aus Codierungsgründen um 65 größer als ihr wahrer Wer. s-fld (\gl. S. 3J) j n J .veJ i.or.i anderen j e . cL-r Addition zweier Lxponenten dieser sogenannte 65er-Exzeß doppelt in die Exponentensumme eingeht, also (x + 65) + (y + 65) = χ + y + 65 + 65. Dies ist zu korrigieren, denn es wird χ + y + 65 benötigt. Hat das Mantissenprodukt führende Nullen, so werden diese durch 4-bit-weise Linksverschiebung bei gleichzeitiger Verkleinerung des Exponenten eleminiert. Die Linksverschiebung von je 4 Mantissen-bits bewirkt eine Verminderung des Exponenten um 1. Von rechts werden bei der Mantissenverschiebung Nullen nachgezogen. Bei MER sind an der Multiplikation je 6 Sedezimalziffern der Mantissen beteiligt; die Produktmantisse umfaßt jedoch 14 Sedezimalziffern, von denen allerdings die zwei niederstwertigen gleich Null sind. Bei MDR sind an der Multiplikation je 14 Sedezimalziffern der Mantissen beteiligt; die Produktmantisse umfaßt jedoch auch nur 14 Sedezimalziffern, wobei nötigenfalls die niederstwertigen Ziffern einer eventuell längeren Produktmantisse wegfallen.

Bedingungscode: Wird nicht verändert.

Codierungsbeispiel: MER 63

55

C2

63

63 C3

32 10

00

00

GP-Register 4

0

32

55

43

4,6

Ol

00

00

(iP Regisler b

0

32

55 10

00

00

00

00

00

00

177

3.4 Maschinenbefehle

Befehle: ME

(multiply normalised single precision; Multiplizieren mit GP-Wort und Normalisieren des Resultats) (multiply normalised double precision; Multiplizieren mit GP-Doppelwort und Normalisieren des Resultats)

MD Typ:

RX

Formate symbolisch: ME

R ^ D 2 (X 2 , B 2 )

MD

R „ D 2 ( X 2 , B2)

Formate maschinenintern: 7

;

c

R,

1. B y t e

6

!

Xj

2 Byte

ι C

R,

I Byte

1 |

2. B y t e

B,



3. B y t e

X,

B,

!«·

3 Byte

-

D,

-i

»

4. Byte

D,

^



4. Byte

Wirkungsweise: Der Multiplikand im Gleitpunktregister R j wird mit dem Multiplikator, der in dem mit + + D2 adressierten Wort bzw. Doppelwort im Arbeitsspeicher steht, multipliziert. Das Resultat wird normalisiert und erscheint in R,. Die Einzelheiten des Multiplikationsvorgangs sind die gleichen wie bei MER und MDR. Bedingungscode: Wird nicht verändert.

Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Wort- bzw. Doppelwortgrenze ausgerichtet sein (vgl. Seite 44 f.). Codierungsbeispiele: ME

6,=E'125.2E—13'

178

3. Die Programmiersprache ASSEMBLER

Der Inhalt des GP-Registers 6 wird mit der als Literal dargestellten Gleitpunktkonstante multipliziert. Die dezimal geschriebene Gleitpunktkonstante wird bei der Ubersetzung des Programms in die sedezimale Gleitpunktdarstellung (kurz) überführt.

GPK0N



0,GHKWN

DC

D'0.1573215904E+5'

Der Inhalt des GP-Registers 0 wird mit der durch GPK0N adressierten Gleitpunktkonstante multipliziert. Die dezimal geschriebene Gleitpunktkonstante wird bei der Ubersetzung des Programms in die sedezimale Gleitpunktdarstellung (lang) überführt.

Befehle: DER

(divide registers normalised single precision; Dividieren Register kurz und Normalisieren des Resultats) (divide registers normalised double precision; Dividieren Register lang und Normalisieren des Resultats)

DDR

Typ:

RR

Formate symbolisch: DER

R „ R2

DDR

Formate maschinenintern: J

: 1

υ

K,

—• 1 !

1. Byte

:

; I.Byle

R;

(DER)

! κ, ι Byte

(DDR)

: . Byte

D

R, :

R „ R2

179

3.4 Maschinenbefehle

Wirkungsweise: Der Dividend im Gleitpunktregister R , wird durch den Divisor, der sich im Gleitpunktregister R 2 befindet, dividiert. Der Quotient erscheint normalisiert in R i ; ein Rest wird nicht erzeugt. Die Division läuft so ab, daß zunächst die Mantissen beider Operanden normalisiert und danach dividiert werden. Der Exponent des Divisors wird vom Exponenten des Dividenden subtrahiert und die Differenz wird um 65 erhöht, weil der aus internen Codierungsgründen (vgl. S. 3 0 ) für jeden Exponenten erforderliche 6 5 e r - E x z e ß bei der Subtraktion verloren geht, also (x + 6 5 ) - (y + 6 5 ) = χ - y. Dies ist zu korrigieren, denn es wird χ - y + 65 benötigt. Eine Division durch Null führt zu einer Programmunterbrechung.

Bedingungscode: Wird nicht verändert.

Befehle: DE

(divide normalised single precision; Dividieren normalisiert

DD

(divide normalised double precision; Dividieren normali-

durch GP-Wort) siert durch GP-Doppelwort) Typ:

RX

Formate symbolisch: DE

R„ D2(X2, B2)

DD

DE

R„S2(X2)

DD

R„ S2(X2)

DD

R,, S2

DE

R,, S2

R „ D 2 ( X 2 , B2)

F o r m a t e maschinenintern: 7

6

Τ i D ι 1 Byte ; 1 Byte

D

.. r _ R,

R,

! X, L. _, 2. Byle ; 2 Byte

X,

1 B,

»

-

D, -!

3 Byte

Β,



3 Byte

.

4 Byte D2

I ->

4. Byte

— *

180

3. Die Programmiersprache ASSEMBLER

Wirkungsweise: Der Dividend in Gleitpunktregister R! wird durch den Divisor dividiert, der in dem mit + + D 2 adressierten Gleitpunktwort bzw. -doppelwort im Arbeitsspeicher steht. Der Quotient erscheint normalisiert in R,. Zu den Einzelheiten des Divisionsablaufs vgl. die Ausführungen zu DER und DDR. Bedingungscode: Wird nicht verändert. Programmieihinweis: Die Adresse des 2. Operanden muß auf eine Wort- bzw. Doppelwortgrenze ausgerichtet sein (vgl. Seite 44 f.).

3.4.3.8 Vergleichsoperationen Befehl: CLC Typ:

(compare logical characters; Vergleichen Zeichen logisch)

SS (logisch)

Formate symbolisch: CLC CLC CLC

D, ( L l B x ), D 2 ( B 2 ) S, (L,), S 2 S,, S 2

Format maschinenintern: L,- 1 1. Byte

2. Byte

B,

'(*-

3. Byte

D, 4. Byte

5. Byte

6. Byte

Wirkungsweise: Der durch (Bi> + Ü! adressierte Operand wird in der Länge L! logisch mit dem durch (B2> + D 2 adressierten Operanden verglichen. Der logische Vergleich besteht im Gegensatz zum arithmetischen darin, daß die Operanden bit-weise ohne Berücksichtigung eines etwaigen numerischen Wertes oder gar eines Vorzeichens miteinander verglichen werden. Aus diesem Grunde sind für die Operanden auch alle möglichen bit-Muster zugelassen. Entsprechend dem Ergebnis des Vergleichs wird ein Bedingungsschlüssel in einem Anzeigeregister (Pro-

181

3.4 Maschinenbefehle

grammstatuswort) gesetzt. Die Ausführung des Befehls wird beendet, sobald Ungleichheit festgestellt wird oder alle L , Bytes miteinander verglichen sind. Der Vergleich erfolgt von links nach rechts. Die maximale Länge der Operandenfelder ist 256 Bytes. Auf Vergleichsoperationen folgen i . d . R . Verzweigungsoperationen (vgl. Kap. 3 4.3.9), die in bestimmter Weise auf den Bedingungscode des Anzeigeregisters (PSW) reagieren. Die Aussage des Bedingungscodes bezieht sich stets auf den 1. Operanden. Ist also der 1 .Operand z.B. größer als der zweite, dann wird z.B. bei Β Η und BNL verzweigt.

Bedingungscode: 0: 1. Operand = 2. Operand 1 : 1 . Operand < 2. Operand 2: 1. Operand > 2. Operand 3:

Codierungsbeispiele: CLC

FELD1,FELD2

Vergleichen des Inhalts von FELD1 mit dem Inhalt von F E L D 2 in der impliziten Länge von F E L D 1 . CLC

14(200,8),FELD

Vergleichen von 2 0 0 Bytes des durch (Reg. 8> + 14 adressierten 1. Operanden mit 200 Bytes ab der Adresse FELD. CLC

FELD1,10(8)

Vergleichen des Inhalts von FELD1 in der impliziten Länge von F E L D 1 mit ebensovielen Bytes ab der durch + 10 gegebenen Adresse. CLC BH BL BE

FELD1,FELD2 GR0ESSER KLEINER GLEICH

Vergleichen < FELD1 > mit ; Sprung nach G R 0 E S S E R , wenn größer ( F E L D 2 ) ; Sprung nach KLEINER, wenn ( F E L D 1 ) kleiner ( F E L D 2 ) ; Sprung nach GLEICH, wenn < FELD1 > gleich < F E L D 2 ) . CLC BNH BNL

A,B NICHTGR NICHTKL

182

3. Die Programmiersprache A S S E M B L E R

Vergleichen mit ; Sprung nach N I C H T G R , wenn ( Α ) kleiner oder gleich (B>; Sprung nach N I C H T K L , wenn größer (oder gleich) . CLC

C=C'ABC'

2. Operand 3:

Codierbeispiel:

LENFIL

LA LA LA L CLCL

2,FELD1 3,300 8,FELD2 9,LENFIL 2,8

DC

X'40000101'

(Länge 257)

Der Inhalt von FELD1 wird in der Länge 257 mit dem Inhalt von FELD2 und in der Länge 43 mit dem Füllzeichen verglichen. Programmierhinweis: Der Operand LENFIL muß ab System /370 nicht mehr auf Vollwortgrenze ausgerichtet werden.

184

3. Die Programmiersprache ASSEMBLER

Befehl: CLI

(comparelogical immediate; Vergleichen Byte mit Direktzeichen)

ZI

Τ/ρ

Formate symbolisch: CLI CLI

D,(B,), I 2 S,, I 2

Format maschinenintern: ; s

. I. ι

1. Byte

CD

9

2. Byte

3. Byte

D, i ι

.

4. Byte

Wirkungsweise: Der Inhalt der durch ( B ^ + Ü! adressierten Speicherstelle wird logisch, d.h. ohne Ansehen eines numerischen Wertes, mit dem direkt in der Instruktion gespeicherten bit-Muster I 2 verglichen. Dabei wird in Abhängigkeit vom Ergebnis des Vergleichs der Bedingungsschlüssel im Anzeigeregister (Programmstatuswort) gesetzt. Wie der CLC-Befehl, so wird auch der CLI-Befehl i.d.R. von bedingten Verzweigungsoperationen gefolgt, die in bestimmter Weise auf den Bedingungscode des Anzeigeregisters (PSW) reagieren. Die Aussage des Bedingungscodes bezieht sich stets auf den 1. Operanden. Bedingungscode: 0: 1. Operand = Direktwert 1 : 1 . Operand < Direktwert 2 : 1 . Operand > Direktwert 3:

Codierungsbeispiele: CLI BNE

BVTE,C'A' NICHTA

Vergleichen des mit der symbolischen Adresse BYTE adressierten Byte mit dem Direktzeichen Ά ' . Wenn ungleich, Sprung nach NICHTA.

185

3.4 Maschinenbefehle

CLI BL BH

7 + D 2 = + 2 gegebenen Adresse. Der gleiche Effekt wird erreicht durch: Β

2(0,9)

oder

Β BC

19(0,5) oder 15,19(0,5)

Β

2(9,0)

oder

Β

2(9)

Unbedingter Sprung zu der durch ( B 2 > + D 2 = + 19 gegebenen Adresse.

Befehl: BCR

Typ:

(branch on condition to register address; bedingtes Verzweigen zu der im Register angegebenen Adresse1»

RR

Format symbolisch: BCR

M„ R2

Format maschinenintern: 1 I 0

j

1

7

M,

1. Byte

j

ι 2. Byte

R,

Wirkungsweise: Vergleichsoperationen, Arithmetikoperationen, Ladeoperationen und shift-Operationen bewirken das Setzen eines Bedingungscodes im Anzeigeregister (PSW). Die BCR-Instruktion vergleicht die 4-bit-Maske M, mit dem Bedingungscode des Anzeigeregisters. Bei Entsprechung wird ein Sprung zu der in Register R 2 geladenen Adresse ausgeführt. Bei Nichtentsprechung setzt das Programm mit der auf BCR folgenden Instruktion fort. Bedingungscode: Wird nicht verändert.

198

3. Die Programmiersprache ASSEMBLER

Programmierhinweis: Das Setzen der bit-Maske M, kann bis auf eine Ausnahme nur explizit durch die Angabe bestimmter Direktwerte erfolgen (vgl. BC auf S. 195 f.). Die Ausnahme ist BCP 1 S # B 2 . Fi-r tMe?er unbedingten Snnmg k?nr min auch den »rv-ei+erter Befehlscode BR R 2 schreiben.

Codierungsbeispiele (für den unbedingten Sprung): BR wird vielfach zusammen mit BAL bzw. BALR verwendet, um den Rücksprung aus einem Unterprogramm zu ermöglichen, in welches mit BAL oder BALR hineingesprungen wurde. Der Rücksprung erfolgt zu der Adresse, die mit BAL oder BALR in das Register R 2 geladen wurde. /

/

/

l

^BAL ^VC

3,UPR0 FELD1.FELD2

/

/

/ * Γ E0J I CLC \ ·

UPR0

FELD1 =X'OOOOOC'

\; ^BR

3

BAL lädt die Adresse von MVC nach Register 3 und springt zur Adresse UPR0; BR springt zu der in Register 3 geladenen Adresse. Der oben angedeutete Effekt könnte bei einmaligem Sprung in ein Unterprogramm auch wie folgt erzielt werden: / "" / WEITER /

l

l

\ \ \

\ UPR0*

MVC

UPR0 FELD1.FELD2

· E0J CLC

FELD1 =X'00000C'

B

WEITER

\ · \

X

199

3.4 Maschinenbefehle

Die BAL- und Β R-Kombination ist vor allem für wiederholte Sprünge in ein bestimmtes Unterprogramm von verschiedenen Stellen des Programms aus interessant, wenn also die Rücksprungadressen variieren:

/ /

./

^BAL MVC · \

3,UPR0 FELD1.FELD2

· \.

/ / ,

, . '

1

W ' UPR0

' \ BAL ,3,UPR0 MVC TELD1 =X'01020C' 1 • \

:

e0J I I2 CLC I /FELD1 =X'00000C' •

/

/

• // • / BR

3

BAL

(branch and link; Verzweigen nach Laden der Rücksprungadresse)

Befehl:

Typ:

RX

Formate symbolisch: 13 BAL BAL

R„D2(0,B2) R,, S 2

Format maschinenintern: « •I 5 I Byte 1J

R,

1 ! 2 Byte

1

1 0

"ι 3. Byle

|

»

4 Byle

Vereinfachend wird hier nur der Fall der nicht indizierten Sprungadressen behandelt.

200

3. Die Programmiersprache ASSEMBLER

Wirkungsweise: Der Inhalt des Befehlszählregisters, das zur Zeit der Ausführung der BALInstruktion die Adresse der nachfolgenden Instruktion enthält, wird in das mit R, angegebene Register geladen. Danach verzweigt das Programm zu der mit \'L,; + J 2 adressierten Instruktion. Bedingungscode: Wird nicht verändert. Codierungsbeispiel: ^BAL / yVIVC

/ I I I UPR0 \ \

· · CLC * \ * Y BR

3,UPR0 FELD1,FELD2

FELD1 =X'00000C'

3

Die Adresse der MVC-Instruktion wird in das Register 3 geladen. Danach verzweigt das Programm zum Befehl mit der symbolischen Adresse UP R0. Der Befehl BR 3 bewirkt den Rücksprung zur MVC-Instruktion.

Befehl: BA LR

Typ:

(branch and link register address; Verzweigen zur Registeradresse nach Laden der Rücksprungadresse)

RR

Format symbolisch: BALR

R,, R 2

201

3.4 Maschinenbefehle

Format maschinenintern: ι 0

I

I

5

R,

I

]

Rj

1

1 Byte

2. B y t e

Wirkungsweise: Der Inhalt des Befehlszählregisters, das zur Zeit der Ausführung der BALRInstruktion die Adresse der nachfolgenden Instruktion enthält, wird in das mit Ri adressierte Register geladen. Danach verzweigt das Programm zu der Instruktion, deren Adresse im Register R 2 steht.

Bedingungscode: Wird nicht verändert.

Codierungsbeispiele: LA

BALR /MVC

/

8.UPR0

11,8 FELD1 ,FELD2

'

/ / /

/ : /

I I UPR0 I \

• E0J CLC

FELD1 =XO0000C'



\ " \· V BR

11

Die Adresse UPR0 wird in das Register 8 geladen. BALR 11,8 bewirkt das Laden der Adresse von MVC . . . nach Register 11 und das Verzweigen nach UPR0. BR 11 bewirkt den Rücksprung aus dem Unterprogramm auf die MVC-lnstruktion.

202

3. D i e P r o g r a m m i e r s p r a c h e A S S E M B L E R

BALR

7,0

Speichern der Folgeadresse nach Register 7, aber kein Verzweigen, sondern weiter mit der Folgeadresse, da der Inhalt von Register 0 von BALR nicht verwendet wird.

Befehl: BCT Typ:

(branch on count; Verzweigen nach Zählen)

RX

Formate symbolisch: 13 BCT BCT

R,, D 2 ( 0 , B 2 ) R „ S2

Format maschinenintern: 4

1 ι

1 6

K,

\

Τ 0

Η, «

1 Byte

2 Byte

3 Byte

-

D,

"i



*

4

Byte

Wirkungsweise: Der Inhalt des Registers R, wird um 1 vermindert. Danach wird der Inhalt geprüft. Ist dieser ungleich Null, so verzweigt das Programm zu der mit + D 2 angegebenen Speicheradresse. Ist der Inhalt von R, gleich Null, so fährt das Programm mit der auf BCT folgenden Instruktion fort. Bedingungscode: Wird nicht verändert. Programmierhinweis: Ist der Anfangswert von R, gleich Null, so wird auf alle Fälle verzweigt, denn zuerst wird um 1 vermindert, d . h . es ist dann = - 1 Φ 0.

3

V e r e i n f a c h e n d w i r d h i e r n u r d e r Kall d e r n i c h t i n d i z i e r t e n S p T u n g a d r e s s e n b e h a n d e l t .

203

3.4 Maschinenbefehle

Codierungsbeispiele: Der BCT-Befehl wird häufig für den Aufbau von Programmschleifen verwendet:

SR SR L A A BCT

14,14 5,5 3,Ν 5,W0RTE(14) 14,=F'4' 3,ADD

Die Register 14 und 5 werden gelöscht. Im Speicherwort Ν sei die Anzahl η der Schleifendurchgänge gespeichert. Diese Zahl wird in das Register 3 geladen. In Register 5 sollen die in den Speicherworten W0RTE gespeicherten Zahlen kumuliert werden. Register 14 dient als Indexregister der gleitenden Adressierung dieser Worte; dazu wird sein Wert bei jedem Durchgang um 4 e r h ä l t . Die Instruktion BCT bewirkt η — 1 mal einen Rücksprung nach ADD. Nach η Durchgängen durch BCT fährt das Programm mit der nachfolgenden Instruktion fort. BCT

3,A

Sprung zu der symbolischen Adresse A, wenn nach der Subtraktion von 1 der Inhalt von Register 3 ungleich Null ist. BCT

3,4(0,7)

Sprungadresse = (B2> + D 2 = (Reg. 7> + 4 BCT BCT BCT

3,0(0,7) 3,0(,7) 3,0(7)

oder oder

Sprungadresse = < Reg. 7) + 0

Befehl: BCTR Typ.

RR

(branch on count to register address; Verzweigen nach Zählen zu der im Register angegebenen Adresse)

204

3. Die Programmiersprache ASSEMBLER

Format symbolisch: BCTR

R,, R 2

Format maschinenintem: 1 I

0

I

1 R, I R,

6

I

1 Byte

: Byte

Wirkungsweise: Der Inhalt des Registers R, wird um 1 vermindert. Danach wird der Inhalt geprüft. Ist dieser ungleich Null, so verzweigt das Programm zu der in R 2 befindlichen Speicheradresse. Ist der Inhalt von R! gleich Null, so fährt das Programm mit der auf BCTR folgenden Instruktion fort. Bedingungscode: Wird nicht verändert. Programmierhinweise: Ist der Anfangswert von R, gleich Null, so wird auf alle Fälle verzweigt, denn zuerst wird ( R ^ um 1 vermindert; d.h. es ist dann = - 1 =£0. Wird für R 2 eine Null gesetzt, so wird der Inhalt von Ri zwar um 1 vermindert, es wird aber nicht verzweigt, da der Inhalt von R 2 = 0 nicht verwendet wird. Codierungsbeispiel (vgl. dazu auch S. 203).

ADD

LA SR SR L A A BCTR

6,ADD 14,14 5,5 3,Ν 5,W0RTE(14) 14,=F'4' 3,6

205

3.4 Maschinenbefehle

Befehle: BXH BXLE Typ:

(branch on index high; Verzweigen bei Index größer) (branch on index Jow or equal; Verzweigen bei Index kleiner oder gleich)

RS

Formate symbolisch: BXH BXH

R,,R3, D2(B2) R „ R 3 , S2

BXLE BXLE

R h R 3 , D 2 (B 2 ) R „ R3, S2

Formate maschinenintern: 1

1 8

: 1

6

R]

1 Byte

1

t

R)

ß:

Z.Byte

>



D,

3 Byte

4

t



-j

··

Byte

1 8

|

7

R,

1. B y t e

; 1

R,

2 Byte

B, ι 3. B y t e

-

0,

• 4

Byte

Wirkungsweise: Der Inhalt des Registers R 3 wird auf den Inhalt des Registers R[ addiert. Danach wird die Summe in R ! mit dem Inhalt des Registers R 3 + 1 (sofern R 3 eine gerade Registernummer ist) oder mit dem Inhalt des Registers R 3 (sofern R 3 eine ungerade Registernummer ist) verglichen. Ist die Summe in R ! bei BXH größer als der Inhalt von R 3 + 1 bzw. R 3 und bei BXLE kleiner oder gleich dem Inhalt von R 3 + 1 bzw. R 3 , so verzweigt das«Programm zu der mit + D 2 angegebenen Adresse. Andernfalls fährt es mit der nachfolgenden Instruktion fort. Bedingungscode: Wird nicht verändert. Codierungsbeispiele: Die Befehle BXH und BXLE können zum Aufbau von Programmschleifen benutzt werden, bei denen der Schleifenzähler mit beliebigen evtl. auch variierenden Inkrementen hochaddiert oder heruntersubtrahiert wird.

L L L

1,ANFANG 2,INKREM 3,ENDE

206

0P

3. Die P r o g r a m m i e r s p r a c h e ASSKMBLKR

Operationen

BXLE

1,2,0P

In die Register 1, 2 und 3 werden der Anfangswert des Schleifenzählers, das Inkrement und der Endwert des Schleifenzählers geladen; diese Werte befinden sich in den mit ANFANG, INKREM und ENDE adressierten Speicherworten. Das Programm durchläuft die mit 0P adressierte Befehlsfolge bis zum Befehl BXLE so lange, bis der Inhalt des Schleifenzählers Register 1 größer als der Inhalt des Registers 3 geworden ist.

ADD

SR SR L L L A A BXLE

14,14 5,5 1 ,=F'1' 2,=FT 3,Ν 5,W0RTE(14) 14,=F'4' 1,2,ADD

Diese Befehlsfolge bewirkt dasselbe wie die auf Seite 203 im Zusammenhang mit BCT angegebene.

Befehl: EX Typ:

(execute; Ausfuhren)

RX

Formate symbolisch: EX EX

R,, D2(X2, R,,S2

B2)

207

3.4 Maschinenbefehle

Format maschinenintern: ι *

;

R,

*

I Byte

1 ; χ, Byte

Β; — !•· L 3 Byte

- Π,

-I ι . 4. Byte

·

Wirkungsweise: Die m i t ( X 2 > + ( B 2 > + D 2 adressierte I n s t r u k t i o n w i r d d u r c h d e n I n h a l t von R , m o d i f i z i e r t u n d a u s g e f ü h r t . D a n a c h setzt d a s P r o g r a m m m i t d e r a u f EX folgend e n I n s t r u k t i o n f o r t . Ist d i e a u s z u f ü h r e n d e I n s t r u k t i o n e i n e S p r u n g i n s t r u k t i o n , so setzt d a s P r o g r a m m m i t der a n g e s p r u n g e n e n I n s t r u k t i o n f o r t . Die M o d i f i k a tion d e r a u s z u f ü h r e n d e n I n s t r u k t i o n u n t e r b l e i b t , w e n n R , = 0 ist. L e t z t e r e s sei der hier allein i n t e r e s s i e r e n d e Fall.

Bedingungscode: Hängt von der ausgeführten Instruktion ab.

Codierungsbeispiel:

A1

MVC

FELD1 .FELD2+3

EX AP

0,A1 REFE.FELD1

D u r c h EX w i r d die m i t A1 adressierte I n s t r u k t i o n MVC . . . a u s g e f ü h r t , d a n a c h wird die I n s t r u k t i o n AP . . . a u s g e f ü h r t .

3.4.3.10

Logische Bit-Verknüpfungen

Befehle:

Typ:

NR

( a n d register)

OR

( o r register)

XR

(exclusive or register)

RR

3. Die P r o g r a m m i e r s p r a c h e ASSHMBLFR

208

Fonnate symbolisch: NR OR XR

Rj, Rj Rj,R2 R j , R2

Fonnate maschinenintem:

1

1 j

. . 4

: 1

β

1 J

1 R. , 1

R,

(OR)

2. Byte

1. Byte

1

(NR)

2. Byte

1. Byte

1

.

R j i R2

7

1. Byte

•Γ R,1 ι 1

RL,

(XR)

2. Byte

Wirkungsweise: Die bits der Register R j und R 2 werden paarweise in der gesamten Registerlänge von 32 logisch verknüpft, und das Resultat wird im Register R j abgesetzt. NR fuhrt eine logische Und-Verknüpfung durch. Wenn ry die j-te bit-Position des Registers R j ist, dann läßt sich die Verknüpfungsregel wie folgt darstellen:

ij 0 0 1 1

A

r

Λ Λ Λ Λ

r

2j 0 1 0 1

lj 0 0 0 1

=> => => =>

OR führt eine logische Oder-Verknüpfung durch. Sie läßt sich wie folgt darstellen: lj 0 0 1 1

ν ν ν ν ν

r

r

2j 0 1 0 1

=>

ij 0 1 1 1

3.4 Maschinenbefehle

209

XR führt eine logische Antivalenz-Verknüpfung durch. Sie läßt sich wie folgt darstellen: ν 0 0 1 1

ν ν ν ν

=>

0 1 0 1

=>

=> => =>

r

lj 0 1 1 0

Bedingungscode: Resultat hat nur Nullen Resultat hat auch Einsen

Codierbeispiel: NR

5,6

Register 6 0 100101

0 31

Λ

Register 5

0 10 10 10

0 31

Register 5 0 100000 31

Die oben gezeigte Operation dient dem Nullsetzen einzelner bits in R 5 . Die Wirkung von < R6 > ist dabei die einer bit-Maske: Alle r 6 j = 1 lassen die r 5 j unverä n d e r t ; alle r 6 j = 0 schalten (bzw. lassen) die r 5 j auf Null. Weitere Anwendungen vgl. Übung 11 (Seite 306 f.).

Befehle: Ν

(and)

Ο X

(or) (exclusive O R )

3. Die Programmiersprache ASSEMBLER

210 Typ:

RX

F o r m a t e symbolisch: Ν Ν Ν

R,,D2(X2;B2)

Ο

R„S2(X2)

ο

R ) , S2 ( X a )

0

R,,S2

R „ S2

X

R,,D2(X2,Bj)

R,,D2(X2,B2)

X

R,,S2(X2)

X

Ri, S2

F o r m a t e maschinenintem: s

1 : 1

4

R

1

1. Byte 5

S

1

X

2

b

2

2. Byte 6

R

1

1. Byte I ! -1 L1. Byte

5

!

: 3. Byte

x

2

B2

I

2. Byte Rj

1 J

!

3. Byte X2

2. Byte

b

2

! 3. Byte

: 4. Byte 1 — • D 2 -J • 4. Byte . D2-J 4. Byte

Wirkungsweise: Analog N R , OR, X R ; die bit-Maske steht hier jedoch in einem indiziert adressierten Speicherwort.

Bedingungscode: 0 : Resultat hat nur Nullen 1: Resultat hat auch Einsen 2: 3: Programmierhinweis: Der Speicheropcrand muß auf eine Wortgrenze ausgerichtet sein (vgl. S. 4 4 f.).

211

3.4 Maschinenbefehle

Befehle: NC OC XC

(and character) (or character) (exclusive or character)

SS

(logisch)

Typ:

Formate symbolisch: NC NC NC

D, ( L , , B , ) , D 2 ( B 2 ) S, ( L i ) , S 2 S,.S2

XC XC XC

D, ( L , , B , ) , D 2 ( B 2 ) S, ( L i ) , s2 Sι, S2

OC OC OC

Di ( L i , B J , D 2 ( B 2 ) S, ( L , ) , S 2 S , , S2

Formate maschinenintem: (NC)

JLLL

-1

B

1

!'

Lj-1

B

i

i

B

1

!

L l

Jl±

(ÜC)

L

D

; 6 I

D

(XC) 1 D

ί '

1. Byte

2. Byte

3. Byte



1

L

1 - D . - J — 4. Byte

b

2

Γ !· ι

»2 1-

1 B2 ! — S.Byte

-

o

2

i — -

6. Byte

Wirkungsweise: Analog NR, O R , X R ; die bit-Maske sowie die zu verändernde bit-Kette stehen hier jedoch beide im Arbeitsspeicher, u n d es wird in der Länge des ersten Operanden verknüpft. Bedingungscode: 0: Resultat hat nur Nullen 1: Resultat hat auch Einsen 2:

3:

212

3. Die Programmiersprache ASSEMBLER

Befehle: ΝI Ol

(and immediate) (or hnmediate) (exclusive or immediate)

Typ:

SI

Formate symbolisch: Nl Nl

D.iBOJj S,,I2

Ol 01

D, ( B , ) , I j S,,I2

XI XI

D, ( B , ) , I 2 S , , I2

Formate maschinenintem: 5

1. Byte

1

1 3. Byte

2. Byte

1. Byte

2. Byte

4. Byte

D

>1

(Nl) J.

Γ l-f

3. Byte

(01)

4. Byte

Τ !

7

1. Byte

ι 2. Byte

3. Byte

Τ

(XI)

4. Byte

Bedingungscode: 0 : Resultat hat nur Nullen 1: Resultat hat auch Einsen 2:

3: Wirkungsweise: Analog NR, OR, XR; die bit-Maske steht hier jedoch im Direktoperand verändernde bit-Kette steht in einem Byte des Arbeitsspeichers.

und die zu

3.5 Assembler-Anweisungen Assembleranweisungen dienen dazu, die Arbeitsweise des Assemblers (des Übersetzerprogramms) zu steuern und zu modifizieren. Sie erzeugen keine Maschineninstruktionen, sind also nicht für die Ausführungsphase, sondern nur für die Umwandlungsphase des Maschinenprogramms existent. Allerdings reicht

213

3.5 Assembler-Anweisungen

ihre Wirkung insofern in die Ausführungsphase hinein, als während der Übersetzungsphase mit ihrer Hilfe z.T. die Maschineninstruktionen modifiziert werden. 3.5.1 Anweisungen zur Symbol-, Konstanten- und Felddefinition Anweisung: EQU

(equate symbol; Gleichsetzen eines Ausdrucks mit einem Symbol)

Allgemeines Format: S

EQU

Ausdruck

Wirkungsweise: Dem Symbol S wird der Wert des Ausdrucks zugeordnet. Der Ausdruck kann ein anderes Symbol sein, dem bereits ein Wert zugeordnet wurde, ein Direktwert, der Wert des Zuordnungszählers, ein Längenattribut (L' Ausdruck) oder eine arithmetische Kombination aus diesen Ausdrucksarten. Codierungsbeispiele: REG1 LAENGE WERT

EQU EQU EQU

2 L'M0VE-X'C'+B'1Or ALPHA+BETA+(»—5)

Programmierhinweise: Die Anwendungsmöglichkeiten dieser Anweisung erstrecken sich im wesentlichen auf folgende 2 Fälle: (1)

Wenn man sich während des Codierens noch nicht darüber im klaren ist, welche Register, Längen und Distanzadressen im einzelnen zu wählen sind, kann man zunächst ganz allgemein mit Symbolen arbeiten und erst am Ende des Programms den Symbolen die entsprechenden Werte zuweisen. Beispiel:

D1 D2 B1 B2 L1

MVC

D1 (L1 ,B1 ),D2(B2)

EQU EQU EQU EQU EQU

17 0 8 B1 L'FELD

214

(2)

3. Die P r o g r a m m i e r s p r a c h e A S S E M B L E R

Wenn ein k o m p l e x e r , umständlich zu schreibender A u s d r u c k in mehreren Befehlen v o r k o m m t , so ist es rationeller, diesen einmal mit e i n e m einfachen Symbol gleichzusetzen u n d dann in den Befehlen dieses S y m b o l zu verwenden. Beispiel: MVC AP

FELD,D(8) D(15,8),D(12,7)

EQU

(ALPHA*2) —(BETA/5) + (< +A)

Anweisung: DC

(define constant: Definieren Konstante)

Allgemeines Format (vereinfacht): S DC k, T L n / x , . . . . x n l | ' ,

k2 T L n / y i . . . . y m 2 '

14

Wirkungsweise: Eine oder mehrere Konstanten werden im Arbeitsspeicher abgesetzt. Das äußerst linke Byte des Konstantenfeldes kann symbolisch mit S adressiert werden, d . h . S erhält den Wert der Speicheradresse des K o n s t a n t e n f e l d e s . Das Längenattribut des Symbols S bestimmt sich nach der expliziten Längenangabe Ln oder wenn diese fehlt, nach der impliziten Länge der K o n s t a n t e . Werden mit einer DC-Anweisung mehrere Konstanten abgesetzt, so erhält das Symbol S das Längenattribut der äußerst linken Konstante. Programmierhinweis: Hinsichtlich der Bildung der Konstanten k T L n ' x , . . . . x m ' gilt das, was bereits bei den Literalen dargestellt wurde (vgl. Seite 58 ff.). Der Unterschied zwischen der Literalverwendung und der K o n s t a n t e n d e f i n i t i o n per DC-Anweisung besteht neben Unterschieden in der Codierung vor allem in folgenden 3 P u n k t e n : (1)

14

Mit DC definierte Konstanten k ö n n e n eine symbolische Adresse h a b e n und somit auch als 1. Operand a u f t r e t e n . Damit ergibt sich u . a . die MögDie Definition mehrerer K o n s t a n t e n mit einer DC-Anweisung ist nicht bei allen Assembler-Versionen möglich.

3.5 Assembler-Anweisungen

215

lichkeit, diese Konstanten während der Programmausführung zu verändern. Literale haben keine symbolische Adresse und können somit auch nicht ohne weiteres verändert werden. (2)

Mit einer DC-Anweisung können mehrere Konstanten abgesetzt werden. Ein Literal definiert dagegen stets nur eine einzige Konstante (vgl. jedoch Fußnote 14, Seite 214).

(3)

Jede DC-Anweisung setzt eine oder mehrere Konstanten tatsachlich ab, auch wenn die Konstanten alle identisch sein sollten. Wird dagegen ein und dasselbe Literal in mehreren Befehlen gebraucht, so wird die damit definierte Konstante nur einmal abgesetzt.

Codierungsbeispiele: a) CLC

FE LD,=4X'FF'

ist äquivalent mit

GRENZE

CLC

FELD,GRENZE

DC

4X'FF'

DC

ΖΌ000'

DC

Β Ί 0 1 1 ',CL3'A',5X'CC51'

DS

(define storage; Definieren Speicherplatz)

b) NULLEN c) K0NSTS

Anweisung:

Allgemeines Format: S

DS

kTLn'z, . . . . z m '

Wirkungsweise: Ein oder mehrere Bytes werden bei der Umwandlung freigehalten; d . h . in dem freigehaltenen Bereich werden keine Maschineninstruktionen oder Konstanten

216

3. Die Programmiersprache ASSt.MBLKR

abgesetzt. Das äußerst linke Byte des Speicherfeldes kann symbolisch mit S adressiert werden; d . h . S erhält den Wert der Adresse des Speicherfeldes. Das Längenattribut des Symbols S bestimmt sich nach der expliziten Längenangabe Ln, nach der Länge der angegebenen Konstante 'z, . . . . z m ' oder nach der impliziten Länge der Typenangabe T. Wird eine Konstante 'z\ . . . . z m ' angegeben, so wird diese bei der Umwandlung nicht abgesetzt. Wird ein Duplizierfaktor k angegeben, so wird das betreffende Feld k-mal reserviert.

Programmierhinweise : (1)

(2)

Für das Symbol Τ in der allgemeinen Formatangabe können folgende Typenzeichen mit folgenden impliziten Längen eingesetzt werden: Τ

Bedeutung

implizites Längenattribut

C X Β F Η Ε D Ρ Ζ

Zeichen sedezimal Dual Vollwort Halbwort GP-Wort GP-Doppelwort gepackt gezont

1 1 1 4 2 4 8 1 1

Werden die Typenangaben D, E, F oder Η verwendet, so erfolgt bei der Feldreservierung, eventuell unter Einschub von „Leer"-Bytes, eine Ausrichtung der Speicheradressen auf Doppel-, Voll- oder Halbwortgrenzen. Die Ausrichtung entfällt, wenn ein expliziter Längenschlüssel verwendet wird.

Codierungsbeispiele:

FELD1 WORT ZEICHEN KARTE BYTES DW FW HW

DS DS DS DS DS DS DS DS

CL4 F C CL80 80C OD OF OH

reservierte Bytes

Längenattribut

4 4 l 80 80 0 0 0

4 4 1 80 ! 8 4 2

217

3.5 Assembler-Anweisungen

Die drei letzten Beispiele zeigen, wie man eine Ausrichtung auf Doppel-, Vollund Halbwortgrenzen erreichen kann, ohne Speicherplatz zu reservieren.

BEREICH NAME ORT BERUF DATUM BEZIRK

DS DS DS DS DS DS DS

0CL80 CL20 CL20 CL20 CL10 CL5 CL5

reservierte Bytes

Längenattribut

0 20 20 20 10 5 5

80 20 20 20 —

5 5

Die obigen 7 Anweisungen sind im Zusammenhang zu sehen: Durch DS 0CL80 wird dem Symbol BEREICH lediglich ein Längenattribut zugeordnet, denn es könnte erforderlich sein, ζ. B. in alle 8 0 Bytes dieses Feld zu übertragen. Die nachfolgenden Anweisungen unterteilen dieses Feld in Unterfelder mit eigenen symbolischen Adressen und eigenen Längenattributen. Die drittletzte Anweisung hält einen unadressierten Bereich von 10 Bytes frei. Die Gesamtzahl der freigehaltenen Bytes der Unterfelder ergibt das Längenattribut des übergeordneten Symbols BEREICH.

3.5.2 Anweisungen zur Deklaration und Aufgabe von Basisregistern Anweisung: USING (using base address registers; Deklarieren von Basisregistern) Allgemeines Format: USING

V, R „ R 2 ,

, R16

V steht für eine symbolische Adresse oder für den Wert des Zuordnungszählers. Durch diese Angabe wird dem Assembler dasjenige Byte angezeigt, welches innerhalb eines Programms während der Umwandlungsphase die relative Basisadresse und während der Ausfuhrungsphase die absolute Basisadresse hat. Die relative Basisadresse ist die Adreßdifferenz zwischen dem Programmanfang (relative Adresse 0 ) und der auf BALR 1. Basisreg., 0 folgenden Maschineninstruktion. Die absolute Basisadresse ist gleich der Summe aus der absoluten Ladeadresse des Programmanfangs und der relativen Basisadresse. Die Zeichen R, bis R| 6 stehen für Nummern von Festpunktregistern, von denen mindestens 1 und höchstens 16 in beliebiger Reihenfolge (aber ohne Wiederholungen) angegeben werden können.

218

3. Die P r o g r a m m i e r s p r a c h e ASSKMHLI R

Wirkungsweise: Mit der USING-Anweisung wird dem Assembler mitgeteilt, welches oder welche Festpunktregister bei der Umwandlung der symbolischen Operandenadressen als Basisregister in die echten Maschineninstruktionen einzusetzen sind. Ferner wird dem Assembler mitgeteilt, daß in den Registern R l t R 2 , R 3 , . . . . in der Ausfiihrungsphase die absoluten Basisadressen Β, B+4096, B+2#4096. . . . stehen werden. Der Assembler berechnet von Β aus die Distanzadressen sämtlicher symbolisch adressierten Operanden und setzt diese zusammen mit R, in den betreffenden Maschineninstruktionen ab. Uberschreiten die Distanzadressen den Wert 4 0 9 5 , so werden die Distanzen von B+4096 aus berechnet und zusammen mit R 2 abgesetzt, usw. Bei dieser Berechnung hat Β den Wert der relativen Basisadresse. Da den symbolischen Adressen bei der Erstellung der Symboltabelle bereits die auf den Programmanfang bezogenen relativen Adressen zugewiesen wurden, müssen zur Berechnung der Distanzadressen nur noch die relativen Basisadressen B, B+4096, . . . subtrahiert werden.

Programmierhinweise: Der Programmierer m u ß mit Hilfe geeigneter Maschineninstruktionen dafür sorgen, daß in der Ausfiihrungsphase des Programms die absoluten Basisadressen tatsächlich in die Basisregister geladen werden. Die USING-Anweisung kann dies nicht leisten, da sie keine Maschineninstruktion ist und daher in der Ausfiihrungsphase nicht mehr existiert.

Codierungsbeispiele: a)

BALR

8,0

Laden der absoluten Adresse der nachfolgenden Maschineninstruktion L 10,= F'1' als Basisadresse in das Register 8. USING

ANF,8,9

Mitteilung an den Assembler, daß die Register 8 und 9 als Basisregister zu benutzen sind und daß in Register 8 als Basisadresse die mit ANF symbolisierte Byteadresse und in Register 9 als Basisadresse die mit A N F + 4 0 9 6 angegebene Byteadresse stehen wird. Damit weiß der Assembler, daß ANF und ANF+4096 als Bezugspunkte zur Berechnung der Distanzadressen zu benutzen sind.

3.5 Assembler-Anweisungen

ANF

L

219

10,=F'1'

Laden einer „Vollwort"-Eins in das Register 10. LA

9,4095(8,10)

Laden von (Reg. 8) + (Reg. 10) + 4095 als Basisadresse in das Register 9.

b)

BALR USING

8,0 *,8,9

Statt einer symbolischen Basisadresse kann auch der Wert des Zuordnungszählers benutzt werden, der nach der Absetzung von BALR 8,0 auf der Adresse des ersten Byte von L 10,=F"T steht. Damit weiß der Assembler, daß * und »+4096 als Bezugspunkte für die Berechnung der Distanzadressen zu benutzen sind.

c) ANF

L LA

10,=F"T 9,4095(8,10)

BALR USING L

8,0 *,8,9 9,=A(ANF+4096)

Die absolute Adresse ANF+4096 wird hier mit Hilfe einer Adreßkonstante dargestellt und als Basisadresse in das Register 9 geladen.

d)

BALR USING LM

8,0 *,8,9,10 9,10,=A( *+4096,»+8192) 1 5

Die absoluten Adressen *+4096 und * + 8 l 9 2 werden als Adreßkonstante dargestellt und als Basisadressen in die Register 9 und 10 geladen. 15

Die V e r w e n d u n g mehrerer Ausdrücke in einer A d r e ß k o n s t a n t e ist nicht bei allen Assembler-Versionen möglich.

220

3. Die P r o g r a m m i e r s p r a c h e A S S b M B l . l R

Anweisung: DR0P

(drop base address registers; Aufgeben von Basisregistern)

Allgemeines Format: DR0P

R„ Rj,

, R16

Die Zeichen R,, R 2 , , R I 6 stehen für Nummern von Festpunktregistem, von denen mindestens 1 und höchstens 16 in beliebiger Reihenfolge (aber ohne Wiederholungen) angegeben werden können.

Wirkungsweise: Mit der DR0P-Anweisung wird dem Assembler mitgeteilt, daß die genannten Register von dieser Anweisung an nicht mehr als Basisregister verwendet werden sollen.

Codierungsbeispiel:

BALR USING

NEU

7,0 ·,7

LA 8,NEU DR0P 7 USING NEU,8 MVC FELD,ZAHL

Die Adresse NEU wird in der Ausführungsphase mit LA 8,NEU in das Basis register 8 geladen. Die Adresse NFU wird mit dem Basisregister 7 erreicht. Die DR0P-Anweisung sagt dem Assembler, daß von nun an bei der Umwandlung Register 7 nicht mehr als Basisiegister in die Maschineninstruktion eingesetzt werden soll. Die Anweisung USING NEU,8 sagt dem Assembler, daß von nun an Register 8 als Basisregister eingesetzt werden soll und daß die Adresse NEU Basisadresse ist. Für die Umsetzung der Adressen FELD und ZAHL wird bereits das neue Basisregister 8 benutzt.

3.5 Assembler-Anweisungen

221

3.5.3 Anweisungen zur Programmsegmentierung und Segmentverknüpfung ASSEMBLER-Programme können segmentiert werden, so daß die einzelnen Abschnitte selbständige Programm-Moduln darstellen, die getrennt übersetzt werden und die im Zuge der linkage-editor-Phase (Binderphase) wieder zu einem Gesamtprogramm verknüpft werden können. Damit wird eine Modulartechnik ermöglicht, die zahlreiche Vorteile aufweist. So können beispielsweise, um nur einige zu nennen, häufig vorkommende standardisierbare Routinen als Unterprogramm-Moduln verfaßt und in allen möglichen Programmen durch einfache Verknüpfung benutzt werden. Große Programme können durch die Segmentierung übersichtlich gegliedert werden. Fehlerkorrekturen erfordern nur die Überarbeitung und Neuumwandlung des betreffenden Segments. Arbeitsteilung bei der Programmierung und schließlich Erzeugung von Moduln auf kleineren Anlagen werden möglich. Anweisung: START (start assembly; Starten des Übersetzungsvorgangs) Allgemeines Format: S

START Direkt wert

Wirkungsweise: Der Zuordnungszähler wird auf den Anfangswert gesetzt und der Beginn des Übersetzungsvorgangs wird eingeleitet: Wird ein durch 8 teilbarer Direktwert angegeben, so wird dieser der Anfangswert des Zuordnungszählers. Ist der Direktwert nicht durch 8 teilbar, so wird der Zuordnungszähler auf die nächst höhere Doppelwortgrenze eingestellt. Wird kein Direktwert angegeben, so wird der Zuordnungszähler auf Null gesetzt. Wird ein Symbol (S) angegeben, so erhält dieses in der Ausfuhrungsphase den Wert der absoluten Ladeadresse des Programms. Besteht ein Programm aus mehreren Segmenten, die gemeinsam übersetzt werden, so dient die START-Anweisung der Kennzeichnung des ersten Segments. Jede in START und END eingeschlossene Instruktionsfolge begründet einen selbständigen Programm-Modul.

Anweisung: CSECT (identify control section; Definieren eines Programmsegments)

222

3. Die Programmiersprache ASSHMBLF.R

Allgemeines Format: S

CSECT

Wirkungsweise: Die CSECT-Anweisung definiert ein neues Programmsegment. Der Zuordnungszähler wird auf eine Doppelwortgrenze eingestellt. Eine völlig neue Adreßrechnung mit neuen displacements und neu zu definierenden Basisregistern beginnt. Wird ein Symbol (S) verwendet, so erhält dieses in der Ausfuhrungsphase den Wert der absoluten Ladeadresse dieses Segments. Jede in CSECT und END eingeschlossene Instruktionsfolge begründet einen selbständigen Programm-Modul. Werden in einem Segment mehrere CSECT-Anweisungen mit gleichlautenden Symbolen gegeben, so erfolgt zwar stets eine neue Ausrichtung des Zuordnungszählers, jedoch werden dadurch keine neuen Segmente begründet. Die Ladeadresse des Segments bleibt die Adresse der ersten Maschineninstruktion nach der ersten CSECT-Anweisung.

Anweisung: EXTRN (identify external symbols; Definieren externer Symbole) Allgemeines Format: EXTRN

S,, S 2 ,

,Sm

16

Wirkungsweise: Symbolische Adressen von Instruktionen, Datenfeldern und Konstantenfeldern, die in einem Programmsegment als Operanden benutzt werden, die aber in anderen Segmenten definiert sind 1 7 , müssen im benutzenden Segment mit Hilfe der EXTRN-Anweisung als externe Symbole deklariert werden. Die Deklaration bewirkt, daß die symbolischen Adressen S ^ S 2 , , S m bei der Umwandlung in eine Tabelle der externen Symbole gebracht werden. Diese Tabelle (external symbol dictionary) dient der Herstellung von Adreßverbin16

17

Die Mehrfachdefinition von Symbolen mit einer einzigen EXTRN- bzw. ENTRYAnweisung ist nicht bei allen ASSEMBLER-Versionen möglich. Die Definition von symbolischen Adressen geschieht bei Instruktionen durch Verwendung eines Symbols im Namensfeld des betreffenden Befehls, bei Daten- und Konstantenfeldern durch Verwendung eines Symbols im Namensfeld der Assembleranweisungen DS und DC.

3.5 Assembler-Anweisungen

223

düngen zwischen den einzelnen Segmenten in der Bindephase: Nach d e m Laden aller Segmente werden die absoluten Speicheradressen der symbolisch adressierten externen Instruktionen, Datenfelder und Konstantenfelder ermittelt und in den dafür zu definierenden A d r e ß k o n s t a n t e n zur Verfugung gestellt. Der Zugriff zu den externen Adressen in der Ausfuhrungsphase des Programms wird mittels dieser Adreßkonstanten realisiert.

Anweisung: ENTRY (identify entrypoint symbols; Erklären Eingangspunktsymbole) Allgemeines F o r m a t : ENTRY

S„S2,

, Sk

16

Wirkungsweise: Symbolische Adressen von Instruktionen, Datenfeldern u n d Konstantenfeldern, die in einem Programmsegment definiert s i n d 1 7 , die aber in anderen Segmenten als Operanden b e n u t z t werden, müssen im definierenden Segment mit Hilfe der ENTRY-Anweisung als Eingangspunktsymbole deklariert w e r d e n . Die Deklaration b e w i r k t , daß die symbolischen Adressen Si, S 2 , S^ in eine Tabelle der externen Symbole gebracht werden. In dieser Tabelle (external symbol dictionary) dienen sie gemeinsam mit den durch die EXTRNAnweisung bewirkten Eintragungen der in der Bindephase ablaufenden Adreßrechnung (siehe oben). Die mit ENTRY deklarierten Symbole erhalten, wie alle übrigen S y m b o l e des betreffenden Segments, bei der U m w a n d l u n g nur relative Adressen. Bei der Adreßrechnung in der Bindephase werden d a n n die Adreßk o n s t a n t e n aus diesen und der Distanz zwischen d e m b e n u t z e n d e n und d e m definierenden Segment gebildet.

Anweisung: END

(end assembly; Beenden der Umwandlung)

Allgemeines F o r m a t : END

S

3. Die P r o g r a m m i e r s p r a c h e A S S l i M B U R

224

Wirkungsweise: Die Umwandlung bricht mit dieser Anweisung ab; alle nachfolgenden Instruktionen und Anweisungen werden ignoriert. Die END-Anweisung muß also die letzte Anweisung eines Segments oder mehrerer gemeinsam umzuwandelnder Segmente sein. Mit Hilfe eines Symbols (S) kann auf eine symbolische Instruktionsadresse bezug genommen werden, die damit zur Startadresse wird. Eine derartige Startadresse kann nur in demselben Segment oder in einem gemeinsam mit diesem letzten Segment übersetzten Segment angegeben werden. Nicht möglich ist die Angabe einer externen Startadresse in einem separat übersetzten Segment. Codierungsbeispiel zum Komplex START, CSECT, EXTRN, ENTRY, END: PR01

START 4000

Definition eines ersten Modul mit dem Namen PR01 und Setzen des Zuordnungszählers auf 4000 (relativ zum Programmanfang). EXTRN B1,C B1 und C sind symbolische Adressen in den Segmenten PR02 bzw. PR03, auf die von diesem Modul PR01 aus bezug genommen werden soll. ENTRY A1,A2 A1 und A2 sind symbolische Adressen dieses Modul PR01, auf die von den Segmenten PR02 bzw. PR03 aus bezug genommen werden soll. A

BALR 8,0 USING *,8

L CLC

5=A(B1) 0(3,5),=C'ABC'

Bezugnahme auf die externe symbolische Adresse B1 und Verarbeitung dieses externen Operanden: Der Inhalt des mit B1 adressierten Feldes wird mit der Zeichenkonstante 'ABC' verglichen.

L BALR

5,=V(B) 4,5

3.5 Assembler-Anweisungen

225

Bezugnahme auf die externe symbolische Adresse Β und Verzweigen zu dieser Adresse mit Rücksprungadressierung in Register 4 . Das Symbol Β m u ß nicht als extern definiert werden, da dies durch die Verwendung einer Adreßkonstante des Typs V impliziert wird (vgl. S. 68). L BR

5,=A(C) 5

Bezugnahme auf die externe symbolische Adresse C und Verzweigen zu dieser Adresse. Wegen der Verwendung einer Adreßkonstante des Typs Α mußte die Adresse C als extern deklariert werden. A1 A2

DS DC END

CL3 C'123' A

Ende der Assemblierung und Begründung des separaten Programm-Modul PR01. Α ist die Adresse der Instruktion, bei der die Ausfuhrung des Programms beginnen soll. PR02

CSECT

Definition eines Modul mit dem Namen PR02. EXTRN A1 A1 ist eine symbolische Adresse im Modul PR01, auf die von diesem Segment PR02 aus bezug genommen werden soll. ENTRY B,B1 Β und B1 sind symbolische Adressen dieses Segments PR02, auf die vom Modul PR01 aus bezug genommen werden soll. Β

BALR USING

9,0 *,9

L 5,=A(A1) MVC 0(3,5)=C'DEF' Bezugnahme auf die externe symbolische Adresse A l und Verarbeiten dieses externen Operanden: Die Zeichenkonstante ' D E F ' wird in das mit A1 adressierte Feld übertragen.

BR

4

226

3. Die Programmiersprache ASSliMBl.KR

Rücksprung zu der in Register 4 gespeicherten Adresse (in den Modul PR01).

B1

DS

PR03

CSECT

CL3

Definition eines Segments mit dem Namen P R 0 3 innerhalb des Modul PR02. EXTRN A2 A2 ist eine symbolische Adresse im Modul PR01, auf die von diesem Segment aus bezug genommen werden soll. ENTRY C C ist eine symbolische Adresse in diesem Segment PR03, auf die vom Modul PR01 aus bezug genommen werden soll. C

BALR USING

10,0 *,10

L

5,=A(B1)

Bezugnahme auf die symbolische Adresse B1 im Segment PR02. B1 m u ß nicht als extern deklariert werden, da diese Adresse demselben Modul angehört. Die Adreßkonstante ist erforderlich, weil in diesem Segment für B1 kein Basisregister zur Verfügung steht. L

6=A(A2)

Bezugnahme auf die externe symbolische Adresse A2. MVC

0(3,5),0(6)

Verarbeitung der externen Operanden: die mit A2 in PR01 adressierte Konstante wird in das mit B1 in PR02 adressierte Feld übertragen.

E0J

3.5 Assembler-Anweisungen

227

Stop des Programms. END Ende der Assemblierung und Begründung des separaten Programm-Modul PR02. 3.5.4 Anweisungen zur Steuerung des Zuordnungszählers Anweisung: 0RG

(set location counter; Setzen des Zuordnungszählers)

Allgemeines Format: 0RG

S (oder *± Direktwert)

Wirkungsweise: Die 0RG-Anweisung gestattet die Vor- und Zurückstellung des Zuordnungszahlers innerhalb eines Programmsegments. Wird eine symbolische Adresse (oder ein modifizierter Wert des Zuordnungszählers) eingesetzt, so wird der Zuordnungszähler auf diese Adresse eingestellt (oder durch den Direktwert modifiziert). Wird diese 0RG-Anweisung ohne Operand gegeben, so wird der Zuordnungszähler auf den höchsten bisher erreichten Wert eingestellt. Dieser Wert wird durch den Assembler laufend gespeichert. Codierungsbeispiel: FELD

DS

CL100

Der Zuordnungszähler steht nach der Verarbeitung dieser Assembleranweisung auf dem Byte, das sich an diesen reservierten Speicherbereich anschließt, also auf der Adresse FELD+100. 0RG

FELD+3

Der Zuordnungszähler wird auf das 4. Byte des Speicherbereichs FELD zurückgesetzt. DC

C'ABC

Im 4., 5. und 6. Byte des Speicherbereiches wird die Konstante 'ABC' abgesetzt. Danach steht der Zuordnungszähler auf der Adresse FELD+6. 0RG Der Zuordnungszähler wird wieder auf die Adresse FELD+100 eingestellt.

228

3. Die Programmiersprache ASSI· MB 1.1·'R

Anweisung: LT0RG (begin literal p o o l : E r ö f f n e n eines Literalbereiches) Allgemeines Format: S

LT0RG

Wirkungsweise: Die LTÖRG-Anweisung bewirkt das Vorrücken des Zuordnungszählers auf die nächste freie Doppelwortgrenze u n d das Absetzen aller Literale, die vor dieser und nach einer eventuell vorangehenden LTÖRG-Anweisung b e n u t z t worden sind. Gleiche Literale werden dabei nur einmal abgesetzt. Literale, die nach einer LTÖRG-Anweisung a u f t r e t e n , werden vom Assembler automatisch in einen allgemeinen Literalbereich am Ende des Programmsegments abgesetzt, es sei d e n n , daß weitere LTÖRG-Anweisungen folgen. Wird eine symbolische Adresse (S) verwendet, so wird diese die Adresse des ersten Byte des b e t r e f f e n d e n Literalbereichs. Auf diese Weise kann der Nachteil der Literale, nicht adressierbar und damit nicht variierbar zu sein, beseitigt werden. Programmierhinweis: Wird ein Literalbereich m i t t e n in einer Folge von Maschineninstruktionen abgesetzt, so m u ß dieser durch eine geeignete Maschineninstruktion übersprungen werden. Codierungsbeispiel: Maschinencode (sedezimal)

LIT1 WEITER

FELD = X L 4 ' 0 C ' MVC AP FELD,=P'+15' Β WEITER LT0RG MVC

D2 FA 47 00 D2

04 31 F0 00

80 80 80 00

2F 2F IE 0C

80 80

18 IC

01

5C

3.5.5 Anweisungen zur Modifikation des Übersetzungsprotokolls Anweisung: TITLE

(identify assembly o u t p u t : Erzeugen einer Überschrift für das Übersetzungsprotokoll)

3.5 Assembler-Anweisungen

229

Allgemeines Format: S

TITLE

'z,

zm'

Wirkungsweise: Die TITLE-Anweisung bewirkt, daß die Zeichen Zj als Kopfzeile auf jedes Blatt des Übersetzungsprotokolls gedruckt werden. Wird für S ein Name eingetragen und wird das Programm auf Lochkarten ausgegeben, so wird dieser Name in die Lochspalten 73 bis 76 aller Karten gestanzt.

Programmiert in weis: Für S kann ein Name aus 1 bis 4 Zeichen (Buchstaben, Ziffern) eingesetzt werden und für z ; bis zu m = 100 druckbare Zeichen oder blanks.

Anweisung: PRINT

(print optional data; Modifikation des Protokollumfangs)

Allgemeines Format: PRINT

O p e r a n d i , Operand2, Operand3

1 bis 3 der nachfolgenden Operanden können in der Anweisung benutzt werden: 0N, 0 F F , GEN, N0GEN, DATA, N0DATA.

Wirkungshinweise: 0N 0FF GEN N0GEN DATA N0DATA

-

Es soll ein Umwandlungsprotokoll gedruckt werden. Es soll kein Umwandlungsprotokoll gedruckt werden. Alle Maschinenbefehle, die aus einem Makroaufruf erzeugt werden, sollen gedruckt werden. — Es soll nur der Makroaufruf, nicht aber die aus ihm erzeugten Maschinenbefehle gedruckt werden. Die Konstanten werden in der vollen Lange, in der sie abgesetzt worden sind, in sedezimaler Schreibweise ausgegeben. Höchstens die ersten 8 Bytes der Konstanten werden in sedezimaler Schreibweise ausgegeben.

230

3. Die P r o g r a m m i e r s p r a c h e A S S E M B L E R

Programmierfiinweis: Es können beliebig viele PRINT-Anweisungen in einem Programm gegeben werden. Jede dieser Anweisungen setzt die vorangehende außer Kraft. Wird keine PRINT-Anweisung gegeben, so gilt: PRINT

0N,N0DATA,GEN

Codierungsbeispiel zum Komplex TITLE,PRINT: TITLE 'BUCHUNGEN' PR0GR70 START 216 PRINT 0N,N0DATA,N0GEN

3.6 Elementare Makroprogrammierung Zur Verminderung des Codieraufwandes ist es zweckmäßig, häufig wiederkehrende Instruktionsfolgen in die Form von Makros zu bringen und diese bei der Codierung anstelle der Instruktionsfolge zu verwenden. Zu diesem Zweck müssen die Instruktionsfolgen zunächst als Makros definiert werden. Die Makrodefinition kann in dem Programm erfolgen, in dem das betreffende Makro verwendet werden soll, oder aber völlig unabhängig von diesem Programm. Im letzteren Fall werden die Makros in eine Makrobibliothek gebracht, wo sie von jedem Programm aus abgerufen werden können. Der Abruf der Makros geschieht mit Hilfe von Makroaufrufen, deren Gestalt durch die Makrodefinition festgelegt wird. Wird bei der Umwandlung des ASSEMBLER-Programms eine Instruktion entdeckt, die nicht Maschinenbefehl und nicht Assembleranweisung ist, so wird sie als Makroaufruf interpretiert. Der Assembler verzweigt daraufhin in den Makroumwandler, der ein Bestandteil dieses Übersetzungsprogramms ist. Der Makroumwandler prüft zunächst, ob es zu dem Makroaufruf im Programm oder in der Makrobibliothek eine entsprechende Makrodefinition gibt und veranlaßt gegebenenfalls die Ausgabe einer Fehlermeldung im Übersetzungsprotokoll. Im Erfolgsfall bewirkt der Makroumwandler, daß an der Stelle des Makroaufrufs im Quellenprogramm die Instruktionsfolge aus der Makrodefinition eingesetzt wird. Diese Instruktionsfolge wird in ASSEMBLER-Code abgesetzt. Der Vorgang der Makroumwandlung liegt also zeitlich vor der eigentlichen Übersetzung des ASSEMBLER-Programms in ein Objektprogramm.

3.6 Elementare Makroprogrammierung

231

3.6.1 Die Definition von Makros Bei der Makrodefinition geht es im wesentlichen um folgende vier Probleme: (1) (2) (3) (4)

Aufstellung der gewünschten Instruktionsfolge, Definition eines Makroaufrufs, Steuerung des Assembler in Bezug auf die Makrodefinition, Einfügen der Makrodefinition in das Quellenprogramm oder in die Makrobibliothek.

3.6.1.1 Die Aufstellung der Instruktionsfolge Als Instruktionen kommen Maschinenbefehle, Assembleranweisungen und auch Makroaufrufe in Betracht. Diese können entweder in der gewöhnlichen Codierweise mit fest definierten Instruktionsadressen, Operandenadressen, Distanzadressen, Operandenregistern, Basisregistern, Indexregistern und Längenschlüsseln geschrieben werden oder aber in einer speziellen Makrocodierweise, die diese Instruktionselemente als Variablen (formale Parameter) einsetzt. Die Variablen sind dabei durch vorangestellte „&"-Zeichen zu markieren. Beispiel: &ADR

&F1 K0NST

BALR &B1,0 USING «,&B1,&B2

Μ VC

&F1+1 (2),K0NST

Β DS DC

«+10 CL3 X'OOOC'

3.6.1.2 Die Definition des Makroaufrufs (Musteranweisung) Die Definition des Makroaufrufs geschieht mit Hilfe der sogenannten Musteranweisung. Sie besteht aus einem 1 bis 5 Zeichen langen Namen und einer Liste der bei der Instruktionsfolge des Makro verwendeten Variablen (formale Parameter). Die Organisation der Parameterliste geschieht entweder nach einem Positionsformat oder nach einem freien sogenannten Schlüsselwortformat oder schließlich, unter Kombination beider Prinzipien, nach einem sogenannten Mischformat. Dementsprechend spricht man auch von Stellungsmakros, Schlüsselwortmakros und Mischform-Makros. a) Stellungsmakros Bei Stellungsmakros werden die f o r m a l e n P a r a m e t e r in der Musteranweisung unmittelbar in einer Liste zusammengestellt u n d die einzelnen Parameter werden durch K o m m a s g e t r e n n t . Die Reihenfolge ist zwar beliebig, m u ß aber

232

3. Die Programmiersprache A S S K M B L K R

später beim Makroaufruf eingehalten werden; denn die Zuordnung der aktuellen Parameter des Makroaufrufs zu den formalen Parametern der Musteranweisung geschieht positionsweise. Beispiel einer Musteranweisung: &ADR

INIT

&B1,&B2,&F1

b) Scldiisselwortmakros Bei Schlüsselwortmakros werden die formalen Parameter in der Musteranweisung mit Hilfe von Schlüsselworten dargestellt. Schlüsselworte sind Symbole aus bis zu 7 + 2 Zeichen und haben die Form &Schlüsselwort= Die Reihenfolge der Schlüsselworte ist bei der Musteranweisung, vor allem aber auch beim Makroaufruf beliebig, da die Zuordnung der aktuellen Parameter zu den formalen Parametern hier allein über die Schlüsselworte erfolgt. Beispiel einer Musteranweisung: &ADR

INIT

&B1=,&B2=,&F1 =

c) Μischform-Makros 1 8 Bei den Mischform-Makros werden die formalen Parameter in der Musteranweisung teils nach dem Stellenprinzip und teils nach dem Schlüsselwortprinzip dargestellt. Wichtig ist dabei jedoch, daß zuerst alle Stellenparameter aufgeführt werden müssen, bevor die Schlüsselworte dargestellt werden können. Im übrigen gelten für die Reihenfolge im Makroaufruf die zuvor unter a) und b) genannten Regeln. Beispiel einei Musteranweisung: &ADR

INIT

&B1,&B2=&F1 =

Wie aus den vorangegangenen Beispielen ersichtlich ist, kann in allen 3 Fällen auch im Namensfeld ein formaler Parameter angegeben werden. Sinnvollerweise wird man ihn zur symbolischen Adressierung der ersten Instruktion des Makro benutzen.

3.6.1.3 Steuerung des Assembler Um den Assembler zu veranlassen, die Makrodefinition als solche zu interpretieren und ihn von dem Versuch abzuhalten, sie zu übersetzen, wird jede Makrodefinition in die Assembleranweisungen MACR0 und MEND eingeschlos18

M i s c h f o r m m a k r o s sind nicht bei allen A s s e m b l e r - V e r s i o n e n zulässig.

3.6 Elementare

Makroprogrammierung

233

s e n . Diese A n w e i s u n g e n b e w i r k e n , d a ß die M a k r o d e f i n i t i o n in e i n e n b e s o n d e r e n S p e i c h e r b e r e i c h ü b e r t r a g e n w i r d , w o sie d e m M a k r o u m w a n d l e r s p ä t e r z u r A u f b e r e i t u n g m i t a k t u e l l e n P a r a m e t e r n u n d z u r E i n f ü g u n g in das Q u e l l e n p r o g r a m m z u r V e r f ü g u n g s t e h t . Mit diesen A s s e m b l e r a n w e i s u n g e n u n d d e r z u v o r b e s p r o c h e n e n M u s t e r a n w e i s u n g l a u t e t die v o l l s t ä n d i g e M a k r o d e f i n i t i o n des Beispiels n u n m e h r wie f o l g t ( h i e r als M i s c h f o r m - M a k r o ) :

&ADR &ADR

&F1 K0NST

MACRO IN IT BALR USING Μ VC Β DS DC MEND

&B1 ,&B2=,&F 1 = &B1,0 \&B1,&B2 &F1+1 (2),K0NST *+10

CL3 X'OOOC'

3.6.1.4 Das Eintragen der Makrodefinitionen Das Einfügen der Makrodefinitionen in das Quellenprogramm geschieht durch die Placierung vor dem ersten Aufruf dieses Makros, z.B. vor der START-Anweisung. Beispiel: TITLE 'BUCHUNGEN' PRINT 0N,N0DATA,GEN MACR0

MEND MACR0

PR0GR7O

MEND S T A R T 216

Das Einfügen der Makrodefinition in eine Makrobibliothek geschieht mit Hilfe von Dienstprogrammen, die von den Herstellern als Bestandteil der Betriebssysteme zur Verfügung gestellt werden.

234

3. Die Programmiersprache ASSEMBLER

Beispiel fur S i e m e n s 4 0 0 4 : Dienstprogramm MAI NT Beispiel eines Monitorlaufs für Μ Al NT: / / JOB // ASSGN SYS005,A1 // OPTION PARAM // EXEC MAINT // CATALM x x x x x 1 9 //

END

//

MEND MACRO

MEND

/* 3.6.2 Der Aufruf von Makros Das A n s p r e c h e n eines M a k r o geschieht d u r c h E i n s a t z des e n t s p r e c h e n d e n M a k r o a u f r u f s ( a k t u a l i s i e r t e M u s t e r a n w e i s u n g ) an der o d e r d e n Stellen des A S S E M B L E R - P r o g r a m m s , an d e n e n die I n s t r u k t i o n s f o l g e des M a k r o abgesetzt w e r d e n soll. Die f o r m a l e n P a r a m e t e r in der M u s t e r a n w e i s u n g müssen d a b e i d u r c h a k t u e l l e ersetzt w e r d e n . Beispiel ( M i s c h f o r m - M a k r o ) : START

BEGIN

INIT

8,B2=9,F1=FELD

CLC

FE L D . Z A H L

D a r a u s m a c h t der M a k r o u m w a n d l e r g e m ä ß d e r M a k r o d e f i n i t i o n von Seite 2 3 3 : START

' ' Dir 5 /.nrlirn ilr·. Nhinirns ilrr Miislrrunwoisunn.

235

3.7 Systemmakios

BEGIN BEGIN

FELD K0NST

IN IT BALR USING MVC Β DS DC CLC

8,B2=9,F1=FELD 8,0 \8,9 FELD+1 (2),KONST *+10

CL3 X'OOOC' FELD,ZAHL

3.7 Systemmakros Systemmakros sind Makrodefinitionen, die durch die Hersteller in der Makrobibliothek zur Verfügung gestellt werden. Der Aufruf dieser Makros geschieht dadurch, daß man an geeigneten Stellen des Quellenprogramms die vom Hersteller vorgesehenen, mit aktuellen Parametern versorgten Musteranweisungen einsetzt. Systemmakros dienen der Eingabe-/Ausgabe-Steuerung, der Dateidefinition, der Monitor- (bzw. Supervisor-)Steuerung, der Monitor- (bzw. Supervisor-)Umwandlung und der job-control-Umwandlung. Für die Zwecke der vorliegenden Einführung in die ASSEMBLER-Programmierung kann der Umfang der Betrachtungen auf einige wichtige Systemmakros aus dem Bereich der Eingabe-/Ausgabe-Steuerung der Dateidefinition und der Monitor- (bzw. Supervisor-)Steuerung beschränkt werden. Die Systemmakros variieren geringfügig von Hersteller zu Hersteller und von Betriebssystem zu Betriebssystem. Aus diesem Grunde sollen die Systemmakros hier nur exemplarisch für einen Hersteller und für das bei mittelgroßen kommerziellen Rechenanlagen am häufigsten installierte Plattenbetriebssystem dargestellt werden. Aufgrund dieser Ausführungen müßte es möglich sein, unter Benutzung der einschlägigen Handbücher auch die Systemmakros anderer Hersteller und Betriebssysteme richtig zu benutzen, zumal die Unterschiede im wesentlichen nur in der Anzahl und in der Namensgebung der in die Musteranweisung einzusetzenden aktuellen Parameter bestehen.

3.7.1 Systemmakros zur Definition von Dateien Für jede Eingabe- oder Ausgabedatei, die mit den nachfolgend unter 3.7.2 beschriebenen Systemmakros angesprochen werden soll, müssen mit Hilfe eines beschreibenden Systemmakro die Verarbeitungsform, bestimmte Dimensionen und einige symbolische Adressen definiert werden. Bei Dateien lassen sich in Abhängigkeit vom Datenträger und dem damit vorgegebenen I/0-Gerät zwei Grundformen unterscheiden, serielle Dateien und

3. Die Programmiersprache A S S I M B U i R

236

gestreute Dateien. Serielle Dateien sind dadurch gekennzeichnet, daß ein bestimmter Datensatz nur nach Abarbeitung der davor angeordneten Sätze erreicht werden kann. Bei den gestreuten Dateien läßt sich jeder Datensatz direkt erreichen. Kartenstapel, Magnetbanddateien und Druckerlisten sind serielle Dateien; Platten-, Trommel- und Magnetkarten-Dateien sind gestreute Dateien. Von der Dateiform zu unterscheiden ist die Verarbeitungsform der Dateien; zwar lassen sich serielle Dateien nur seriell verarbeiten, d . h . ein Satz wird nach dem anderen gelesen oder geschrieben, jedoch gibt es bei den gestreuten Dateien eine ganze Reihe von Verarbeitungsformen, von denen hier die serielle und die wahlweise (gestreute) erwähnt werden sollen; d . h . gestreute Dateien können Satz für Satz oder aber mit direktem Zugriff zu jedem beliebigen Satz verarbeitet werden. Um den Umfang dieser einfuhrenden Darstellung in Grenzen zu halten, sollen hier nur diese beiden, allerdings auch am häufigsten vorkommenden, Verarbeitungsformen behandelt werden. Die entsprechenden Systemmakros zur Definition derartiger Dateiverarbeitungen haben die Musteranweisungen DTFSR (define the file of serial type device) und DTFDA (define the file of direct access type device). Die Formate dieser Musteranweisungen lauten: Dateiname DTFSR Schlüsselwortl=Param., SchIüsselwort2=Param., . . . Dateiname DTFDA Schlüsselwortl=Param., Schlüsselwort2=Param., . . . Diese Makroaufrufe müssen vor dem ersten Maschinenbefehl des Quellenprogramms eingesetzt werden. Jede Datei, die im Quellenprogramm benutzt wird, bedarf der Definition durch einen solchen Makroaufruf. Sind alle Dateien auf diese Weise erklärt, so m u ß dem Makroumwandler das Ende dieser Definitionen durch die Anweisung DTFEN angezeigt werden. Im folgenden sollen Beispiele für die Definition von Kartenstapeln, Druckerlisten, Banddateien und Plattendateien vorgestellt und erläutert werden.

«

«

DEFINITIONEN DES EAS (I0CS)

KARTE

20

DTFSR

30

BLKSIΖ E = 80, DEVADDR=SYSRDR , DEVICE=READER , E0FADDR=ENUL , I0AREA1 = EBER 1 , I(JAREA2=EBLR2 , RECF0RM=FIXUNB, TYPEFLE=INPUT, W0RKA=YES

Κ AS: tingabc-/'Ausgabesystem 10CS: j n p u t o u t p u t c o n t r o l system

Spalte

237

3.7 S y s t e m m j k r o s SP

*

LISTE

DTFSR

to

BLKSIZE=132 , C0NTR0L=YES , DEVADDR= S Y S L S T , DEVICE=PRINTER , I 0 A R E A 1 = DRBER 1 , I0AREA2= 0RBER2 , PRINT0V=YES , R E C F 0 R M = F I XIINB , TYPEFLE=0UTPUT, W0RKA = Y E S

*

EBAND

DTFSR

*

PLATTE

BL KS I Z E = 8 0 0 , DEVADDR=SYS001 , DEVICE = TAPE , E(JFADOR = E N D T A P E , FILABL=STD , 10A R Ε A 1 = Ε Β Ε R1 , I0AREA2=EBER2 , RECF0RM=FIXBL Κ , R E C S I Z E = 80 , TYPEFLE=INPUT , W0RKA=YES

DTFDA

BLKSIZE=274, D E V I C E = D I SC , ERRBYTE = FEHLER , I0AREA1 = PBER, READID = YES , RECF0RM=FIXUNB , SEEKADR=SPURADRF, TYPEFLE=INPUT , WRITEID=YES

DTFEN

Die einzelnen Parameter bedeuten: KARTE. LISTE, EBAND, PLATTE Beliebige Namen fur die einzelnen Dateien. Unter diesen Namen werden die Dateien mit Hilfe der Ein- und Ausgabemakros angesprochen. BLKSIZE=m Länge des zu übertragenden Blocks in Bytes. Ein Block ist die Bytekette, die mit einem Übertragungsvorgang aus dem Arbeitsspeicher auf einem Schreibgerät (ζ. B. Schnelldrucker) oder auf einen peripheren Speicher (ζ. B. Band) ausgegeben bzw. von einem Lesegerät (ζ. B. Kartenleser) oder einem peripheren Speicher in den Arbeitsspeicher eingegeben wird. Ein Block kann aus einem oder mehreren logischen Sätzen bestehen. C0NTR0L=YES Dieser Parameter wiid benötigt, wenn im Quellenprogramm der Makroaufruf CNTRL zur Steuerung peripherer Geräte benutzt werden soll. Mit Hilfe dieses Makro lassen sich Funktionen wie ζ. B. Zeilenvorschub beim Schnelldrucker

238

3. Die Programmiersprache ASSEMBLER

oder Rückspulen bei Magnetbandeinheiten steuern. Der Parameter C0NTR0L=YES bewirkt die Bereitstellung der erforderlichen Maschineninstruktionen für die betreffenden Dateien (d.h. für das betreffende Gerät). DEVADDR=SYSxxx Symbolischer Gerätename im Betriebssystem. Diesem Namen wird die betreffende Datei zugeordnet. DEVICE=Name Fixierter physikalischer Gerätename im Betriebssystem, der das Gerät selbst bezeichnet. Zum Beispiel muß für „Name" READER, PRINTER, TAPE oder DISC eingetragen werden, wenn es sich um einen Kartenleser, einen Schnelldrucker, eine Bandeinheit oder um eine Platteneinheit handelt. E0FADDR=Symbol Symbolische Adresse eines vom Programmierer zu schreibenden Programmstücks, in das automatisch verzweigt wird, sobald bei einer Eingabedatei das Endkriterium erfüllt ist; ζ. B. die letzte Karte eines Stapels enthält die Zeichen I* in den Spalten 1 und 2. ERRBVTE=Symbol Symbolische Adresse eines 2 Bytes langen Feldes, das der Programmierer zu definieren hat. Dieses Feld nimmt Bedingungs- und Fehleranzeigen auf, die beim Ablauf von Plattenschreib- und Plattenieseroutinen generiert werden. Fl LABL=Attribut Dieser Parameter wird bei Banddateien benötigt, um die Art der Etikette anzuzeigen. Folgende fixierte Attribute sind möglich: STD bei Standardetikett NSTD bei nicht standardisiertem Etikett N0 bei Bändern ohne Etikett l0AREA1=Symbol Symbolische Adresse eines vom Programmierer zu definierenden Speicherbereichs für Ein- oder Ausgabedaten. Dieser Speicherbereich muß die Länge haben, die bei BLKSIZE angegeben ist. l0AREA2=Symbol Symbolische Adresse eines zweiten vom Programmierer zu definierenden Ein-/Ausgabebereichs. Dieser zweite Bereich, der ebenfalls die bei BLKSIZE angegebene Länge haben muß, ermöglicht zusammen mit dem ersten und einem ebenfalls zu definierenden Arbeitsbereich eine zeitliche Überlagerung von Verarbeitungsoperationen und Ein-/Ausgabeoperationen.

3.7 Systemmakros

239

PRINT0V=YES Dieser Parameter wird benötigt, wenn im Quellenprogramm der Makroaufruf PRT0V zur Steuerung des Formularwechsels beim Schnelldrucker (automatischer Vorschub auf neuen Formularanfang, sobald eine bestimmte Zeilenzahl auf dem alten Formular erreicht ist) benutzt werden soll. Der Parameter PRINT0V=YES bewirkt die Bereitstellung der erforderlichen Instruktionen für die Steuerung des Druckers. READID=YES Dieser Parameter wird benötigt, wenn im Quellenprogramm der Makroaufruf READ Dateiname, ID zur Steuerung einer bestimmten Plattenleseroutine verwendet werden soll. Der Parameter READID=YES bewirkt die Bereitstellung der dafür erforderlichen Instruktionen. RECF0RM=Attribut Dieser Parameter dient der Beschreibung der Satzform und bewirkt die Bereitstellung der adäquaten Verarbeitungsroutinen. Folgende fixierte Attribute sind möglich: FIXUNB bei FIXBLK bei VARUNB bei VARBLK bei UNDEF bei RECSIZE=n

ungeblockten Sätzen fester Länge geblockten Sätzen fester Länge ungeblockten Sätzen variabler Länge geblockten Sätzen variabler Länge beliebigen (Undefinierten) Sätzen

Längenangabe für geblockte und Undefinierte Sätze. Bei geblockten Sätzen gibt η unmittelbar die Satzlänge in Bytes an. Bei Undefinierten Sätzen ist η die Nummer eines Festpunktregisters, in das vor dem Schreiben (Ausgabe) die jeweilige Satzlänge gebracht werden muß und in dem nach dem Lesen (Eingabe) automatisch die jeweilige Satzlänge erscheint. SEEKADR=Symbol Symbolische Adresse eines vom Programmierer zu definierenden 8 Bytes langen Feldes (Spuradreßfeld), in dem vor dem Lesen oder Schreiben eines Plattensatzes die Spuradresse aufgebaut werden muß. TYPE FLE=Attribut Dieser Parameter dient der Erklärung einer Datei als Eingabe- oder Ausgabedatei. Dazu dienen die fixierten Al tribute INPUT und OUTPUT. Bei Plattendateien, die in beiden Richtungen benutzt werden, ist T Y P E F L E = I N P U T anzugeben. W0RKA=YES Dieser Parameter wird benötigt, wenn Sätze vor der Ausgabe oder nach der Eingabe nicht im Ein-/Ausgabebereich, sondern in einem Arbeitsbereich auf-

240

3. Die Programmiersprache ASSEMBLER

gebaut bzw. verarbeitet werden sollen. Dieser Arbeitsbereich muß die bei BLKSIZE angegebene Länge m oder im Falle geblockter Sätze die bei RECSIZE angegebene Länge η haben. Die Benutzung eines Arbeitsbereiches ist die Voraussetzung für eine überlagerte Ein-/Ausgabe (vgl. I0AREA2). Der Parameter W0RKA=YES bewirkt die entsprechende Modifikation der Ein-/Ausgaberoutinen. WRITEID=YES Dieser Parameter wird benötigt, wenn im Quellenprogramm der Makroaufruf WRITE Dateiname, ID zur Steuerung einer bestimmten Piattenschreibroutine verwendet werden soll. Der Parameter WRITEID=YES bewirkt die Bereitstellung der dafür erforderlichen Instruktionen. 3.7.2 Systemmakros zum Öffnen und Schließen von Dateien Makroaufruf: 0ΡΕΝ

(Eröffnen Dateien)

Allgemeines Format: S

0ΡΕΝ

Dateiname 1,

Dateiname 16

Wirkungsweise: Der Makroaufruf 0ΡΕΝ dient zur Aktivierung der Dateien, die in einem Programm benutzt werden sollen. Die wichtigsten Funktionen des Makro sind die Prüfung der Betriebsbereitschaft der betreffenden peripheren Geräte und die Prüfung etwaiger Etikette zur Identifikation der Dateien. Programmierhinweis: Mit einem 0PEN-Aufruf können bis zu 16 Dateien eröffnet werden. Die Dateinamen müssen mit denen aus den Dateidefmitionen übereinstimmen. Codierungsbeispiel: 0ΡΕΝ

KARTE,LISTE,EB AND,PLATTE

Makroaufruf: CL0SE (Schließen Dateien)

3.7 S y s t e m m a k r o s

241

Allgemeines Format: S

CLOSE

Dateinamel

Dateinamel6

Wirkungsweise: Der Makroaufruf CLOSE dient der Deaktivierung der Dateien, die zu Beginn des Programms mit OPEN eröffnet worden sind. Die wichtigsten Funktionen sind die Rückgabe der Kontrolle der betreffenden Geräte an das Betriebssystem und das Schreiben von Nachkennsätzen auf Magnetband- und Plattendateien. Programmieriiinweis: Mit einem CLOSE-Aufruf können bis zu 16 Dateien geschlossen werden. Die Dateinamen müssen mit denen aus den Dateidefinitionen übereinstimmen. Codierungsbeispiel: ENDLIST

CLOSE

LISTE

3.7.3 Makros zum Lesen und Schreiben von Dateien Makroaufruf: GET

(Lesen seriell)

Allgemeine Formate: S S

GET GET

Dateiname Dateiname, Arbeitsbereich

Wirkungsweise: Der Makroaufruf GET bewirkt das serielle Einlesen eines Blocks von einer mit DTFSR definierten Datei. Beim erstgenannten Format wird der Block in dem mit IOAREA1=Symbol angegebenen Ein-/Ausgabebereich bereitgestellt, beim zweitgenannten Format im Arbeitsbereich. Ist mit IOAREA2=Symbol ein zweiter Ein-/Ausgabebereich angegeben worden und wird das zweite Format benutzt, so wird die Verarbeitung der Blöcke von der Eingabe überlagert. Dieser Vorgang läuft wie folgt ab: Beim ersten GET-Aufruf wird ein Block in den ersten Ein-/Ausgabebereich gelesen und der erste (eventuell einzige) Satz des Blocks wird sofort in den Arbeitsbereich übertragen. Während dieser Satz verarbeitet wird und im Falle geblockter Sätze durch weitere GET-Aufrufe weitere Sätze in den Arbeitsbereich gebracht werden, wird selbständig der nächste Block in den zweiten Ein-/Ausgabebereich gelesen. Wenn der einzige Satz oder alle Sätze eines Blocks

242

3. Die Programmiersprache ASSEMBLER

aus d e m ersten Ein-/Ausgabebereich in den Arbeitsbereich gebracht u n d d o r t verarbeitet w o r d e n sind, holt GET den b z w . die nächsten Sätze aus d e m zweiten Ein-/Ausgabebereich, während selbständig ein neuer Block in d e n ersten Bereich gelesen wird usw. Codierungpbeispiele: LIES

GET

KARTE

Eine Lochkarte wird in den Ein-/Ausgabebereich gelesen, der bei der Definition der Datei KARTE mit I0AREA1 =Symbol angegeben w o r d e n ist. Der Inhalt der Lochkarte wird in diesem Bereich verarbeitet. GET

GET

KARTE(KABER

Ein Satz wird aus d e m ( d e n ) bei der Dateidefinition KARTE mit l 0 A R E A 1 = S y m b o l (oder l 0 A R E A 2 = S y m b o l ) angegebenen Ein-/Ausgabebereich(en) in den Arbeitsbereich Κ AB ER übertragen.

Makroaufruf: PUT

(Schreiben seriell)

Allgemeine Formate: S S

PUT PUT

Dateiname Dateiname, Arbeitsbereich

Wirkungsweise: Der M a k r o a u f r u f PUT bewirkt das serielle Schreiben eines Blocks auf eine mit DTFSR definierte Datei. Beim erstgenannten F o r m a t ist der Block in d e m mit l 0 A R E A 1 = S y m b o l angegebenen Ein-/Ausgabebereich a u f z u b a u e n . Beim zweiten F o r m a t sind die Sätze im Arbeitsbereich bereitzustellen, w ä h r e n d die Übertragung in den Ein-/Ausgabebereich, eine eventuelle Blockung in diesem Bereich und die eigentliche Ausgabe selbständig geschieht. Genauso wie bei GET k a n n auch hier eine Überlagerung des S a t z a u f b a u e s u n d der Blockung durch den Schreibvorgang erreicht w e r d e n , indem man einen zweiten Ein-/Ausgabebereich zur Verfügung stellt und den S a t z a u f b a u im Arbeitsbereich vollzieht: Während durch j e d e s PUT ein Satz aus d e m Arbeitsbereich in den einen Ein-/Ausgabebereich übertragen und eventuell d o r t geblockt wird, wird der Inhalt des bereits zuvor gefüllten anderen Ein-/Ausgabebereichs auf das Schreib-

243

3.7 SystL-niniükros

gerät (Band, Schnelldrucker) übertragen. Sobald ein Ein-/Ausgabebereich gefüllt ist. wird automatisch geschrieben, während nunmehr der andere Bereich gefüllt wird usw. Codierungsbeispiele: SCHREIB

PUT

LISTE

Der Inhalt des bei der Definition der Datei LISTE mit l0AREA1=Symbol angegebenen Ein-/Ausgabebereichs wird auf einem Schnelldrucker ausgegeben. SCHREIB

PUT

BAND,ABER

Ein Satz wird aus dem Arbeitsbereich A B E R in den (die) bei der Definition der Datei B A N D mit I 0 A R E A 1 =Symbol (oder l0AREA2=Symbol) angegebenen Ein-/Ausgabebereich(e) übertragen. Sobald ein Ein-/Ausgabebereich gefüllt ist, wird sein Inhalt auf das Magnetband geschrieben.

Makroaufruf: READ

(Lesen gestreut)

Allgemeines Format: S

READ

Dateiname,ID

Wirkungsweise: Der Makroaufruf READ bewirkt das Einlesen eines beliebig wählbaren Satzes aus einer mit DTFDA definierten Datei und stellt ihn in dem mit l0AREA1=Symbol angegebenen Ein-/Ausgabebereich zur Verarbeitung bereit. Program mierhin weis: Die Adresse des Satzes muß vor dem Aufruf des Makro mit Hilfe von Dualzahlen in dem mit SEEKADR=Symbol bezeichneten Spuradreßfeld aufgebaut werden. (Im folgenden Beispiel für eine Magnetplatte vom Typ SIEMENS 564 bei absoluter Adressierung dargestellt). Spuradreßfeld Byte

Inhal!

1

einheit

hereich

3

4

Nr. der Platten-

Zahlen-

:

0-255

Reserv lert fur

5

6

X

7

Zylinder-

Spur-

Sat?

numnier

numnier

nurnmei

Magn e t k a r t e n -

0

1

o :o:

Sämtliche Werte sind als Dualzahlen einzutragen.

0

0> '

0

3. Die Programmiersprache ASSEMBLER

244

Codiemngsbeispiel: LIES

READ

PLATTE,ID

Makroaufruf: WRITE (Schreiben gestreut) Allgemeines Format: S

WRITE

Dateiname,!D

Wirkungsweise: Der Makroaufruf WRITE bewirkt das Schreiben eines Satzes an eine beliebig wählbare Stelle einer mit DTFDA definierten Datei. Programmierhinweise: Der Satz muß vor dem Schreiben in dem mit l0AREA1=Symbol angegebenen Ein-/Ausgabebereich aufgebaut werden. Die Adresse, an die der Satz auf der Datei gebracht werden soll, muß vor dem Aufruf des Makro mit Hilfe von Dualzahlen in dem mit SEEKADR=Symbol bezeichneten Spuradreßfeld aufgebaut werden (vgl. Seite 243). Codierungsbeispiel: WR

WRITE PLATTE,ID

Makroaufruf: WAITF (Warten auf das Ende der Übertragung) Allgemeines Format: S

WAITF

Dateiname

Wirkungsweise: Das Programmsteuerwerk wartet mit der Aosführung weiterer Instruktionen bis der durch die Makros READ oder WRITE ausgelöste Datenübertragui.gsvorgang beendet ist.

3.7 Systemmakros

245

Programmierhinweise: Der Makroaufruf WAITF ist immer dann zu verwenden, wenn der weitere Programmablauf von der im Feld ERRBYTE=Symbol bereitgestellten Anzeige abhängig ist. Diese Anzeige wird aber erst nach Abschluß des Obertragungsvorgangs bereitgestellt. Ferner muß WAITF gegeben werden, wenn die Gefahr besteht, daß die Adresse in dem mit SEEKADR=SymboI angegebenen Spuradreßfeld bereits für den nächsten Übertragungsvorgang aufbereitet wird, bevor der vorangehende Vorgang abgeschlossen ist. Codierungsbeispiel:

READ PLATTE,ID WAITF PLATTE

3.7.4 Makros zur Steuerung peripherer Geräte Die nachfolgenden Ausführungen beschränken sich auf die Beschreibung der Steuerungsmöglichkeiten beim Schnelldrucker, da diese am häufigsten benutzt werden. Die Steuerungsmöglichkeiten für andere periphere Geräte sind den einschlägigen Handbüchern zu entnehmen.

Makroaufrof: CNTRL (Steuern Gerät) Allgemeines Format: S

CNTRL Dateiname,Schlüssel n.m

Wirkungsweise: Der Makroaufruf CNTRL steuert den Zeilen- und Blattvorschub beim Schnelldrucker in Abhängigkeit vom Schlüssel und von den Angaben η und m. Als

246

3. Die Programmiersprache ASSEMBLER

Schlüssel kommen in Betracht SP (Zeilenvorschub) und SK (Blattvorschub). Im einzelnen gilt: SP:

η = Anzahl der vorzuschiebenden Leerzeilen vor dem nächsten Drucken, m = Anzahl der (insgesamt) vorzuschiebenden Zeilen nach dem nächsten Drucken. Wird m spezifiziert, so muß wie folgt codiert werden: CNTRL

SK:

Dateiname,SP„m

η = Nummer des Lochbandkanals am Schnelldrucker, bis zu dessen Lochung vor dem nächsten Drucken vorgeschoben werden soll, m = Nummer des Lochbandkanals am Schnelldrucker, bis zu dessen Lochung nach dem nächsten Drucken vorgeschoben werden soll. Wird m spezifiziert, so gilt auch hier: CNTRL Dateiname,SΚ„m Die Lochungen in den Kanälen des Lochbandes sind so anzubringen, daß damit eine bestimmte Formulareinteilung erreicht bzw. der Formularanfang markiert wird.

Codierungsbeispiele: CNTRL RECHNG,SK,1 Beispielsweise sei in Kanal 1 des Lochbandes der Formularanfang markiert. Werden nun ζ. B. Rechnungen geschrieben, so kann man nach dem Drucken jeder Rechnungsendsumme mit Hilfe des obigen Makroaufrufs auf den Anfang des neuen Rechnungsformulars springen. Die Ausgabedatei auf dem Schnelldrucker ist hierbei im Zuge der DTFSR-Definition mit RECHNG bezeichnet worden. CNTRL

LISTE,SP„3

Das Formular soll nach dem nächsten Drucken um 3 Zeilen (2 Leerzeilen + 1 Zeile für den nächsten Satz) vorgeschoben werden.

Makroaufruf: PRT0V (Vorschub bei Forniularende) Allgemeines Format: S

PRT0V

Dateiname^,S 2

247

3.7 S y s t e m m a k r o s

Wirkungsweise: Das Makro PRT0V prüft, ob die Lochung des mit η bezeichneten Lochbandkanals (n ist stets 9 oder 12), die das Formularende markiert, bereits erreicht oder überschritten ist. Ist dies der Fall, so erfolgt ein Formularvorschub bis zu dem stets in Kanal 1 markierten Anfang des neuen Formulars. Wird nach η noch eine symbolische Adresse S 2 angegeben, so unterbleibt der Vorschub und das Programm verzweigt stattdessen in eine mit S 2 adressierte und vom Programmierer geschriebene Routine, ζ. B. zum Drucken einer Überschriftzeile. C odierungsbeispiel:

SCHREIB

PUT PRT0V

LISTE LISTE,12,NEUBLA

NEUBLA

CNTRL LISTE,SK,1 MVC DRUCKB,HEADLINE PUT LISTE

3.7.5 Das „Ende"-Makro Makroaufrufe: E0J TERM

(end of j o b , IBM) (terminate, Siemens)

Wirkungsweise: Am funktionalen Ende eines jeden Programms wird der Makroaufruf E0J (bzw. TERM) gegeben. Dieser zeigt dem Betriebssystem und dem Operator durch Nachricht über die Konsolschreibmaschine das Ende des job an. Zugleich wird die Kontrolle der Programmsteuerung an das Betriebssystem zurückgegeben. Das bedeutet folgendes: Man kann sich vorstellen, daß alle Programme gleichsam als Unterprogramme deb Betriebssystems ablaufen. Beim Starten verzweigt das Betriebssystem in das betreffende Programm. Durch das Makro E0J (bzw. TERM) wird in das Betriebssystem zurückverzweigt.

4. Übungsprogramme

248

4. Übungsprogramme

Übung 1: Lochkarten, in denen Personalnummern, Namen und Adressen abgelocht sind, sollen unter Erzeugung eines bestimmten Druckbildes aufgelistet werden. Kartenformat:

I

5

6

17

18

29

30

-

51

52

75

Alle Begriffe sind linksbündig gelocht.

Listen format:

Die lfd. Nr. ist durch Zählung der eingelesenen Karten zu ermitteln. Die Personal-Nummern in den Adreßkarten werden ignoriert.

4. (ibunpspropramme

249

4. Übungsprogrammi-

250

PROG01

TITLE START PRINT

' UEBUNG1' 216 ON.DATA.NOGEN

DTFSR

BLKSIZE=132, CONTROL*YES, DEVADDR=SYSLST, DEVICE*PRINTER, I0AREA1=DRBER, PRINTOV*YES, RECFORM=FIXUNB, TYPEFLE=OUTPUT

ι » D E F I N I T I O N E N DES I0CS • KARTE DTFSR BLKSIZE=80, DEVADDR=SYSRDR, DEVICE=READER, EOFADDR=ENDE, I0AREA1-EBER, RECFORM=FIXUNB, TYPEFLE=INPUT •

LISTE

ι DTFEN •

VORPROGRAMM

VP

» •

BALR 7,0 U S I N G · ,7 OPEN KARTE,LISTE HAUPTPROGRAMM

NEUBLATT

NEXT



CNTRL MVC PUT CNTRL MVC GET AP UNPK MVZ MVC MVC MVC MVC PUT MVC PRTOV Β

LISTE,SK.l D R B E R + 1 0 ( 5 8 ) ,HEADDER LISTE LISTE,SP,1 D R B E R ( 8 4 ) .DRBER-l KARTE LFDNR.EINS DRBER+3(3),LFDNR DRBER + 5(1) ,F D R B E R + 8 ( 1 2 ) ,ΝΝΑΜΕ D R B E R + 2 2 ( 1 2 ) .VNAME D R B E R + 3 6 ( 2 2 ) .ORT D R B E R + 6 0 ( 2 4 ) .STRASSE LISTE DRBER(84),DRBER-l LISTE,12,NEUBLATT NEXT

ENDROUTINE

ENDE

CLOSE TERM

« K O N S T A N T E N UND LFDNR EINS F EBER

DC DC DC DS

KARTE,LISTE

BEREICHE X'OOOC' χ • IC' Χ 1 FF' 0CL80

Spalte

251

4. Übungsprogramme

VNAME NNAME f RT STRASSE

ORBER HEADDER

|

DS DS DS DS DS DS DC DS DC DS

DC DS DC DS DC

CL5 CL12 CL12 CL22 CL24 CL5 X ' 40' CL132 C'NAME' CL9 C'VORNAME' C L U C ' 0RT' CL17 C 1STRASSE 1

END

VP

Übung 2: Umgang mit Festpunktregistern: Es soll ein Programm geschrieben werden, welches Registerinhalte bit-weise ausdruckt. Dadurch kann die Umwandlung von Dezimalzahlen in Dualzahlen sichtbar gemacht werden. Als Übung taste man sich zu den Grenzwerten der dualen Festpunktzahlen vor. Die Eingabe der Dezimalzahlen geschieht per Lochkarten in einem freien Format, d . h . die darzustellende Zahl wird in den Spalten 1 bis 16 abgelocht und kann innerhalb dieses Feldes beliebig nach rechts oder links verschoben sein. Die erste Aufgabe ist daher, diese Zahl rechtsbündig anzuordnen. Vorzeichen werden durch Überloch in der niederstwertigen Ziffer dargestellt: negative Zahlen erhalten ein 11er Überloch, positive Zahlen ein 12er oder kein Überloch. Kartenformat: I

16

Ausgabeformat: DEZIMALZAHL l>

xxxxxxxxxxxxxxxx

DUALZAHL 2 5

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

252

4. Übungsprogramme

4. Übungsprogramme

PR0GO2

TITLE START PRINT

253 ' UEBUNG21 216 N0GEN

*

• D E F I N I T I O N E N DES IOCS • KARTE DTFSR B L K S I Z E = 1 6 , DEVADDR=SYSRDR, DEV ICE = R E A D E R , E?FADDR= ENDE, I0AREA1=EBER, RECF0RM=FIXUNB, TYPEFLE=INPUT

*

LISTE

DTFSR



BLKSIZE=>132, DEVADDR=SYSLST, DEVICE=PRINTER, I0AREA1-DRBER, RECFHRM=FIXUNB, TYPEFLE=0UTPUT

DTFEN *

VORPROGRAMM

*

VP

BALR 8,0 U S I N G * ,8 OPEN KARTE,LISTE HAUPTPROGRAMM

LIES CLI

PACK

SCHLANF

EINS SHIFT PUT

ENDE

MVC MVC Β GET CLI BNE MVC MVC MVI Β PACK MVC CVB L LA C BL MVI Β MVI SLL LA BCT PUT MVC Β CL0SE TERM

• K O N S T A N T E N UND

DRBER+8(11) ,=C'DEZIMALZAHL' DRBER+35(8) ,=C'DUALZAHL' PUT KARTE E B E R + 1 5 ,C1 ' PACK ZFELD.EBER EBER+1(15).ZFELD EBER,C'O' CLI DW0RT.EBER D R B E R + 5 ( 1 6 ) ,EBER 5.DW0RT 9 , = F ' 32 ' 10 .DRBER+24 5 ,=F Ό ' EINS 0(10),CO' SHIFT 0(10), C T 5,1 10,1(10) 9,SCHLANF LISTE DRBER ,f)R8ER-l LIES KARTE,LISTE BEREICHE

Spalte

254

4. Übungsprogrammt

EBER ORBER ZFELD DW0RT

DS DC DS DS DS

CL16 X' 40' CL132 CL15 D

END

VP

Übung 3 : Umgang mit der Dezimalarithmetik: Je zwei Zahlen werden von einer Loch karte eingelesen, gepackt und wahlweise nach einer der 4 Grundrechnungsarten verarbeitet. Die Resultate werden entpackt und ausgegeben. Ziel der Übung ist u . a . , die Zahlengrenzen zu erkennen. Man beachte vor allem die Größenbeschränkung für Multiplikatoren und Divisoren auf 8 Bytes! Kartenformat:

1

2

3

18

19

20

21

36

Die Zahlen sind rechtsbündig abzulochen. Negative Vorzeichen müssen, positive können angegeben werden. Ausgabeformat: DRBER+io

(±xx

+ 2 g

+30

+ 3 2

x) LJ - L_J (±xx *

/

+ 5 0

+ s 4

x) LJ = LJ ± Resultat

4. Übungsprogramme

256

4. Übungsprogramnc

4. Übungsprogramme

257

258

PR0GO3

4. Ubungsprogrummc TITLE 1 UEBUNG3' START 2 1 6 PRINT N0GEN

* * DEFINITIONEN DES I 0 C S ι KARTE DTFSR B L K S I Z E » 3 6 , DEVADDR'SYSRDR, DEVICE«READER, E0FADDR>ENDE, I(SAREA1 = EBER, RECFJRM*FIXUNB, TYPEFLE=INPU Τ

Spalte " » · » * · »

*

LISTE

DTFSR B L K S I Z E - 1 3 2 , DEVADDR-SYSLST, DEVICE-PRINTER, I0AREA1>DRBER, RECFiRM«FIXUNB, TYPEFLE=PUTPUT

» » · » »

*

DTFEN * V0RPR0GRAMM *

VP

BALR 9,0 USING * , 9 0ΡΕΝ KARTE.LISTE




• DEFINITIONEN DES

IOCS

*

KARTE

DTFSR

» LISTE

BLKSIZE-36, DEVADDR»SYSRDR, DEVICE=READER, EOFADDR« ENDE, I(JAREA1 = EBER , RECFiRH.FIXUNB, TYPEFLE»INPUT

DTFSR

BLKSIZE*132, DEVAODR«SYSLST, DEVICE»PRINTER. I0AREA1«DRBER , RECFßRM-FIXUNB, TYPEFLE-OUTPUT

» DTFEN >

• VORPROGRAMM VP

BALR 9,0 USING · , 9 OPEN KARTE,LISTE HAUPTPROGRAMM

LIES

CiNVTl

C0NVT2 SELECT

ADD

GET PACK CLI BNE MVN ZAP CVB PACK CLI BNE MVN ZAP CVB CLI BE CLI BE CLI BE CLI BE MVC PUT MVC Β AR MV I CVD ZAP UNPK

KARTE i P l ,EBER+2(16) EBER+l.C'-' C0NVT1 0 P 1 + 1 5 ( 1 ) , = X 1 DD1 DW.OPl 1 , DW 0P2,EBER+20(16) EBER+19 ,C 1 - ' C0NVT2 0 P 2 + 1 5 ( 1 ) ,»X ' DD ' DW.0P2 2 ,DW EBER,C'A' ADD EBER,C'S· SUB EBER,C'M" MULT EBER,C'D' DIV DRBER-f 1 0 ( 2 0 ) , = C 'UNGUELT IGE OPERATION ' LISTE DRBER.DRBER-l LIES 1,2 OPERATOR.C'+' l.DW 0P1.DW DRBER + 5 9 ( 1 6 ) , 0 P l + / ( 9 )

Spalte

4. Übungsprogramme

SUB §

MULT

C0NVERT5 φ DIV

t EDIT

» ENDE

265

MV Ν UNPK MV I MV Ζ CP BNL MV I Β

0P1+7(1) , = X ' FF 1 DRBER+55(4),0Pl+5(3) DRBER+54,C'+' DRBER+74(1) , = X ' F F ' 0P1+15(1) , = Ρ ' 0 ' EDIT DRBER+54,C'-' EDIT

SR MV I 8

1,2 0PERAT0R ,C ' - ' ADD+6

LR MR MVI ZAP C BE CVD ZAP MP MP C BNL AP SLL SRL CVD ZAP AP Β

5,1 4,2 (JPERAT0R ,C ' « ' 0P1 , = Ρ Ό ' 4 ,=F Ό' C0NVERT5 4 ,DW (JP1 ,DH 0P1. = Ρ'65536' 0P1. = Ρ'65536' 5 ,=F ' 0 1 C0NVERT5 (JP1 , = P' 2147483648' 5.1 5,1 5 ,DW 0P2.DW 0P1.0P2 ADD+16

LR SRDA DR MVI CVD ZAP CVD ZAP MVC UNPK MVZ Β

4,1 4,32 4.2 0PERAT0R,C'/ 1 5 ,DW 0P1.DH 4 ,DW 0P2.DW DRBER+76(4),=C'REST' DRBER+81(16), 0P2 DRBER+96(1),=X'FF' ADD+16

MVI MVC PACK UNPK MVC MVC PACK UNPK MVC PUT MVC Β

DRBER + 10 , C 1 ( ' DRBER+11(1).EBER+l PFELD ,EBER+2(16) DRBER + 12(16) .PFELD DRBER + 28(5) .0PERAT0R-2 DRBER+33(1) ,EBER+19 PFELD,EBER + 20(16) DRBER + 34{16) .PFELD DRBER+50(4) , = C ' ) = ' LISTE DRBER.DRBER-l LIES

CL0SE KARTE.LISTE TERM

266

4. Übungsprogramme

• K O N S T A N T E N UND

BEREICHE

ι

EBER ORBER

OW

UPI

0P2 0PERAT0R PFELD

DS OC DS DS DS DS DC DS DC OS

CL80

END

VP

X 1 40' CL132

0

CL16 CL16

C') ' CL1

c- (· CL9

Übung 5: Im Zuge einer Auftragsabwicklung sollen Rechnungen erstellt und geschrieben werden. Die erforderlichen Daten werden ausschließlich per Lochkarten eingegeben. Der Kartenstapel besteht aus zusammensortierten Kunden- und Bestellkarten. Erstere enthalten u.a. die Anschrift der Kunden und letztere das Bestelldatum, die Artikelnummern und die Bestellmengen. Das Tagesdatum und die Artikelpreise werden mit Hilfe von Vorlaufkarten eingegeben. Kartenformate: a) Kundenkarte 56

-

17 18

29 30

51 52

75

80

/ Name

Nr.

Vorname

Ort

Straße

Κ

b) Bestellkarte 13

15-19

Kun-

XXX . XX .X

Artikel-

den-

Bestell-

Nr.

Nr.

datum

21-23

25 - 29

31 - 33

Artikel Menge

Nr.

65 - 69

71 73

ArtikelMenge

Nr.

Menge

80

267

4. Übungsprogramme

c) Datumskarte 14 XX.XX.XX

xxxxx

Tagesdatum

Nr

|

der

zuletzt

mit

diesem

Programm

geschriebenen Rechnung

d) Preiskarte 65

Artikel-

XXX-XX

Artikel-

xxx.xx

Nr.

Preis

Nr.

Preis

-

69

71 - 78

80

268

4. Übungsprogramme

4. Ü b u n g s p r o g r a m m e

Adresse des Unterprogramms „DRUCKEN" nach Reg. 12 laden

Übertragen des Datums aus EBER nach DATUM 1 I Packen der letzten Rechnungsnummer aus E B E R nach R E C H N R

Übertrag :n von „HERRN , F R A U " in den D r u c k b e i eich

Ubertragen d e s Tagesdatums aus DATUM in d e n Druckbereich

/ BA LR 11, 12 V (DRUCKEN)

Übertragen des 1. Buchstabens des V o r n a m e n s in den Druckbereich

Übertragen d. Artikelpreise aus E B E R nach PREISE

Ü b e r t r a g e n von „REGENSBURG, D." in d e n Druckbereich

/ \

B A L R 11, 12 (DRUCKEN)

Übertragen eines P u n k t e s in den Druckbereich

Übertragen des Nachnamens in den Druck bereich

Übertragen der K u n d e n n r in das Zwischenfeld KKNR

Übertragen eines „ J " nach ERSTART

270

4. Ubungsprogramme ARTIKEL

4. Ühungsprogrummc

Multiplizieren Menge m a l Preis in M E N G E ; d . h . Berechnung des Warenwertes L0AD Adresse in Reg. 2 auf n ä c h s t e Artikelnr. im Feld P R E I S E stellen

'Reg. Eins dem ..Null

j

Übertragen einer D r u c k m a s k e in den Druckbereich

I

1 um \ vermin- \ und a u f / φ Q prüfen/

RECHNE Übertragen des Preises aus d e m Feld P R E I S E in d e n Druckbereich

P a c k e n der Bestellmenge aus d e m Eingabebereich nach M E N G E

Übertragen des Preises ( P f e n nigbetrag) nach Z P R E I S

Überlragen des Preises ( M a r k hclrag) nach Ζ PR EI S

Packen d e s Preises a u s Z P R E I S nach PREIS

Aufbereiten des W a r e n wertes zum Drucken

/ B A L R 11, 1 2 \ MDRUCKEN) /

Addieren des Warenwertes auf d a s F e l d SUMME

WE1TER2 Einstellen der A d r e s s e in Reg. 10 a u f d e n nächsten Posten in E B E R

•J

272

4. Übungsprogramme

ENDRECHG 1 Ausführung des Befehles L0AD

Übertragen von „SUMME" in den Druckbereich

Aufbereiten der 11% vom Warenwert zum Drucken

Ausführung des Befehles L0AD

Schließen des Druckers

Aufbereiten der S u m m e des Warenwertes zum Drucken

E0J Übertragen von„T0TAL" in den Druckbereich

Addieren der 11% des Warenwertes auf den Warenwert in SUMME Übertragen v o n „ 1 1 % MWST" in den Druckbereich

Ausführung des Befehles L0AD

ENDE Übertragen eines „ J " nach E0J für letzte Rechnung

Schließen des Kaxtenlesers

DRUCKEN Übertragen der S u m m e des Warenwertes rechtsbündig nach P R ? D

Multiplikation der S u m m e des Warenwertes mit I 1 in PR0D

Division des Inhaltes von P R 0 D durch 100

Aufbereiten des gesamten Rechnungsbetrages zum Drucken

Löschen des Druck bereichs

BR I I Riicksprung aus der Unterroutine

4.

PR0GO5



273

Übungsprogramme

TITLE START PRINT

' UEBUNG5 1 216 0N , N 0 D A T A , N 0 G E N

D E F I N I T I 0 N E N DES

I0CS

*

KARTE

DTFSR

8LKSIZE-80, DEVADDR»SYSRDR, DEVICE»READER , E 0 F A D D R * ENDE , I0AREA1-EBER, RECF0RM=FIXUNB, TYPEFLE»INPUT

t LISTE

DTFSR

BLKSIZE-132, C0NTR0L»YES, DEVADDR=SYSLST, DEVICE=PRINTER, I0AREA1-DR8ER, PRINTiV'YES, RECF0RH-FIXUNB, TYPEFLE»iUTPUT

DTFEN «

V0RPRHGRAMM

*

VP

BALR USING OPEN

8,0

* .8 KARTE,LISTE

*



HAUPTPR0GRAMM

*

LIES

Ρ

A

NEXTRECH

LA GET CLI BNE MVC PACK Β CLI BNE MVC Β CLI BE CLI BNE

12,DRUCKEN KARTE EBER+79 ,C1D1 Ρ DATUM,EBER RECHNR , E B E R + 9 ( 5 ) LIES EBER+79,C'P' A PREISE,EBER LIES EBER+79,C'A' ARTIKEL EBER+79 , C ' K ' LIES

CLI BE MV I CNTRL MVC BALR MVC

ERSTE,C'Ν1 ENDRECHG ERSTE,C'N' LISTE,SK,1 DRBER + 1 0 ( 1 0 ) , = C 1 HERRN . F R A U ' 11,12 DRBER+10(1),VNAME

MV I MVC BALR MVC BALR MVC

D R B E R + 11 , C ' · ' DRBER + 1 2 ( 1 2 ) ,ΝΝΑΜΕ 11 , 1 2 DRBER+10(22).ORT 11,12 DRBER+10(24).STRASSE

Spalte 7a ι *

< t * t

274

4. Übungsprogramme MVC DRBER+39(13) , = C'REGENSBURG,D.1 MVC DRBER+52(8).DATUM BALR 11,12 CNTRL L I S T E , S P , 1 MVC KKNR.AKNR MV I ERSTART, C ' J ' Β LIES

ARTIKEL

WEITER1 C0MP1

C0HP2

RECHNE

L0AD

WEITER2 ENDRECHG

CLC BNE CLI BNE MVC MVC MVC AP MVC ED BALR CNTRL MVC BALR MVC MV I LA CLI BE AP MVC ED MVC MVC L LA CLC BE LA BCT Β MVC PACK MVC MVC PACK MP MVC ED BALR AP LA Β

KKNR.AKNR LIES ERSTART, C ' J ' WEITER1 D R B E R + 1 0 ( 2 0 ) , » C ' I H R E BESTELLUNG V » M ' DRBER+30(8).EBER+5 DRBER+45(12),=C'RECHNUNG NR.' RECHNR = P ' 1 1 DRBER+57(6),=X'402120202020' DRBER+57(6).RECHNR 11.12 LISTE,SP,1 DRBER+11(58).EINTEILG 11,12 PJS.-X'OOOC' ERSTART,C'N' 10 . E B E R + 1 4 0(10),X'40" LIES P0S, = P ' l ' 0RBER+10(4),=X'40202020' 0 R B E R + 1 0 ( 4 ) ,P0S DRBER+18(5),0(10) DRBER+47(3),6(10) 1 ,= F ' 6 1 2,PREISE 0(5,2),0(10) RECHNE 2,13(2) 1.C0MP2 WEITER2 DRBER+54(6) ,6(2) MENGE,6(3,10) ZPREIS(3) ,6(2) ZPREIS+3(2) ,10(2) PREIS,ZPREIS MENGE,PREIS DRBER+60(11), = X'40202020202021204B2020' DRBER + 6 0 ( 1 1 ) .MENGE 11,12 SUMME,MENGE 10,10(10) C0MP1

CNTRL MVC EX ED BALR MVC ZAP MP DP EX

LISTE.SP,1 DR8ER+49(5) , = C'SUMME' O.L0AD DRBER+60(11).SUMME 11.12 ORB E R + 4 9 ( 8 ) , = C ' 1 1 X M W S T ' PR0D(8).SUMME PR0D(8) , = X ' l l C ' PR0D(8) , = X1100C' O.L0AD

4. Übungsprogrammc ED BALR MVC AP EX ED BALR MVC CLI BNE CLOSE TERM

275 DRBER + 60(11) .PR0D+1 11,12 DRBER + 49(5) ,«C'TOTAL' SUMME,PROD O,LOAD D R B E R + 6 0 ( 1 1 ) .SUMME 11,12 SUMME,=PL5'0' EOJ ,C" J ' NEXTRECH LISTE

ENDE

MV I EOJ.C'J' C L O S E KARTE Β ENDRECHG

DRUCKEN

PUT MVC BR

LISTE DRBER.DRBER-L 11

« K O N S T A N T E N UND BEREICHE Ι 0CL80 EBER DS AKNR DS CL5 NNAME DS CL12 OS VNAME CL12 DS ORT CL22 DS STRASSE CL24 DS CL5 DS KKNR CL5 DS ERSTART C DS POS CL2 MENGE ZPREIS PREIS SUMME PR0D E0J DRBER DATUM PREISE RECHNR ERSTE EINTEILG

DS OS DS DC DS OS DS DC DS DS DS DS DS DC DC

CL5 CLS CL3 PL5'0 1 CL6 CL2 C1 Ν 1 X 1 40' CL132 CL8 CL78 CL3 C C'POS. ART.-NR C' WERT'

END

VP

BEZEICHNUNG

MENGE

PREIS

276

4. Übungsprogramme

Übung 6 : Dieselben Adreßkarten, die in Übung 1 verarbeitet wurden, sollen im Arbeitsspeicher sortiert werden, und zwar einmal nach steigenden Personalnummern und einmal alphabetisch nach den ersten 5 Buchstaben der Familiennamen. Die sortierten Karten sollen wie in Übung 1 aufgelistet werden, jedoch hier unter Einbeziehung der Personalnummern in die Schreibpositionen 87 bis 91. Man gehe davon aus, daß mit einem Programmablauf maximal 100 Adreßkarten verarbeitet werden. Das Programm ist nach Möglichkeit unter weitgehender Verwendung intramodularer Unterprogrammtechnik zu entwickeln.

4. Übungsprogramme

277

278

4. Ubungsprogramme

4. Übungsprogramme

279

4. Ubungsprogramme

280

PR0GO6

TITLE START PRINT

1

UEBUNG6' 216 0N , N0DATA , N0GEN

ι • D E F I N I T I O N E N DES

I0CS

*

KARTE

DTFSR

BLKSIZE-80, DEVADDR-SYSRDR, DEV I C E « R E A D E R , EfFADDR»ENDE, I 0 A R E A 1 = EBER , RECF0RM=FIXUNB, TYPEFLE=INPUT

LISTE

DTFSR

BLKSIZE=132, C0NTR*L=YES, DEVICE-PRINTER, DEVADDR=SYSLST, I0AREA1ORBER, PRINT0V-YES, RECFfRM«FIXUNB, TYPEFLE-iUTPUT

DTFEN *



V0RPR0GRAMM

VP

BALR USING OPEN

8,0 * ,8 KARTE,LISTE

«« HAUPTPR0GRAMM

GET

ENDE

LA L L GET MVC LA LA BCT

5.S0RTBER1 6 ,"A(S(IRTBER2) 4,*F'100' KARTE 0 ( 8 0 , 5 ) .EBER 5.80(5) 6,80(6) 4,GET

CLdSE MVC MVC L LA L LR BAL BAL L L LA LR BAL MVC BAL CL0SE TERM

KARTE 0(2,5) , =C1/* ' 0(2,6) . « r / » ' 3,=F101 5.S0RTBER1 6 , = A(S0RTBER2) 4,6 7.SPRT 7,LIST 3 , = F ' 17 ' 5,=A(S0RTBER2) 6.S0RTBER1 4,6 7.S0RT LFDNR , = X'OOOC 1 7,LIST LISTE

Spalte

4. Ubungsprogramme

S0RT

SR MVC LR Β LA LR CLC 8E CLI ΒΕ LA CLC BNL HVC LR Β C BE MVC LA MVC Β

13,13 CiMP.-X-FFFFFFFFFF· 10,5 CLC 10,80(10) 2,3 0(2,10) , = C 1 /·' MßVE 0(10) .Χ"ΛΟLA 2,0(10,2) 0(5,2) ,CiMP LA CiMP ,0(2) 13,10 LA 13 ,»F ' 01 RAUS 0 ( 8 0 , 6 ) ,0(13) 6,80(6) 0(80 ,13) ,-80C" ' S0RT

RAUS

BR

7

LIST

CNTRL MVC CNTRL BAL MVC LA CLC BE AP UNPK MVZ MVC MVC MVC MVC MVC BAL PRTiV Β

LISTE,SK.l D R B E R + 1 0 ( 7 9 ) .HEADDER LISTE,SP,,1 9,DRUCK EBER,0(4) 4,80(4) EBER(2),«C'/·' RAUS LFONR.EINS D R B E R + 3 ( 3 ) .LFDNR D R B E R + 5 ( 1 ) ,F DRBER + 8(12) ,ΝΝΑΜΕ D R B E R + 2 2 ( 1 2 ) .VNAME D R B E R + 3 6 ( 2 2 ) ,0RT D R B E R + 6 0 ( 2 4 ) .STRASSE D R B E R + 8 5 ( 5 ) ,PNR 9,DRUCK LISTE,12,LIST NEXT

PUT MVC BR

LISTE DRBER(132),DRBER-1 9

LA CLC

M0VE

*

NEXT

ι DRUCK



• K O N S T A N T E N UND LFDNR EINS F EBER PNR VNAME NNAME

LT0RG DC DC DC OS DS DS DS

BEREICHE X'OOOC· X-1C" X" FF' 0CL80 CL5 CL12 CL12

4. Übungsprogramme

282 JRT STRASSE DRBER

C0MP

DS DS DS DC DC DC CS DC DS DC DS DC DS DC DS

CL22 CL24 CL5 X 1 40 1 132X1401 C'NAME" CL9 C'VPRNAME' CL11 C'0RT' CL17 C1 S T R A S S E ' CL18 C'PNR' CLS

DS DS DS DS

100CL80 CL2 100CL80 CL2

END

VP

Übung 7: Das Beispiel aus Übung 1 soll unter weitgehender Verwendung der intermodularen Unterprogrammtechnik programmiert werden. Dabei sind selbständige Moduln (1.) für die Definitionen des I0CS einschließlich der 10-Bereiche, (2.) für das Vor- und Hauptprogramm, (3.) für die Konstanten und Bereiche und (4.) für die Druckroutine zu schreiben. Die Bedeutung dieser Aufgabe ist vor allem in der Separierung der Dateierklärungen vom eigentlichen Programm zu sehen, da auf diese Weise eine allgemeine Dateierklärung für alle möglichen Programme erzeugt werden kann. Kartenformat und Listenformat: wie bei Übung 1.

PR0G71

»

TITLE CSECT PRINT EXTRN ENTRY ENTRY ENTRY ENTRY

'UEBUNG7.SEGMENT1 1 0N.N0DATA.N0GEN ENDE KARTE LISTE DRBER EBER

D E F I N I T I O N E N DES

KARTE

DTFSR

I0CS

8LKSIZE=80, DEVADDR=SYSRDR, DEVICE=READER, E0FADDR-ENDE, I ß A R E A l = EBER,

Spalte

283

4 . Übungsprogramme Spalte 72 RECF0RM=FIXUNB, ΤYPEFL E=INPUT ι LISTE

DTFSR

»

BLKSIZE=132, C0NTR0L=YES, DEVADDR=SYSLST, D E V I C E= PR I N T E R , I0AREA1=DRBER , PR I N T 0 V = Y E S , RECF0RM=FIXUNB, TYPEFLE=0UTPUT

DTFEN *

EBER DRBER

»

DS DC DS

CL80 X'40' CL132

END

PR0G72

TITLE START PRINT EXTRN EXTRN EXTRN EXTRN EXTRN EXTRN EXTRN EXTRN ENTRY

' UEBUNG7 .SEGMENT2' 216 0N , N 0 D A T A , N 0 G E N KARTE LISTE EBER DRBER HEADDER LFDNR EINS F ENDE

*

• t

VORPROGRAMM

VP

BALR USING 0ΡΕΝ LM L

7,0 *. 7 KARTE.LISTE 8,13,ADRESS 4 , = V(ORUC KE)

HAU P T P R 0 G R A M M NEUBLATT

NEXT

CNTRL MVC BALR CNTRL GET AP UNPK MV Ζ MVC MVC MVC MVC BALR PRT0V Β

LISTE,SK.l 11(58,8) ,0(9) 6,4 LISTE,SP,1 KARTE 0(2,10),0(1,11) 4(3,8),0(2,10) 6(1,8),0(13) 9(12,8),17(12) 23(12,8),5(12) 37(22,8),29(12) 61(24,8),51(12) 6,4 LISTE,12,NEUBLATT NEXT

284 ADRESS



4. Ubungsprogramme DC DC DC DC DC DC

A(ORBER-l) A(HEADDER) A(LFONR) A(EINS) A(EBER) A(F)

ENDR0UTINE

ENDE

PR0G73

LFDNR EINS F HEADDER

CLiSE TERM

KARTE,LISTE

END

VP

TITLE CSECT PRINT ENTRY ENTRY ENTRY ENTRY DC DC DC DC DS DC DS DC DS DC

1

UEBUNG7.SEGMENT3'

0N.N0DATA.N0GEN LFDNR EINS F HEADDER X'OOOC' X'IC' X'FF 1 C'NAME 1 CL9 C VORNAME' CL11 ORT1 CL17 CSTRASSE'

END

PR0G74

DRUCKE



TITLE CSECT PRINT EXTRN ENTRY BALR USING PUT MVC BR END

'UEBUNG7, UNTERPROGRAMM' 0N.N0DATA.N0GEN LISTE DRUCKE 5,0 · ,5 LISTE 1(132,8).0(8) 6

4. Übungsprogramme

285

Übung 8a: Lochkarten mit statistischen Erhebungsdaten sollen in Blöcken zu je 10 auf ein Magnetband gebracht werden. Kartenformat: 16 17 18 - 20 21 Μ SE W AR AN BE 0H

xxxxx lfd. Nr.

XX .XX XX

L

XXX

XXX

Geburts-

V

Kör-

Kör-

V Μ

datum

G

per-

per-

9

W

größe

gewicht

0

κ L F U

s

9

ν o. 3

£

^c η JC.

— •C a«> ο



06 e ^3

0

X> 3

5

^

J

2

£



t

Μ 3

£

1

Berufe:

Schulbildung:

Einkommensgruppen:

SE AR AN BE 0H

V - Volksschule Μ - Mittelschule φ - Oberschule

0 1 2 3 4 5 6 7 8 9

-

selbständig Arbeiter Angestellter Beamter ohne Beruf

Geschlecht: Μ W

— männlich - weiblich

Weiterbildung: Κ L F U S

Familienstand: L V G W

- ledig — verheiratet - geschieden - verwitwet

Blockformat: I 26 1

26 I - 26 I

— keine - Lehre — Fachschule — Universitätsstudium - sonstige (Sekretärinnenschule, Dolmetscherschule etc.)

26 I

26 I

26 I

-

0 10000 15000 20000 25000 30000 35000 40000 45000 50000

26 1 - 26 I

bis bis bis bis bis bis bis bis bis bis

9999 14999 19999 24999 29999 34999 39999 44999 49999 u.m.

26 1 - 26

4. Übungsprogiamme

286

PR0G8A *

* *

TITLE START PRINT

DEFINITIONEN

KARTE

' U E B U NG8A' 216 0N.N0DATA.N0GEN DES

I?CS

DTFSR

BLKSIZE=26, DEVADDR«SYSRDR, DEVICE=READER, E0FADDR*ENDE, I0AREA1

KPNSTANTEN

UND

BEREICHE

DRBER EBER1 EBER2 WA ALTER JAHR Μ0ΝΑΤ AKLASSE

LT0RG X' 40' DC CL132 DS DS 10CL26 DS 10CL26 CL26 DS CL3 DS CL3 OS CL2 DS OS CL18

C(8MP UEBERSCH

DS DC

CL2 C ' Κ 0 Μ Β I NAT 1 0 N S T A B E L L E

KZEILE1

DC DS DC OS DC DC DC DC DC DC DC DC DC DS DS DC

C'MAENNLICH' CL25 C'WEIBLICH' CL27 C'INSGESAMT' C'LEDIG VERH. C'LEDIG VERH. C 'LEDIG C'BIS C'31 C151 C' 71 C ' 91 CL45 18CL45 4 4 X ' FF '

END

VP

KZEILE2

SUMMEN TAB LAB *

2 1 V g l . Seite 2 8 6 .

ALTER,GESCHLECHT,FAMILIENSTAND'

WITW. WITW.

INSG. INSG.

' '

VERH. GESCH WITW. INSG. 1516 - 2 0 2 1 - 2526 - 3 0 ' 3536 - 4041 - 4546 - 5 0 ' 5556 - 6061 - 6566 - 7 0 ' 7576 - 8081 - 8586 - 9 0 ' 9596 U . M . '

'

i 1

GESCH GESCH

:

296

4. Übungsprogramme

Übung 9: Umgang mit der Gleitpunktarithmetik: Je zwei Zahlen werden von einer Lochkarte eingelesen, in die sedezimale Gleitpunktdarstellung gebracht und nach einer der 4 Grundrechnungsarten in einem Gleitpunktregister verarbeitet. Die Resultate sowie die Ausgangszahlen werden in die normalisierte dezimale Gleitpunktdarstellung umgewandelt und so ausgegeben. Ziel der Übung ist u. a. die Anwendung der Unterprogramme zur Umwandlung von Dezimalzahlen in die und aus der sedezimalen Gleitpunktdarstellung (S. 127 ff.). Kartenformat: 1

2

3

24

25

26

Die Zahlen sind linksbündig, beginnend mit Spalte 3 bzw. Spalte 26 abzulochen. Die Mantissen können an beliebigen Stellen einen Dezimalpunkt haben. Jede Mantisse wird durch ein Ε beendet. Negative Vorzeichen bei Mantissen und Exponenten müssen, positive können angegeben werden. Werden positive Vorzeichen fortgelassen, dann müssen die betreffenden Stellen „blank" gelassen werden. Die Exponenten haben 2 Stellen. Wird nur eine Stelle benutzt, dann ist links ein blank oder eine fiihrende Null erforderlich. Ausgabeformat: DRBER+ 10

+34

+3g

+6]

+65

+

(±0.xx . . . . E±yy) UJ * LJ (±0.xx . . . . E±yy) LJ = LJ ±0.XX . . -E±yy /

297

4. Übungsprogiamme WEITER l j Ubertragen d. Mantisse der 2. Zahl nach F 16

Einlesen einer Datenkarte

Laden d. Adresse der Mantisse der 2. Zahl nach Reg. 2

Laden d. Adresse des Eingabebereichs d. 2. Zahl nach Reg. 8

Vorzeichenindikator V Z 2 d. 2. Zahl vorab auf „ + " setzen

Übertragen gezonter Nullen nach MANT 1

BAL 11, N0RMAL (Normalisieren)

Übertragen d. Vorzeichens d. 2. Zahl nach VZ

/

/ \

BAL 11, CNVTDEGP (Umformen in \ GP-Code)

Speichern d. umgeformten 2. Zahl aus GP-Reg. 0 in 0 P 2

Übertragen d. normalisierten E x p o n e n t e n aus EXP nach EXP 1

Übertragen d. Mantisse der 1. Zahl nach F16

Laden d. Adresse der Mantisse d. 1. Zahl nach Reg. 2 Vorzeichenindikator V Z 2 d. 2. Zahl auf „ - " setzen

Laden d. Adresse des Eingabebereichs d. 1. Zahl nach Reg. 8

Übertragen gezonter Nullen nach MANT 2

Vorzeichenindikator VZ 1 d. 1. Zahl vorab auf „ + " setzen

,—31 / \ \

I /

WEITER 2

/

Übertragen d. Vorzeichens der 1. Zahl nach V Z

B A L 11 N0RMAL (Normalisicren)

Übertragen d. normalisierten E x p o n e n t e n aus EXP nach EX Ρ 2

Vorzcichenindikator VZ 1 der 1. Zahl auf „ - " setzen

BAL 11, / CNVTDEGP \ (Umformen in/ \ GP-Code) t

298

4. Übungsprogramrme

1. Ziffer = 0?

4. Übungsprogramme

299

300

4. Übungsprogrammie

EDIT Übertragen einer Zeichenkette „( 0 . " in den Druckbereich

Übertragen d. PPERAT(JRS und d. Zeichenkette „) (0." i. d. Druckbereich

Übertragen d. Zeichenkette „) = " in den Druckbereich

Übertragen d. Vorzeichens der 1. Zahl in den Druckbereich

Übertragen d. Vorzeichens der 2. Zahl in den Druckbereich

Laden des Resultats aus GP-Reg. 0 nach GP-Reg. 6

Übertragen d. Mantisse der 1. Zahl in den Druckbereich

Übertragen d. Mantisse der 2. Zahl in den Druckbereich

BAL 11 / Ci CNVTGPDE { (Umwandeln in \ Dez.-zahl)

Übertragen eines „ S " in de.i Druckbereich

Übertragen -in-s ,.E" in den Druckbereich

Umwandeln des Exponenten d. Resultats aus Reg. 4 in eine Dezimalzahl

Überschreiben d. Vorzeichens d. Exponenten mit 1111

Übertragen eines „ + " ' n d e n Druckbereich NEG 2 Übertragen eines „ - " in den Druck bereich WEITER 3 Übertragen d. Exponenten der 1. Zahl in den Druckbercich

Überschreiben d. Vorzeichens d. Exponenten mit 1111

Übertragen eines „ + " in den Druckbereich

Übertragen d. Vorzeichens d. Resultats in den Druckbereich

NEG 3 Übertragen eines „ - " in den Druckbercich

Übertragen der Zeichen „ 0 . " in den Druckbercich

WEITER 4 Übertragen d. Exponenten der 2. Zahl in den Druckbercich

Überschreiben d. Vorzeichens d. Exponenten mit I I I !

Übertragen d. Mantisse dos Resultats in den Druck bcTcich

4. Ü b u n g s p r o g r a m m e

301

Übertragen eines ,,Ε" in den Druckbereich DRUCKEN

Übertragen d. Vorzeichens d. E x p o n e n t e n in den D r u c k b e r .

Drucken

E n t p a c k e n des E x p o n e n t e n des Resultats in d e n Druckbereich

Löschen des Druckbereichs

BAL 11, DRUCKEN

BR ) 1 ' (Rticksprung aus der Unterroutine) 1 ι ι I

(uES^·

ENDE Schließen der Dateien

L0J

CNVTDEGP

vgl. S. 129 f.

BR ] 1 (Rückspru ng aus der Unterroutine)

CNVTGPDE

BR 1] (RUcksprung aus der Unterroutine)

4. Übungsprogramme

302

PRIG9

TITLE START PRINT

'UEBUNG9' 216 N0GEN Spalte

• DEFINITIONEN OES I0CS KARTE

DTFSR

BLKSIZE-80, DEVADDR-SYS9DR, DEVICE-READER , E0FADDR·ENDE, IiAREAl-EBER, RECFPRM-FIXUNB, TYPEFLE»INPUT

LISTE

DTFSR

BLKSIZE-132 , DEVADDR»SYSLST, DEVICE-PRINTER, I0AREA1-ORBER, RECFfRM-FIXUNB, TYPEFLE-PUTPUT

DTFEN •

• VP

V0RPR0GRAMM dALR USING L SPM »PEN

• • HAUPTPRIGRAMM ι LIES GET LA LA LA CLI BNE MV I WEITER2 MVC BAL MVC MVC MVC BAL STD LA LA MV I CLI BNE MV I UEITER1 MVC BAL MVC

22

9.0 •.9 8 ,«F'234881024'

"

8 KARTE.LISTE

KARTE 2.MANT2 8 , EBER + 25 VZ2 ,C ' EBER+24,C'-' WEITER2 VZ2.C'-' MANT2 , · 1 6 X ' F O ' 11.N0RMAL EXP2.EXP F16.MANT2 VZ.VZ2 ll.CNVTDEGP O.0P2 2.MANT1 8,EBER+2 VZl.C'*' EBER+1,C'- 1 WE ITER 1 VZl.C'-· MANT116X'FO' ll.NfRMAL EXP1.EXP

In Reg. 8 wird eine Programm Maske aufgebaut, die die Programmunterbrechung bei O-Mantissen unterdrückt. Mit SPM 8 wird diese Programm-Maske gesetzt.

4. ilbungsprogrunimt.·



§

ADO f SUB §

MULT t OIV §

NfRMAL

CLI1

LAI CL 12 CL 13

LA2 LA3

g SR4

MVC MVC BAL

F16.MANT1 νζ,νζι 11 ,C N V T D E G P

CLI BE CLI BE CLI BE CLI BE MVC BAL Β

EBER,C'A' ADD EBER,C'S' SUB EBER,C'Μ' MULT EBER,C'D' DIV DRBER-fl0(20) , « C ' U N G U E L T I G E 11.DRUCKEN LIES

AD MV I Β

O.0P2 I P E R A T f R , C ' •' EDIT

SD MV I Β

0,»P2 J P E R A T J R ,C 1 - ' EDIT

MD MV I Β

0,»P2 0 P E R A T 0 R ,C '· ' EDIT

DD MV I Β

0 ,0P2 ί P E R A T J R ,C ' / ' EDIT

LR SR CLI BNE A CLI BE CLI BE CLI BNE S LA Β CLI BE LR CLI BE CLI BE MVC LA LA LA CLI BNE Β

6.8 5.5 0(6), C O ' CLI3 5 ,*F' 1' 0(6),C'Ε' SR4 0(6).C ' LA1 0(6) . C O ' C L 12 5,-F'l' 6.1(6) CLU 0(6).C.' LA1 4.5 0(6) ,C' . ' PUNKT 0(6),C ' LA2 0 ( 1 . 2 ) ,0(6) 2,1(2) 5,1(5) 6.1(6) 0(6) ,C'E' CL 13 PACK

SR

4,4

fPERATΙ0Ν'

304

4 . Übungsprogiamrme

PACK

PACK ZAP CVB CLI BE AR EXITN0RM CVD UNPK BR NFGl SR Ρ PUNKT LR Β MV I NULL Β • EDIT MVC HVC MVC MV I CLI 8H MVI Β N*G? MVI WEITER3 MVC MVZ MVC MVC MVC MVI CLI BH MVI Β NEG3 MVI WEITER4 MVC MVZ MVC LDR BAL CVD MVN MVC MVC MVC MVI HVC UNPK BAL •

EXPP , 2 ( 2 , 6 ) DWJRT, EXPP I .DW0RT 1(6) ,C'-· NEG1 4,1 4.DW0RT EXP,DW?RT+6(2) II 4.1 EXITNJRM 4,5 LA3 0(2) ,C'0' LA2 DRBER+10(4) , - C ' ( 0 . DRBER+11(1) ,VZ1 DRBER+14(16 ).MANT1 DRBER+30 , C ' E' EXPU1,X'C9 NEG2 DRBER+31,C' UEITER3 PRPEP+31,1' DRBER+32(2) , EXP1 DRBER+33(1) , - X ' F F ' DRBER+34(8) . P P E R A T » R - 2 D R B E R » 3 9 ( 1 ) ,VZ2 ORBER+42(16 ) .MANT2 DRBER+58,C' E' EXP2+1,X'C9 NEG3 DRBER+59,C' • 1 WEITER4 DRBER+59 , C ' 0 R B E R + 6 0 ( 2 ) , EXP2 DRBER+61(1) , « X ' F F ' DRBER+62(7) . - c · ) -

6,0

11 .CNVTGPDE 4 ,0U DW*7(1) , - X ' FF' DRBER+65(1) ,VZ DRBER+66(2) • • C O . ' DRBER+68(16 , . F 1 6 ORBER+84 ,C ' ORBER+85(1) ,VZE DRBER+86(2) ,0H+6 ( 2 ) 11 .DRUCKEN LIES

KONSTANTEN UND BEREICHE

EBER ORBER MANT2 MANT1 VZ2 EXP2 EXP1

OS OS OS DS OS DS DS DS

CL80 X' 4 0 ' CL132 CL16 CL16 CH CL2 C12

305

4. Übungsprogramme

EXP EX PP »P2 0PERAT0R DW0RT

DS DS DS DC DS DC DS

CL2 CL2 Γ) C') ' CL1 r ( η D

PUT MVC BR

LISTE DRBER.I 11



DRUCKEN •

ENDE

TERM

• UNTERPROGRAMME ZUR U"WAN0LU«r, V0N TEZT'AL NACH SΕΓ1EZ I"AL (GΡ) • UND ZUROCK PTABLE

DC f>C DC

D'lE-75' Ι'1Ε-74' D'1E-73'

nc DC DC IS DS OS DS nc OS oc os DS DS DS

n

'1E74' 0'1E75' X'4710000000000000 π Τ F F 3X'10' CL16 X ' FO' CL9 CL1 CL1 6F

CNVTDEGP

STM

2,7 .RETT27

CNVTGPDE

STM

2,7 .RETT27

END

VP

K9N471 GW DW FW FW7 F16 F9 VΖ VZE RETT27 *

*

Die Übungsbeispiele 1 bis 9 benutzen ausschließlich Karten- und Banddatein. Eine Vorführung der Benutzung von Plattendateien hätte wegen des notwendigen Umfangs den Rahmen dieses Lehrbuchs gesprengt. Eine ausführliche Darstellung dieser Programmiertechnik findet sich jedoch in: Niemeyer, G.: „Ein integriertes Datenverarbeitungs-und Informationssystem". Berlin 1972 [12].

4. Ü b u n g s p r o g r a m m e

306

Zur Durchführung einer selbständigen Programmieriibung wird folgende Aufgabe vorgeschlagen: Übung 10a: Eine Buchhaltung ist auf einer Magnetplatte einzurichten. Übung 10b: Ein Buchungsprogramm für alle möglichen Geschäftsvorfälle ist zu schreiben. Übung 10c: Ein Programm für den Periodenabschluß (Bilanz und G + V-Rechnung) ist zu schreiben. Übung lOd: Ein Programm für das Ausdrucken von Konten ist zu schreiben. Übung 11: Multiplikation von Inzidenzmatrizen mit Zustandsvektoren:

PR0G1O •

TITLE START PRINT

DEFINITIONEN

LISTE

DTFSR

'UEBUNG10' 216 N0GEN DES

IPCS

BLKSIZE=132, CONTROL'YES, DEVADDR=SYSLST, DEVIC£=PRINTER, I0AREA1ORBER, RECF0RM=FIXUNB, TYPEFLE=OUTPUT

DTFEN VORPROGRAMM VP

*

IC

BAL R USING OPEN CNTRl MVC BAL

3,0 *,3 LISTE LISTE,SK.l D R B E R ( 1 2 ) , Ζ VEKTOR 12,PUT

HAUPTPROGRAMM LA SR SR SR SR IC IC SLL

8,8

4.4 5.5 6.6 7,7 4 .VEKTORZ 5 , ΜΑ Τ RI X { 7 ) 6,1

Spalte

4. Ü b u n g s p r o g r a m m e

NR BZ 0 LA NULL BCT STC • AUSDRUCKEN MVC LA LA MVC SCH LA BAL BCT LA MVC LA LA SLL C C BM MVI Β EINS MVI LA LA SLL BCT • BAL CLOSE TERM •

M ( 7 )

8, IC 6, VEKT0RV DRBER(4 ) ,==C' A 7,ZMATRIX 8,8 DRBE R+4(811.0(7 7,8(7) 12,PUT 8,SCH 7,DRBER 0(4,7),«C' V = 7.4(7) 8,8 6,24 6,-F'O' EINS 0(7),C'O' LA 0(7),C'l' 7.1(7) 6.1 8, C 12,PUT LISTE

UNTERPROGRAMM

PUT



4,5 NULL 6 , = F ' 1'

PUT MVI MVC BR

LISTE DRBE R,X'40 1 DRBER+1(131).DRBER 12

K O N S T A N T E N UND BEREICHE

DRBER ZVEKT0R VEKTdRZ VEKT0RV MATRIX

ZMATRIX

DC DC DC DS DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC

C132' ' C'Z = 0 1 0 0 0 0 0 0 ' Β 101000000' C Β'00000000' Β'10000000' Β'01000000 1 Β 1001100001 Β'00000000' Β'00000000' Β'00000000' Β'00000000' C'OOOOOOOO' C'10000000' C'OIOOOOOO' C'OOllOOOO' C'OOOOOOOO' C'OOOOOOOO' C'OOOOOOOO' C'OOOOOOOO'

END

VP

307

308

Dieser P r o g r a m m a b i a u f p l a n b e s c h r e i b t die w i c h t i g s t e n Teile D r u c k r o u t i n e n d a r , sie sind s e l b s t e r k J ä r e n d .

4. (jbungsprogrmme

des P r o g r a m m s ; die ü b r i g e n Teile s l e l l e n

5. Programmierhilfen 5.1 Lochkartenformat im ASSEMBLER

Reicht das Operandenfeld nicht aus, so können mehrere Fortsetzungskarten gelocht werden. Hat eine Karte eine Fortsetzungskarte, so ist dies durch ein beliebiges Zeichen in Spalte 72 der vorangehenden Karte anzuzeigen. Die Operanden werden ab Spalte 16 der Fortsetzungskarte gelocht.

310

5. Programmierhilfen

5.2 Tabelle der Maschineninstruktionen

Op.Code symb.

Instruktion

Typ

Operandenformat explizite

Seite

Übertragungsoperationen im Arbeitsspeicher Übertragen Zeichen

MVC

SS[

Dl ( L j , B j ) , D 2

Übertragen Zeichen bei Langfeldern

MVCL

RR

R

83

Übertragen Direktzeichen

MVI

SI

DjiBi), I2

85

Übertragen rechte Halbbytes (Ziffern)

Μ VN

SS]

D , « . , . B,). D 2 ( B 2 )

86

Übertragen Zeichen um 1 Halbbyte nach links versetzt

MV0

ssa

DI (Li, Bi), D 2 ( L 2 , B 2 )

88

MV Ζ

SS|

D , ( L i , B , ) , D2(B2)

87

t

81

(B 2 )

l> R 2

,

Ü ier ra"er lirke Halbbytes (Zonen)

Laden von Registern, Speichern von Registerinhalten Laden FP-Wort

L

RX

R , , D 2 ( X 2 , B2)

93

Laden Adresse

LA

RX

RI, D 2 ( X 2 , B 2 )

90

Umladen FP-Register komplementiert

LCR

RR

RI, R2

98

Umladen GP-Register lang, mit umgekehrten Vorzeichen

LCDR

RR

RI, R2

-

Umladen GP-Register kurz, mit umgekehrten Vorzeichen

LCER

RR

RI, R2

-

Laden GP-Doppelwort

LD

RX

R , , D 2 ( X 2 ) B2)

110

Umladen GP-Register lang Laden GP-Wort

LDR LE

RR RX

Ri, R2

108

R , , D 2 (X 2 , B 2 )

109

Umladen GP-Register kurz Laden Halbwort

LER LH

RR RX

RI, R2

107

Laden mehrfach FP-Worte

LM

RS

R i , D 2 (X 2 , B J ) R , ; R3, D2(B2)

94 101

Umladen FP-Register negativ

L.NR

RR

RI, R 2

Umladen GP-Register lang, negativ

LNDR

RR

Ri, R2

Umladen GP-Register kurz, negativ

LNER

RR

Rb

Umladen FP-Register positiv

LPR

RR

RI, R2

99 -

-

100

5.2 Tabelle der Maschinenbefehle

311

Instruktion

Op.Code symb.

Typ

Operandenformat explizite

Seite

Umladen GP-Register lang, positiv

LPDR

RR

Rl.

-

Umladen GP-Register kurz, positiv

LPER

RR

R i , K2

Umladen FP-Register

LR

RR

R „ R2

92

Umladen FP-Register mit Test

LTR

RR

R „ R2

93

Umladen GP-Register lang mit Test

LTDR

RR

R „ R2

-

-



Umladen GP-Register kurz mit Test

LTER

RR

Ri, R2

Einfügen Zeichen (Byte)

IC

RX

R1,D2(X2,B2)

96

Einfügen Zeichenkette unter Maskenkontrolle

ICM

RS

R1,M3,D2(B2)

97

Speichern FP-Register in Wort

ST

RX

R , , D 2 (X2jB2)

102

Speichern FP-Register in Byte

STC

RX

R1,D2(X2,B2)

104

Speichern Zeichenkette unter Maskenkontrolle

STCM

RS

Rj.Ma.DjCBj)

105

Speichern GP-Register in Doppelwort

STD

RX

R,,D2(X2,B2)

112

Speichern GP-Register in Wort

STE

RX

R , , D 2 ( X j , B2)

111

Speichern FP-Register in Halbwort

STH

RX

R , , D 2 (X 2 , B 2 )

103

Speichern FP-Register mehrfach in Worte

STM

RS

R,, R3, D2(B2)

106

Codetransformationen Umwandeln dezimal gepackt in dual

CVB

Umwandeln dual in dezimal gepackt Aufbereiten zum Drucken

RX

R , . D 2 ( X 2 , BJ)

125

CVD

RX

R I , D 2 ( X 2 , B2)

126

ED

SSi

DI (Li, B,), D 2 ( B 2 )

118

Aufbereiten zum Drucken und Markieren

EDMK

SS|

D) (Li, B,), D 2 ( B 2 )

-

Packen

PACK

SS a

DI ( L j , B,), D 2 ( L 2 , B 2 )

113

Übersetzen mit Hilfe von Code-Tabellen

TR

SSi

Di (Li, B,), D 2 ( B 2 )

137

Übersetzen und Prüfen mit Hilfe von CodeTabellen

TRT

SS]

D, ( L , , B,), D 2 ( B 2 )

-

312

5. Prograxnmierhilfen

Instruktion

Op.Code symb.

Typ

Operandenformat explizite

Seite

Entpacken

UNPK

SSa

Di ( L I , B , ) , D 2 ( L 2 , B 2 )

116

shift-Operationen in Festpunktregistern Links-shift arithmetisch (ohne bit-Position 31)

SLA

RS

R i , D2 (B2)

141

Links-shift im Doppelregister arithmetisch (ohne bit-Position 31 in R i )

SLDA

RS

RI, D2(B2)

143

Links-shift im Doppelregister logisch (mit bitPosition 31 in R ( )

SLDL

RS

RI, D 2 ( B 2 )

Links-shift logisch (mit bit-Position 3 1 )

SLL

RS

RI, D 2 ( B 2 )

146

Rechts-shift arithmetisch (ohne bit-Position 31)

SRA

RS

RI, Üi (B,_)

140

Rechts-shift im Doppelregister arithmetisch (ohne bit-Position 31 in R j )

SRDA

RS

Ri, D2(B2)

142

Links-shift im Doppelregister logisch (mit bitPosition 31 in R i )

SRDL

RS

RI, D 2 ( B 2 )

Rechts-shift logisch (mit bit-Position 31)

SRL

RS

RI, D 2 ( B 2 )

145

Dezimal arithmetik DI ( L i , B I ) , D 2 ( L 2 , B 2 )

147

DP

ss a ss a

DI ( L i , B O , D 2 ( L 2 , B 2 )

153

MP

SSa

DI ( L i , B i ) , D 2 ( L 2 , B 2 )

150

Subtrahieren gepackt

SP

ss a

DI ( L i , B I ) , D 2 ( L 2 , B 2 )

147

Übertragen gepackt, rechtbündig mit fuhrenden Nullen

ZAP

ss a

D1(L1,B1),D2(L2,B2)

149

Verschieben und Runden gepackt

SRP

ss a

DJ ( L i , B I ) , D 2 ( B 2 ) , I 3

155

Addieren gepackt

AP

Dividieren gepackt Multiplizieren gepackt

Festpunktarithmetik Addieren FP-Wort

A

RX

R,, D 2 ( X 2 , B2)

Addieren FP-Halbwort

AH

RX

RI, D 2 ( X 2 , B2)

160

Addieren FP-Wort logisch

AL

RX

R,, D 2 ( X 2 , B2)

161

Addieren FP-Register logisch

Α LR

RR

Rl, R2

161

158

5.2 Tabelle der Maschinenbefehle

313

Instruktion

Op.Code symb.

Typ

Operandenformat explizite

A d d i e r e n FP-Register

AR

RR

R • R2

157

Dividieren d u r c h FP-Wort

D

RX

R • D 2 ( X 2 , B2)

168

Dividieren d u r c h FP-Register

DR

RR

R • RJ

167

Multiplizieren m i t FP-Wort

Μ

RX

R , D2 (X2, B2)

165

Multiplizieren m i t FP-Halbwort

ΜΗ

RX

R , D 2 ( X 2 , B2)

166

Seite

Multiplizieren mit FP-Register

MR

RR

R . R:

163

S u b t r a h i e r e n FP-Wort

S

RX

R

D 2 ( X 2 , B2)

158

Subtrahieren FP-Halbwort

SH

RX

R

D2 (X2, B2)

160

S u b t r a h i e r e n FP-Wort logisch

SL

RX

R

D2 (X2) B2)

162

S u b t r a h i e r e n FP-Register logisch

SLR

RR

R

R2

162

S u b t r a h i e r e n FP-Register

SR

RR

R

R2

157

Gleitpunk t a r i t h m e t i k Addieren GP-Doppelwort

AD

RX

R

A d d i e r e n GP-Register lang

ADR

RR

R

A d d i e r e n GP-Wort

AE

RX

R

D2 (X2, B2)

172

A d d i e r e n GP-Register kurz

AER

RR

R

R2

170

A d d i e r e n GP-Wort unnormalisiert

AU

RX

R

D 2 (X2, B2)

_

A d d i e r e n GP-Register kurz, unnormalisiert

AUR

RR

R

R2

_

Addieren GP-Doppelwort unnormalisiert

AW

RX

R

D 2 ( X 2 , B2)

_

A d d i e r e n GP-Register lang, unnormalisiert

AWR

RR

R

R2

_

Dividieren d u r c h GP-Doppelwort

DD

RX

R

D 2 ( X 2 , B2)

179

Dividieren d u r c h GP-Register lang

DDR

RR

R

R2

178

Dividieren d u r c h GP-Wort

DE

RX

R

D 2 ( X 2 , B2)

179

Dividieren d u r c h GP-Register k u r z

DER

RR

R

R2

178

Halbieren GP-Register lang

HDR

RR

R

R2

-

Halbieren GP-Rcgistcr kurz

HER

RR

R

R2

D 2 ( X 2 , B2)

172

R2

170

5. Programmierhilfen

314 Op.Code symb.

Typ

Operandenformat explizite

Seite

Multiplizieren mit GP-Doppelwort

MD

RX

RI, D 2 ( X 2 , B 2 )

177

Multiplizieren mit GP-Register lang

MDR

RR

RI. R 2

175

Multiplizieren mit GP-Wort

ME

RX

RI. D 2 ( X 2 , B 2 )

177

Multiplizieren mit GP-Register kurz

MER

RR

RI. R 2

175

Subtrahieren GP-Doppelwort

SD

RX

RI. D 2 ( X 2 , B 2 )

174

Subtrahieren GP-Register lang

SDR

RR

RI. R 2

173

Subtrahieren GP-Wort

SE

RX

RI. D 2 ( X 2 , B 2 )

174

Subtrahieren GP-Register kurz

SER

RR

RI, R 2

173

S"bt»aHer*n GP W-rt unnormalisiert

SU

RX

RI, D 2 ( X 2 , B 2 )

Subtrahieren GP-Register kurz, unnormalisiert

SUR

RR

RI R 2

Subtrahieren GP-Doppelwort unnormalisiert

SW

RX

RI D 2 ( X 2 , B 2 )

Subtrahieren GP-Register lang, unnormalisiert

SWR

RR

RI R 2

Instruktion

-

-

Vergleichsoperationen Vergleichen FP-Register mit FP-Wort

C

RX

RI D 2 ( X 2 , B 2 )

189

Vergleichen GP-Register mit GP-Doppelwort

CD

RX

RI D 2 (X 2 > B 2 )

192

Vergleichen GP-Register lang

CDR

RR

RI R 2

191

Vergleichen GP-Register mit GP-Wort

CE

RX

RI D 2 ( X 2 , B 2 )

192

Vergleichen GF-Register kurz

CER

RR

RI, R 2

191

Vergleichen FP-Register mit FP-Halbwort

CH

RX

RI

Vergleichen Zeichen logisch

CLC

SS,

DL ( L i , B i ) , D j ( B 2 )

180

Vergleichen Zeichen logisch in Langfeldern

CLCL

RR

RI . R 2

182

Vergleichen logisch Direktzeichen

CLI

SI

DL ( B i ) , I 2

184

D 2 (X 2 > B 2 )

190

5.2 Tabelle der Maschinenbefehle

Op.Code symb.

Instruktion

315

Typ

Operandenformat explizite

Seite

1 ,M3,D2(B2)

185

Vergleichen logisch unter Maskenkontrolle

CLM

RS

R

Vergleichen gepackte Dezimalzahlen

CP

ssa

D, ( L , , B,), D 2 ( L 2 , B 2 )

186

Vergleichen FP-Register

CR

RR

Ri R 2

187

Testen Byte mit Maske

TM

SI

Di (B,)> I j

193

Verzweigungsoperationen Verzweigen nach Laden der Rücksprungadresse

BAL

RX

R 1 > D 2 ( X 2 , B2)

199

Verzweigen zu Registeradresse nach Laden der Rücksprungadresse

BALR

RR

R l . R2

200

Verzweigen bedingt

BC

RX

Μ » D 2 (X 2 , Bj)

195

Verzweigen bedingt zu Registeradresse

BCR

RR

Μi.RJ

197

Vermindern Inhalt Register und Verzweigen bei Φ 0

BCT

RX

R , D 2 ( X 2 ) B2)

202

Vermindern Register und Verzweigen bei Φ 0 (Adresse in R 2 )

BCTR

RR

Ri , R 2

203

Verzweigen wenn ( R [ ) nach Erhöhung größer bzw. B 2 )

206

Modifizieren und Ausführer EX des adressierten Befehls

Erweiterter mnemotechnischer Befehlscode für BC unbedingte Verzweigungen Sprung

Β

RX

Ri , D 2 ( X 2 ) Bj)

196

Sprung (Adresse in R 2 )

BR

RR

Ri , R 2

198

Keine Operation

Ν0Ρ

RX

Ri D 2 (X 2 , B 2 )

196

Keine Operation (Adresse in R 2 )

N0PR

RR

Ri R 2

-

Verzweigung nach Vergleichsoperationen Verzweigen bei gleich

BE

RX

Ri D 2 ( X 2 , B 2 )

196

5. Programmierhilfen

316

Instruktion

Op.Code symb.

Typ

Operandenformat explizite

Seite

Veizweigen bei größer

BH

RX

R, ( D 2 (X 2 , B 2 )

196

Verzweigen bei kleiner

BL

RX

R , , D 2 ( X 2 i B2)

196

Verzweigen bei ungleich

BNE

RX

R,, D 2 (X 2 , B 2 )

196

Verzweigen bei kleiner/ gleich

BN Η

RX

R , , D J (X2> B 2 )

196

Verzweigen bei größer/ gleich

BNL

RX

R , , D 2 ( X 2 , B2)

196

Verzweigung nach arithmetischen Operationen Verzweigen bei negativ Verzweigen bei nicht negativ

BM

RX

R,, D 2 (X 2 , B 2 )

-

BN Μ

RX

Ri, D 2 (X 2 , B 2 )

-

Verzweigen bei nicht positiv

BN Ρ

RX

R „ D 2 (X 2 , B 2 )

-

VpTZ">ei"er be< ungHich Null

BN Ζ

RX

Ri, DJ(X 2 , B 2 )

-

Verzweigen bei Überlauf

Β0

RX

R , , D 2 (X 2 , B 2 )

-

Verzweigen bei positiv

BP

RX

R,, D 2 (X 2 i B 2 )

-

Verzweigen bei gleich Null

BZ

RX

R,, D 2 (X 2 i B 2 )

-

Verzweigung nach TM (Testen Maske) Verzweigen bei Einsen und Nullen

BM

RX

R,, D 2 (X 2 , B 2 )

196

Verzweigen bei Einsen

B0

RX

R,, D 2 (X 2 , B 2 )

196

Verzweigen bei Nullen

BZ

RX

R,, D 2 (X 2 > B 2 )

196

Logische Bit-Verknüpfungen and register or register

NR OR

RR

RJ, R 2

207

RR

R



R

2

207

l.

R

2

207

exclusive or register

XR

RR

R

and

Ν

RX

RLDJCX^BI)

209

or

0

RX

R1>D2(X2,B2)

209 209

exclusive or

X

RX

R ^ D ^ X ^ )

and character

NC

SS!

D1(L1,Bi),D2(B2)

211

or character

oc xc

SS!

D1(L1,B1),D2(B2)

211

SS,

D1(LJ,B,),D2(B2)

211

Dl

(Βi), I 2

212

exclusive or character and immediate

NI

SI

or immediate

Ol

SI

D j (Bj), I 2

212

exclusive or immediate

XI

SI

Di (Bj), I 2

212

317

5.3 Tabelle der 2er-Potenzen

5.3 Tabelle der 2er-Potenzen

η

2n

η

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

1 2 4 8 16 32 64 128 256 512 024 048 096 192 384 768 536 072 144 288 576

21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

1 2 4 8 16 32 65 131 262 524 1 048

2" 2 4 8 16 33 67 134 268 536 1 073 2 147 4 294 8 589 17 179 34 359 68 719 137 4 3 8 274 877 5 4 9 755 1 099 511 2 199 0 2 3

097 194 388 777 554 108 217 435 870 741 483 967 934 869 738 476 953 906 813 627 255

152 304 608 216 432 864 728 456 912 824 648 296 592 184 368 736 472 944 888 776 552

318

5. Programmierhilfen

5.4 Umrechnungstabelle sedezimal - dezimal

Μ 0 1 2 3 4 5 6 7 8 9 A Β C D Ε F

Z4 164

Z3

0 536 072 608 144 680 216 752 288 824 360 896 432 968 504 040

0 1 2 3 4 5 6 7 8 9 A Β C D Ε F

65 131 196 262 327 393 458 524 589 655 720 786 851 917 983

Z2

Z2162

0 4 096 8 192 12 288 16 384 20 480 24 576 28 672 32 768 36 864 4 0 960 45 056 49 152 53 248 51 ^44

0 1 2 3 4 5 6 7 8 9 A Β C D ς

61

F

0 256 512 768 024 280 536 792 048 304 560 816 072 328 5«4 840

z 3 · 16 3

440

Zj-16 1 -

1 1 1 1 2 2 2 2 3 3 3 3

Zi

-

Sedezimalziffer

i

-

Sedezimalstelle mit dem Stellenwert 16'

Zl 0 1 2 3 4 5 6 7 8 9 A Β C D F F

Zi · 16* 0 16 32 48 64 80 96 112 128 144 160 176 192 208 22< 240

Zo 0 1 2 3 4 5 6 7 8 9 A Β C D Ε F

Zo-16° 0 1 2 3 4 5 6 7 8 9 10 11 12 13 τ X 15

Dezimalwert

5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)

Halbbytes (sedezimal) 00 01 02 03 04 05 06 07 08 09 OA OB OC OD OE OF

Dezimalwert

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Maschineninstruktionen (symb. Op.Code)

Druckzeichen, Maskenzeichen

Seite

_ -

_ _ SPM BA L R BCTR BCR SSK ISK SVC

-

200 203 197

_ _ -

MVCL CLCL

83 182

5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)

Halbbytes (sedezimal)

10 11 12 13 14 15 16 17 18 19 1A 1B IC 1D IE 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41

Dezimal wert

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

Maschineninstruktionen (symb. Op.Code) LPR LNR LTR LCR NR CLR 0R XR LR CR

Druckzeichen, Maskenzeichen

319

Seite

100 99 93 98 207

Zifferzeichen Startzeichen fur Nullen Endezeichen für Nullen

AR SR MR DR ALR SLR LPDR LNDR LTDR LCDR HDR

-

207 207 92 187 157 157 163 167 161 162

_ -

_ -

_ -

LDR CDR ADR SDR MDR DDR AWR SWR LPER LNER LTER LCER HER

108 191 170 173 175 178 -

-

LER CER AER SER MER DER AUR SUR STH LA

107 191 170 173 175 178

_ -

Leerzeichen (blank)

103 90

320

Halbbytes (sedezimal) 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 £3 54 55 56 57 58 59 5A 5B SC 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74

5. Programmierhilfen

Dezimalwert 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 8S 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

Maschineninstruktionen (symb. Op.Code) STC IC EX BAL BCT BC LH CH AH SH MH CVD CVB ST

Druckzeichen, Maskenzeichen

t

< ( +

1 &

Seite 104 96 206 199 202 195 94 190 160 160 166 -

126 125 102 -

-

Ν CL

182 -

^

X L C A S Μ D AL SL STD

1

$ *

)

Ί -

/

209 209 93 189 158 158 165 168 161 162 112 -

-

LD CD AD SD MD DD AW SW STE

%

> ?

110 192 172 174 177 179 -

111 -

-

5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)

.. ι · · . Halbbytes (sedezimal) 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 91· AO Al A2 A3 A4 A5 A6 A7

MaschinenDezima|wert

117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167

instruktionen (symb 0 p Code)

321

_ . . . D™^ze'Chen Maskenzeichen -

LE CE AE SE ME DE AÜ SU SSM

109 192 172 174 177 179

# @

-

LPSW

-

WRD RDD BXH BXLE SRL SLL SRA SLA SRDL SLDL SRDA SLDA STM TM MVI TS NI CL1 01 XI LM

-

-

-

205 205 145 146 140 141 -

-

142 143 106 193 85

_

212 184 212 212 101 -

SI0 ΤΙ0 ΗΙ0 TCH

-

-

-

-

5. Programmierhilfen

322

Halbbytes (sedezimal)

Dezimalwert

A8 A9 AA AB AC AD AE AF BO B1 B2 B3 B4 BS B6 B7 B8 3? BA BB BC BD BE BF CO C1 C2 C3 C4 CS C6 C7 C8 C9 CA CB CC CD CE CF DO Dl D2 D3 D4 D5 D6 D7 D8 D9 DA

168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 1Γ5 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218

Maschineninstruktionen (symb. Op.Code)

Druckzeichen, Maskenzeichen

Seite

-



— —

— —



CLM STCM ICM

185 105 97 A Β C D Ε F G Η I



— — —

— — —





MVN MVC MVZ NC CLC , und ; dem Displacement 5 ergibt, in das Register AX.

(7) Stack (Relativ zum Inhalt des BP-Registers) Daten im Stack lassen sich erreichen, indem man relativ zum BP-Register adressiert. Beispiel: MOV AX, [BP + 6]

; Lade den Inhalt der Stack-Adresse + 6 ; in das Register AX.

6 . 7 Beispiel

335

Zu allen Speicher- und Stack-Adressen werden intern noch die Adressen in den entsprechenden Segmentregistern addiert.

6.7 Beispiel Aufgabe: Einlesen und Aufsummieren einer Reihe von Zahlen. Abbruch und Ausgabe der Summe, wenn Eingabe = 0. 8086/ASSEMBLER T I T L E ADDITIONS - ROUTINE. PUBLIC S T A R T Das Symbol wird exportiert. EXTRN GET:NEAR Die Unterprogramme GET und PUT E X T R N PUTrNEAR werden importiert. N U L L EQU 0 Konstantendefinition. SEGMENT DATA Datenbereich. ASSUME DS:DATA Segmentregister DS enthält die Startadresse des Datenbereichs. SUMME DWO Define Word SUMME. Anfangswert 0. DATA Ende des Datensegments. ENDS CODE Programmbereich. SEGMENT Segmentregister CS enthält die ASSUME CS:CODE Startadresse des Programmcode. S T A R T PROC NEAR Prozedur Start NEAR: Zwei-Byte Adresse FAR: Vier-Byte Adresse READ: Eingabewert in Register AX. CALL GET CMP A X , N U L L Vergleiche AX mit NULL. JE ENDE Bei Gleichheit springe nach ENDE. ADD SUMME, A X Addiere den Wert von AX zur Variablen SUMME. JMP READ Springe zur Marke READ. ENDE: MOV A X , SUMME Lade SUMME in das Register AX. C A L L PUT Aufruf der externen Ausgaberoutine PUT. S T A R T ENDP Ende der Prozedur Start. CODE ENDS Ende des Programmsegments. END S T A R T Ende der Quelldatei mit Start als Einsprungpunkt.

336

6. Einführung in den 8086/Assembler

Zum Vergleich dasselbe Problem in 360/ASSEMBLER START

LIES

ENDE

SUMME NULL ZAHL PZAHL DRBER

MVC GET PACK CP BE AP Β UNPK MVZ PUT EOJ DS DC DS DS DS END

SUMME, NULL KARTE, ZAHL PZAHL, ZAHL PZAHL, NULL ENDE SUMME, PZAHL LIES DRBER, SUMME D R B E R + 6 0 ),=X'FF' LISTE CL4 PL4O' CL3 CL2 CL7

Literaturverzeichnis Alletsee, R., H. Jung und G.Umhauer: Assembler I, II und III. 4. Aufl., Berlin—Heidelberg—New York 1979. 1988. Dworatschek, S.: Grundlagen der Datenverarbeitung. 8. Aufl., Berlin-New York 1989. Germain, C. B.: Das Programmier-Handbuch der IBM-DV-Systeme. 8. Aufl., München 1983. IBM-Handbuch der EDV-Organisation. IBM Schule für Datenverarbeitung: Programmieren in der IBM/360 Assembler-Sprache. ASS-PU, Text 1 - 4 , 2 . Aufl., Sindelfingen 1970. IBM System/370: Die Assemblersprache. 1981. IBM System/360: Datenorganisation auf Speichereinheiten mit direktem Zugriff. DASD-Handbuch. IBM System/360: Maschinenlogik und Aufbau der Instruktionen. 1966. IBM System/370: Principles of Operation. 1975. IBM System/370: OSNS-DOS/VS-VM/370 Assembler Language. 1975. IBM System 3704 and 3705: Communication Controllers, Assembler Language. 1979. Niemeyer, G.: Ein integriertes Datenverarbeitungs-und Informationssystem. Berlin 1972 Siemens Schriftenreihe „data praxis": Methoden zur Adressierung von Speichern mit direktem Zugriff. Siemens Schriftenreihe „data praxis": Technik der Speicherung und Wiedergewinnung von Daten mit direktem Zugriff. Siemens BS 2000: Assembler Befehle, Beschreibung. 1988. Siemens System 4004 BS 1000: Dienstprogramme. Siemens System 4004 BS 1000: Ein-/Ausgabesystem. Siemens System 4004 BS 1000: Organisationsprogramm. Siemens System 4004: Systemkonventionen. Siemens System 4004 Zentraleinheiten 4004/127,135-2,45-3. Beschreibung und Befehlsliste. Siemens 7800: Hardware Principles of Operation. 1979. Tuggle, S.: Assembler Language Programming: System/360 and 370. Chicago (Ill.)e.a. 1975. [23] Wolters, M. F. (Hrsg.): Der Schlüssel zum Computer. 4 Bde. Neubearb. Aufl., Reinbeck b. Hamburg, o. J.

Stichwortverzeichnis Α Addieren (Wort) 158 AD Addieren normalisiert lang 172 ADR Addieren normalisiert lang (Register) 170 Adresse, siehe Arbeitsspeicheradressierung Adreßkonstanten 6 6 - 6 8 AE Addieren normalisiert kurz 172 AER Addieren normalisiert kurz (Register) 170 AH Addieren Halbwort 160 Akkumulator 3 2 8 AL Addieren FP-Wort logisch 161 ALR Addieren FP-Register logisch 161 AP Addieren dezimal 147 AR Addieren (Register) 157 Arbeitsspeicher 9 O ^ a - n s - t i c n