222 65 17MB
German Pages 303 [304] Year 1982
de Gruyter Lehrbuch Niemeyer • Programmieren in A S S E M B L E R
Gerhard Niemeyer
Einführung in das
Programmieren in ASSEMBLER Systeme IBM, Siemens, Univac Interdata 4. Auflage
w DE
G Walter de Gruyter • Berlin • New York 1982
Dr. rer. pol. Gerhard Niemeyer, o. Professor der Betriebswirtschaftslehre, insbes. Wirtschaftsinformatik, an der Universität Regensburg
CIP-Kurztitelaufnahme der Deutschen Bibliothek Niemeyer, Gerhard: Einführung in das Programmieren in ASSEMBLER : Systeme IBM, Siemens, Univac, Interdata / Gerhard Niemeyer. 4. Aufl. - Berlin ; New York : de Gruyter, 1982. (De-Gruyter-Lehrbuch) ISBN 3-11-008758-8
© Copyright 1982 by Walter de Gruyter & Co., vormals G. J. Göschen'sehe Verlagshandlung, J. Guttentag, Verlagsbuchhandlung Georg Reimer, Karl J. Trübner, Veit & Comp., 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: Mercedes-Druck, Berlin. - Druck: Color-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 fiir 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 fuhrenden 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. Uber 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.
6
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 Benutzimg 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. Dazu sei als Lektüre u. a. [42], [18] und [5] empfohlen. Regensburg, im Februar 1973
Gerhard Niemeyer
Vorwort zur 3. Auflage Einem Wunsch zahlreicher Benutzer meines Buches folgend, wird die 3. Auflage um den Befehlsvorrat zur logischen bit-Verknüpfung erweitert. Die sich daraus ergebenden Seitenverschiebungen wurden mit der bestmöglichen Sorgfalt in die Befehlstabelle und das Stichwortverzeichnis eingearbeitet. Regensburg, im Januar 1979
Gerhard Niemeyer
Vorwort zur 4. Auflage Nachdem die neuen Computergenerationen von IBM und Siemens (IBM Serien 30 und 43, Siemens Serie 75) ihre Architektur und damit auch den Befehlsvorrat im wesentlichen beibehalten haben, bleibt die Sprache ASSEMBLER auch für die nächsten Jahre aktuell. Der mit dem vorliegenden Buch erreichte Standard machte es möglich, die 4. Auflage bis auf einige geringfügige Druckfehlerkorrekturen unverändert herauszugeben. Regensburg, im September 1981
Gerhard Niemeyer
Inhalt 1. Die Darstellung von Daten in Bytemaschinen 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 1.2.3 Die sedezimale Schreibweise von bit-Mustern 1.3 Die dezimal gepackte Zahlendarstellung 1.4 Die duale Zahlendarstellung 1.5 Die Zahlendarstellung im Halbwort, Wort und Festpunktregister 1.6 Exkurs: Zahlensysteme 1.6.1 Die polynomiale Zahlendarstellung 1.6.2 Die Umrechnung von Zahlen in andere Zahlensysteme 1.7 Die Zahlendarstellung im Gleitpunktregister
9 9 11 11 12 13 16 17 19 21 21 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 2.4 Die Länge der Operanden 2.5 Die Ausrichtung von Operanden im Arbeitsspeicher
31 32 38 38 42 44 44
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ählers 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 3.4.3.2 Laden von Registern, Speichern von Registerinhalten 3.4.3.3 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
46 46 47 48 48 49 52 54 54 66 67 77 79 79 85 103 127 132 140 149 158 169 180
8
Inhaltsverzeichnis 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 Segmentverknü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 Makrodefinition 3.6.2 Der Aufruf von Makros 3.7 Systemmakros 3.7.1 Systemmakros zur Definition von Dateien 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 Übung Übung Übung Übung
1: 2: 3: 4: 5: 6: 7: 8a: 8b: 9: 10: 11:
Auflisten von Adieß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 Auszählen statistischer Merkmale von einer Banddatei Sedezimale Gleitpunktarithmetik Einrichten einer Buchhaltung auf einer Magnetplatte Multiplikation von Inzidenzmatrizen mit Zustandsvektoren
5. Anhang: Programmierhilfen 5.1 Lochkartenformat im ASSEMBLER 5.2 Tabelle der Maschineninstruktionen * 5.3 Tabelle der 2er-Potenzen 5.4 Umrechnungstabelle sedezimal - dezimal 5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal) 5.6 Tabelle der maschineninternen Instruktionsformate 5.7 Fehleranzeigen des Übersetzerprogramms (Übersetzungsphase) 5.8 Fehleranzeigen des Betriebssystems (Ablaufphase)
184 185 189 . . 193 199 200 202 203 203 203 204 205 206 207 207 212 213 217 219
220 220 223 226 232 238 248 254 257 259 268 278 278
281 281 282 288 289 289 295 295 296
Literaturverzeichnis
297
Stichwortverzeichnis
299
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 bits 1 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 n - 1, wobei n von der Größe der jeweiligen Anlage abhängt. Speicherorganisation (logisch): Adressen:
507
508
xxxxxxxx
509 xxxxxxxx
Byte
Byte
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. Byte-Maschinen gibt es mit Arbeitsspeichergrößen zwischen 8 und 2000 KB. 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 1 0 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 0 1 1
0 1 0 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 Gebüden erfolgt durch die Angabe der jeweils niedrigsten Byteadresse. b) Register Byte-Maschinen verfügen ü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 103 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.
11
1.2 Der EBCDI-Code
1.2 Der EBCDI-Code Der Extended Binary Coded Decimal Interchange Code ist typisch für 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 111 111 111 111 111 111 111 111
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 0 111 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:
1 im ! oooi
317
318
319
im ! oooo
320
im ! ooio
1 im ! ooii
Tausender
Hunderter
Zehner
Einer
Legt man fest, daß das Byte Nr. 317 den Stellenwert 103, das Byte Nr. 318 den Stellenwert 102, das Byte Nr. 319 den Stellenwert 101 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 (1111) Zur Markierung negativer Zahlen dienen folgende bit-Muster: 110 1 10 11 Voizeichendarstellung (Beispiele): + 1023
1023
im ! oooi i
1 im ! oooo 0
1 "T — im ! ooio lioo ! ooii 2 + 3
1 im ! oooi I
1111 ! oooo 1
im ! ooio
noi ;1 ooii
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 bit-
Pos.
3210
3 2 10
3210
3 2 10
32 10
3 2 10
3 2 10
3 2 10
3 2 10
76 54
0001
0010
0011
0100
0101
0110
Olli
1000
1001
1100 1101 1110
A J
B K S
c
D M U
E N V
F
G P X
H
0
I R Z
L T
W
Q
Y
Für die Verschlüsselung der Sonderzeichen werden ebenfalls der Zonenteil und der Ziffernteil des Byte benötigt. Eine unmittelbare Analogie zum Lochkartencode läßt sich hierbei jedoch nicht herstellen. Sondeizeichendarstellung bit-
Pos.
32 1 0
32 10
32 1 0
32 10
32 10
32 10
32 1 0
32 10
7654
0000
0001
1010
1011
1100
1101
1110
1111
0100 0101 0110
blank &
=
? ff
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 ,Rinkes 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 A B C D E . 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 b i t P o s i t 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 Sedezimalziffem 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 • 2 1 + + 1 • 2° = 11. Die elfte Sedezimalziffer lautet aber B. Folglich wird dem bitMuster 1011 die Ziffer B zugeordnet. Zuordnung von Sedezimalziffem zu bit-Mustern bit-Muster
Dezimalwert
Sedezimalziffer
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
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 B C D E F
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1
2 3 2 2 2 1 2° (duale Stellenwerte) Anm.: Die Zeichen A bis F sind hier nicht als Buchstaben, sondern als Sedezimalziffem 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 E
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
16
1. Die Darstellung von Daten in Bytemaschinen
Sonderzeichen linkes Halbbyte 4 5 6 7
0
1
rechtes Halbbyte A B C
1!
In den nachfolgenden Ausfuhrungen 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: 2
4 1111 ! i
0100
1
3
i m ! ooio
noi ; ooii
0100
| t
ooii ! noi
0001
i 0000 1
oioi ! lioo
Uli 1 0000
lioo ! oioi
Packen
.
Entpacken
Uli
! 0001 1
0010
1
X
In sedezimaler Schreibweise stellen sich diese Vorgänge wie folgt dar: F4
F2
D 3
4
2
3 D
1 l X
Packen
/ 1 X 1
Entpacken Fl
0
F0
5 C
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.
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 _ i • 2 n _ 1 + z n _ 2 .- 2n~2 + . . . + z 2 • 2 2 + z1 • 2 1 + z 0 • 2° = Zahl 10 Dabei haben die zt die Werte 0 oder 1 und n ist die Anzahl der Dualziffern. Beispiel: 01011001 2 = 0 - 2 7 + 1 • 2 6 + 0 • 2 5 + 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: 11112 = 2 3 + 2 2 + 2 1 + 2° = 8 + 4 + 2 + 1 = 15 10 = 2 4 - 1 Die Zahl der möglichen bit-Muster ist hingegen 16 = 24. Die größte im Byte darstellbare Zahl ist: 11111111 2 = 2 7 + 2 6 + 2 5 + 2 4 + 2 3 + 2 2 + 2 1 + 2° = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 - 255 10 = 28- 1 Die Zahl der möglichen bit-Muster ist hingegen 256 = 2 8 . Die größte in IV2 Bytes darstellbare Zahl ist: I I I I I I I I I I I I 2 = 2 1 1 + 2 1 0 + 2 9 + 2 8 + (2 8 - 1) = 2048 + 1024 + 512 + 256 + 255 = 4095 1 0 = 2 1 2 — 1 Die Zahl der möglichen bit-Muster ist hingegen 4096 = 2 12 . 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: + 105 10 15 31
0
- 105 10 0
01101001
15 31
0
1 . . . . 10010111
— 76io 15 31
+ 76io O
15 31
O
1 . . . . 10110100 =>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 Halb wort und Wort darstellbaren positiven Zahlen sind: 15 31
14 30
0
0
11
1,
was den Dezimalzahlen 2 spricht.
15
- 1 = 32767 bzw. 2 3 1 - 1 = 2147483647 ent-
Die dem Betrag nach größtmöglichen negativen Zahlen im Wort und Halbwort sind: 15 31
14 30
1 00
o
0,
IS
was den Dezimalzahlen - 2 = - 3 2 7 6 8 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 15 31
1 00
0
0,
1.6 Exkurs: Zahlensysteme
21
d.h. sie bleiben negativ. Daher ist die Komplementierung der größten negativen Zahlen nicht möglich. Die Dualzahl 15 31
1 1 1
0
1 1
stellt eine dezimale - 1 dar, denn ihr Komplement ist 15 31
000
o
0 1,
also eine dezimale + 1. Die Dualzahl 15 31
1 1 1
0
1 10
stellt eine dezimale - 2 dar, denn ihr Komplement ist 15
31
0 0 0
o
0 1 0,
also eine dezimale + 2. Die Dualzahl
15
31
1 1 1
o
10 1
stellt eine dezimale — 3 dar, denn ihr Komplement ist 15 31
0 0 0
Ol
o
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 potynomiale 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, 1 / 10 , Vioo, so ergibt sich die Dezimalzahl 9 - 1 0 + 1-1 + 7-Vio+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,o = Z n - l • 1 0 n _ 1 + . . . + z 2 • 102 + Z j • 101 + Z 0 • 10° +
Z_j
• 10" 1 + . . .
Darin bedeuten: Z10: 10: z,: 101: n: m:
Dezimalzahl Basis des Zahlensystems Dezimalziffer, 0 < zt < 9 Stellenwert der Ziffer Z; Zahl der Ziffern „vor dem Komma" 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: Zb = z n _ 1 b n k
n - l
+ . . . + z 2 b 2 t z ^ b 1 + z 0 b° + z _ 1 - b " 1 +
• • •+ z-m•b-m Darin bedeuten: Zb: b: zi: b': n: m:
Zahl eines bestimmten Zahlensystems Basis des Zahlensystems Ziffer, 0 < z{ < b - 1 Stellenwert der Ziffer Zi 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
16
Ziffern
0 bis 9
Obis 1
0 bis F
Stellenwerte
...lOMO 1 10° 10" 1 ... . . . 2 3 2 2 2 1 2 °
. . . l ó 2 ^ 1 1 6 ° 16" 1 ...
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. 288). 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 " - 1 + . . . + z 2 -b 2 + Zj -b 1 + z 0 b° + z _ ! - b _ 1 + . . . . . . + z..m-b-m Darin bedeuten: Z 1 0 : gesuchte Dezimalzahl zx\
Dualziffer (Sedezimalziffer) als Dezimalzahl geschrieben
b: 1
dualer (sedezimaler) Stellenwert als Dezimalzahl geschrieben
Beispiele: (1)
Die Dualzahl 011101 ist in eine Dezimalzahl umzurechnen. 011101 2 = 0 • 2 S + 1 • 2 4 + 1 • 2 3 + 1 • 2 2 + 0 • 2 1 + 1 • 2° = 0+16 + 8 + 4 + 0 + 1 =
(2)
2910
Die Sedezimalzahl A2E ist in eine Dezimalzahl umzurechnen. A2E 1 6 = A - 1 6 2 + 2 -16 1 + E - 1 6 ° = 10-25b + 2 - 1 6 + 1 4 - 1 = 2 6 0 6 1 0
2
Gebrochene Dualzahlen sind im Zusammenhang mit der elektronischen Datenverarbeitung nicht üblich.
24
(3)
1. Die Darstellung von Daten in Bytemaschinen
Die Sedezimalzahl E.3 ist in eine Dezimalzahl umzurechnen. E.3 16 = E• 16° + 3 • 16 _1 = 14 1 + 3 - 7 i 6 = 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 = z n _ 1 b n - 1 + . . . + z 3 - b 3 + z 2 -b 2 + z 1 -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: Z 1 0 = z 0 + b(z 1 + b(z 2 + b(z 3 + . . . + b z n _ j ) ) ) • • .) Sodann werden die gesuchten Ziffern zx durch fortgesetzte Modulodivision3 dieses Polynoms mit der Basis b ermittelt. Dies ist möglich, weil die Ziffern Zj wegen 0 < z4 < 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 zj + b(z 2 + b ( z 3 + . . . + b z n _ i » . . .) lautet, wobei z 0 als Rest bleibt. Dividiert man dieses Resultat wieder durch b, so erhält man z 2 + b(z 3 + . . . + b z n _ ! ) . . .) und als Rest bleibt z x , 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 Exkurs: Zahlensysteme
25
Z 1 0 = z 0 + b (z, + b (z2 + b (z 3 + b • z 4 ))) > v ' Yo v ' v Yi = z t + b(z 2 + b(z 3 + b -z 4 )) > v ' y 2 = z 2 + b(z 3 -t-^b -z 4 ) y3 = z3 + b
z^ /4
Der schematische Ablauf des Algorithmus stellt sich dann wie folgt dar: Z10 = Yo : b = yi
Rest z 0
Yi : b = y 2
Rest zl
y ^ b = y3
Rest z 2
y3 : b = y4 y4 : b = 0
Rest z 3 Rest z 4
Die Dezimalzahl Z10 wird also im b-Zahlensystem durch die Ziffernfolge z 4 z 3 z 2 Zi 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 (zO
9:2 = 4
Rest 1 (z 2 )
2
Rest 0 (z 3 )
2:2=
1
Rest 0 (z 4 )
1:2=
0
Rest 1 (z s )
Es ist also 38 1 0 = 1001102 Probe: 1 • 2 5 + 0 • 2 4 + 0 • 23 + 1 • 2 2 + 1 • 2 1 + 0 • 2° = 32 + 0 + 0 + 4 + 2 + 0 = 38 1 0
1. Die Darstellung von Daten in Bytemaschinen
26
(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 1 6 Probe: 2 -16 1 + 6 - 1 6 ° = 32 + 6 = 38 1 0 c) Umrechnung von Dezimalbrüchen in Sedezimalbrüche 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 1 0 = z_i • b " 1 + z _ 2 • b - 2 + . . . + z _ m • b - m oder als Hornerschema geschrieben: •Z,o = b "
1
^ , + b _ 1 ( z _ 2 + b - 1 (z_ 3 + . . . + b - 1
z _ m ) ) ) . . .)
Die Ziffern z_l 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_ i + b _ 1 ( z _ 2 + b - 1 (z_ 3 + . . . + b _ 1 • z _ m ) ) . . .) ergibt. Spaltet man z _ i 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 yj, dann läßt sich dieses Polynom wie folgt auflösen: .Z 1 0 = b - 1 (z_i + b - 1 (z_2 + b _ 1 • z _ 3 ) ) J
1.6 Exkurs: Zahlensysteme
27
Der schematische Ablauf des Algorithmus stellt sich dann wie folgt dar: y _ i • b = z _ ! + y_2 y_2 • b = z_2 + y_3 y _ 3 - b = z_3 Der Dezimalbruch .Z 10 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 • 16 = 4 + .8 .8-16 = 12 + .8 .8^16^1.8 usw.
Schreibt man die gefundenen Werte z_i als Sedezimalziffern, so erhält man 0.3 1 0 (2)
=
0.4CC . . . , 1 6
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 0 6 ^ 1 0 ( A ) j t 0.24 0 . 2 4 ^ 1 6 j = ^ J ^ + 0.84 0.84-16 = 13(D) + 0.44 usw.
28
1. Die Darstellung von Daten in Bytemaschinen
Es ist also 213.04 1 0 = D5.0A3D . . . , 1 6 Probe: 13 • 161 + 5 • 16° + 0 • 1 6 _ 1 + 1 0 • 1 6 - 2 + 3 • 1 6 - 3 + 1 3 • 1 6 - 4 « 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 = z „ - i
l6n-1 + . . . + z016°
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! 1101! 1011 i i 1
D
B
Dann ist Z 2 = 1 162 + D 1 6 1 + B 1 6 ° = 1DB 16 Zur Probe werden beide Zahlen in Dezimalzahlen umgerechnet: Z 2 = 1 • 2 8 + 1 • 2 7 + 1 • 2 6 + 0 • 2 S + 1 • 2 4 + 1 • 2 3 + 0 • 2 2 + 1 • 2 1 + 1 • 2° = 256 + 128 + 64 + 0 + 16 + 8 + 0 + 2 + 1 = 475 1 0 oder Z , 6 = 1 • 162 + D 1 6 1 + B 1 6 ° = 1 - 2 5 6 + 13 16 + 11-1 = 2 5 6 + 2 0 8 + 11 = 475,0
e) Umrechnung von Sedezimalzahlen in Dualzahlen Für die Umrechnung einer Sedezimalzahl Z 1 6 in eine Dualzahl Z 2 empfiehlt sich ein analoges Vorgehen. Z 2 = z n _ 1 - 2 n - 1 + . . . + z 0 -2°
1.7 Die Zahlendarstellung im Gleitpunktregister
29
Die Dualziffern z n _ t 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: 0010 ¡ l l l l i 1010 , i Dann ist Z 1 6 = 1 -2 9 + 0 - 2 8 + 1 -2 7 + 1 -2 6 + 1 -2 S + 1 -2 4 + 1 -2 3 + 0 - 2 2 + 1 • 21 + 0 • 2° = 1011111010 2 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 Gleitpunktzahlen Mantisse-
V Exp.
63 62
56 55
Es werden nur die bit-Positionen 63 bis 32 des Gleitpunktregisters benutzt. Lange Gleitpunktzahlen 1
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-
1. Die Darstellung von Daten in Bytemaschinen
30
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 - 6 5 , der 1 der Wert - 6 4 , . . . . , 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 Sedezimalziffem 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
0 +
32
r100 | 0001 65- 0
0110
1110
6
E
.. .0
00..
+ 6 - 1 6 ° + E • 1 6 _ 1 = + 6.E16 = + 6.87510 63 1 "
32 011 | 1111
1000
63 ~ - 2
... 0
0....
8 -
8
-2
16"
_
_
0.0816 = — 0.0312510
63 0 +
32 100 ! 0010 l 66- 1
1101
0101
0000
1010
0011
1101
D
5
0
A
3
D
+ D • 161 + 5 • 16° + 0 • 16 _ 1 + A • 1 6 - 2 + 3 • 16~ 3 + D • 16~ 4 = + D 5 . 0 A 3 D 1 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 Funktionsmoduln 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.
32
2.2 Die Instruktionstypen und ihre Formate
Zur Darstellung des Aufbaus der Maschineninstruktionen werden üblicherweise Symbole verwendet, deren Bedeutung nachfolgend beschrieben wird. Op.-Code R B X D I L M
— Operationscode der Instruktion — Operandenregister — Basisadreßregister (Basisregister) — Indexadreßregister (Indexregister) — Distanzadresse (displacement) — Direktoperand (immediate operand) — Länge eines Speicheroperanden (in Bytes) — Bedingungsmaske bei Sprungbefehlen
Die Buchstaben R, B, X, D, I, L und M werden mit 1, i oder 3 indiziert, um die Operanden zu bezeichnen. Als Besonderheit bei den Registern gilt zu beachten, daß es sich bei den Basisregistern (B) und Indexregistern (X) stets um die Festpunktregister 0 bis 15 handelt. Die Operandenregister (R) können je nach Operation sowohl Festpunkt* als auch Gleitpunktregister sein. Die Vergabe der Symbole B, X und R richtet sich nur nach der aktuellen Verwendung: Wenn eines der Festpunktregister als Operandenregister für eine arithmetische oder logische Operation benutzt wird, nennt man es R; wenn es als Basisregister verwendet wird, heißt es B und wenn es als Indexregister fungiert, heißt es X. Die Symbole B, X und R sind somit nur funktionallogische Bezeichnungen. In einem Programm kann möglicherweise ein und dasselbe Festpunktregister alle 3 Funktionen ausüben.
2.2 Die Instruktionstypen und ihre Formate Byte-Maschinen haben 5 Instruktionstypen, die entsprechend der mit ihnen angesprochenen Operandenarten mit den mnemotechnischen Kürzeln RR (Register und Register), RX (Register und indizierter Speicher), RS (Register und Speicher), SI (Speicher und Direktoperand), SS (Speicher und Speicher) gekennzeichnet werden. Bei den SS-Instruktionen unterscheidet man die Versionen SS (logisch) und SS (arithmetisch), so daß man insgesamt auch von 6 Instruktionstypen sprechen kann. Alle Instruktionen haben einen Operationsteil und einen Operandenteil.
Operationsteil 1 Byte
Operandenteil
2.2 Die Instruktionen und ihre Formate
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
7 6
Instruktionslänge
Instruktionstyp
0 0 1 1
2 4 4 6
RR RX RS, SI SS
0 1 0 1
Bytes (1 Bytes (2 Bytes (2 Bytes (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 Instruktionstyp 1, 3 oder 5 Bytes zur Verschlüsselung des Operandenteils an. Bei den Operanden handelt es sich einmal um 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önnen 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önnen sodann Steuergrößen für shift-Operationen sein. Sie treten in der Form von Speicheradressen als Direktoperanden auf. Es wird jedoch nicht auf eine Speicheradresse zugegriffen, sondern der Wert der „Adresse" bildet die Steuergröße. Operanden können 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 umdeuten, 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, z.B. Addieren auf s , d.h. beide Operanden stehen in Operandenregistern. Im Arbeitsspeicher hat dieser Instruktionstyp folgendes Format: Op.-Code 1. Byte
2. Byte
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 , wobei L t = 5 und L 2 = 3 ist.
2. Maschineninstruktionen und Operandenadressierung
38 Addieren gepackt
F
!
im !
1
Speicheradresse des 1. Operanden A — • l 0 1 ¡
L, - 1 ,
,
A
4
2
— -
8
!
1010
0100
0010
1000
•••• 1
!
sedezimal
binär:
L, - 1
0000
0001
6
8
0110
1000
Speicheradresse des 2. Operanden /\ 1 — 1 ; 1 0
0001
0000
A
1010
Der Instruktionstyp SS (logisch) hat im Arbeitsspeicher folgendes Format: SS (logisch) Op.-Code
L, - 1
1. Byte
2. Byte
B2 3. Byte
d2
K-
6. Byte
S.Byte
4. 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 r = 256. Beispiel für eine Instruktion vom Typ SS (logisch): Vergleichen logisch (Feld 1 > mit , wobei L, = 11 ist. Vergleichen logisch A sedezimal:
binär:
D
•:
s
noi •! oioi
Speicheradresse des 1. Operanden A
Li - 1 A
o
:
i 0000 ¡
A
7
1010
Olli
:
Speicheradresse des 2. Operanden A
i
D
0
0001
1101
0000
1
Olli
!
1
F
0001
1111
!
Eine zusammenfassende Ubersicht ü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 Bi und aus den Distanzadressen Dj gebildet: Speicheradresse = < Bj > + Dj B; ist die Nummer irgendeines der 16 Festpunktregister, welches durch den Programmierer als Basisregister deklariert worden ist. Ferner muß der Program-
B
1010
39
2.3 Die Arbeitsspeicheradressierung
mierer dafür sorgen, daß in dieses Basisregister eine absolute Speicheradresse, die sogenannte Basisadresse geladen wird. Das geschieht für gewöhnlich mit Hilfe der Instruktion BALR
Basisregister-Nr., 0
während der Ausfuhrungsphase des Programms. Dieser Vorgang läßt sich folgendermaß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 folgenden Maschineninstruktion. Di 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
1051
1052
V— Operand
Dann wird die Speicheradresse dieses Operanden wie folgt dargestellt: + Dj = + Di = 1000 + 50. Die Verschlüsselung dieser Adresse in der Maschineninstruktion lautet: sedezimal:
binär:
allgemein:
7 ¡ 0 1 Olli ¡ 0000 1 ¡ I"
B
3
1 1: 2
•
1 oon ; ooio
D¡ »i
»
Für die Verschlüsselung der Distanzadresse stehen bei allen dafür in Betracht kommenden Instruktionstypen 3 Halbbytes = 1 2 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 (Bj > + 0 bis < B; > + 4095 liegen, mit den Zahlen des obigen Beispiels also alle Operanden, die absolute Speicheradressen zwischen 1000 und 5095 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 z. B. folgende Operationen ausfuhren: = 28
. > 3 1 4 ^ 8 4 5 ^ 3 ,8 3 >46 6
0 6 C 12
m 1F 18
26 2B 2E
F2 F2 FA D2 47
23 24 22 02 F0
70|[C] 70(22] 701F 7026 701C 701F 702B 701C 702E
F1F1F2F5 F2F1F0F4F1 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 Di berechnet werden 6 , pabei 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 für die jeweils zweiten Operanden in den RX-Instruktionen vorgesehen. Die Speicheradressen werden aus dem Inhalt von Indexregistern X2, dem Inhalt von Basisregistern B2 und aus den Distanzadressen D2 gebildet: Speicheradresse = + + D2 X2 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 = 10, = 1000 und D2 = 50, dann ist die Speicheradresse 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 + 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.
43
2.3 Die Arbeitsspeicheradressierung
U vO n vD vO O OS OS r- r- r- r- r.S *o
oc rJ \û o o -ôV oo OO O
1 3g I •«
8 -hO ~O ÎSO
a
o
II
s
a aa .5 • M'
— m — es vo >5 r*-
tÎÎÎÎÎÎlÎ gj
5
IO
ÍS s?
°
oí .. 7
44
2. Maschineninstruktionen und Operandenadressierung
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 Sl-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 für 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
2.5 Die Ausrichtung von Operanden im Arbeitsspeicher
45
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 fuhrt 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. 0
H V D
1
2
H
3
4
H V
5
6
H
7
8
H V D
9
10
H
11
12
H V
13
14
H
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 Übersetzerprogramm 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.
3. Die Programmiersprache Assembler 3.1 Allgemeine Vorbemerkungen Die Programmiersprache ASSEMBLER ist eine universelle Sprache zur Erstellung von Quellenprogrammen für die Anlagen IBM 360, 370, Siemens 4004 und Univac 9000, die besonders den einheitlichen Vorrat an Maschineninstruktionen und die Byte-Struktur dieser Anlagen berücksichtigt. Ein in ASSEMBLER geschriebenes Quellenprogramm wird durch ein Umwandlungsprogramm, welches ebenfalls Assemblerprogramm heißt 7 , 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 7 0 I C 7022 keinerlei Ähnlichkeit zu einem menschlichen Sprachgebilde aufweist, ist die zugehörige Instruktion in ASSEMBLER, nämlich PACK FELD1, ZAHL1, nach dem Erlernen primitiver Syntaxregeln leicht verständlich: Sie besagt, daß der Inhalt des mit ZAHL1 adressierten Datenfeldes in ein mit FELD1 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 FELD1, FELD2 in FA 22 701C 701F oder binär geschrieben in 1111 1010 0 0 1 0 0 0 1 0 0111 0000 0001 1100 0111 0000 0001 1111. (2) Umwandlung von symbolischen in echte Arbeitsspeicheradressen, z. B. WEITER in 702E, d . h . (Reg. 7> + 46 1 0 . (3) Reservierung von Datenfeldern im Arbeitsspeicher; z. B. wird durch die Anweisung FELD1 DS CL3 ein Feld von 3 Bytes Länge ab der Adresse 701C, d . h . + 28 io, reserviert. 7
Der Name ASSEMBLER für eine bestimmte Programmiersprache führt oft 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 ASSEMBLER und das Übersetzelprogramm durch das Wort Assembler gekennzeichnet.
3.2 Die Elemente der Sprache
47
(4) Erzeugung von Konstanten im Arbeitsspeicher; z. B. wird durch die Anweisung ZAHL1 DC C'1125' eine Konstante von 4 Bytes Länge ab der Adresse 7022, d . h . (Reg. 7> + 34 1 0 , erzeugt. Diese Konstante lautet F1F1F2F5 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 8 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. kann 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 aufruft. Auf diese Weise läßt sich der Programmieraufwand vielfach entscheidend reduzieren. o
Die Bindephase sorgt dafür, daß andere separat übersetzte Programm-Moduln, die durch das Programm angesprochen werden, mit dem erstgenannten Programm(-Modul) zu einem lauffähigen Programm verknüpft werden. Die Ladephase speichert das gebundene Programm ab einer bestimmten Ladeadresse in den Arbeitsspeicher.
48
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 A bis Z, die Sonderzeichen # und die Ziffern 0 bis 9. Das erste Zeichen muß 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.
49
3.3 Ausdrücke
Beispiele für Symbole: @123, DP, L1, BASISI, FELD, F1@#
Beispiele für die Wertzuweisung durch den Programmierer: DP BASISI 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 Konstantenfeldes 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: Dj = 0, Li = 7 und Bj = 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
50
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, denn 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,81,0(7)
Darin sind: Dj = 2, Lt = 200, B t = 8, D 2 = 0, B2 = 7 SR
15,4
Darin sind: R j = 15, R 2 = 4 A
4,3(5,8)
Darin sind: R, = 4, D2 = 3, X2 = 5, B2 = 8 ADR
EQU
10000
51
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, X'O' bis X'FFF' für die Angabe von Distanzadressen, X'O' 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'ABFV
c) Binäre Diiektwerte Binäre Direktwerte sind voizeichenlose Dualzahlen im Bereich von 0 bis 11 .
1 24
(dezimal: 2 2 4 — 1). Sie werden durch ein vorangestelltes B gekennzeichnet und in Hochkommas eingeschlossen. Beispiel: B'101'. Der jeweilige Verwendungszweck bestimmt die aktuelle Größe; dabei gelten die Bereiche B'O' bis B'l 111' für die Registerbezeichnung, B'O' bis B*111111111111' für die Angabe von Distanzadressen, B'O' bis B'l 1111111' (bzw. B'1111') für Längenangaben und B'O' bis B'11111111' für die Darstellung von Direktoperanden in Sl-Instruktionen. Beispiele:
WERT
CLI MVC EQU
BYTE,B'11111111' 2(200,8),0(B'111') B'111011110001'
d) Zeichendirektwerte Ein Zeichendirektwert besteht aus 1 bis 3 Zeichen (Buchstaben, Ziffern, Sonderzeichen), die durch ein vorangestelltes C gekennzeichnet werden und in Hochkommas eingeschlossen sind. Beispiel: C'A1B'; dabei ist A1B eine Zeichenkette, die im Arbeitsspeicher durch das bit-Muster C1 F l C2 dargestellt wird.
52
3. Die Programmiersprache ASSEMBLER
Ihre hauptsächliche Verwendung finden Zeichendirektwerte in Sl-Instruktionen, wobei jedoch stets nur ein Zeichen eingesetzt werden darf. Beispiele: CLI CLI MVI MVI
0(7),C'+' FELD+1,C'A' BYTE.C'V 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, fiir das der Assembler den um die relative Basisadresse9 verminderten Stand des Zuordnungszählers einsetzt. Beispiel: Adressen (rei. zum Programmanfang)
Distanzadressen (rei. zur Basisadresse)
18 22 28
10
14 20
ASSEMBLERBefehle BE AP MVC
*+10 FELD1,ZAHL1 DRBER.FELD1
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 ßasisreg., 0" folgende Maschineninstruktion in der Umwandlungsphase abgesetzt wird. In der Ausführungsphase ist die Basisadresse die absolute Speicheradresse dieser Maschineninstruktion.
3.3 Ausdrücke
53
Im Augenblick der Übersetzung 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 = 2 0 (sedezimal: 14). Wird als Basisregister das Register 10 deklariert, so wird als Sprungadresse A014 in die Maschineninstruktion eingesetzt. relative Adressen (dezimal, dezimal und relativ zum * ) 18 *
19 +1
20 +2
1 4 ¡7
1 8 ! 0 a|o
\
21 +3
22 +4
1 1 ! 4 F ¡A 1
23 +5
24 +6
25 +7
1 5 ! 5 AIO 1
BE
26 +8
27 28 +9 +10
5! 1 a ! o
6 : ? D12 1 A
a|o
o! 5
4|3
- 1 — A | 0 s : 1 i *
AP
M VC
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 -14-13-12-11-10-9 -8 -7 -6 -5 -4 -3 -2 -1 1 —1— 4 1 1 5! 0 1 LA
5 »1 0 o l l •
d; 2
1 —1— 0] 1 S i l 1
1 f ;•i
MVC
1 1 —1— 5 ] 0 0 1 0 9 ! 5 4 ; E 8 :1 1 1 CLI
40 *
1—
F : 1 4 ]»7
7;o8 BNE
1 1 \0 o ; a » •
3. Die Programmiersprache ASSEMBLER
54
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 m, dann werden vor dem Absetzen und vor einer etwaigen Duplizierung rechts n — m Leerstellen angefügt. Beispiel: Das Literal wird abgesetzt als
=3CL6'ABCDE' A
B C
D E
A B C D
E
A B C D
E i_i
58
3. Die Programmiersprache ASSEMBLER
Weitere Beispiele: Das Literal wird abgesetzt als
=CL1'J0E'
Das Literal wird abgesetzt als
=C'ABC+1'
IT
A B 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 Zj 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' 111
Das Literal wird abgesetzt als
F]C
=X'C1F03' "I—1——1——'— 0 ; C
I
1I F
I
0 !3
I
Die Zahl der belegten Bytes darf 256 nicht überschreiten; m darf also maximal 512 sein. Bei Verwendung eines expliziten Längenschlüssels dominiert dieser; d.h. wenn n kleiner als die Zahl der belegten Bytes ist, dann werden vor dem Absetzen 10
Das Zeichen [ . . . . ] bedeutet „ganzzahliger Teil von . . . .".
59
3.3 Ausdrücke
und vor einer etwaigen Duplizierung die äußerst linken Bytes der Konstante abgeschnitten. Beispiele: Das Literal wird abgesetzt als
=XL2'F0C1B' o |c i ;B
Das Literal wird abgesetzt als
=2XL1'11FO' F l 0 _1_
F , 0
Wenn die Länge n 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 ! F ol 1
Das Literal wird abgesetzt als
=2XL2'FF' o !o
F ¡F
0 ¡0
F !f t
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 wird abgesetzt als Das Literal wird abgesetzt als
=B'11010001' 1101 I 0001 I =B'110011110' 0000 i 0001
1001
1110
Die Zahl der belegten Bytes darf maximal 256 betragen.
60
3. Die Programmiersprache ASSEMBLER
Wird ein expliziter Längenschlüssel angegeben, so gilt dieser vor der impliziten Länge; d.h. wenn n kleiner angegeben wird als die Zahl der sonst belegten Bytes, dann werden vor dem Absetzen und vor einer etwaigen Duplizierung die äußerst linken Bytes abgeschnitten. Beispiele: Das Literal wird abgesetzt als
=BL1'1000101111' 0010 I 1111
Das Literal wird abgesetzt als
=2BL1'111010000' 1101
0000
1101 ; 0000
Wenn n 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 i 0000
Das Literal wird abgesetzt als
0000 i 0101
=2BL2'11101101' 0000 I 0000
1110
1101
0000 I 0000
1110 i 1101
d) Literale mit Festpunktkonstanten (F und H) Allgemeines Format (Vollwort): Allgemeines Format (Halbwort):
= kFLn'± Zj = kHLn'±z,
zm' zm'
11
Für z; können die Dezimalziffern 0 bis 9 eingesetzt werden. Zur Bezeichnung negativer Konstanten muß ein „-"-Zeichen 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 Zahlenumfang genommen werden kann. Einzelheiten sind den einschlägigen Handbüchern zu entnehmen.
61
3.3 Ausdrücke
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 = -2147483648 bis + 2 31 - 1 = = + 2147483647 (bzw. von - 2 1 5 = - 32768 bis + 2 1 5 - 1 = + 32767). 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 n = 4 bzw. n = 2 vorgegeben wird. Der explizite Längenschlüssel ist für beide Typen H und F begrenzt auf 1 < n < 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 kommt 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
Das Literal wird abgesetzt als
=H'-1' 1 im ! im
im ! im
(ausgerichtet)
=F'10' oooo ! oooo
oooo 1 oooo 0000 ! 0000
0000 ! 1010 (ausgerichtet)
Das Literal wird abgesetzt als
=H L4'2' oooo ! oooo
oooo •! oooo
oooo ; 0000 . .1
0000 ! 0010 i (nicht ausgerichtet)
Ein etwaiger Duplizierfaktor wird erst nach der Umwandlung in eine Dualzahl wirksam. Beispiel: Das Literal wird abgesetzt als
=2H'2' oooo j oooo
0000 ; 0010 1
oooo ! oooo 1
1 oooo ; ooio (ausgerichtet)
3. Die Programmiersprache ASSEMBLER
62
e) Literale mit Gleitpunktkonstanten (E und D) Allgemeines Format (kurze Mantisse): =kELn'± Zj
z m E ± yiy2'
Allgemeines Format (lange Mantisse): =kDLn'± Zl
z m E ± y1y2'
Für Z{ 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 zl 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 t geschrieben werden. Gleitpunktkonstanten im E-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 —I— 4l2 DiS 0 ' A 3 !d (vgl. dazu Seite 28). f) Literale mit Dezimalkonstanten (P und Z) Allgemeines Format (gepackt): = kPLn± z, Allgemeines Format (gezont): = kZLn'±Zj
zm' zm'
63
3.3 Ausdrücke
Für z, 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 (EBCDI) Form abgespeichert. Je 2 gepackte und je 1 gezonte Ziffer belegen ein Byte; allerdings wird bei gepackten Zahlen im äußerst rechten Byte 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' 0 •11 2 I! c
Das Literal wird abgesetzt als
=P'—123'
Das Literal wird abgesetzt als
=P'1234'
Das Literal wird abgesetzt als
=Z'+12'
Das Literal wird abgesetzt als
=Z'1234'
i —i— 1|2 3¡D
0|l 2 ¡3 4 ]c
i F I 1 C]2 • I •
—;—r-1——1——r— F i 1 F| 2 F 1 3 C \ 4
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 n kleiner als die Zahl der von der betreffenden Konstante benötigten Bytes, dann werden die linken (höchstwertigen) Dezimalziffern nicht dargestellt. Ist n größer
3. Die Programmiersprache ASSEMBLER
64
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 I 5 7 ¡3
l_
l_
5 IC _L
Das Literal wird abgesetzt als
=P L3'—12' —i— o ; o oli 2 ¡D i _l
Das Literal wird abgesetzt als
=ZL3'125735' F ! 7 F I 3 C ! 5
I
I
Das Literal wird abgesetzt als
=ZL3'—12' F
;o
F, 1
DI2
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 ¡D
g) Literale mit Adreßkonstanten (A, 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 für die Adressierung (für das Aufrufen) separater Programm-Moduln. Auf diese Verwendungszwecke sind die nachfolgenden vereinfachten Formatangaben abgestimmt. Allgemeine Formate:
= A (Ausdruck) = Y (Ausdruck) = V (Ausdruck)
65
3.3 Ausdrücke
Als Ausdrücke können eingesetzt werden: (1)
Symbole mit und ohne Distanz. Beispiele: = A(FELD),- = A(FELD+200); = A(B2-7)
(2)
Zuordnungszähler mit und ohne Distanz. Beispiele: = A(*); = A(*—17); = A(*+5000) .
Für die Adreßkonstanten gilt folgendes: Bei der Ubersetzung 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 A 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
66 L
4,=A(RECHFLD—1)
Laden des Wertes der Adreßkonstante in das Register Nr. 4. MVC
0(200,4),ZAHL
Übertragen des Inhaltes des Feldes ZAHL in der Länge 200 in das mit (Bj) = (Reg. 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 um 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 Konstanten noch anzumerken, daß die Typen A und V in Wortlänge (4 Bytes) abgesetzt werden und daß sie auf Wortgrenzen ausgerichtet sind. Die Konstanten des Typs Y werden in Halbwortlänge (2 Bytes) abgesetzt und sind auf Halbwortgrenzen ausgerichtet. Die Ausrichtung entfällt bei allen Typen, 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 Maschineninstruktionen als Maschinenbefehle bezeichnet werden, bestehen aus folgenden Komponenten: (1) (2) (3)
Symbolische Adresse (als Sprungziel wahlweise) Operationscode (fixiert) Operanden (Anzahl je nach Operation fixiert)
67
3.4 Maschinenbefehle
Im folgenden soll gezeigt werden, wie sich diese Komponenten bei den einzelnen Befehlen aneinanderfügen, insbesondere aber, wie die Operanden 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 und 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 Aufbau eines Befehls durch Symbol Op.-Code Symbol 1, Direktwert2 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: B D I L LT M R S X
— Nummer eines expliziten Basisregisters - explizite Distanzadresse — Direktoperand — expliziter Längenschlüssel — Literal — explizite Bedingungsmaske (bei bedingten Verzweigungsbefehlen) - Nummer eines Operandenregisters — symbolische Adresse — Nummer eines Indexregisters.
Die bei diesen Abkürzungen verwendeten Indizes l, 2 und 3 bezeichnen die Nummer des Operanden. 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 Formate dargestellt. Zur Abkürzung werden dabei die Pfeile => und ->• verwendet; => steht für „bezeichnet" und steht für „wird dargestellt durch". RR-Instruktionen Allgemeines Format: Symb.Adr.
Op.Code Operandi, Operand2
68
3. Die Programmiersprache ASSEMBLER
Operand 1 =»• Registernummer R j 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 h 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
Operand 1 => Registernummer R, Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand2 => indiz. Speicheradr. D2 (X 2) B 2 ) Ausdr.l (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 ) -»• Ausdr. 1 (,Ausdr. 3) Ausdruck 1 und Ausdruck 3 vgl. oben! oder Operand2 =»• Inhalt Indexreg. + Distanzadr. D2(X2).->- 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
oder Operand 2 => Direktkonstante LT2 ->• Literal Die symbolischen Befehlsformate lauten: a) bei expliziter Adressierung (d.h. die Speicheradresse wird vom Programmierer durch D, B und evtl. X dargestellt)
3.4 Maschinenbefehle
S S S
Op.Code Op.Code Op.Code
69
R,, D 2 (X 2 , B 2 ) Rj, D 2 ( 3 2 ) Rj, D 2 (X 2 )
indiziert nicht indiziert indiziert ohne Basisregister
Einfache Beispiele: L
5,0(10,2)
Der Inhalt des mit (X 2 > + (B2> + D 2 = + 0 adressierten Speicherfeldes wird in das Register 5 geladen. NEU
A
5,4(,2)
Der Inhalt des mit + D 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,, S 2 (X 2 ) R 1} S 2
indiziert nicht indiziert
Einfache Beispiele: AB
S
5,W0RT(1O)
Der Inhalt des mit Symbol + = W0RT + 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 B2 berechnet wird. C
3.K0NST
Der Inhalt des Registers 3 wird mit dem Inhalt des mit dem Symbol KUNST 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 u 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
70
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 Mj ->• 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 für diesen letzten Fall lauten: a) normal mit Bedingungsschlüssel S
Op.Code
ML 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.
71
3.4 Maschinenbefehle
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 (vgl. S. 170). RS-Instruktionen Allgemeines Format: Symb.Adr. Op.Code Operand 1, Operand 3, Operand 2 Operand 1 =» Registernummer R j -»• Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand 3 => Registernummer R 3 -»• Ausdruck Ausdruck vgl. oben! Operand 2 => Speicheradr. D2 (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: S
Op.Code
R 1 ; R 3 , D2 (B 2 )
Einfaches Beispiel: LADEN LM
5,7,12(9)
In die Register 5, 6 und 7 werden 3 Speicherworte geladen, deren Adresse aus + 12 berechnet wird. b) bei impliziter Adressierung: S
Op.Code
R I , R 3 , S2
Einfaches Beispiel: STM
5,7,WORTE
Die Inhalte der Register 5, 6 und 7 werden in 3 Speicherworte gebracht, deren symbolische Adresse WORTE lautet. Bei der Übersetzung wird dem Symbol WORTE ein Basisregister und eine Distanzadresse zugeordnet, so daß die Adresse intern aus D2 und B2 berechnet wird.
3. Die Programmiersprache ASSEMBLER
72
c) bei Literalverwendung: S
Op .Code
R 1( R 3 , LT2
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 Ri -*• Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand 2 =*• Verschiebezahl D2 (B2) 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 (B 2 )
Op.Code
Ri, 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
73
3.4 Maschinenbefehle
(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 I 2 ->• Direktwert (1 Byte) Die symbolischen Befehlsformate lauten a) bei expliziter Adressierung: S
Op.Code
Ü! (BO, 12
Einfaches Beispiel: M0VE
MVI
5(8),C'A'
Die Direktkonstante A wird in das mit < Reg. 8 > + 5 adressierte Byte übertragen. b) bei implizierter Adressierung: S
Op.Code
SL I 2
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 Operandi und Operand2 =*• Speicheradr. u. Längenschi. Dj(L(, B;) -»• 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
74
Operandi und Operand2 => Speicheradresse Si -> Symbol oder Operand 2 => Direktkonstante LT 2
Literal
Die symbolischen Befehlsformate lauten a) bei expliziter Adressierung und explizitem Längenschlüssel: S
Op.Code
Ü! (L,, Bi), D2 (L 2 , B 2 )
Einfaches Beispiel: PACK
0(2,7),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ängenschlüssel (der Längenschlüssel der Felddefinition ist maßgebend): S
Op.Code
Sx, S2
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
AI (3),B1 (4)
Der Inhalt des mit Bl adressierten und 4 Bytes langen Zahlenfeldes wird in der Länge 3 in das mit AI 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 FELD1 (3),0(3,7) FELD1,FELD2(4)
e) bei Literalverwendung: S S S
Op.Code Op.Code Op.Code
Ü! (Li, B0, LT 2 S„ LT2 Sj (Li), LT 2
oder oder
3.4 Maschinenbefehle
75
Einfache Beispiele: AP
SUMME,=X'710C'
Die als Sedezimalkonstante dargestellte gepackte Dezimalzahl +710 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. Di (Li, Bi) -*• Ausdr. 1 (Ausdr. 2, Ausdr.3) Ausdruck 1, Ausdruck 2 und Ausdruck 3 vgl. bei SS (arithmetisch) oder Operand 1 => Speicheradr. u. Längenschi. Sj (Li) -»• 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 LT 2 ->• Literal
Die symbolischen Befehlsformate lauten: a) bei expliziter Adressierung und explizitem Längenschlüssel: S
Op.Code
Ü! (L 1; Bj), D2 (B 2 )
76
3. Die Programmiersprache ASSEMBLER
Einfaches Beispiel: M0VE
MVC
10(200,121,310(12)
In das 200 Bytes lange und mit + D j adressierte Byte übertragen. Codierungsbeispiele: MVI
STELLE,C' '
In das mit S T E L L E adressierte Byte wird ein blank übertragen. MVI
0(7),P'-1'
In das mit < Reg. 7 > + 0 adressierte Byte wird eine dezimal gepackte — 1 übertragen. MVI
BYTE+3,X'F1'
In das mit BYTE+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
D, ( L „ B,), D2 (B2) S , ^ ) , S2 S,, S2
82
3. Die Programmiersprache ASSEMBLER
Format maschinenintern: D
;
i
L, - 1
1. Byte
2. Byte
B,
•
D,
3. Byte
J 4. Byte
»
B*
Ì5. Byte
-
Di
I -1 6. Byte
Wirkungsweise: Die Instruktion bewirkt die Übertragung von L! rechten Halbbytes (Ziffern) ab der durch + D 2 angegebenen Adresse in das mit + D j adressierte Feld, und zwar ebenfalls in die rechten Halbbytes. Die Übertragung erfolgt von links nach rechts. Maximal können 256 Halbbytes übertragen werden.
Codierungsbeispiele: MVN
BETRAG+3(1 ),=X'OD'
Das rechte Halbbyte der als Literal definierten Sedezimalkonstante OD, also das bit-Muster 1101, wird in das rechte Halbbyte des mit BETRAG+3 adressierten 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. FELD1
FELD2
FELD1 nachher:
Weitere Codierungsmöglichkeiten wie bei MVC!
Befehl: MVZ
Typ:
(move zones; Übertragen Zonenteile)
SS (logisch)
•
3.4 Maschinenbefehle
83
Formate symbolisch: MVZ MVZ MVZ
Di (Li, B ^ , D 2 (B 2 ) S ^ L , ) , S2 S l S2
Format maschinenintern: L, 1 1. Byte
2. Byte
D, 3. Byte
D,
B, 4. Byte
S.Byte
6. Byte
Wirkungsweise: Die Instruktion bewirkt die Übertragung von Lj linken Halbbytes (Zonen) ab der durch + D 2 angegebenen Adresse in das mit + D, adressierte Feld, und zwar ebenfalls in die linken Halbbytes. Die Übertragung erfolgt von links nach rechts. Maximal können 256 Halbbytes übertragen werden. Codierungsbeispiele: MVZ
FELD(1 ),=X'F0'
Das linke Halbbyte der als Literal definierten Sedezimalkonstante FO, also das bit-Muster 1111, wird in das linke Halbbyte des mit FELD adressierten Byte übertragen. Es wird angenommen, daß FELD einen impliziten Längenschlüssel > 1 hat, weswegen hier explizite der Längenschlüssel 1 angegeben werden muß. MVZ
FELD1,FELD2
FELD1 habe die implizite Länge 3. FELD 1
FELD 2
FELDl nachher:
D
i
5
Weitere Codierungsmöglichkeiten wie bei MVC!
Befehl: MV0
(move with offset; Übertragen versetzt)
84
3. Die Programmiersprache ASSEMBLER
Typ:
SS (arithmetisch)
Formate symbolisch: MV0 MV0 MV0
D, ( L l B O , D 2 (L 2 , B 2 ) Sj (L^, S 2 (L 2 ) S l S2
Format maschinenintern: L, - 1 ! L2 - 1 1. Byte
2. Byte
B2
D. 3. Byte
4. Byte
d2
S.Byte
6. Byte
Wirkungsweise: Der durch (B2> + D2 adressierte zweite Operand wird, um ein Halbbyte nach links versetzt, in den mit + D t adressierten ersten Operanden übertragen. Die Verarbeitung verläuft von rechts nach links. 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. Codierungsbeispiele: MV0
FELD1,FELD2
Die Länge von FELD1 sei L, = 3, die Länge von FELD2 sei L 2 = 3. FEL02
FELD1
MV0
0(2,8),0(3,7)
(Reg. 7>
(Reg. 8>
85
3.4 Maschinenbefehle MV0
0(4,9),11(2,9) (Reg. 9> + 11
4 ! 1
0 i 0
;V/
1 0 1 4
1
! 4
1 4 ! F
F !
(Reg. 9> +0 MV0
RESULTO),RESULK2)
Wegbringen der l e t z t e n p e z i m a l s t e l l e : RESULTI2I
i : 2
i : s
3 !C
1. Operand
1 5 | C
1. Operand nach MV0
RESULTO)
0 1 1 RESULT
2 : • i
3.4.3.2 L a d e n v o n R e g i s t e r n , S p e i c h e r n v o n R e g i s t e r i n h a l t e n Befehl: LA Typ:
(load address; L a d e n Adresse)
RX
Formate s y m b o l i s c h 1 2 : LA LA LA 12
R I , D 2 ( X 2 , B2) Ri> S 2 ( X 2 ) Ri, S2
Neben diesen Standard-Formaten gibt es bei RX-Instruktionen noch folgende Sonderformen, deren Einsatz insbesondere beim LA-Befehl sinnvoll sein kann: Rl,D2(,B2) Rl,D2(X2) R1;D2
statt statt statt
R 1 ; D 2 ( 0 , B2) R1,D2(X2,0) R j , D 2 (0, 0)
86
3. Die Programmiersprache ASSEMBLER
Format maschinenintern: 4
Ri
! 1
i X2
+
1 1 1 l] 0 0 0 1
Reg. 6 (vorher) 0
0
0
0
0
0
0 0
0
0
0
0
1 1
1
1 0
0
0 0
0
0
1
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 0
0
0
0
0
0
0
0
0
0
0 0
1
1
1 1 0
0 0
0
0 0
1 0
0 0
8 7 6
1 1
1 1
5
0
0
0
0 0
4
3
2
1 0
1
0
0 0
1
Reg. 6 (nachher)
Befehl: LCR Typ:
(load complement; Umladen und Komplementieren)
RR
Format symbolisch: LCR
R h R2
Format maschinenintern: R, 1. Byte
2. Byte
Wirkungsweise: Der Inhalt des Registers R 2 wird komplementiert (d. h. positive Zahlen werden negativ und negative Zahlen werden positiv gemacht, vgl. dazu auch Seite 20) und in das Register R j geladen. Codierungsbeispiele: LCR
3,7
Reg. 7 0 0
0
31 31 1 1 1 Reg . 3
0 komplementiert
1 0 0
1 1
92
3. Die Programmiersprache ASSEMBLER
LCR
6,6
Reg. 6 1
1
1
1 0
1 0
31 komplementiert 31 0
0 0
0
0
1
•
Reg. 6
Befehl: LNR Typ:
Qoad negative; Umladen negativ)
RR
Format symbolisch: LNR R u R2 Format maschinenintern: R, 1. Byte
2. Byte
Wirkungsweise: Der Inhalt des Registers R 2 wird in das Register R j umgeladen. Ist negativ, so wird dieser Inhalt unverändert übertragen; ist positiv, so wird dieser Inhalt vorher komplementiert. Codierungsbeispiele: LNR
3,3
Der Inhalt des Registers 3 wird negativ gemacht oder bleibt negativ. LNR
7,1
Der Inhalt des Registers 1 wird nötigenfalls durch Komplementieren negativ gemacht und in Register 7 geladen.
3.4 Maschinenbefehle
93
Befehl: LPR Typ:
(load positive; Umladen positiv)
RR
Format symbolisch: LPR Rj, R 2 Format maschinenintern: ' I
i
, 0 1 1. Byte
R,
| R, I 2. Byte
Wirkungsweise: Der Inhalt des Registers R 2 wird in das Register R[ umgeladen. Ist positiv, so wird dieser Inhalt unverändert übertragen; ist negativ, so wird dieser Inhalt vorher komplementiert. Codierungsbeispiel: LPR
15,3
Der Inhalt des Registers 3 wird nötigenfalls durch Komplementieren positiv gemacht und in Register 15 geladen.
Befehl: LM Typ:
(¡oad multiple; Laden mehrfach)
RS
Formate symbolisch: LM LM
Ri, R 3 , D2 (B2) R,, R 3 , S 2
Format maschinenintern: 9
| 1. Byte
8
R,
1 j 2. Byte
1 R3
B:
> 3. Byte
4. Byte
3. Die Programmiersprache ASSEMBLER
94
Wirkungsweise: In die aufeinanderfolgenden Register R^ bis R 3 werden die Inhalte entsprechend vieler Speicherworte geladen, deren erstes mit (B2> + D 2 adressiert ist. Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44). Codierungsbeispiele: LM
7,10,15(2)
(Reg.2) +15
+16
+17
+18
+19
Reg. 7
+20
+21
+22
Reg. 8
LM
+23
+24
+25
Reg. 9
+26
+ 27
+28
+29
+30
Reg. 10
3,4,WORTE
Zwei Speicherworte ab der Adresse W0RTE werden in die Register 3 und 4 geladen.
Befehl: ST Typ:
(störe; Speichern Vollwort)
RX
Formate symbolisch: ST ST ST
R,, D 2 (X 2 , B 2 ) R!,S2(X2) R,, S 2
3.4 Maschinenbefehle
95
Format maschinenintern: 1 1 0
5
T
1 B2 ¡x
1
R, ] X2 2. Byte
1. Byte
3. Byte
- D2 i . 1 4. Byte
Wirkungsweise: Der Inhalt (alle 32 bits) des mit Rx adressierten Registers wird in das mit + (B2> + D 2 adressierte Wort gespeichert. Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44). Codierungsbeispiele ST
2.W0RT
Der Inhalt des Registers 2 wird in das mit W0RT adressierte Vollwort im Arbeitsspeicher übertragen. ST
5,W(7)
Der Inhalt des Registers 5 wird in das mit W + < Indexreg. 7 > adressierte Wort im Arbeitsspeicher übertragen.
Befehl: STH Typ:
(store halfword; Speichern Halbwort)
RX
Formate symbolisch: STH STH STH
R l t D 2 (X 2) B 2 ) R 1 ; S 2 (X 2 ) R u S2
Format maschinenintem: 4
! 0 l.Byte
Ri t» 2. Byte
». BÏ 1 — • D2 -!1 3. Byte 4. Byte
96
3. Die Programmiersprache ASSEMBLER
Wirkungsweise: Die niederstwertigen 16 bits des mit R; adressierten Registers werden in das mit + + D 2 adressierte Halbwort gespeichert. Programmierhinweis : Die Adresse des 2. Operanden muß auf eine Halb wortgrenze ausgerichtet sein (vgl. Seite 44). Codierungsbeispiel : ST H
5,HW0RT(6)
Register 5
0 0 0 0 1 0 10 0 0 1 0 1 0 10 0 0 1 1 1 10 10 0 0 0 0 10 1 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9
ooi
8
1 ! lioi
7
6
5
4
Befehl:
Typ:
(store character; Speichern Zeichen (Byte))
RX
Formate symbolisch: STC STC STC
R^D^Xj.Bj) R,, S 2 (X 2 ) R 1( S 2
Format maschinenintern: 1 2 1 1. Byte
Ri , X2 1 2. Byte
, • D2 -Il
CD
4
3. Byte
4. Byte
•
2
1
0
oooo ! oi o i
H WORT + (Indexreg. 6>
STC
3
97
3.4 Maschinenbefehle
Wirkungsweise: Die niederstwertigen 8 bits des mit R j adressierten Registers werden in das mit + + D2 adressierte Byte gespeichert. Codierungsbeispiel: STC
4.BVTE
Register 4
1 10 0 10 0 1 1 1 1 1 10 0 0 0 0 0 0 10 10 0 0 1 1 1 1 1 1 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 >958 4 3 2 1
I
0 0 11 ! 1 1 1 1 BYTE
Befehl: STM Typ:
(störe multiple; Speichern mehrfach)
RS
Formate symbolisch: STM R „ R 3 , D2 (B 2 ) STM R 1 ; R3, S2 Format maschinenintern: 1 9
1 i
0
1. Byte
R,
! R3 1 — 2. Byte
B2
I*
3. Byte
Dj
I
*
4. Byte
Wirkungsweise: Die Inhalte der aufeinanderfolgenden Register Ri bis R 3 werden in entsprechend viele Vollworte gespeichert, deren erstes mit (B2> + D 2 adressiert ist. Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44).
3. Die Programmiersprache ASSEMBLER
98 Codierungsbeispiel: STM
5,7,W0RTE
Reg. 5
WORTE +1
Reg. 6
+2
+ 3 + 4 + 5 + 6
Reg. 7
+7
+8
+9
+10
+11
Befehl: LER Typ:
(load register Single precision; Umladen kurz)
RR
Format symbolisch: LER
Ri, R 2
Format maschinenintern: 3
| 8 I 1. Byte
R,
| R, l 2. Byte
Wirkungsweise: Der Inhalt des Gleitpunktregisters R 2 wird in das Gleitpunktregister Ri geladen, und zwar nur der Inhalt der bit-Positionen 63 bis 32. Die bit-Positionen 31 bis 0 bei R t sind nach dieser Operation unverändert. Codierungsbeispiel: LER
0,6
GP-Register 6 63
GP-Register 0
55
32 31
^
0
V" unverändert
99
3.4 Maschinenbefehle
Befehl: LDR Typ:
(load register double precision; Umladen lang)
RR
Format symbolisch: LDR R1; R2 Format maschinenintern: 2 , 8
R,
i
1. B y t e
,
R,
I
2. B y t e
Wirkungsweise: Der Inhalt des Gleitpunktregisters R 2 wird in voller Länge in das Gleitpunktregister R ] umgeladen. C odierungsbeispiel: LDR
4,2
GP-Register 2 63
55
0
63
55
0
GP-Register 4
Befehl: LE Typ:
(load Single precision; Laden GP-Wort)
RX
Formate symbolisch: LE LE LE
Ri, D 2 (X 2 , B 2 ) Ri, S 2 ( X 2 ) Rj, S2
100
3. Die Programmiersprache ASSEMBLER
Format maschinenintern: 7
; 8 1
I B, U
Ri ,« X2
1. Byte
•
2. Byte
3. Byte
1 " D> 1
•
4. Byte
Wirkungsweise: Der Inhalt des mit (X2> + + D2 adressierten Speicherwortes (32 bits) wird in die bit-Positionen 63 bis 32 des Gleitpunktregisters geladen. Die bitPositionen 31 bis 0 von R j sind nach dieser Operation unverändert. Programmierhinweis: Die Adresse des 2. Operanden ist auf eine Wortgrenze auszurichten (vgl. Seite 44). Codierungsbeispiel : LE
2,W0RT
WORT
GP-Register 2
V
unverändert
Befehl: LD Typ:
(load double precision; Laden GP-Doppelwort)
RX
Formate symbolisch: LD LD LD
R1;D2(X2,B2) R|, S 2 (X 2 ) R,, S 2
Format maschinenintern: 1
1
6
! 1. Byte
8
Ri
! X2 1 2. Byte
B2
1 I1 3. Byte
D,
i
1 4. Byte
101
3.4 Maschinenbefehle
Wirkungsweise: Der Inhalt des mit + + D 2 adressierten Doppelwortes im Arbeitsspeicher (64 bits) wird in das Gleitpunktregister R[ geladen. Programmierhinweis: Die Adresse des 2. Operanden ist auf eine Doppelwortgrenze auszurichten (vgl. Seite 44). Codierungsbeispiel: LD
4,DW0RT(1 )
DW0RT + < Indexreg, 1)
GP-Register 4
Befehl: STE Typ:
(störe Single precision; Speichern GP-Wort)
RX
Formate symbolisch: STE STE STE
R „ D2 (X2, B 2 ) Rj, S 2 (X 2 ) Ri, S 2
Format maschinenintern:
1. Byte
2. Byte
3. Byte
4. Byte
3. Die Programmiersprache ASSEMBLER
102
Wirkungsweise: Der Inhalt der bit-Positionen 63 bis 32 des Gleitpunktregisters R^ wird in das mit + + D2 adressierte Speicherwort gespeichert. Programmierhinweis: Die Adresse des 2. Operanden ist auf eine Wortgrenze auszurichten (vgl. Seite 44). Codierungsbeispiel: STE
0,W+4
GP-Register 0 63 55
32 31
W+4
0
« l»
i 1
l i , 1
!
Befehl: STD Typ:
(störe double precision; Speichern GP-Doppelwort)
RX
Formate symbolisch: STD R j . D j i X j , B2) STD R l t S 2 (X 2 ) STD R[, S 2 Format maschinenintern:
1. Byte
2. Byte
3. Byte
4. Byte
Wirkungsweise: Der Inhalt des Gleitpunktregisters wird in das mit + + D2 adressierte Doppelwort im Arbeitsspeicher gespeichert.
3.4 Maschinenbefehle
103
Programmierhinweis: Die Adresse des 2. Operanden ist auf eine Doppelwortgrenze auszurichten (vgl. Seite 44). Codierungsbeispiel: STD
6,D+8(7)
GP-Register 6 63
55
32 31
0
v D+8+ (Indexreg. 7 >
1i i 1
1
1
i I 1
i t I
1
_ i
I i
11
1
I
i i I
i i I
1
i i I
r
> i L
3.4.3.3 Codetransformationen Befehl: PACK Typ:
(pack; Packen von gezonten Dezimalzahlen)
SS (arithmetisch)
Formate symbolisch: PACK D 1 ( L 1 , B i ) , D 2 ( L 2 , B 2 ) PACK Si(L,), S 2 (L 2 ) PACK S 1; S 2 Format maschinenintern: L, l.Byte
L,- 1 2. Byte
3. Byte
4. Byte
5. Byte
6. Byte
Wirkungsweise: Der durch + D2 adressierte 2. Operand wird (normalerweise) in der Länge L2 aus der gezonten in die gepackte Form überfuhrt und in das durch (B,) + Dj adressierte Feld gespeichert. Die Verarbeitung verläuft byteweise von rechts nach links, also entgegengesetzt wie z. 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.
104
3. Die Programmiersprache ASSEMBLER
Beispiele für gezonte und gepackte Zahlenfelder: —
gezonte Zahl
gepackte Zahl
;—TT——i-]—1—r-i—|
—i——i— i |
F | 0 F ; 0 F | 7 F | 2 D | 5
1 ¡0
Voizeichen
4 13
1 ¡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. Programmieihinweis: 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: Li = [(L2 + 2)/2]. Ist die Länge des sendenden Feldes eine gerade Zahl, dann werden im empfangenden Feld L2 Halbbytes mit Ziffern, 1 Halbbyte mit dem Vorzeichen und 1 Halbbyte mit einer führenden 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 für L, und L2 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
1. Operand
3.4 Maschinenbefehle
PACK
REFE1.ZAHLEN
Die Länge von REFE1 sei 4, die Länge von ZAHLEN sei 5 ZAHLEN F|1
I — — 11— — 1— — r1— ~ F | 7 F', 3 F | 0 F ; s i 1 i
0 «¡ 0
«¡7
— r ~
3 | 0
1. Operand (wird mit führenden Nullen aufgefüllt).
5|F
PACK
2. Operand
REFE2,ZAHLEN
Die Länge von REFE2 sei 2, die Länge von ZAHLEN sei 5 1 F Î1
F|7
F|3
—i— 1 F •: o F | 5
1. Operand (die höherwertigen Ziffern 1 und 7 des 2. Operanden werden nicht berücksichtigt).
REFE2
PACK
2. Operand
REFE1.ZAHLEN1
Die Länge von REFE1 sei 4, die Länge von ZAHLEN 1 sei 6
2. Operand
—1— —i— U|4 3 ; i •
PACK
1 |F
1. Operand (wird mit einer fuhren den Null aufgefüllt).
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 BETRAG gepackt werden.
106
3. Die Programmiersprache ASSEMBLER
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 < Reg. 8 > + 0 adressierte Feld der Länge 4 sollen 6 Bytes aus dem mit < Reg. 8 > + 3 adressierten Feld gepackt werden. PACK
FELD+27 (5),BETRAG
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, (Li, BO, D2 (L 2 , B 2 ) S! (L,), S 2 (L 2 ) Sj, S 2
Format maschinenintern: Li - i ! L2 - 1 1. Byte
2. Byte
D, 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 gepackten in die gezonte Form überfuhrt und in das durch (Bj) + Di adressierte Feld gespeichert. Die Verarbeitung verläuft von rechts nach links, also entgegengesetzt wie z. 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.
3.4 Maschinenbefehle
107
Ist der 1. Operand zu kurz, um alle Ziffern aufzunehmen, so werden die (linken) höherwertigen Ziffern des 2. Operanden nicht berücksichtigt.
Programmierhinweis: Die genau passende Länge des empfangenden Feldes errechnet sich wie folgt: Länge des empfangenden Feldes = Länge des sendenden Feldes » 2 — 1 oder kürzer: Li = 2*L 2 — 1. Die maximalen Werte für L! und L 2 sind je 16! Codierungsbeispiele: UNPK
ZAHLEN,REFE
Die Länge von ZAHLEN sei 5, die Länge von REFE sei 3. REFE 2. Operand
1. Operand ZAHLEN
UNPK
ZAHLEN1,REFE
Die Länge von ZAHLEN1 sei 6, die Länge von REFE sei 3. 2. Operand
F
!
F
0
1 ! I
0
1 ; i
F
F
1 | 3 1
F
|
7
ZAHLEN1
UNPK
C
! 7
1. Operand (wird mit einer führenden Null aufgefüllt).
ZAHLEN2,REFE
Die Länge von ZAHLEN2 sei 4, die Länge von REFE sei 3. — 7
1
i 3
1
!
^ A . 3/
N
, F
! I
/ 1
2AHLEN2
1
F
;
3
2
F
1 ;
i
8
1 |
D
X
D
\
8
2. Operand
1. Operand (die Ziffer 7 des 2. Operanden wird nicht berücksichtigt).
108
3. Die Programmiersprache ASSEMBLER
UNPK
FELDA+4(7),FELDB+2(4)
In das Feld mit der symbolischen Adresse FELDA+4 und der Länge 7 sollen 4 Bytes aus dem Feld mit der symbolischen Adresse FELDB+2 entpackt werden.
Befehl: ED
Typ:
(edit packed data; Aufbereiten gepackter Zahlen zum Drucken)
SS (logisch)
Formate symbolisch: ED ED ED
D, (Li, Bj), D 2 (B 2 ) S, (L,), S 2 Si, S 2
Format maschinenintern: L, - 1 ]. Byte
2. Byte
D, 3. Byte
4 . Byte
S.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 (Bj) + Ü! 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 fuhrende Nullen durch Füllzeichen ersetzt werden. Die Maske (Schablone) kann aus folgenden Zeichen bestehen: (1)
Einfugungszeichen (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')
3.4 Maschinenbefehle
109
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.
(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 Einfiigungszeichen 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 Einfügungszeichen 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 L! kann höchstens L! — 1 Ziffern aufnehmen, da das 1. Byte für das Füllzeichen reserviert ist.
Codierungsbeispiele:
(1)
Maske l-iVVVV MVC
DRBER+1(5),MASKE
ED
DRBER+K5),ZAHLEN
MASKE
DC
X'4020202020'
ZAHLEN
DS
CL4
110
3. Die Programmiersprache ASSEMBLER ZAHLEN 1 0 | 0 l\
4 ! 0
1 i ; i 2\
2
I. Operand (nach MVC)
2 : o
2
4 \ 0
4 ! 0
1 F' ! 1 I
Maske
\
0
F
\o
1 :
1
11
Druckbild:
MASKE REFE
2. Operand
2 10
DRBER+1
(2)
11 7 1 C
3\
DRBER+1
1 4 | 0
4 ! 5
i_j V,V [ V.VV MVC ED
DRBER+1 (9),MASKE DRBER+1(9),REFE
DC DS
X'40206B2021204B2020' CL4
I. Operand (nach ED)
111
3.4 Maschinenbefehle
(3)
Maske vgl. (2) REFE 0
1_ i : o
0
3 : i
7 !D
3\
6
DRBER+1 4 \ 0
2
6
B
2
0
2
°
.
4 »! 0 DRBER+1
4
4
0
Druckbild:
(4)
0
4
\'
2 \ 0
\
F 11
1 F 1 0
0 ; 1
7 ! C
0
l 4 ;B
2 l 0
4 ! B 1
F
3
F : i
4 ! B i
2 \0 il
2 ^0
\
0
1 N 1\
10.31
Maske vgl. (2) REFE 0
0
0 2
DRBER+1
-T
\
0
\
®
/
4 ; 0
2
o
6
4 «! 0 DRBER+1
4
0
4 ! 0 1
B
2
0
1 2 : i
4
0
4
2 i 0 ll
\
Druckbild:
.. J
0
! F ! 0
i 4 iB 1
0.01
Kennzeichnung von negativen Beträgen (5)
2
Maske:
BETRAG
uj[v.VVV-
MVC ED
D R B E R + 1 (8),=X'4021204B20202060' D R B E R + 1 (8),BETRAG
DS
CL3
\
l \ \ F 11 F ; o i
3. Die Programmiersprache ASSEMBLER
112
BETRAG
Druckbild:
13.578-
Die Nullenunterdrückung wird nicht wieder eingeschaltet, da hier ein negativer Betrag vorliegt; also werden alle nachfolgenden Zeichen gedruckt.
(6)
Maske vgl. (5) BETRAG 1 1 i! ' 1 /
DRBER+1 1 4 ; 0
4 | 0 i DRBER+1
• : 7
1
\'
2 \ 0
F !1
i F l 1 1
Druckbild:
5
3\
/
2
4 ; C
1
i 4 \B
4 :B
2^0
\\ F !1
2
\
0
1 f i ^
2 1 0 Ii
F ]4 i
6 j 0
I 4 | 0
11.174
Die Nullenunterdrückung wird wieder eingeschaltet, da hier ein positiver Betrag vorliegt; also werden auch alle nachfolgenden Einfügungszeichen durch das Füllzeichen (hier blank) überschrieben. Schreiben von Schutzsternen: (7)
Maske:
*VVV[V.VV *
MVC
DRBER+K10), MASKE
3.4 Maschinenbefehle
SUMME MASKE
ED
DRBER+1 (9),SUMME
DS DC
CL4 X'5C20202021204B20205C' 1 j 0 1
0
—r 5 ; c
o
2
c L_
5
*>
113
0
0
2
C
5
» ;
5
! c
L
Drockbüd:
-1 ; 3
1
! i
1
4
c C l
KU K 0
2
c
F
\
1 2 \ 0
| 3 i
1 i i
F
1 4 jB
2 \ 0
4
F
1
|
B
1 ; 4
...
2
\o
i
F I! '
,
s ; c
T
S
| C
• • • • 31.41
Der letzte Stern wird von der Wiedereinschaltung der Nullenunterdrückung durch den positiven Betrag nicht berührt; denn die ED-Operation geht hier nur über 9 Bytes. Einfügen von Texten: (8)
Maske:
ERGEBN SCHABL
ljYVVBISV[V
MVC ED
DRBER+1 (10) ,SCH ABL DRBER+1 (10),ERGEBN
DS DC
CL4 X'40202020C2C9 E2202120'
/r
ERGEBN 1 i 1/
JRBER+l 4
j
0
)RBER+1 4
| 0
2
F
!
4
1
0
l \U 0
\
:
1
Druckbild:
2
F
°
2
!^
F
1
,\ 0
i
;
i
i
141BIS041
4
:
i
i
3
4
c
C
!
2
C
1 2
C
1
:
i
c
'
^
!
1
|
i
9
E
|
2
9
E
;
2
\uu 2
F
i
0
2
0
F
1 1
1
| 4
2
F
\
0
> 1 i
114
3. Die Programmiersprache ASSEMBLER
(9)
Maske: i _ i W V B I S ] v [ v
ERGEBN MASKE
MVC ED
DRBER+K11), MASKE DRBER+K11),ERGEBN
DS DC
CL4 X'40202020C2C9E222202120'
ERGEBN i
1 DRBER+1
4 ; o
4
2 /
i : o i
4
2
!\
F
1 ' i
o
2
\ 1
F
:
3
1 ;
c
C
1 !
2
C
i 1
9
E
2
2
c
;
2
c
!
9
E ; 2
4
\ 4
F
|
Druckbild:
(10) Maske vgl. (9) ERGEBN
.
4
0
\
!
3\
tf
DRBER+1
4 ! 0
/
: i
1
14 IBIS
41
;
I
1 |
2
2
0
4
|
2
\
1
2
F
J
4
F
\
\\\\ 0
1 |
3.4 Maschinenbefehle
115
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
RLDjO^BJ) Rj, S 2 (X 2 ) R l S2
Format maschinenintern:
1. Byte
: . Byte
3. Byte
4 . Byte
Wirkungsweise: Der Inhalt des mit + 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 Zugleich ist mit der Tabellenzahl O.tt . . . t * 1 6 ± s ( + 1 ) der entsprechende Exponent ±d zur Basis 10 bekannt. Die Umwandlung O.yy . . . y * 1 6 ° ergibt eine Dezimalzahl O.xx . . . x*10°. Diese wird mit 10 hoch ±d multipliziert, und man erhält die gesuchte Dezimalzahl.
* >
U M W A N D L U N G VON O E Z I M A L Z A H L E N
CNVTDEGP
PCK
MVIGW
*
TAB
STH LA MV I MVC CLI BE MVI PACK MVC ZAP MV0 CVB ST MVC LD S BAL LDR MVI ZAP CVB ST MVC LD S BAL ADR LM BR LPR M C
2.7.RETT27 6.PTABLE+600 GW,X'481 G W + 5 ( 3 ) ,»3X'00 1 VZ,C'+' PCK GW , X 1 C 8 1 F9.F16 MVIGW+1(1),GW " ,»P 1 0 1 DW D W + 3 ( 5 ) ,F9(5) 3 ,DW 3,FW GW+1(4),FW 2 ,GW 4 , = F1 9 1 7 ,TAB 0,2 GW ,X 1 48 1 DW ,F9 + 5(4) 3 ,DW 3 ,FW GW+1(4),FW 2,GW 4 , = F' 7 1 7 ,TAB 0,2 2.7.RETT27 11 3,4 2 , = F1 81 4 , =F101
IN G P - Z A H L E N (1) (2) (3) (4) (5) (6) (7 (8) (10) (11) 12) (13) (14) (15) (16) (17 (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32)
120
DIVID EXITTAB
3. Die Programmiersprache ASSEMBLER BL MD B DD BR
» * UMWANDLUNG CNVTGPDE
CD1
SUCHTAB CD
GEFUNDEN
LPR45
MANTISSE
ST7
DIVID 2,0(3,6) EXITTAB 2,0(3,6) 7
V0N G P - Z A H L E N
IN D E Z I M A L Z A H L E N
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 LPR LM LM BR
2,7,RETT27 VZ(2) , = C 1 ++ 1 4,=F'600 1 6,=D101 CD1 VZ.C'-' 6,6 6 ,=D ' 1 ' SUCHTAB VZE ,C1 - ' 4,4 7,=F'76' 6,PTABLE(4) GEFUNDEN 4,8(4) 7,CD 6,PTABLE(4) 4,32 4,=F181 5,=F'75 1 2,MANTISSE F9(5),DW+3 F9+4(1),=X100' F9+5(4), = P101 GW+1(7),FW7 6 ,GW 2,MANTISSE F9,DW+3(5) F16.F9 F16+15(1),=X1FF1 F16 , B 1 0 0 0 0 1 1 1 1 ' LPR45 F16(16),F16+1 5 , = F ' 11 4,5 2,3,RETT27 5,7 ,RETT27 + 12 11
MD STD LM SLDL SRDL CD BNL SRDL ST CVD BR
6.PTABLE+664 6 ,GW 6 ,7 ,GW 6,8 6,4 6.K0N471 ST7 6,4 7 ,FW7 6 ,DW 2
* K0NSTANTEN UND
*
(33) (34) (35) (36) (37)
BEREICHE
(38) (39) (40) (41) (42)
SSI
(45) (46) (47) (48) (49) (50) (51) (52) (53) (54) (55)
i"! (58) (59)
181 (62) (63) (64) (65) (66)
(67) (68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (78) (79) (80)
ill! (83) (84) (85) (86)
3.4 Maschinenbefehle
PTABLE
K0N471 GW DW FW FW7 F16 F9 VZ VZE RETT27
121
DC DC DC
D'lE-75' D'1E-74' D'1E-73'
DC DC DC DS DS DS DS DC DS DC DS DS DS DS
D11E741 D'1E75' X'47100 D D F F 3X100' CL16 X' F01 CL9 CL1 CL1 6F
Kommentare zu den Instruktionen der Programmstücke CNVTDEPG und CNVTGPDE: ( 1 ) Retten der Registerinhalte 2 bis 7 in das Feld RETT27. ( 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 0100 1000 (sedezimal: 48) in das erste Byte von GW gebracht, um vorab ein positives Mantissenvorzeichen 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 • 167 entsteht. ( 4 ) Die letzten 3 Bytes von GW werden mit sedezimalen Nullen aufgefüllt, weil diese Stellen nicht benötigt werden. ( 5 ) Prüfen, ob die Dezimalzahl tatsächlich positiv ist. ( 6 ) Wenn ja, dann Sprung nach PCK. ( 7 ) Andernfalls wird in das erste Byte von GW das bit-Muster 1100 1000 (sedezimal: C8) gebracht, um ein negatives Mantissenvorzeichen und den Exponenten 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 Instruktion mit der Adresse MVIGW. (10)
dw
1 0 j 0
i 0 |0 1
0
0
o j o !
i o ; o 1
•i 0 | 0 I
1 0 10 1
1 0 I c
122
3. Die Programmiersprache ASSEMBLER
(11) Die ersten 5 Bytes (9 Dezimalziffern und eine führende Null) werden aus F9 um ein Halbbyte nach links versetzt nach DW gebracht. F9
+1
+2
+3
+4
(12) 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. und 5. Byte von GW. (15) Laden der sedezimalen Gleitpunktzahl aus GW in das Gleitpunktregister 2. (16) Vermindern des dezimalen Exponenten in Register 4 um 9. Dies geschieht für den späteren Ausgleich des Fehlers, der dadurch entsteht, daß die ersten 9 Mantissenstellen der Zahl 0.x.. .x • 10° bei der Konvertierung in eine Dualzahl (Sedezimalzahl) wie eine Dezimalzahl der Form xxxxxxxxx oder 0.xxxxxxxxx • 109 behandelt werden. Später wird die zu dieser Dezimalzahl equivalente Sedezimalzahl in GP-Register 2 durch 109 dividiert. (17) Sprung in das Programmstück TAB, um die zum Exponenten der Dezimalzahl gehörige sedezimale Gleitpunktzahl zu ermitteln, mit der dann der Inhalt des Gleitpunktregisters 2 im Wege der Multiplikation bzw. Division korrigiert wird. (18) Umladen des Inhalts des Gleitpunktregisters 2 in das Gleitpunktregister 0, weil dort die sedezimale Gleitpunktzahl erscheinen soll. (19) vgl. (3) bzw. (7). (20) Übertragen der letzten 4 Bytes (7 Dezimalziffern und Vorzeichen) aus F9 rechtsbündig und mit führenden Nullen nach DW. F9
j 0 i' 0 DW
0 1 0 +1
1
0 | 0 +2
N0 j >0 •
+3
X
+5 1 | X
+6 X
1' X
j +4
X
X
+7
1 1 X
[ +5
X
1
1r
X
X
1 X
+8 1
x | C
i \ X 1 +6
x ; C +7
3.4 Maschinenbefehle
123
(21) Vgl. (12) (22) vgl. (13) (23) vgl. (14) (24) vgl. (15) (25) Vermindern des dezimalen Exponenten in Register 4 um weitere 7. Die restlichen 7 Mantissenstellen der Dezimalzahl 0.x.. .x • 10° entsprechen einer Dezimalzahl der Form O.OOOOOOOOOxxxxxxx•10° oder O.xxxxxxx-10~ 9 . Sie werden bei der Umwandlung in eine Dualzahl (Sedezimalzahl) wie eine Dezimalzahl der Form xxxxxxx oder O.xxxxxxx • 10 7 behandelt. Später wird die zu dieser Dezimalzahl äquivalente Sedezimalzahl in GP-Register 2 durch 10 1 6 dividiert. (26) vgl. (17) (27) Addieren des Inhalts des Gleitpunktregisters 2 auf den Inhalt des Gleitpunktregisters 0, in welchem jetzt die gesuchte sedezimale Gleitpunktzahl steht. (28) Wiederherstellen der alten Registerinhalte 2 bis 7. (29) Sprung aus dem Unterprogramm. (30) Umladen des dezimalen Exponenten aus Register 4 in das Register 3, wobei dieser nötigenfalls in eine positive Dualzahl komplementiert wird. (31) Multiplikation des Registerpaares 2, 3 mit einer dualen 8, wodurch in Register 3 die relative Adresse der zugehörigen sedezimalen Gleitpunktzahl in der Tabelle PTABLE entsteht. (32) Prüfen, ob der Exponent in Register 4 negativ ist. (33) Wenn ja, dann Sprung nach DIV. (34) Multiplikation des Inhalts des Gleitpunktregisters 2 mit der zum dezimalen Exponenten gehörigen Sedezimalzahl aus der Tabelle PTABLE, die mit < Reg. 3 > + < Reg. 6 > adressiert wird. (35) Verzweigen nach EXITTAB. (36) Division . . . analog (34). (37) Rücksprung aus der Routine TAB. (38) vgl. (1) (39) Die Vorzeichen der dezimalen Mantisse und des Exponenten werden vorab als positiv angenommen. (40) Laden einer 600 in das Indexregister 4, um auf den Tabellenwert 10° zu kommen. (41) Vergleichen des Inhalts des GP-Registers 6 mit Null.
124
3. Die Programmiersprache ASSEMBLER
(42) Sprung nach CD1, wenn der Registerinhalt größer oder gleich Null (positiv) ist. (43) Wenn der Registerinhalt kleiner als Null (negativ) ist, dann wird ein „—"•Zeichen nach VZ gebracht. (44) Der Inhalt von GP-Register 6 erhält ein positives Vorzeichen. (45) Vergleichen des Inhalts von GP-Register 6 mit einer Eins. (46) Sprung nach SUCHT AB, wenn der Registerinhalt größer oder gleich Eins ist, d.h. einen positiven Exponenten hat. (47) Ist der Registerinhalt kleiner 1, dann ist der Exponent negativ, und es wird ein „-"-Zeichen nach VZE gebracht. (48) Das Indexregister 4 wird gelöscht, um auf den Tabellenwert 10 - 7 5 zu kommen. (49) In den Schleifenzähler Register 7 und eine 76 laden. (50) Vergleichen der Gleitpunktzahl im GP-Register 6 mit einer indexadressierten Gleitpunktzahl aus der Dezimal-Sedezimal-Tabelle PTABLE. (51) Sobald die Gleitpunktzahl in Register 6 kleiner ist als eine Gleitpunktzahl aus der Tabelle, wird nach GEFUNDEN gesprungen. (52) Ist die Gleitpunktzahl in Register 6 noch größer oder gleich einem Tabellenwert, wird der Inhalt des Indexregisters 4 um 8 erhöht, um die nächst größere Gleitpunktzahl in der Tabelle zu adressieren. (53) Der Schleifenzähler (Reg. 7 > wird um eine Eins vermindert und auf Null geprüft; wenn 0 ist, dann Sprung nach CD; auf diese Weise wird die Schleife (50) bis (52) maximal 76mal durchlaufen. (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 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
0 |X
+1
"T XjX
+:
X 1| X
+3
1 X ] X 1
+4
1 X !±
3.4 Maschinenbefehle
125
(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 T
o ;
x
X
+1 —r i I
X
X
+2 1 1 1
+3 X
1 X 1
+4 X
x
DW+
+
! 0
+5 • i
o ; o
3 (x)
;
x
+6 !
o i; o
+4 l X
\ •
+7
o !o
+5 1 X
X
[ »
+8
+6 1 X
X
J
o ! c +7
X
x
;
(66) Entpacken des Inhalts von F9 nach F16. (67) Überschreiben des Vorzeichens in F16 mit dem bit-Muster 1111 (sedezimal: F). (68) Prüfen, ob das erste Byte von F16 eine Null enthält. (69) Wenn nein, Sprung nach LPR45. (70) Wenn ja, Inhalt von F16 um eine Stelle nach links versetzen und (71) vermindern des dezimalen Exponenten in FP-Register 5 um 1. (72) Umladen des dezimalen Exponenten mit positivem Vorzeichen nach FP-Register 4. (73) Wiederherstellen der alten Registerinhalte 2 und 3. (74) Wiederherstellen der alten Registerinhalte 5 bis 7. (75) Rücksprung aus dem Unterprogramm. (76) Unterprogramm zur Konversion der sedezimalen Mantisse: Multiplikation des Inhalts von GP-Register 6 mit 108. Grund: Die sedezimale Mantisse der Zahl O.y.. .y • 16° wird in 2 gleichen Teilen zu je 7 Sedezimalziffern konvertiert, wodurch jeweils 8 Dezimalziffern entstehen.
C
126
3. Die Programmiersprache ASSEMBLER
Es wird also eine Dezimalzahl der Form O.xx... x • 10 16 erzeugt, deren 16 Stellen die gesuchte Mantisse bilden. Die Mantisse der Sedezimalzahl O.y.. .y • 16° ist also um den Faktor 10 16 zu klein, weswegen jede Teilmantisse mit 108 zu multiplizieren ist. (77) Speichern des Inhalts von GP-Regjster 6 nach GW. (78) Laden des Inhalts von GW in die FP-Register 6 und 7. (79) Herausschieben der Charakteristik durch logische Linksverschiebung der Gleitpunktzahl in FP-Register 6 und 7 um 8-bit-Positionen. (80) Logische Rechtsverschiebung der Mantisse in FP-Register 6 und 7 um 4-bit-Positionen. Reg. 6 0
X
X
X
Reg. 7 X
X
X
X
X
16*
X
X
X
X
X
X
0
16°
(81) Prüfen, ob nach Multiplikation mit 108 der Stellenwert der ersten Sedezimalziffer der Mantisse tatsächlich 166 ist. (82) Wenn ja, dann Sprung nach ST7. (83) Wenn der Stellenwert aufgrund maschineninterner Abrundungsfehler nur 165 ist, dann logische Rechtsverschiebung der Mantisse in FP-Register 6 und 7 um weitere 4-bit-Positionen. ^ O
Reg. 6 O
x 16 s
x
x
x
Reg. 7 x
x
x
x
x
x
x
x
x
x
16°
(84) Speichern des zweiten Teils der Mantisse aus FP-Register 7 in FW7. (85) Konvertieren des Inhalts von FP-Register 6 in eine Dezimalzahl. (86) Rücksprung aus dem Unterprogramm. Betrachtet man die Länge dieser Routinen, so wird sofort deutlich, daß die Anwendung der sedezimalen Gleitpunktarithmetik nur dann gerechtfertigt ist, wenn relativ wenige Eingabedaten einer relativ großen Anzahl von Rechenoperationen unterzogen und dabei wenige Ausgabedaten erzeugt werden. Ferner ist die Gleitpunktarithmetik dann unumgänglich, wenn in einem Datenverarbeitungsproblem Zahlengrößen auftreten, die mit der dezimalen oder dualen Festpunktarithmetik nicht mehr zu bewältigen sind. In allen anderen Fällen wäre die Anwendung der sedezimalen Gleitpunktarithmetik allein wegen des mit der Codetransformation verbundenen Maschinenzeitaufwandes unwirtschaftlich.
3.4 Maschinenbefehle
127
3.4.3.4 Shift-Operationen in Festpunktregistern Befehl: SRA
Typ:
(shift right Single algebraical; algebraische Rechtsverschiebung eines Registerinhalts)
RS
Formate symbolisch: SRA SRA
Ri, D 2 (B 2 ) Rj, D 2
Format maschinenintem : 8
!
!
A
R,
1. Byte
! 1
0
2. Byte
B2
11 11 k——• 1
3. Byte
1 D, -1 I
•
4. Byte
Wirkungsweise: Der Inhalt der bit-Positionen 0 bis 30 des Registers R, wird um + D 2 Stellen nach rechts verschoben; der zweite Operand ist also keine Arbeitsspeicheradresse, sondern eine Verschiebezahl. Von links werden bits nachgezogen, die den Wert des Vorzeichen-bit haben. Das Vorzeichen-bit in Position 31 bleibt jedoch unverändert. Die rechten bits gehen verloren. Codierungsbeispiel: SRA
3,0(8)
Der Inhalt des Registers 8 sei 2; dann wird der Inhalt des Registers 3 algebraisch 2 Stellen nach rechts verschoben.
Befehl: SLA
(shift left single algebraical; algebraische Linksverschiebung eines Registerinhalts)
128
3. Die Programmiersprache ASSEMBLER
Typ:
RS
Formate symbolisch: SLA SLA
R 1 ; D 2 (B 2 ) R „ D2
Format maschinenintern : ; i
B
R,
1 • Byte
|
0
2. Byte
D,
00
8
3. Byte
I
-j
•
4. Byte
Wirkungsweise: Der Inhalt der bit-Positionen 0 bis 30 des Registers R, wird um + D2 Stellen nach links verschoben; der zweite Operand ist also keine Arbeitsspeicheradresse, sondern eine Verschiebezahl. Von rechts werden Nullen nachgezogen. Die linken bits gehen verloren; das Vorzeichen-bit in Position 31 bleibt jedoch unverändert. Codierungsbeispiel: SLA
5,3
Der Inhalt des Registers 5 wird algebraisch um 3 Stellen nach links verschoben. 31
Befehl: SRDA
Typ:
RS
(shift right double algebraical; algebraische Rechtsverschiebung im Doppelregister)
3.4 Maschinenbefehle
129
Formate symbolisch: SRDA SRDA
Rj, D 2 (B2) Rj, D 2
Format maschinenintem: R, 1. Byte
D,
2. Byte
3. Byte
4. Byte
Wirkungsweise: Der Inhalt des mit R[ adressierten Registerpaares R,, R , + 1 wird um soviele Stellen (bit-Positionen) nach rechts verschoben, wie der Wert + D 2 angibt; der 2. Operand ist also keine Arbeitsspeicheradresse, sondern eine Verschiebezahl. R! muß stets eine gradzahlige Registernummer sein. Der Inhalt aller 63 Stellen des Registerpaares wird verschoben. Die Vorzeichenstelle in bit-Position 31 des Registers R! bleibt unberührt. Von links werden bit-Werte nachgezogen, die der Vorzeichenstelle entsprechen, also binäre Nullen bei „+" und binäre Einsen bei „—". Codierungsbeispiel: SRDA
4,3
Reg. 4
Reg. 5
11110 1 1 0
0 0 110 1
Reg. 4
1 0
1 0 0
Reg. 5
Befehl: SLDA Typ:
(shift left double algebraical; algebraische Linksverschiebung im Doppelregister)
RS
Formate symbolisch: SLDA SLDA
Ri, D 2 (B 2 ) R „ D2
130
3. Die Programmiersprache ASSEMBLER
Format maschinenintern: - 1
8
I I
;
R,
F
1. Byte
o
2. Byte
1
Ba
!•"
•
D,
3. Byte
-1
•
4. Byte
Wirkungsweise: Der Inhalt des mit R! adressierten Registerpaares R,, R, + 1 wird um soviele Stellen (bit-Positionen) nach links verschoben, wie der Wert + D 2 angibt; der 2. Operand ist hier also keine Arbeitsspeicheradresse, sondern eine Verschiebezahl. R j muß stets eine gradzahlige Registernummer sein. Der Inhalt aller 63 Stellen des Registerpaares wird verschoben; die Vorzeichenstelle in bitPosition 31 des Registers R j bleibt unberührt. Von rechts werden Nullen nachgezogen. Codierungsbeispiel: SLDA
12,0(5)
Es sei (Reg. 5> = 2; dann wird der Inhalt des Doppelregisters 12, 13 um 2 bit-Positionen nach links verschoben. Reg. 12
Reg. 1 3 '
Reg. 12
Reg. 13
Befehl: SRL
Typ:
(shift right Single logical; logische Rechtsverschiebung eines Registerinhalts)
RS
Formate symbolisch: SRL SRL
R „ D 2 (B 2 ) R „ D2
131
3.4 Maschinenbefehle
Format maschinenintern: 1 !
8
8
1 ;
R,
1. Byte
o
1
B,
2. Byte
' L 2 sein. Die maximale Länge der Operanden beträgt jeweils 16 Bytes. Codierungsbeispiele: AP
SUMME,ZAHL
Die Länge von SUMME sei 3, die Länge von ZAHL sei 2. SUMME -1 0 j
SUMME 4
i
;
2
3
+
i
3
2
: 3 •
;
c
3 ; o
1
5
1
0
! 3
! C i
1 0 ID
2
1
2
5 !C
i ! i
+
ZAHL
SUMME =
1 i
0
1 2 '
4
:
5
SP
8
1 ' C
i
DIFF,=X'017C'
Die Länge von DI FF sei 2: DIFF 0
! 1 3
o
DIFF
0
0
i
F
|
C
1
2
; i
] I
7
SUMME i 2 j 9 1
• 9
i | 0 I
| 5
l | D I
134
3. Die Programmiersprache ASSEMBLER
AP (Reg. 8 )
0(3,8),3(3,8)
+1
+2
+3
Befehl: ZAP Typ:
(zero and add packed; Nullsetzen und Addieren)
SS (arithmetisch)
Formate symbolisch: ZAP ZAP ZAP
Di (L ls B^, D2 (Li, B 2 ) S! (LO, S 2 (L 2 ) S,, S 2
Format maschinenintern : L, - 1 ! Lj - 1 B, 1. Byte
2. Byte
3. Byte
D, 4. Byte
B2
-L5. Byte
6. Byte
Wirkungsweise: Die Instruktion lädt den mit + D 2 adressierten 2. Operanden der Länge L 2 < 16 rechtsbündig mit fuhrenden Nullen in den mit + Di adressierten 1. Operanden der Länge L t < 16. Die Verarbeitung verläuft von rechts nach links. Wenn Li < ist, so fuhrt das zu einem Dezimalüberlauf und zur Programmunterbrechung. Programmierhinweis : Der 2. Operand muß dezimal gepackte Ziffern und ein Vorzeichen enthalten.
3.4 Maschinenbefehle
135
Codierungsbeispiele: ZAP
REFE,ZAHL
Die Länge von REFE sei L! = 3, die Länge von ZAHL sei L 2 = 2 ZAHL 1
v\ o
i 0 1
1 ; t
0
4
3
! o
i 1 | D
1. Operand
1 1 | c
2. Operand
Das Resultat dieses Vergleichs ist ein Bedingungsschlüssel im Anzeigeregister, der aussagt, daß der 1. Operand kleiner als der 2. Operand ist. CP
ZAHL+2(3),0(2,9)
Der arithmetische Wert des 3 Bytes langen und mit ZAH L+2 adressierten 1. Operanden wird mit dem arithmetischen Wert des 2 Bytes langen und mit + 0 adressierten 2. Operanden verglichen. Der 2. Operand wird während des Vergleichs virtuell mit führenden Nullen auf 3 Bytes aufgefüllt.
Befehl: CR
Typ:
(compare registers; Vergleichen arithmetisch FP-Register mit FP-Register)
RR
Format symbolisch: CR
Rj, R 2
Format maschinenintern: 1
; 1. Byte
9
R,
1 ] '
2. Byte
R2
163
3.4 Maschinenbefehle
Wirkungsweise: Der Inhalt des mit R ! adressierten Registers wird arithmetisch, d . h . unter Berücksichtigung der Vorzeichen und der Zahlenwerte, mit dem Inhalt des durch R 2 adressierten Registers verglichen. Entsprechend dem Ergebnis des Vergleichs wird ein Bedingungsschlüssel im Anzeigeregister gesetzt. In der Regel wird die Vergleichsoperation von bedingten Verzweigungsoperationen gefolgt, die in bestimmter Weise auf den Bedingungsschlüssel des Anzeigeregisters reagieren. Codierungsbeispiel:
GLEICH
CR BL BH AR
5,6 KLEINER GR0ESSER 7,5
Vergleichen < Reg. 5 > mit < Reg. 6 >; wenn < Reg. 5 > kleiner < Reg. 6 >, dann Sprung nach KLEINER; wenn + + Di adressierten Byte, und zwar wird jedes bit geprüft, welches in der Maske I 2 an der entsprechenden Stelle eine 1 hat. Hat ein bit in der Maske I 2 den Wert 0, so wird das entsprechende bit im Arbeitsspeicher nicht geprüft. In Abhängigkeit vom Ausgang des Vergleiches wird ein Bedingungsschlüssel im Anzeigeregister gesetzt. Die Reaktion auf den Bedingungsschlüssel im Anzeigeregister geschieht mittels der bedingten Sprungbefehle BZ, B0 und BM. 1. Sind alle getesteten bit-Stellen im Kernspeicher gleich Null, so wird mit BZ gesprungen (branch on zero), bei B0 und BM nicht! 2. Sind alle getesteten bit-Stellen im Kernspeicher gleich Eins, so wird mit B0 gesprungen (branch on ones), bei BZ und BM nicht! 3. Sind einige der getesteten bit-Stellen im Kernspeicher gleich Eins und einige gleich Null, so wird mit BM gesprungen (branch on mixed), bei BZ und B0 nicht! Codierungsbeispiele: TM B0 BZ MVC
BYTE,B'11110000' EINSEN NULLEN FELD1,FELD2
Wenn das mit BYTE adressierte Byte den Inhalt 111 lxxxx hat, springt das Programm zur Adresse EINSEN; wenn BYTE den Inhalt OOOOxxxx hat, springt das Programm zur Adresse NULLEN; wenn BYTE z.B. den Inhalt 011 lxxxx hat, dann setzt es mit MVC . . . fort. C
TM BM AP
B,B'11001100' MIXED SUMME,ZAHL
3.4 Maschinenbefehle
169
Wenn das mit B adressierte Byte z.B. Olxxllxx enthält, springt das Programm zur Adresse MIXED; wenn es hingegen l l x x l l x x oder OOxxOOxx enthält, dann setzt das Programm mit AP . . . fort.
3.4.3.9 Verzweigungsoperationen Befehl: BC Typ:
(branch on condition; bedingtes Verzweigen)
RX
Formate symbolisch13: BC BC
M„ D 2 (0, B 2 ) M,, S2
Format maschinenintern13: r 4
!
7
l.Byte
M,
! 0 I 2. Byte
B:
',•*
1 3. Byte
—P -
D3
1 4. Byte
»
Wirkungsweise: Vergleichsoperationen, Arithmetikoperationen, Ladeoperationen und shiftOperationen bewirken das Setzen eines Bedingungsschlüssels im Anzeigeregister. Die BC-Instruktion vergleicht die 4-bit-Maske M! mit dem Bedingungsschlüssel des Anzeigeregisters. Bei Entsprechung wird ein Sprung zu der mit + D 2 angegebenen Adresse ausgeführt. Bei Nichtentsprechung setzt das Programm mit der auf BC folgenden Instruktion fort. Programmierhinweise: Das Setzen der bit-Maske Mj erfolgt entweder explizite durch die Angabe bestimmter Direktwerte oder implizite durch einen erweiterten Bedingungscode. Es können, solange der Bedingungsschlüssel nicht verändert wird, mehrere Sprunginstruktionen hintereinander auf ein und dieselbe Anzeige bezug nehmen. 13
Vereinfachend wird hier nur der Fall der nicht indizierten Sprungadressen behandelt.
170
3. Die Programmiersprache ASSEMBLER
Erweiterter Bedingungscode Bedeutung
implizite
explizite
Unbedingter Sprung kein Sprung (übergehen) Sprung bei größer Sprung bei kleiner Sprung bei gleich Sprung bei nicht größer Sprung bei nicht kleiner Sprung bei ungleich Sprung bei positiv Sprung bei Einsen Sprung bei gemischt Sprung bei Nullen
B
D 2 (0, B 2 )
BC
15, D 2 (0, B 2 )
N0P BH BL BE BNH BNL BNE BP B0 BM BZ
D 2 (0, D 2 (0, D 2 (0, D2(O, D 2 (0, D 2 (0,
BC BC BC BC BC BC BC BC BC BC BC
0,D2(0, 2, D 2 (0, 4, D 2 (0, 8, D2 (0, 13, D 2 (0, 11,D 2 (0, 7,D2(0, 2, D 2 (0, 1,D2(0, 4, D 2 (0, 8,D2(0,
B2) B2) B2) B2) B2) B2)
D2(O, B2)
D 2 (0, D 2 (0, D 2 (0, D 2 (0,
B2) B2) B2) B2)
B2) B2) B2) B2) B2)
B2) B2) B2) B2) B2) B2)
Die 3 letzten Befehle werden in der Regel im Zusammenhang mit dem Befehl TM (test under mask) verwendet. Codierungsbeispiele (für den unbedingten Sprung): B
WEITER
oder
BC
15.WEITER
Unbedingter Sprung zu der durch die symbolische Adresse WEITER angegebenen Kernspeicheradresse. B 2(,9) Unbedingter Sprung zu der durch + D2 = (Reg. 9> + 2 gegebenen Adresse. Der gleiche Effekt wird erreicht durch: B
2(0,9)
oder
B BC
19(0,5) oder 15,19(0,5)
B
2(9,0)
oder
B
2(9)
Unbedingter Sprung zu der durch + D2 = + 19 gegebenen Adresse.
Befehl: BCR
(branch on condition to register address; bedingtes Verzweigen zu der im Register angegebenen Adresse)
171
3.4 Maschinenbefehle
Typ:
RR
Format symbolisch: BCR
Mj, R 2
Format maschinenintem: o
7
M,
. Byte
;
R;
2. Byte
Wirkungsweise: Vergleichsoperationen, Arithmetikoperationen, Ladeoperationen und shiftOperationen bewirken das Setzen eines Bedingungsschlüssels im Anzeigeregister. Die BCR-Instruktion vergleicht die 4-bit-Maske M! mit dem Bedingungsschlüssel 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. Programmierhinweis: Das Setzen der bit-Maske M, kann bis auf eine Ausnahme nur explizite durch die Angabe bestimmter Direktwerte erfolgen (vgl. BC auf S. 170). Die Ausnahme ist BCR 15,R2. Für diesen unbedingten Sprung kann man auch den erweiterten 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. BAL MVC
/
i
/
UPR0
3,UPR0 FELD1.FELD2
/•
/ ' I E®J i CLC \
F E LD1 ,=X'00000C'
'
\; \
BR
3
3. Die Programmiersprache ASSEMBLER
172
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: X / WEITER /
I
l
\
*
\
'
\
S, \ UPR0\
UPR0 FELD1,FELD2
MVC
E0J CLC
F E LD1 ,=X'00000C'
\ • \
^B
WEITER
Die BAL- und BR-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:
/ / i/ /
/
,
2/
^!
//
^BAL 3,UPR0 MVC FELD1 ,FELD2 • \ • V * \ BAL ,3,UPR0 MVC VELD1,=X'01020C' • \ \ \
V / UPR0
E0J I 1 2 CLC | /FELD1,=X'00000C' • "
/ BR
/
/
/ /
3
3.4 Maschinenbefehle
173
Befehl: BAL
Typ:
(branch and link; Verzweigen nach Laden der Rücksprungadresse)
RX
Formate symbolisch: 13 BAL BAL
Rj, D 2 (0, B 2 ) Rj, S 2
Format maschinenintern: 4 . ...
! 1
R,
5
1. Byte
I •]
0
2. Byte
B •>2
1 >4 1« 3. Byte
Pi
"1
1 "
1 \
1
~ »•
4. Byte
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 Ri angegebene Register geladen. Danach verzweigt das Programm zu der mit + D 2 adressierten Instruktion. Codierungsbeispiel: BAL / yvivc
/
3.UPR0 FELD1,FELD2
/
/
/
i
UPR0 \
CLC
FELD1 ,=X'00000C'
\ " \ * Y
BR
3
Die Adresse der MVC-Instruktion wird in das Register 3 geladen. Danach verzweigt das Programm zum Befehl mit der symbolischen Adresse UPR0. Der Befehl BR 3 bewirkt den Rücksprung zur MVC-Instruktion. 3
Vereinfachend wird hier nur der Fall der nicht indizierten Sprungadressen behandelt.
3. Die Programmiersprache ASSEMBLER
174
Befehl: BALR
Typ:
(branch and link registers; Verzweigen zur Registeradresse nach Laden der Rücksprungadresse)
RR
Format symbolisch: BALR
Rj, R 2
Format maschinenintern: 1 0 | 5
1 R, | R,
I
I
1. Byte
2. Byte
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 Rj adressierte Register geladen. Danach verzweigt das Programm zu der Instruktion, deren Adresse im Register R 2 steht. Codierungsbeispiele: LA
BALR /yVC
8,UPR0
11,8 FELD1,FELD2
/ ? :
i •
/ I I UPR0 I \
E0J CLC •
\ • \• V
BR
FELD1 ,=X'00000C'
11
175
3.4 Maschinenbefehle
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-Instruktion. 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 1; S 2
Format maschinenintern: 4
1 1 6 1. Byte
r,
1 ; 2. Byte
o
- T B, '¡* 3. Byte
1 - D; -j
•
4. Byte
Wirkungsweise: Der Inhalt des Registers R j 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. 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. 13
Vereinfachend wird hier nur der Fall der nicht indizierten Sprungadressen behandelt.
3. Die Programmiersprache ASSEMBLER
176
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,N 5,W0RTE(14) 14,=F'4' 3,ADD
Die Register 14 und 5 werden gelöscht. Im Speicherwort N sei die Anzahl n 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 erhöht. Die Instruktion BCT bewirkt n — 1 mal einen Rücksprung nach ADD. Nach n 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 = + D 2 = + 4 BCT BCT BCT
3,0(0,7) 3,0(,7) 3,0(7)
oder oder
Sprungadresse = + 0
Befehl: BCTR
(branch on count to register address; Verzweigen nach Zählen zu der im Register angegebenen Adresse)
3.4 Maschinenbefehle
Typ:
177
RR
Format symbolisch: BCTR
Rl5 R2
Format maschinenintern: 0
1 1 6 I 1. Byte
R,
1 | R2 I 2. 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.
Programmierhinweise: Ist der Anfangswert von R 2 gleich Null, so wird auf alle Fälle verzweigt, denn zuerst wird ( R ^ um 1 vermindert; d . h . es ist dann ( R ^ = — 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. 176):
ADD
LA SR SR L A A BCTR
6,ADD 14,14 5,5 3,N 5,W0RTE(14) 14,=F'4' 3,6
3. Die Programmiersprache ASSEMBLER
178
Befehle: BXH BXLE
Typ:
(branch on index high; Verzweigen bei Index größer) (branch on index low or equal; Verzweigen bei Index kleiner oder gleich)
RS
Formate symbolisch: BXH BXH
R„ R3,D2(B2) R „ R3, S2
BXLE BXLE
R„ R3,D2(B2) R „ R3, S2
Formate maschinenintern : T ! 6 i 1. Byte
Ri t R3 2. Byte
1 B, ¡« 3. Byte
• D2 J
1 i' 7
Ri 1 R3 1
B,
1 - D2 -J
8
8
1. Byte
2. Byte
3. Byte
•
4. Byte
»
4. Byte
Wirkungsweise: Der Inhalt des Registers R 3 wird auf den Inhalt des Registers R! addiert. Danach wird die Summe in R j 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 fahrt es mit der nachfolgenden Instruktion fort. 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
3.4 Maschinenbefehle
0P
179
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.
SR SR L L L A A BXLE
14,14 5,5 1,= F T 2,=F'1' 3,N 5,W0RTE(14) 14,=F'4' 1,2,ADD
Diese Befehlsfolge bewirkt dasselbe wie die auf Seite 176 im Zusammenhang mit BCT angegebene.
Befehl: EX Typ:
RX
(execute; Ausführen)
3. Die Programmiersprache ASSEMBLER
180 Formate symbolisch: EX EX
R „ D 2 ( X 2 , B2) R „ S2
Format maschinenintern: 1 1 4 | 4 R, ! X, i 1 l.Byte 2. Byte
B,
!« 3. Byte
- D, -j • J. _ 4. Byte
Wirkungsweise: Die mit + + D 2 adressierte Instruktion wird durch den Inhalt von R! modifiziert und ausgeführt. Danach setzt das Programm mit der auf EX folgenden Instruktion fort. Ist die auszuführende Instruktion eine Sprunginstruktion, so setzt das Programm mit der angesprungenen Instruktion fort. Die Modifikation der auszuführenden Instruktion unterbleibt, wenn R! = 0 ist. Letzteres sei der hier allein interessierende Fall. Codierungsbeispiel :
A1
MVC
FELD1.FELD2+3
EX AP
0,A1 REFE,FELD1
Durch EX wird die mit A1 adressierte Instruktion MVC . . . ausgeführt, danach wird die Instruktion AP . . . ausgeführt.
3.4.3.10
Logische Bit-Verknüpfungen
Befehle: NR OR XR Typ:
RR
(and register) (or register) (exclusive or register)
3.4 Maschinenbefehle
181
Formate symbolisch: NR OR XR
R j , R2 R1;R2 RPR2
Formate maschinenintem:
2. Byte
1. Byte
—1 1 1!
6
• 1 ;
1 R1 j
(OR)
R2
2. Byte
1. Byte
i
(NR)
!
4
7
1. Byte
1 R, 1 1 ,
(XR)
L
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 führt eine logische Und-Verknüpfung durch. Wenn ry die j-te bit-Position des Registers Rj ist, dann läßt sich die Verknüpfungsregel wie folgt darstellen: lj 0 0 1 1
A
r
A A A A
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: Ij 0 0 1 1
V V V V V
r
2j 0 1 0 1
=>
=> =>
=> =>
r
lj 0 1 1 1
3. Die Programmiersprache ASSEMBLER
182
XR führt eine logische Antivalenz-Verknüpfung durch. Sie läßt sich wie folgt darstellen: lj
V
0 0 1 1
V V V V
r
2j 0 1 0 1
=>
=>
r
lj 0 1 1 0
Codierbeispiel: NR
5,6
Register 6 n
....
31
0
A
Register 5 n
....
31
. . _
n
....
31
0101010 0
li V
Register 5
0100101
o 1 onono 0
Die oben gezeigte Operation dient dem Nullsetzen einzelner bits in R5. Die Wirk von < R 6 > ist dabei die einer bit-Maske: Alle XQ = 1 lassen die r5j unverändert; r6j = 0 schalten (bzw. lassen) die r 5 j auf Null. Weitere Anwendungen vgl. Übung (Seite 278). Befehle: N 0 X Typ:
RX
Formate symbolisch: (Vgl. z.B. L a u f S . 88).
(and) (or) (exclusive OR)
3.4 Maschinenbefehle
183
Formate maschinenintern: 5
1 |
I
R
1
J
2
!
X
R
1
3. Byte
1. Byte
X
j
2
B
°2
+
r
(O)
4. Byte
—I
2 ! 3. Byte
2. Byte
(N)
4. Byte
°2 " t
2
2
1
7
!' 3. Byte
2. Byte
1. Byte
1
B
2. Byte
1. Byte
5
T
R
4
(X)
4. Byte
Wirkungsweise: Analog NR, OR, XR; die bit-Maske steht hier jedoch in einem indiziert adressierten Speicherwort. Programmierhinweis: Der Speicheroperand muß auf eine Wortgrenze ausgerichtet sein (vgl. S. 44 f.). Befehle:
Typ:
NC OC XC
(and character) (or character) (exclusive or character)
SS
(logisch)
Formate symbolisch: (Vgl. z.B. MVCaufS. 79 ff.). Formate maschinenintern: (NC)
1. Byte
2. Byte
3. Byte
4. Byte
5. Byte
6. Byte
184
3. Die Programmiersprache A S S E M B L E R
Wirkungsweise: Analog NR, OR, XR; die bit-Maske sowie die zu verändernde bit-Kette stehen hier jedoch beide im Arbeitsspeicher, und es wird in der Länge des ersten Operanden verknüpft. Befehle: N' Ol XI Typ:
(and immediate) (or immediate) (exclusive or immediate)
SI
Formate symbolisch: (Vgl. z.B. MVI auf S. 81). Formate maschinenintem : 9
1 J• 4
1. Byte
h
Bl
2. Byte
i
2. Byte
2. Byte
4. Byte
(Ol)
! 4. Byte
3. Byte B
1. Byte
—
3. Byte B
1. Byte
i
1
i
J
3. Byte
D
1 j
(XI)
4. Byte
Wirkungsweise: Analog NR, OR, X R ; die bit-Maske steht hier jedoch im Direktoperand I2 und die zu verändernde bit-Kette steht in einem Byte des Arbeitsspeichers.
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 ihre Wirkung insofern in die Ausführungsphase hinein, als während der Übersetzungsphase mit ihrer Hilfe z. T. die Maschineninstruktionen modifiziert werden.
185
3.5 Assembler-Anweisungen
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'1O1' 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
DI (L1 ,B1 ),D2(B2)
EQU EQU EQU EQU EQU
17 0 8 B1 L'FELD
186
(2)
3. Die Programmiersprache ASSEMBLER
Wenn ein komplexer, umständlich zu schreibender Ausdruck in mehreren Befehlen vorkommt, so ist es rationeller, diesen einmal mit einem einfachen Symbol gleichzusetzen und dann in den Befehlen dieses Symbol zu verwenden. Beispiel: MVC AP
FELD,D
Übertragen eines „+" nach 0PERAT0R Konvertieren (Reg. l ) in eine gepackte Dezimalzahl in DW
Überschreiben des Vorzeichens mit 1101 in 0 PI
Übertragen des Resultats aus DW rechtsbündig nach 0P1
I
C0NVT1
Entpacken d. Resultats aus pPl in 2 Teilen l. d. Druckbereich (vgl. S.231)
Übertragen d. ersten Zahl aus 0 PI rechtsbündig nach DW
I
Übertragen eines „ + " für das Resultat in den Druckbereich
Konvertieren der ersten Zahl in eine Dualzahl in Reg. 1 Packen der zweiten Zahl aus EBER nach 0P2
Überschreiben des Vorzeichens mit 1101 in 0P2
Fehlermeldung in Druckbereich übertragen
Überschreiben d. Vorzeichens des Resultats in 0P1 durch 1111
Übertragen eines „ - " für das Resultat in den Druckbereich
234
4. Übungsprogramme
SUB Subtrahieren (Reg. 2> von (Reg. 1>
Übertragen eines „ - " nach 0PERAT0R
DIV Übertragen d. 1. Teils d. Prod. aus DW rechtsbündig nach 0P1
Multiplikation d. 1. Teils des Produktes mit 2 3 2 in PP1
Multiplizieren
S0RT
LA CLC
M0VE
RAUS LIST
NEXT
§
DRUCK
SR MVC LR B LA LR CLC BE CLI BE LA CLC BNL MVC LR B C BE MVC LA MVC B BR
13,13 C0MP , = X 1 FFFFFFFFFF' 10,5 CLC 10,80(10) 2.3 0(2,10) ..C'/»' M0VE 0(10) ,X '40' LA 2.0(10,2) 0(5,2) ,C0MP LA C0MP ,0(2) 13.10 LA 13 ,»F ' 0 1 RAUS 0(80,6),0(13) 6,80(6) 0(80,13) ,-80C' ' S0RT 7
CNTRL MVC CNTRL BAL MVC LA CLC BE AP UNPK MVZ MVC MVC MVC MVC MVC BAL PRT0V B
LISTE,SK,1 DRBER+10(79).HEADDER LISTE,SP, ,1 9,DRUCK EBER,0(4) 4,80(4) EBER(2),=C'/»' RAUS LFDNR ,EINS DRBER+3(3),LFDNR DRBER+5(1) ,F DRBER+8(12).NNAME DRBER+22(12).VNAME DRBER+36(22) ,0RT DRBER+60(24).STRASSE DRBER+85(5),PNR 9,DRUCK LISTE, 12, LIST NEXT
PUT MVC BR
LISTE DRBER(132) .ORBER-l 9
« « KONSTANTEN UNO BEREICHE LFDNR EINS F EBER PNR VNAME NNAME
LT0RG DC DC DC DS DS DS DS
X'OOOC' X'IC' X 1 FF ' 0CL80 CL5 CL12 CL12
4. Übungsprogramme
254 0RT STRASSE
DRBER HEADDER
C0MP S0RTBER1 S0RTBER2 •
DS DS OS DC DC DC CS DC DS DC DS DC DS DC OS
CL22 CL24 CL5 X ' 401 132X'40' C'NAHE' CL9 C1V0RNAME1 CLU C'ßRT' CL17 CSTRASSE' CU8 C'PNR" CL5
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 I0-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 fur 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 U N , N 0 D A T A , N(JG EN ENDE KARTE LISTE DRBER EBER
D E F I N I T I O N DES
KARTE
DTFSR
I0CS
BLKSIZE-80, DEVADDR«SYSRDR, DEVICE-READER, E0FADDR-ENDE, I0AREA1-EBER,
Spalte
7a
4. Übungsprogramme
255 Spalte RECF0RM>FIXUNB, TYPEFLE=INPUT
*
LISTE
DTFSR
* *
EBER DRBER *
BLKSIZE=132, C0NTR0L=YES, DEVADDR=SYSLST, DEVICE®PR INTER, I0AREA1=DRBER, PRINT0V=YES, RECF0RM=FIXUNB, TYPEFLE=?UTPUT
DTFEN 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,N0DATA,N0GEN KARTE LISTE EBER DRBER HEADDER LFDNR EINS F ENDE
* V0RPR0GRAMM *
VP
BALR USING 0PEN LM L
7,0 *.7 KARTE,LISTE 8,13,ADRESS 4 ,«V(DRUCKE)
» HAUPTPR0GRAMM • NEUBLATT
NEXT
CNTRL MVC BALR CNTRL GET AP UNPK HVZ MVC MVC MVC MVC BALR PRT0V B
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
72 * * * * » * * *
4. Übungsprogramme
256 ADRESS
DC DC DC DC DC DC
A(ORBER-1) A(HEADDER) A(LFDNR) A(EINS) A(EBER) A(F)
CL0SE TERM
KARTE.LISTE
END
VP
TITLE CSECT PRINT ENTRY ENTRY ENTRY ENTRY DC DC DC DC DS DC DS DC DS DC
'UEBUNG7 »SEGMENT3'
• • ENDR0UTINE ENDE »
PR0G73
LFDNR EINS F HEADDER
0N.N0DATA.N0GEN LFDNR EINS F HEADDER X'OOOC' X'IC' X 1 FF 1 C NAME' CL9 C VORNAME' CL11 C'JRT' CL17 CSTRASSE'
END
PR0G74
DRUCKE
TITLE CSECT PRINT EXTRN ENTRY BALR USING PUT MVC BR END
'UEBUNG7 .UNTERPR0GRAMM' 0N,N0DATA,N0GEN LISTE DRUCKE 5,0 •,5 LISTE 1(132,8) .0(8) 6
4. Übungsprogramme
257
Übung 8a: Lochkarten mit statistischen Erhebungsdaten sollen in Blöcken zu je 10 auf ein Magnetband gebracht werden. Kartenformat: 5
XXX XX
lfd.
6
7
M W
Nr.
8
9
SE AR AN BE 0H
16
xx.xx.xx Geburtsdatum
17
L V G W
18 - 20
XXX Körpergröße
21
-
23
XXX Körpergewicht
1 3
5 ä
v M
9
4> o. 3 a
e
X
0
25
§
2 eo r3 i
o
•s u
26
K L F U
s
9
"O
•c
24
00 "O jD
3
t
•3 ja
4»
I
Berufe:
Schulbildung:
Einkommensgruppen:
SE AR AN BE 0H
V - Volksschule M - Mittelschule 0 — Oberschule
0 1 2 3 4 5 6 7 8 9
— selbständig - Arbeiter — Angestellter - Beamter — ohne Beruf
Geschlecht: M — männlich W — weiblich Familienstand: L V G W
— — — —
ledig verheiratet geschieden verwitwet
Weiterbildung: K L F U S
— keine — Lehre — Fachschule - Universitätsstudium - sonstige (Sekretärinnenschule, Dolmetscherschule etc.)
-
0 10000 15000 20000 25000 30000 35000 40000 45000 50000
bis 9999 bis 14999 bis 19999 bis 24999 bis 29999 bis 34999 bis 39999 bis 44999 bis 49999 bis u. m.
Blockformat: 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26
4. Übungsprogramme
258
PR0G8A x
TITLE START PRINT
1 UEBUNG8A ' 216 ON ,NODATA,NOGEN
Spalte
* « DEFINITIONEN DES IOCS KARTE
« BAND
DTFSR
DTFSR
#
72
BLKSIZE=26, DEVADDR=SYSRDR, DEVICE-READER, EOFADDR=ENDE, IÜAREA1=EBER, RECFORM=FIXUNB, TYPEFLE=INPUT
X
BLKSIZE=260, DEVADDR=SYS010, DEVICE=TAPE, FILABL=STD , LABNAME=LAB, a 1 I0AREA1=ABER, RECF0RM=FIXBLK, RECSIZE=26, TYPEFLE=OUTPUT W0RKA*YES
* * * « * *
*
X
IE X X
X
X X
DTFEN
*
« V0RPR0GRAMM • BALR USING OPEN
VP
tt
9,0 «,9 KARTE,BAND
« HAUPTPROGRAMM * LIES
S ENDE «
GET MVC PUT B
KARTE WORKAREA,EBER BAND.UORKAREA LIES
CLOSE TERM
KARTE,BAND
* KONSTANTEN UND BEREICHE » EBER ABER U0RKAREA LAB x
21
DS DS DS DC
CL26 10CL26 CL26 44X 1 FF'
END
VP
21
Das Feld LAB enthält Informationen für den Etikettvergleich. Da in diesem Programm keine Etikettprüfung vorgesehen ist, wird das Feld LAB mit binären Einsen gefüllt.
4. Übungsprogramme
259
Übung 8b: Die in Übung 8a aufgebaute Banddatei soll statistisch ausgewertet werden; Und zwar soll eine Kombinationstabelle aufgestellt werden, die die Aufgliederung der Merkmalsträger nach Alter, Geschlecht und Familienstand ausweist. Kartenformat/Blockformat: wie Übung 8a Listenformat: siehe nächste Seite.
260
4. Übungsprogramme
4. Übungsprogramme
262
4. Übungsprogramme
263
4. Übungsprogramme ENDE Vorschub auf neuen Formularanfang
1 Adresse der Kombinationstabelle TAB nach Reg. 8 laden
Laden einer Druckschablone in den Druckbereich
Übertragen der Tabellenüberschrift in den Druckbereich
Adresse von KLASSK0N (Altersklassen) nach Reg. 4 laden
Aufbereiten einer Besetzungszahl zum Drucken
Anfangswert 15 d. Schleifenzählers nach Reg. 5 laden
Adrefipegel in Reg. 3 auf nächste. Besetzungszahl in TAB einstellen
Laden d. Adr. von TAB aus Reg. 8 nach Reg. 3
Adrefipegel in Reg. 6 auf Summenfeld der nächsten Spalte einstellen
Adresse des Feldes SUMMEN nach Reg. 6 laden
Adrefipegel in Reg. 7 auf nächstes Feld im Druckbereich einstellen
Vorschub um eine Leerzeile
Tab. eint eilung „MAENNLICH, WEIBLICH, INSGESAMT" in den Druckbereich
Adresse des Druckbereichs DRBER+1 nach Reg. 7 laden Tab.einteilung nach Familienstand in den Druckbereich bringen
Übertragen einer Altersklasse in den Druckbereich Adrefipegel in Reg. 4 auf die nächste Altersklasse einstellen AP2
Anfangswert 18 d. Schleifenzählers nach Reg. 2 laden
Add. der Besetzungszahl einer Altersklasse auf das Summenfeld der betr. Spalte
(Reg. 5> um 1 vermin-^ dem und auf Null Prüfen
I
= 0
/ B A L 11, PUT ( (Drucken ei\ n e r Zeile)
Adrefipegel in Reg. 8 auf nächste Zeile von TAB einstelle« Reg. 2 um 1 vermindern und auf Null prüfen
#0
4. Übungsprogramme
264
Vorschub um eine Leerzeile
Anfangswert 15 d. Schleifenzählers nach Reg. 5 laden
T
BAL 11, PUT (Drucken der Summenzeile)
Adresse des Feldes SUMMEN nach Reg. 6 laden Adresse des Druckbereichs DRBER + 1 nach Reg. 7 laden
Schließen der Dateien
Übertragungen d. Wortes SUMMEN in den Druckbereich
E0J
MVC PUT
Übertragungen einer Druckschablone in den Druckbereich
Adrefimodifikation in Reg. 8: ' 1E74 ' 0'1E75' X'4710000000000000' n 0 F F 3X'00' CL16 X 1 FO ' CL9 CL1 CL1 6F
CNVTDEGP
STM
2.7.RETT27
CNVTGPDE
STM
2.7.RETT27
END
VP
K0N471 GW DW FW FW7 F16 F9 VZ 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],
278
4. Ü b u n g s p r o g r a m m e
Zur Durchführung einer selbständigen Programmierübung 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 1 U E B U N G 1 0 1 START 216 PRINT N0GEN
* DEFINITIONEN • LISTE
DTFSR
• « • VP
DES
I0CS
BLKSIZE=132, C0NTR0L=YES, DEVADDR=SYSLST, DEVICÉ=PRINTER, I0AREA1=DRBER, RECF0RM=FIXUNB, TYPEFLE=0UTPUT
DTFEN V0RPR0GRAMM BALR 3,0 U S I N G *,3 UPEN LISTE CNTRL L I S T E , S K , 1 MVC DRBER(12),ZVEKT0R BAL 12,PUT HAUPTPR0GRAMM
IC
LA SR SR SR SR IC IC SLL
8,8 4.4 5.5
6.6
7.7 4, VEKT0RZ 5,MATRIX(7) 6,1
Spalte
4. Übungsprogramme
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 B EINS MVI LA LA SLL BCT • BAL CLOSE TERM
4.5 NULL 6,=F'1' 7.1(7) 8,IC 6.VEKT0RV DRBER(4),=C'A = 7.ZMATRIX 8.8 DRBER+4(8),0(7) 7.8(7) 12.PUT 8,SCH 7.DRBER 0(4.7)..C'V = 1 7.4(7) 8,8 6,24 6 ,aF' 0 ' EINS 0(7),C'O1 LA 0(7), C'l' 7.1(7) 6,1 8.C 12,PUT LISTE
• UNTERPROGRAMM PUT
PUT MVI MVC BR
LISTE DRBER,X140' DRBER+1(131),DRBER 12
* KONSTANTEN UND BEREICHE DRBER ZVEKT0R VEKT0RZ VEKT0RV MATRIX
ZMATRIX
DC DC DC DS DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC
C1321 ' C Z = 01000 B '01000000' C B1 00000000' B1'10000000' B1 01000000' B '00110000' B''00000000' B '00000000' B1 00000000' B1'00000000' C 00000000' C 10000000' C 01000000' C 00110000' C 00000000' C 00000000' C 00000000' C 00000000'
END
VP
279
280
Dieser Programmablaufplan beschreibt die wichtigsten Teile Druckroutinen dar, sie sind selbsterklärend.
4. Übungsprogramme
des Programms; die Übrigen Teile stellen
5. Anhang: 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.
282
5. Anhang: Progiammierhilfen
5.2 Tabelle der Maschineninstruktionen
Op.Code symb.
Instruktion
Typ
Operandenformat explizite
Seite
Übertragungsoperationen im Arbeitsspeicher Übertragen Zeichen
MVC
SSj
Di (Li, Bi), D 2 (B 2 )
79
Übertragen Direktzeichen
MVI
SI
DI (Bi), I 2
81
Übertragen rechte Halbbytes (Ziffern)
MVN
SSi
Di (Lj, Bi), D 2 (B 2 )
81
Übertragen Zeichen um 1 Halbbyte nach links versetzt
MV0
SS a
Dj ( L L B O , D 2 ( L 2 , B 2 )
83
Übertragen linke Halbbytes (Zonen)
MVZ
SSi
DI (Li, Bj), D 2 (B 2 )
82
Laden von Registern, Speichern von Registerinhalten Laden FP-Wort
L
RX
RI, D 2 (X 2 , B 2 )
88
Laden Adresse
LA
RX
R 1 ; D 2 (X 2 , B 2 )
85
Umladen FP-Register komplementiert
LCR
RR
Ri, R 2
91
Umladen GP-Register lang, mit umgekehrten Vorzeichen
LCDR
RR
RI, R 2
Umladen GP-Register kurz, mit umgekehrten Vorzeichen
LCER
RR
r
Laden GP-Doppelwort
LD
RX
Umladen GP-Register lang Laden GP-Wort
LDR LE
RR RX
Ri, R 2 R | , D 2 (X 2 , B 2 )
99 99
Umladen GP-Register kurz Laden Halbwort Laden mehrfach FP-Worte
LER LH LM
RR RX RS
R i . R2 R l , D 2 (X 2 , B 2 ) Ri, R 3 , D 2 (B 2 )
98 89 93
Umladen FP-Register negativ
LNR
RR
RI, R 2
92
Umladen GP-Register lang, negativ
LNDR
RR
Rl. R2
-
Umladen GP-Register kurz, negativ
LNER
RR
RL. R2
-
Umladen FP-Register positiv
LPR
RR
Ri, R 2
Umladen GP-Register lang, positiv
LPDR
RR
Ri. R2
I > R2 R 1 ) D 2 ( X 2 , B2)
100
93 -
5.2 Tabelle der Maschinenbefehle
283
Instruktion
Op.Code symb.
Typ
Operandenformat explizite
Umladen GP-Register kurz, positiv
LPER
RR
R
Umladen FP-Register
LR
RR
l> R 2 RI, R 2
Umladen FP-Register mit Test
LTR
RR
Rii R2
-
Umladen GP-Register lang mit Test
LTDR
RR
Ri. R2
-
Umladen GP-Register kurz mit Test
LTER
RR
Ri, R 2
-
Einfügen Zeichen (Byte)
IC
RX
R 1 ( D 2 (X 2 ) B 2 )
90
Speichern FP-Register in Wort
ST
RX
R 1 i D 2 ( X 2 ) B2)
94
Speichern FP-Register in Byte
STC
RX
R , , D 2 ( X 2 ) B2)
96
Speichern GP-Register in Doppelwort
STD
RX
R I , D 2 ( X 2 ; B2)
103
Speichern GP-Register in Wort
STE
RX
RI, D 2 (X 2 , B 2 )
101
Speichern FP-Register in Halbwort
STH
RX
RI, D 2 (X 2) B 2 )
95
Speichern FP-Register mehrfach in Worte
STM
RS
RI, R3. D 2 (B 2 )
97
Seite
—
87
Codetransformationen Umwandeln dezimal gepackt in dual
CVB
Umwandeln dual in dezimal gepackt Aufbereiten zum Drucken
RX
RI, D 2 (X 2 , B 2 )
115
CVD
RX
RI, D 2 (X 2 , B 2 )
116
ED
SSi
Di (Li, Bi), D 2 (B 2 )
108
Aufbereiten zum Drucken und Markieren
EDMK
SSi
DI (Lj, B!), D 2 (B 2 )
-
Packen
PACK
ss a
Di (Li, Bi), D 2 ( L 2 , B 2 )
103
Übersetzen mit Hilfe von Code-Tabellen
TR
SSi
DI (Li, Bi), D 2 (B 2 )
—
Übersetzen und Prüfen mit Hüfe von CodeTabellen
TRT
SSi
D, (Li, Bi), D 2 (B 2 )
Entpacken
UNPK
SSa
DI (LI, BI), D 2 (L 2 , B 2 )
106
shift-Operationen in Festpunktregistern Links-shift arithmetisch (ohne bit-Position 31) W
SLA
RS
RI, D 2 (B 2 )
127
284
5. Anhang: Programmierhilfen Op.Code symb.
Typ
Operandenformat explizite
Seite
Links-shift im Doppelregister arithmetisch (ohne bit-Position 31 in R j )
SLDA
RS
Ri, D 2 (B 2 )
129
Links-shift im Doppelregister logisch (mit bitPosition 31 in Ri)
SLDL
RS
RI, D 2 (B 2 )
Links-shift logisch (mit bit-Position 31)
SLL
RS
RI, D 2 (B 2 )
131
Rechts-shift arithmetisch (ohne bit-Position 31)
SRA
RS
RI, 1>2(B2)
127
Rechts-shift im Doppelregister arithmetisch (ohne bit-Position 31 in R,)
SRDA
RS
RI,D2(B2)
128
Links-shift im Doppelregister logisch (mit bitPosition 31 in R j )
SRDL
RS
Ri, D 2 (B 2 )
Rechts-shift logisch (mit bit-Position 31)
SRL
RS
Ri, D 2 (B 2 )
Instruktion
130
Dezimalarithmetik DI (Lj, Bi), D 2 ( L 2 , B 2 )
132
Di (LI, Bi), D 2 ( L 2 , B 2 )
138
DI (Lj, Bi), D 2 ( L 2 , B 2 )
135
SP
ssa ssa ssa ssa
Di (LI, BI), D 2 ( L 2 , B 2 )
132
ZAP
ssa
DI (Li, Bi), D 2 ( L 2 , B 2 )
134
Addieren gepackt
AP
Dividieren gepackt
DP
Multiplizieren gepackt
MP
Subtrahieren gepackt Übertragen gepackt, rechtbündig mit führenden Nullen
Festpunktarithmetik Addieren FP-Wort
A
RX
RI, D 2 (X 2 , B 2 )
141
Addieren FP-Halbwort
AH
RX
RI, D 2 ( X 2 i B 2 )
142
Addieren FP-Wort logisch
AL
RX
Ri, D 2 (X 2 , B 2 )
-
Addieren FP-Register logisch Addieren FP-Register
ALR AR
RR RR
R
Ri, R 2
140
Dividieren durch FP-Wort
D
RX
RI, D 2 ( X 2 , B 2 )
148
Dividieren durch FP-Register
DR
RR
RI, R 2
146
Multiplizieren mit FP-Wort
M
RX
RI, D 2 (X 2 , B 2 )
144
l> R2
5.2 Tabelle der Maschinenbefehle
285
Instruktion
Op.Code symb.
Typ
Operandenformat explizite
Seite
Multiplizieren mit FP-Halbwort
MH
RX
R I D 2 (X 2 , B 2 )
145
Multiplizieren mit FP-Register
MR
RR
S
RX
RI R2 R I D 2 ( X 2 , B2)
143
Subtrahieren FP-Wort Subtrahieren FP-Halbwort
SH
RX
R I D 2 (X 2 , B 2 )
142
Subtrahieren FP-Wort logisch
SL
RX
R I D 2 (X 2 , B 2 )
—
Subtrahieren FP-Register logisch
SLR
RR
RI R2
_
Subtrahieren FP-Register
SR
RR
RI R2
140
141
Gleitpunktarithmetik Addieren GP-Doppelwort
AD
RX
Addieren GP-Register lang
ADR
RR
R I D 2 ( X 2 , B2) RI R2
149
Addieren GP-Wort
AE
RX
R I D 2 ( X 2 i B2)
151
Addieren GP-Register kurz AER
RR
RI R2
149
Addieren GP-Wort unnormalisiert
AU
RX
R I D 2 (X 2 , B 2 )
_
Addieren GP-Register kurz, unnormalisiert
AUR
RR
RI R2
_
Addieren GP-Doppelwort unnormalisiert
AW
RX
R I D 2 (X 2 , B 2 )
Addieren GP-Register lang, unnormalisiert
AWR
RR
RI R2
_
Dividieren durch GP-Doppelwort
DD
RX
R I D 2 (X 2 , B 2 )
157
RI R2 R I D 2 (X 2 , B 2 )
156
151
Dividieren durch GP-Register lang
DDR
RR
Dividieren durch GP-Wort
DE
RX
Dividieren durch GP-Register kurz
DER
RR RR
RI R2 RI R2
156
Halbieren GP-Register lang HDR Halbieren GP-Register kurz
HER
RR
RI R2
_
Multiplizieren mit GP-Doppelwort
MD
RX
R I D 2 (X 2 , B 2 )
155
Multiplizieren mit GP-Register lang
MDR
RR
RI R2
154
Multiplizieren mit GP-Wort
ME
RX
R I D 2 (X 2 , B 2 )
155
157
-
5. Anhang: Programmierhilfen
286
Instruktion
Op.Code symb.
Typ
Operandenformat explizite
Seite
Multiplizieren mit GP-Register kurz
MER
RR
Ri> R2
154
Subtrahieren GP-Doppelwort
SD
RX
R,, D 2 (X 2 , B 2 )
153
Subtrahieren GP-Register lang
SDR
RR
R
Subtrahieren GP-Wort
SE
RX
Ri, D 2 (X 2 , B 2 )
153
Subtrahieren GP-Register kurz
SER
RR
RI, R 2
152
Subtrahieren GP-Wort unnormalisiert
SU
RX
Ri. D 2 (X 2 , B 2 )
-
Subtrahieren GP-Register kurz, unnormalisiert
SUR
RR
RI. R2
-
Subtrahieren GP-Doppelwort unnormalisiert
SW
RX
R I , D 2 (X 2 , B 2 )
-
Subtrahieren GP-Register lang, unnormalisiert
SWR
RR
RI, R 2
-
l»
R
2
152
Vergleichsoperationen Vergleichen FP-Register mit FP-Wort
C
RX
RL D 2 (X 2 , B 2 )
163
Vergleichen GP-Register mit GP-Doppelwort
CD
RX
R I , D 2 ( X 2 , B2)
166
Vergleichen GP-Register lang
CDR
RR
RI, R 2
166
Vergleichen. GP-Register mit GP-Wort
CE
RX
RI, D 2 ( X 2 , B 2 )
166
Vergleichen GP-Register kurz
CER
RR
R l . R2
166
Vergleichen FP-Register mit FP-Halbwort
CH
RX
Ri, D 2 (X 2 , B 2 )
164
Vergleichen Zeichen logisch
CLC
SSi
Di (LI, Bi), D 2 (B 2 )
158
Vergleichen logisch Direktzeichen
CLI
SI
D,(Bi), I 2
160
Vergleichen gepackte Dezimalzahlen
CP
SS a
Di (Li, Bi), D 2 ( L 2 , B 2 )
161
CR TM
RR
Ri. R2 Di(B,), I2
162
SI
Vergleichen FP-Register Testen Byte mit Maske
167
Verzweigungsoperationen Verzweigen nach Laden der Rücksprungadresse
BAL
RX
R l , D 2 (X 2 , B 2 )
173
5.2 Tabelle der Maschinenbefehle
287
Instruktion
Op.Code symb.
Typ
Operandenformat explizite
Seite
Verzweigen zu Registeradresse nach Laden der Rücksprungadresse
BALR
RR
Rl, R2
174
Verzweigen bedingt
BC
RX
MI, D 2 ( X 2 , B 2 )
169
Verzweigen bedingt zu Registeradresse
BCR
RR
MI, R 2
170
Vermindern Inhalt Register und Verzweigen bei # 0
BCT
RX
Ri, D 2 ( X 2 , B 2 )
175
Vermindern Register und Verzweigen bei 0 (Adresse in R 2 )
BCTR
RR
Ri, R2
176
Verzweigen wenn (Ri> nach Erhöhung größer bzw.
BXH
RS
RI, D 2 (B 2 )
178
Verzweigen wenn (R,> nach Erhöhung kleiner/ gleich bzw. BXLE
RS
Ri, D 2 (B 2 )
178
Modifizieren und Ausfuhren des adressierten Befehls EX
RX
R I , D 2 ( X 2 , B2)
179
Erweiterter mnemotechnischer Befehlscode für BC unbedingte Verzweigungen Sprung
B
RX
RI, D 2 ( X 2 , B 2 )
170
Sprung (Adresse in R 2 )
BR
RR
RI, R 2
171
Keine Operation
N0P
RX
R,, D2(X2,B2)
170
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 )
170
Verzweigen bei größer
BH
RX
Rl, D 2 ( X 2 , B 2 )
170
Verzweigen bei kleiner
BL
RX
Ri, D 2 (X 2 , B 2 )
170
Verzweigen bei ungleich
BNE
RX
RL D 2 (X 2 , B 2 )
170
Verzweigen bei kleiner/ gleich
BNH
RX
RI, D 2 ( X 2 , B2>
170
Verzweigen bei größer/ gleich
BNL
RX
R l , D 2 ( X 2 , B2)
170
Verzweigung nach arithmetischen Operationen Verzweigen bei negativ
BM
RX
Rl, D 2 ( X 2 , B 2 )
-
5. Anhang: Programmierhilfen
288 Op.Code symb.
Typ
Operandenformat explizite
Seite
Verzweigen bei nicht negativ
BNM
RX
R i . D 2 ( X 2 ) B2)
_
Verzweigen bei nicht positiv
BNP
RX
R i . D 2 (X 2 > B 2 )
Verzweigen bei ungleich Null
BNZ
RX
Instruktion
-
_
Verzweigen bei Überlauf
B0
RX
R i . D 2 ( X 2 , B2) Ri, D 2 ( X 2 , B 2 )
Verzweigen bei positiv
BP
RX
R i . D 2 (X 2 > B 2 )
-
Verzweigen bei gleich Null
BZ
RX
Ri. D 2 ( X 2 , B 2 )
-
-
Verzweigung nach TM (Testen Maske) Verzweigen bei Einsen und Nullen
BM
RX
R „ D 2 ( X 2 ) B2)
170
Verzweigen bei Einsen
B0
RX
170
Verzweigen bei Nullen
BZ
RX
Ri. D 2 (X 2 , B 2 ) Ri. D 2 (X 2) B 2 )
170
5.3 Tabelle der 2er-Potenzen
n
2"
n
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 1 024 2 048 4 096 8 192 16 384 32 768 65 536 131 072 262 144 524 288 1 048 576
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
2n 2 097 152 4 194 304 8 388 608 16 777 216 33 554 432 67 108 864 134 217 728 268 435 456 536 870 912 1 073 741 824 2 147 483 648 4 294 967 296 8 589 934 592 17 179 869 184 34 359 738 368 68 719 476 736 137 438 953 472 274 877 906 944 549 755 813 888 1 099 511 627 776 2 199 023 255 552
5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)
289
5.4 Umrechnungstabelle sedezimal - dezimal
Z4 0 1 2 3 4 5 6 7 8 9 A B C D E F z; i -
Z4
65 131 196 262 327 393 458 524 589 655 720 786 851 917 983
• 16 4
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 B C D E F
Z3-163
4 8 12 16 20 24 28 32 36 40 45 49 53 57 61
Sedezimalziffer
0 096 192 288 384 480 576 672 768 864 960 056 152 248 344 440
z2 0 1 2 3 4 5 6 7 8 9 A B C D E F
z 2 • 16 2
1 1 1 1 2 2 2 2 3 3 3 3
Zl 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 256 512 768 024 280 536 792 048 304 560 816 072 328 584 840
z
r
16 1 0 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240
zo
zo•16°
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Zj • 16' - Dezimalwert
Sedezimalstelle mit dem Stellenwert 16'
5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)
Halbbytes (sedezimal) 00 Ol 02 03 04 05 06 017 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 BALR BCTR BCR SSK ISK SVC
-
174 176 170 — -
— — -
-
290
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
5. Anhang: Programmiethilfen
Dezimalwert
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 (HR XR LR CR AR SR MR DR ALR SLR LPDR LNDR LTDR LCDR HDR
Druckzeichen, Maskenzeichen
Seite
93 92 -
Zifferzeichen Startzeichen für Nullen Endezeichen für Nullen
91 180 180 180 87 162 140 140 143 146 -
_ -
-
_
LDR CDR ADR SDR MDR DDR AWR SWR LPER LNER LTER LCER HER
99 166 149 152 154 156 -
-
_ -
LER CER AER SER MER DER AUR SUR STH LA
98 166 149 152 154 156 -
Leerzeichen (blank)
95 85
291
5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)
Halbbytes (sedezimal) 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74
Dezimalwert 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 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
Masch ineninstruktionen (symb. Op.Code) STC IC EX BAL BCT BC LH CH AH SH MH CVD CVB ST
Druckzeichen, Maskenzeichen
< (
+
1 &
Seite 96 90 179 173 175 169 89 164 142 142 145 -
116 115 94 -
N CL 0 X L C A S M D AL SL STD
182 -
i
$ *
)
182 182 88 163 141 141 144 148
;
-
i
-
-
/
102 -
-
LD CD AD SD MD DD AW SW STE
t
%
> 7
100 166 151 153 155 157 -
101 -
-
-
5. Anhang: Pogrammierhilfen
292
Halbbytes (sedezimal)
Dezimalwert
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 9F AO Al A2 A3 A4 A5 A6 A7
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
Maschineninstruktionen (symb. Op.Code)
Druckzeichen, Maskenzeichen
Seite
_ -
LE CE AE SE ME DE AU SU SSM
#
@ = "
99 166 151 153 155 157 -
LPSW
-
WRD RDD BXH BXLE SRL SLL SRA SLA SRDL SLDL SRDA SLDA STM TM MVI TS NI CLI 01 XI LM
-
178 178 130 131 127 127 -
128 129 97 167 81
_
184 160 184 184 93 -
SI0 TI0 HI0 TCH
-
-
—
5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)
Halbbytes (sedezimal)
Dezimalwert
A8 A9 AA AB AC AD AE AF BO B1 B2 B3 B4 BS B6 B7 B8 B9 BA BB BC BD BE BF CO C1 C2 C3 C4 C5 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 185 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
293
Seite -
-
-
-
A B c D E F G H I
MVN MVC MVZ NC CLC 0C
xc
—
—
—
— —
P
81 79 82 183 158 183 183
R
_
J K L M N
d,
r
B2
5.7 Fehleranzeigen des Übersetzerprogramms (Übersetzungsphase)23 A D E
M 0 S T U Y 23
Unzulässiger Wert einer symbolischen Adresse Formfehler (falscher Längenschlüssel, Operandenausrichtung fehlt, unzulässige Zeichen in Konstantendefinition, unzulässiger Konstantentyp etc.) Syntaxfehler (Ablochformat verletzt, unzulässige Zeichen, falsche Namensbildung, Literal als 1. Operand, Fehler bei der Bildung komplexer Ausdrücke etc.) Mehrfachdefinition von Symbolen Unzulässiger symbolischer Operationscode Unzulässiges Symbol im Namensfeld Fehler bei der Makroumwandlung Symbol nicht definiert Kein Basisregister verfugbar Es werden nur die am häufigsten vorkommenden Anzeigen behandelt. Die Anzeigen erscheinen im Übersetzungsprotokoll in der Spalte „flags"; nähere Einzelheiten vgl. die einschlägigen Handbücher der Hersteller.
296
5. Anhang: Programmierhilfen
5.8 Fehleranzeigen des Betriebssystems (Ablaufphase)24 P088 Nichtdecodierbarer Operationscode (meistens, wenn in Daten- oder Konstantenfelder verzweigt wird) P092 Adressierungsfehler (Ausrichtung verletzt, Adresse zu groß) P096 Unzulässiger Datencode PI00 Exponent zu groß (bei Gleitpunktarithmetik) PI04 Division durch Null P108 Mantisse gleich Null (bei Gleitpunktarithmetik) PI 12 Exponent zu klein (bei Gleitpunktarithmetik) PI 16 Dezimalüberlauf (bei Dezimalarithmetik) PI20 Registerüberlauf (bei dualer FP-Arithmetik)
24
Es werden nur die am häufigsten vorkommenden Anzeigen behandelt. Die Anzeigen erscheinen auf dem Konsolschreiberprotokoll und als „type of termination" im Kernspeicherauszug (dump); nähere Einzelheiten vgl. die einschlägigen Handbücher der Hersteller.
Literaturverzeichnis Alletsee, R. und G. Umhauer: Assembler I, II und III. Berlin - Heidelberg - N e w York 1974. Assabgui, M.: Le langage d'assemblage. Paris 1972. Barron, D. W.: Assembler und Lader. München 1970. Chapin, N.: 360/370 Programming in Assembly Language. 2. Aufl., New York (N. Y.) e. a. 1973. Dworatschek, S.: Einfuhrung in die Datenverarbeitung. 5. Aufl., Berlin 1973. Fersehkurs im Medienverbund: Einfiihrung in die Elektronische Datenverarbeitung, Band I, II, III. Fischbach, F. und J. Breidenbach: Allgemeine Einführung in die Assembler-Sprache. Mainz 1967. Flores, I.: Assemblers and BAL. Englewood Cliffs (N. J.) 1971. Germain, C. B.: Das Programmier-Handbuch der IBM/360. 4. Aufl., München 1972. Huber, W.: Assembler. München 1973. 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/360: Die Assemblersprache. IBM System/360: Die Basic Assembler Sprache. IBM System/360: Datenorganisation auf Speichereinheiten mit direktem Zugriff. DASD-Handbuch. IBM System/360: Maschinenlogik und Aufbau der Instruktionen. 1966. IBM System/360: Principles of Operation. IDV-Lernprogramm: Elektronische Datenverarbeitung, I, II. Berlin 1971. Kuo, S. S.: Assembler Language for FORTRAN, COBOL, and PL/I Programmers. Reading (Mass.) e. a. 1974. Lohr, K. P.: Assembler-Programmierung. Berlin 1972. Mrachacz, H.-P.: Einführung in das praktische Programmieren. München 1972. Mrachacz, H.-P. und G. Paetz: Taschenbuch für Programmierer. München 1971. Niemeyer, G.: Ein integriertes Datenverarbeitungs- und Informationssystem. Berlin 1972. Opler, A. (Hrsg.): Das IBM-System/360 und seine Programmiertechniken. 2. Aufl., München - Wien 1972. Payne, W. H.: Machine, Assembly and Systems Programming for the IBM/360. New York (N. Y.) 1969. Saxon, J. A., H. S. Englander and W. R. Englander: System 360 Programming. Englewood Cliffs (N. J.) 1968. Schiro, H. und R. Herzog: Wie sag ich's dem Computer?, 2. Aufl. München 1971. Schwarzhuber, M.: Makrosprache. Berlin - München 1971. 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 System 4004 BS 1000: Assembler, Beschreibung. 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. Stabley, D. H.: System 360 Assembler Sprache. Stuttgart 1969. Struble, G.: Assembler Language Programming. Reading (Mass.), 1969.
298
Literaturverzeichnis
[39]Tuggle, S.: Assembler Language Programming: System/360 & 370. Chicago (III.) e. a. 1975. [40] Univac Serie 9000: Programmierungs-Standard, Bibliothek Teil 1 und 2. [41 JUnivac Serie 9000: Technische Beschreibung 9200, 9300. [42] Wolters, M. F. (Hrsg.): Der Schlüssel zum Computer. Reinbek b. Hamburg, 1974.
Stich wortverzeichn is A Addieren (Wort) 141 AD Addieren normalisiert lang 151, 152 ADR Addieren normalisiert lang (Register) 1 4 9 - 1 5 1 Adresse, siehe Arbeitsspeicheradressierung Adreßkonstanten 6 4 - 6 6 AE Addieren normalisiert k u r z 151, 152 AE R Addieren normalisiert k u r z (Register) 1 4 9 , 1 5 0 AH Addieren Halbwort 142, 143 AP Addieren dezimal 1 3 2 - 1 3 4 AR Addieren (Register) 140 Arbeitsspeicher 9 Organisation des - 9 Arbeitsspeicheradressierung 38 f f . absolute 39, 4 0 , 65, 189 f f . einfache 38 f f . explizite 68 f f . implizierte - 69 f f . indizierte - 4 2 f f . relative - 3 9 , 4 0 , 5 2 , 5 3 , 65 relative symbolische - 52, 7 7 - 7 9 symbolische 40, 54, 6 6 f f . Assembler, siehe Umwandlungsprogramm ASSEMBLER 4 6 f f . Elemente des - 47 Assembleranweisungen 47, 180 f f . A u f b e r e i t e n z u m Drucken 108 f f . Aufbereitungsmaske 109 Ausdrücke 4 8 f f . Ausführungsphase 180, 192 f f . B Verzweigen unbedingt 170 BAL Springen und Speichern Rücksprungadresse 173 BALR Springen (zu Registeradresse) und Speichern Rücksprungadresse 174 Basisadresse 39 absolute - 5 2 , 189 f f . relative - 5 2 , 5 3 , 189 f f . Basisregister 31, 38 f f . , 189 f f . BC Springen bedingt 1 6 9 , 1 7 0 — erweiterter Bedingungscode 170 BCR Springen (zu Registeradresse) bedingt 1 7 0 , 1 7 1 BCT Springen nach Zählen 175, 176 BCTR Springen {zu Registeradresse) nach Zählen 176, 177
Befehle, siehe Maschinenbefehle BE Verzweigen bei gleich 170 Befehlszählregister 33, 39 BH Verzweigen bei größer 170 Binärkonstante 59, 60 Bindephase 195 bit 9 - Positionen 9 f f . - Muster 9 ff. BL Verzweigen bei kleiner 170 BM Verzweigen bei gemischtem bit-Muster 170 BNE Verzweigen bei ungleich 170 BNH Verzweigen bei nicht größer 170 BNL Verzweigen bei Einsen-bit-Muster 170 BP Sprung bei positiv 170 Buchstabendarstellung 13, 15 BXH Springen, w e n n Index größer 1 7 8 , 1 7 9 BXLE Springen, w e n n I n d e x kleiner oder gleich 178, 179 Byte 9 BZ
Sprung bei Nullen-bit-Muster 170
C Vergleichen algebraisch (FP-Wort) 163, 164 CD Vergleichen lang 167 CDR Vergleichen lang (Register) 166 CE Vergleichen kurz 167 CER Vergleichen k u r z (Register) 1 6 6 CH Vergleichen Halbwort 165 CLC Vergleichen logisch 1 5 8 - 1 6 0 CLI Vergleichen logisch direkt 160 CLOSE Schließen einer o d e r mehrerer Dateien 212,213 C N T R L Steuerung eines peripheren Geräts 217, 2 1 8 CNVTDEGP U m w a n d l u n g dezimal nach sedezimal G l e i t p u n k t 117 f f . CNVTGPDE Umwandlung sedezimal Gleitpunkt nach dezimal 117 f f . C o d e u m w a n d l u n g 16 f f . , 1 0 3 f f . - EBCDI nach dezimal gepackt 1 0 3 - 1 0 6 - dezimal gepackt nach EBCDI 1 0 6 - 1 1 5 - dezimal gepackt nach dual 115, 116 - dual nach dezimal gepackt 116, 117 - dezimal n a c h sedezimaler G l e i t p u n k t zahl 117, 119 f f . - sedezimal G P nach dezimal 117, 120 f f .
300 CP Vergleichen dezimal 161, 162 CR Vergleichen algebraisch (Register) 162, 163 CSECT Definieren eines Programmabschnitts 193 ff. CV B Umwandeln in Dualzahl 115, 116 CVD Umwandeln in Dezimalzahl 116, 117 D Dividieren (Wort) 148, 149 Dateidefinitionen 207 ff. DC Definieren Konstante 186, 187 DD Dividieren lang 157, 158 DDR Dividieren lang (Register) 156, 157 DE Dividieren kurz 1 5 7 , 1 5 8 DER Dividieren kurz (Register) 156, 157 Dezimalbefehle (arithmetische) 132 ff. Dezimalkonstante 6 2 - 6 4 Dezimal gepackte Zahlendarstellung 16 ff. Direktoperanden 33 Direktwerte 49 ff. binäre - 51 dezimale - 50 sedezimale - 51 Zeichen - 5 1 , 5 2 Distanzadresse 31, 32, 35, 38 ff., 190 f. Doppelwort 10 Doppelwortgrenze 44 Ausrichtung auf - 44, 188 DP Dividieren sedezimal 1 3 8 , 1 3 9 DR Dividieren (Register) 146, 147 DROP Sperren von Basisregistern, die vorher durch USING zugewiesen wurden 192 DS Definieren Speicherplatz 187 ff. DTFDA Dateierklärung für Gerät mit direktem Zugriff 208 f. DTFEN Ende der Dateierklärungen 208 f. DTFSR Dateierklärung für Gerät mit seriellem Zugriff 208 ff. Dualer Stellenwert 14, 18, 19, 23 Duale Zahlendarstellung 17 ff., - im Halbwort 1 9 - 2 3 - im Festpunktregister 1 9 - 2 3 - im Wort 1 9 - 2 3 Duplizierfaktor 56 EBCDI-Code 11 ff. Buchstabendarstellung im - 12, 13, 15 Sonderzeichendarstellung im - 13, 16 Vorzeichendarstellung im - 12, 15 Zahlendarstellung im - 12, 15 Zifferndarstellung im - 11, 15
Stichwortverzeichnis ED Aufbereiten 1 0 8 - 1 1 5 Einfügungszeichen in Druckmaske 109 Endezeichen in Druckmaske 109 END Beenden der Umwandlung 195 ff. Entpacken 17, 1 0 6 - 1 0 8 ENTRY Definieren symbolische Adresse als Einsprungstelle 195 ff. E 0 J Programmende (identisch mit TERM) 219 EQU Wertzuweisung zu einem Symbol 4 9 - 5 1 , 185, 186 Erweiterter Bedingungscode bei Verzweigungsbefehlen 170 EX Ausführen 179, 180 EXTRN Erklären externer Symbole 6 6 , 1 9 4 ff. Festpunktkonstante 60, 61 Festpunktregister 10, 19 GET Lesen seriell 213, 214 Gleitpunktbefehle (arithmetische) 1 4 9 - 1 5 8 Gleitpunktkonstante 62 Gleitpunktregister 10, 29, 30 Gleitpunktzahl 29, 30 Halbbyte 13, 18 Halbwort 10, 18, 1 9 - 2 1 Halbwortgrenze 45 Ausrichtung auf - 44 ff., 60, 189 IC Laden Zeichen 90, 91 Indexregister 32, 42, 43 Instruktionen 47 Instruktionstypen 32 ff. Formate der - 32 ff., 295 Kilobyte 9 Komplementierung 20, 9 1 - 9 3 Konstantentyp 56 ff. L Laden (FP-Wort) 88, 89 LA Laden Adresse 8 5 - 8 7 Ladeadresse 39, 65, 189 Ladebefehle 85 ff. Längenattribut 54 Längenschlüssel 56 expliziter - 56 impliziter - 57 LCR Laden Komplement 9 1 , 9 2 LD Laden lang 100, 101
301
Stichwortverzeichnis LDR Laden lang (Register) 99 LE Laden kurz 99, 100 LER Laden kurz (Register) 98 LH Laden Halbwort 89, 90 Literal 54 ff. - mit Adreßkonstante 64 ff. - mit Binärkonstante 59, 60 - mit Dezimalkonstante 6 2 - 6 4 - mit Festpunktkonstante 6 0 - 6 2 - mit Gleitpunktkonstante 62 - mit Sedezimalkonstante 58, 59 - mit Zeichenkonstante 57, 5 8 Literalbereich 200 LM Laden mehrfach 93, 94 LNR Laden negativ 92 LPR Laden positiv 93 LR Umladen Registerwert 87, 88 L T 0 R G Eröffnen eines Literalbereichs 200 M Multiplizieren Register mit Vollwort 144, 145 Makro 47, 202 ff. - Aufruf 47, 202, 205 - Bibliothek 202, 205, 206 - Definition 202 ff. Mischform - 204 Schlüsselwort - 204 Stellungs - 203, 204 System - 207 ff. - Umwandler 202, 205 Makros 47, 202 ff. - zur Dateidefinierung 207 ff. - zum Öffnen und Schließen von Dateien 212, 213 - zum Schreiben und Lesen 2 1 3 - 2 1 7 - zur Steuerung peripherer Geräte 217-219 Maschinenbefehle 47, 66 ff. Beschreibung der - 79 ff. Syntax der - 6 7 - 7 7 Maschineninstruktionen 31 ff. MD Multiplizieren mit GP-Doppelwort 155,156 MDR Multiplizieren GP-Register lang 154, 155 ME Multiplizieren mit GP-Wort 155, 156 MER Multiplizieren GP-Register kurz 154, 155 MH Multiplizieren Register mit Halbwort 145,146 MP Multiplizieren gepackt 1 3 5 - 1 3 7
MR Multiplizieren Register 1 4 3 , 1 4 4 Musteranweisung 203 ff. MVC Übertragen Zeichen 79, 80 MVI Übertragen Direktzeichen 81 MVN Übertragen rechte Halbbytes (Ziffern) 81, 82 MV© Übertragen Zeichen versetzt 8 3 - 8 5 MVZ Übertragen linke Halbbytes (Zonen) 82, 83 N bitweise UND-Verkniipfung Register mit indiziertem Speicherwort 182 f. NC bitweise UND-Verknüpfung Speicherfeld mit Speicherfeld 183 Nl bitweise UND-Verknüpfung Speicherfeld mit Direktwert 184 NR bitweise UND-Verknüpfung Register mit Register 180 f. Nullenunterdrückung 108 ff. 0 bitweise 0DER-Verknüpfung Register mit indiziertem Speicherwort 182 f. Objektprogramm 31, 46 OC bitweise 0DER-Verknüpfung Speicherfeld mit Speicherfeld 183 01 bitweise 0DER-Verknüpfung Speicherfeld mit Direktwert 184 OPEN Eröffnen von Dateien 212 Operanden 31, 66 ff. - Adressierung 34 ff., 38 ff. Ausrichtung der - 44, 45 Länge der - 44 Operationscode 66 ff. OR bitweise 0DER-Verknüpfung Register mit Register 180 f. ORG Setzen des Zuordnungszählers 199 PACK Packen von gezonten Dezimalzahlen 16, 17, 1 0 3 - 1 0 6 PRINT Modifikation des Protokollumfangs 2 0 1 , 2 0 2 Programmsegment 193 ff. Programm-Modul 193 ff. P R T 0 V Vorschub bei Formularende 211, 218,219 PUT Schreiben seriell 214, 215 Quellenprogramm 46 ff. READ Lesen gestreut 215, 216 Register 10
Stichwortverzeichnis
302
Laden - 85 f f .
SS-Instruktionen, echt 37, 38
- Operanden 33 ff.
-
-
ST
inhalten, Speichern von 94 f f .
symbolisch 7 3 - 7 7 Speichern (FP-Wort) 94, 95
Relative Adressierung 39 f f . , 7 7 - 7 9
START
-
bei R X - und RS-Instruktionen 77
Startzeichen in Druckmaske 108
-
bei Sl-Instruktionen 78
STC
Speichern Zeichen 96, 97
-
bei SS-Instruktionen 78, 79
STD
Speichern lang 102, 103
RR-Instruktionen, echt 34
STE
Speichern kurz 101, 102
-
Stellenwert 12 f f .
symbolisch 67, 68
RS-Instruktionen, echt 35, 36 -
193
dezimaler - 21, 22
symbo lisch 71, 7 2
dualer - 14, 23
Rücksprungadresse 171 f f .
sedezimaler - 23
RX-Instruktionen, echt 34, 35
STH
Speichern Halbwort 95, 96
-
symbolisch 68, 69
STM
Speichern mehrfach 97, 98
-
als Sprungbefehle 70, 71
Symbole 48, 49 Symbolische Maschineninstruktionen 66 f f . Syntax der -
S
Subtrahieren (Wort) 141
Schutzsternschreibung 112, 113 SO
Subtrahieren normal lang 153
SDR
Subtrahieren normal lang (Register)
Systemmakros 207 f f . TERM
Beenden des Programms 219
152, 153
Tetrade 13
SE
TITLE
Subtrahieren normal kurz 153
Sedezimale Schreibweise 13 f f .
67-77
Symboltabelle 49
TM
Drucken Kopfzeile 201 Testen m i t M a s k e l 6 7 - 1 6 9
Buchstabendarstellung in - 15 Sonderzeichendarstellung in - 16
Übertragungsbefehle 7 9 - 8 5
Zahlendarstellung in - 15
Übungsprogramme 220 f f .
Zifferndarstellung in - 15
Umwandlung 41, 43, 5 2 - 5 6
Sedezimalbrüche 26, 27
Umwandlungsprogramm 46
Sedezimalkonstante 58, 59
U N P K Entpacken 1 0 6 - 1 0 8
Sedezimalsystem 14
USING
Sedezimalzahl 23 f f .
189-191
Segment 193 f f .
Unterprogrammsprung 171 f f .
SE R
Deklarieren Basisregister 41,
Subtrahieren normal kurz
(Register) 153
Vergleichsbefehle 1 5 8 - 1 6 9
SH
Verzweigungsbefehle 1 6 9 - 1 8 0
Subtrahieren Halbwort 142, 143
Shift-Befehle 1 2 7 - 1 3 2
V o l l w o r t 10
Sl-Instruktionen, echt 36, 37
Vollwortgrenze 45
-
symbolisch 72, 73
SLA
Verschieben links 128
Ausrichtung auf - 45, 6 0 - 6 2 , 188 Vorzeichendarstellung 12, 15, 20, 29, 30
S L D A Verschieben links doppelt 129, 130 SLL
Verschieben links logisch 131, 132
WAITF
SP
Subtrahieren dezimal 132, 133
eines Großspeichers beendet ist 216, 217
Warten, bis eine E/A-Operation
Sonderzeichendarstellung 13, 16
Wertzuweisung, siehe E Q U
Speicherbefehle 94 f f . , 1 0 1 - 1 0 3
WRITE
Speicheroperanden 31
Wort 18, 19, 20
Schreiben gestreut 216
Sprungbefehle 70, 71, 1 6 0 - 1 8 0 SR
Subtrahieren (Register) 140
X
SRA
Verschieben rechts 127
Register mit indiziertem Speicherwort 182 f.
bitweise exklusive 0DER-Verknüpfung
SR D A Verschieben rechts doppelt 128, 129
XC
SRL
Speicherfeld mit Speicherfeld 183
Verschieben rechts logisch 130, 131
bitweise exklusive 0DER-Verknüpfung
Stichwortverzeichnis XI bitweise exklusive 0DER-Verknüpfung Speicherfeld mit Direktwert 184 XR bitweise exklusive 0DER-Verknüpfung Register mit Register 180 ff.
Zahlendarstellung 12, 15,16 ff. dezimal gepackte - 16, 17 dezimal gezonte — 12, 15 - dual 1 7 - 2 1 - im Festpunktregister 19-21 - im Gleitpunktregister 29, 30 - im Halbwort 1 9 - 2 1 - im Wort 1 9 - 2 1 polynomiale - 2 1 - 2 9 sedezimale - 2 3 - 3 0
303 Zahlensysteme 21 ff. Umrechnung von - 23 ff. ZAR Löschen und Addieren dezimal 134,135 Zeichendirektwert 51, 52 Zeichenkettenverarbeitung 11 Zeichenkonstante 57, 58 Zifferndarstellung 11, 15 Ziffernteil 103 Ziffernzeichen in Druckmaske 108 Zonenteil 103 Zuordnungszähler 52 ff. Stand des - 52 ff. Steuerung des - 199 Vorrücken des - 200 Zweierkomplement 20
w DE
G G. Niemeyer
Walter de Gruyter Berlin-New York Einführung in das Programmieren in PASCAL
Mit Sonderteil UCSD-PASCAL-System 15,5 cm x 23 cm. 167 Seiten. 1980. Plastik flexibel DM 24,- ISBN 3110082802 (de Gruyter Lehrbuch)
E. W. Mägerle
Einführung in das Programmieren in BASIC
2., durchgesehene Auflage. 15,5 cm x 23 cm. 112 Seiten. 1980. Plastik flexibel DM 19,80 ISBN 311008227 6 (de Gruyter Lehrbuch)
K. Hambeck
Einführung in das Programmieren in COBOL
3., verbesserte Auflage. 15,5 cm x 23 cm. X, 163 Seiten. 1981. Kartoniert DM 26,ISBN 311008693 X (de Gruyter Lehrbuch)
S. Dworatschek
Grundlagen der Datenverarbeitung
6., völlig neu bearbeitete und erweiterte Auflage. 15,5 cm x 23 cm. 538 Seiten. Mit über 200 Abbildungen, 211 Übungsaufgaben und einem Anhang mit 59 Fotos. 1977. Kartoniert DM 44,ISBN 3110071908 (de Gruyter Lehrbuch)
Th. Spitta B. Gasch H. Franck
Systematische Einführung in die kommerzielle EDV
Kimm / Koch Simonsmeier / Tontsch
Einführung in Software Engineering
Problemlösen mit COBOL 15,5 cm x 23 cm. XVI, 369 Seiten. 1979. Plastik flexibel DM 36,- ISBN 3 11 007544 X (de Gruyter Lehrbuch)
15,5 cm x 23 cm. 306 Seiten. 1979. Plastik flexibel DM 38,- ISBN 3110078368 (de Gruyter Lehrbuch) Preisänderungen vorbehalten