235 51 6MB
German Pages [348] Year 1989
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 —
5·
? 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
1Ι
Ε
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
r»
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
Mü
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«> ο
e«
06 e ^3
0
X> 3
5
^
J
2
£
LÜ
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
l·
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