335 107 16MB
German Pages 295 [296] Year 1973
de Gruyter Lehrbuch Niemeyer • Programmieren in A S S E M B L E R
Einführung in das Programmieren in ASSEMBLER Systeme IBM 360, IBM 370, Siemens 4004, Univac 9000 von Gerhard Niemeyer
W DE G Walter de Gruyter • Berlin . New York • 1973
© Copyright 1973 by Walter de Gruyter & Co., vormals G. J. Göschen'sche 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 Fotokopie, Mikrofilm oder ein anderes Verfahren) ohne schriftliche Genehmigung des Verlages reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden. Satz und Druck: Mercedes-Druck, Berlin 61 Printed in Germany ISBN 3 1 1 0 0 4 3 1 0 6
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 für kaufmännische und verwaltungstechnische Aufgaben. Die von den Herstellern angebotenen problemorientierten Programmiersprachen COBOL (common business oriented language), PL/1 und RPG (report program generator), die ebenfalls auf derartige Aufgabenstellungen zugeschnitten sind und die den Programmieraufwand reduzieren sollen, konnten ASSEMBLER nicht aus seiner führenden Position verdrängen. Dies mag teils mit der absoluten Universalität und dem Testkomfort der ASSEMBLER-Sprache zusammenhängen und teils durch die spürbar längeren Übersetzungszeiten für die in problemorientierten Sprachen geschriebenen Programme begründet sein. Hinzu kommen sicherlich auch „gefühlsmäßige" Präferenzen durch die Programmierer, die an der Programmiersprache ASSEMBLER die größere Freiheit der Programmgestaltung und die größere Transparenz der eigentlichen Datenverarbeitungsvorgänge in der Maschine schätzen. In der Tat erscheinen diese Faktoren geeignet, insbesondere den Neuling auf dem Gebiet der elektronischen Datenverarbeitung für diese Tätigkeit zu interessieren und ihn gründlich in dieses Gebiet einzuführen. Aus diesem Grunde sieht das vom Verfasser konzipierte Informatik-Studium für Studenten der Wirtschaftswissenschaften an der Universität Regensburg u. a. eine Einführung in ASSEMBLER im Grundstudium vor. Über diese didaktischen Überlegungen hinaus muß jedoch auch auf die Bedeutung der ASSEMBLER-Sprache als universelle Basis für ,.höhere" Programmieraufgaben, wie Systemprogrammierung, Compilerbau und Aufbau von Datenbank- und Informationssystemen hingewiesen werden. Das Erlernen der ASSEMBLER-Sprache schafft also einen idealen Ausgangspunkt für vielerlei berufliche Spezialisierungen im Bereich der elektronischen Datenverarbeitung. Das vorliegende Lehrbuch ist als möglichst umfassende Einführung in ASSEMBLER gedacht und kann darüber hinaus vom Programmierer auch als Nachschlagewerk benutzt werden; letzteres allerdings mit der Einschränkung, daß wegen der Knappheit des verfügbaren Raumes nicht der gesamte Sprachumfang dargestellt werden konnte. Jedoch dürfte das Gebotene für die meisten Aufgabenstellungen ausreichen. Das Lehrbuch ist in vier Hauptabschnitte unterteilt: Der erste Abschnitt behandelt die Datendarstellung in Bytemaschinen, der zweite die Maschineninstruktionen und der dritte die ASSEMBLER-Sprache.
Der vierte Abschnitt zeigt die Anwendung anhand mehrerer Beispiele, die von einfachen kaufmännischen Problemen bis hin zu Problemen, wie sie im Compilerbau vorkommen, reichen. Bei der Lektüre des Buches empfiehlt es sich, mit den Beispielen in Hauptabschnitt 4 zu beginnen. Die dabei auftretenden Fragen können dann unter Benutzung des ausfuhrlichen 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. [26], [10] und [0] empfohlen Regensburg, im Februar 1973
Gerhard Niemeyer
Inhaltsverzeichnis
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
46 46 47 48 48 49 52 54 54 66 67 77 79 79 85 103 127 132 140 149 158 169
8
Inhaltsverzeichnis 3.5 Assembler-Anweisungen 180 3.5.1 Anweisungen zur Symbol-, Konstanten- und Felddefinition 181 185 3.5.2 Anweisungen zur Deklaration und Aufgabe von Basisregistern 3.5.3 Anweisungen zur Programmsegmentierung und Segmentverknüpfung. . 189 3.5.4 Anweisungen zur Steuerung des Zuordnungszählers 195 3.5.5 Anweisungen zur Modifikation des Übersetzungsprotokolls 196 3.6 Elementare Makroprogrammierung 198 3.6.1 Die Definition von Makros 199 3.6.1.1 Die Aufstellung der Instruktionsfolge 199 3.6.1.2 Die Definition des Makroaufrufs (Modellanweisung) 199 3.6.1.3 Steuerung des Assembler: 200 3.6.1.4 Das Eintragen der Makrodefinition 201 3.6.2 Der Aufruf von Makros 202 3.7 Systemmakros 203 3.7.1 Systemmakros zur Definition von Dateien 203 3.7.2 Systemmakros zum Öffnen und Schließen von Dateien 208 3.7.3 Makros zum Lesen und Schreiben von Dateien 209 3.7.4 Makros zur Steuerung peripherer Geräte 213 3.7.5 Das „Ende-Makro" 215
4. Übungsprogramme Übung Übung Übung Übung Übung Übung Übung Übung Übung Übung
1: Auflisten von Adreßkarten 2: Ausdrucken des Inhalts eines Festpunktregisters 3: Dezimalarithmetik 4: Dualarithmetik 5: Rechnungsschreibung 6: Sortieren von Adreßkarten numerisch und alphabetisch 7: Programmsegmentierung bei Übung 1 8a: Erzeugen einer Banddatei mit statistischen Erhebungsdaten 8b:Auszählen statistischer Merkmale von einer Banddatei 9: Sedezimale Gleitpunktarithmetik
5. Anhang: Programmierhilfen 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8
Lochkartenformat im ASSEMBLER Tabelle der Maschinenbefehle Tabelle der 2er-Potenzen Umrechnungstabelle sedezimal — dezimal Tabelle der möglichen bit-Muster im Byte (sedezimal) Tabelle der maschineninternen Instruktionsformate Fehleranzeigen des Übersetzerprogramms (Übersetzungsphase) Fehleranzeigen des Betriebssystems (Ablaufphase)
216 216 219 222 228 234 244 250 253 255 264 275 275 276 282 283 283 289 289 290
Literaturverzeichnis
291
Stichwortverzeichnis . .
292
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
509
xxxxxxxx
xxxxxxxx
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 8 = 256 verschiedene bit-Muster bilden. 1
In Wirklichkeit besteht ein Byte aus 9 bits. Das 9. bit dient jedoch als „paiity 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 Gebilden erfolgt durch die Angabe der jeweils niedrigsten Byteadresse. b) Register Byte-Maschinen verfugen über 20 Operandenregister, zu denen der Programmierer direkten Zugriff hat. Von diesen sind 16 sogenannte Festpunktregister mit je 32 bits und 4 sogenannte Gleitpunktregister mit je 64 bits. Die einzelnen bits der Register werden in der Regel durch Flip-Flop-Schaltungen realisiert mit Kippzeiten im Nanosekundenbereich. Zum Vergleich sei erwähnt, daß die Ummagnetisierungszeiten im Arbeitsspeicher im Mikrosekundenbereich liegen. Die Zustandsänderungen der einzelnen bits vollziehen sich also in den Registern etwa um den Faktor 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: dezimal
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 s 4
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.
1. Die Darstellung von Daten in Bytemaschinen
12
Zahlendarstellung (Beispiel): Adressen:
317 im ! oooi Tausender
318 im >! oooo Hunderter
319 im ! ooio .i Zehner
320 1 im ! ooii Einer
Legt man fest, daß das Byte Nr. 317 den Stellenwert 10 3 , 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 ( 1 1 1 1 ) Zur Markierung negativer Zahlen dienen folgende bit-Muster: 110 1 10 11 Voizeidiendarstellung (Beispiele): + 1023
1023
im ! oooi 1 1
1 1111 ! 0000 1 0
1 1111 j 0010 1 2
lioo ; ooii
i i m ;> oooi 1
i m ! oooo 0
i m ! ooio 2
lioi ; ooii 3
+
3
1.2.2 Die Darstellung von Buchstaben und Sonderzeichen Buchstaben werden im Byte in der Weise dargestellt, daß die bit-Muster 0 0 0 1 bis 1 0 0 1 zur Darstellung der Ziffern 1 bis 9 in den bit-Positionen 3 2 1 0 mit den bit-Mustern 1 1 0 0, 1 1 0 1 und 1 1 1 0 in den bit-Positionen 7 6 5 4 kombiniert werden. Die Darstellung geschieht in Analogie zum Lochkartencode, wobei die bit-Muster 1 1 0 0, 1 1 0 1 und 1 1 1 0 die Funktionen der Zonenlochungen 12, 11 und 0 übernehmen..In diesem Zusam-
1.2 Der EBCDI-Code
13
menhang nennt man auch die bit-Positionen 7 6 5 4 den „Zonenteil" und die bit-Positionen 3 2 1 0 den „Ziffernteil" des Byte. Buchstab endarstellung bit-
Pos.
32 10
3 2 10
3210
3210
3210
3210
3 2 10
3 2 10
32 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
F 0
V
W
G P X
H
N
I R Z
L T
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 10
32 10
32 10
32 10
32 10
32 10
32 1 0
32 10
7654
0000
0001
1010
1011
1100
1101
1110
1111
0100
blanc
( )
+
1
&
#
*
% @
—
1
> =
?
It
1.2.3 Die sedezimale Schreibweise von Bit-Mustern Bei der Angabe von Byte-Inhalten ist es recht umständlich, die bit-Muster hinzuschreiben. Auch lassen sich diese bit-Muster wegen ihrer Unübersichtlichkeit nur schwer entschlüsseln. Um nun das Schreiben und Lesen von Byte-Inhalten zu erleichtern, wurde die sedezimale Schreibweise geschaffen. Diese Schreibweise beruht auf der Einteilung des Byte in zwei 4-er Gruppen (Tetraden) von bit-Positionen und der Kennzeichnung der bit-Muster in jeder Tetrade durch ein einfaches Zeichen. Die Aufteilung des Byte in zwei Tetraden ergibt sich aus der Natur des EBCDI-Code, bei dem für die Verschlüsselung von Ziffern, Buchstaben und Sonderzeichen die bit-Positionen 7 6 5 4 und 3 2 1 0 als selbständige logische Einheiten zusammenwirken. Für diese logischen Einheiten sind neben den Bezeichnungen „Zonenteil" und „Ziffernteil" vor allem im Zusammenhang mit der sedezimalen Schreibweise auch die Bezeichnungen „linkes Halbbyte" und „rechtes Halbbyte" gebräuchlich.
1. Die Darstellung von Daten in Bytemaschinen
14
Mit den 4 bits einer Tetrade lassen sich 2 4 = 16 verschiedene bit-Muster erzeugen, denen man je eine Ziffer des Sedezimalsystems, zu Deutsch 16-er System, zuordnet. Die 16 Ziffern des Systems lauten 0 1 2 3 4 5 6 7 8 9 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 bit - positk}n Wichtig ist, daß die bit-Positionen in jeder Tetrade, also auch im linken Halbbyte von 0 bis 3 numeriert werden. Multipliziert man jetzt die Einsen eines bit-Musters mit den entsprechenden Stellenwerten und addiert man die Produkte, so erhält dieses bit-Muster einen bestimmten Dezimalwert. Dabei können sich Dezimalwerte zwischen 0 und 15 ergeben. Diesen Werten ordnet man schließlich die Sedezimalziffern 0 bis F entsprechend den Positionsnummern 0 bis 15 in der oben dargestellten Reihenfolge zu. Beispiel: Das bit-Muster 1011 hat den Dezimalwert 1 • 2 3 + 0 • 2 2 + 1 • 2 1 + + 1 -2° = 11. Die elfte Sedezimalziffer lautet aber B. Folglich wird dem bitMuster 1011 die Ziffer B zugeordnet. Zuordnung von Sedezimalziffern 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 Sedezimalziffern zu verstehen!
15
1.2 Der EBCDI-Code
Der Vorzug dieses Systems besteht wie gesagt in der Möglichkeit der Kompaktdarstellung von bit-Mustern in Halbbytes. Statt 1 1 1 0 schreibt man einfach E, oder statt 1 0 0 1 einfach 9. Nutzt man dies für die in den vorangehenden Kapiteln dargestellten EBCDI-Verschlüsselungen von Ziffern, Zahlen, Buchstaben und Sonderzeichen aus, so erhält man nunmehr folgende Codiertabellen:
Ziffern dezimal
EBCDI (sedezimal)
0 1 2 3 4 5 6 7 8 9
FO 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
*
blanc &
t
/
• >
#
< *
%
@
D
E
F
( )
+
1 n ?
—
f
>
> =
ti
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: 4
2
Uli ! 0100 i
3
im !• ooio
noi ; ooii
0100 \ 0010
ooii ! noi
0001 t 0000 1
oioi ! lioo 1
i m !1 oooo
lioo ! oioi 1
.
Packen
Entpacken
1111 1! 0001
X
X
In sedezimaler Schreibweise stellen sich diese Vorgänge wie folgt dar: F4
F2
D 3
4
2
3 D
I l X
Packen
Entpacken
/
/ I X 1
Fl
0
F0
s
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 überführen.
18
1. Die Darstellung von Daten in Bytemaschinen
Die duale Zahlendarstellung tritt auf im Halbbyte, Byte, ll/2 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-Positk>n
Die in diesen Bytegebilden dargestellten Zahlen haben dann folgenden Dezimalwert: z n _ j • 2 n— ^ + z n _ 2 - 2 n _ 2 + . . . + z 2 -2 2 + z t -2 1 + z 0 -2° = Zahl 10 Dabei haben die z; die Werte 0 oder 1 und n ist die Anzahl der Dualziffern. Beispiel: 01011001 2 = 0 - 2 7 + 1 • 2 6 + 0 • 2S + 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 3 + 2 1 + 2 ° = 8 + 4 + 2 + 1 = 15 1 0 = 2 4 - 1 Die Zahl der möglichen bit-Muster ist hingegen 16 = 2 4 . Die größte im Byte darstellbare Zahl ist: 11111111 2 = 2 7 + 2 6 + 2S + 2 4 + 2 3 + 2 2 + 2 1 + 2° = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 10 = 2» - 1 Die Zahl der möglichen bit-Muster ist hingegen 256 = 2 8 . Die größte in IV2 Bytes darstellbare Zahl ist: 111111111111 2 = 2 U + 2 1 0 + 2 9 + 2 S + (2 S - 1) = 2048 + 1024 + 512 + 256 + 255 = 4095 1 0 = 2 1 2 - 1 Die Zahl der möglichen bit-Muster ist hingegen 4096 = 2 1 2 . Die Zahlen 15, 255 und 4095 treten im Zusammenhang mit der Adreßrechnung sehr häufig auf. Es wird daher empfohlen, sie im Gedächtnis zu behalten.
1.5 Die Zahlendarstellung im Halbwort, Wort und Festpunktregister Halbwort und Wort im Arbeitsspeicher sind Operanden für die Dualarithmetik, die mit Hilfe der Festpunktregister abgewickelt wird. Die in diesen Bytegebilden verschlüsselten Zahlen müssen daher auf die Zahlendarstellung in den Festpunktregistern abgestimmt sein. Gegenüber der rein dualen Zahlendarstellung besteht hierbei insofern ein Unterschied, als im Halbwort, Wort und Festpunktregister die jeweils höchste
20
1. Die Darstellung von Daten in Bytemaschinen
(äußerst linke) bit-Position der Vorzeichendarstellung vorbehalten ist, und zwar gilt: Positive Zahlen beginnen mit einer 0 und negative Zahlen mit einer 1 in der 15. bzw. 31. bit-Position. Ferner gilt für negative Zahlen die Besonderheit, daß sie ausschließlich im sogenannten Zweierkomplement dargestellt werden. Diese Komplementierung geschieht in der Weise, daß von der bit-Position 0 ausgehend alle Nullen (so vorhanden) bis einschließlich der ersten Eins übernommen und daß von da ab alle Dualziffern umgekehrt werden. Also aus Einsen werden Nullen und umgekehrt. Um diese Komplementierung braucht sich jedoch der Programmierer normalerweise nicht zu kümmern, da sie von der Maschine automatisch vorgenommen wird. Allerdings sind diese Maschinenfunktionen auch durch den Programmierer ansprechbar. Beispiele: 15
+ 105 lo
31
0
0
15 31
01101001 => 1 — 76io
15 31 1
- 105 lo
15 0 31 10110100 =>0
0
10010111 + 76 i 0 0 01001100
Das letzte Beispiel zeigt, daß die Komplementierung einer negativen Dualzahl (des Zweierkomplements) wieder die ursprüngliche positive Dualzahl ergibt. Die größten im Halbwort und Wort darstellbaren positiven Zahlen sind: 15 14 31 30 0 0 11 1, 1S was den Dezimalzahlen 2 - 1 = 32767 bzw. 2 3 1 - 1 = 2147483647 entspricht. Die dem Betrag nach größtmöglichen negativen Zahlen im Wort und Halbwort sind: 15 14 31 30 o 1 00 0, 1S 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 o 0, 1 00
1.6 Exkurs: Zahlensysteme
21
d. h. sie bleiben negativ. Daher ist die Komplementierung der größten negativen Zahlen nicht möglich. Die Dualzahl
IS 31 0 1 1 1 1 1 stellt eine dezimale — 1 dar, denn ihr Komplement ist 15 31 o
000
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 111
0 10 1
stellt eine dezimale — 3 dar, denn ihr Komplement ist 15 31 o 0 0 0 O l 1, also eine dezimale + 3. Zur Übung stelle man die Zahlen — 4 bis - 10 im Dual-Code dar und überprüfe sie durch Rückkomplementierung.
1.6 Exkurs: Zahlensysteme 1.6.1 Die polynomiale Zahlendarstellung Das allen geläufige dezimale Zahlensystem basiert auf 10 Ziffern, nämlich 0 bis 9. Diese stehen in Gruppen zusammen und bilden durch Zuordnung zu dezimalen Stellenwerten die Dezimalzahlen. Nimmt man also beispielsweise die Zifferngruppe 9172 und ordnet man z.B. der 9 den Stellenwert 1000, der 1 den Stellenwert 100, der 7 den Stellenwert
22
1. Die Darstellung von Daten in Bytemaschinen
10 und der 2 den Stellenwert 1 zu, so erhält man die Dezimalzahl 9 • 1000 + 1 • 100 + 7 • 10 + 2 • 1 ; in Worten: neuntausendeinhundertzweiundsiebzig. Wählt man andere Stellenwerte, z.B. 10, 1, Vio» V100» so ergibt sich die Dezimalzahl 9 1 0 + 1 - 1 + 7 - 7 1 0 + 2-Vìoo; . 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 10er-Potenzen handelt. Dezimalzahlen lassen sich daher allgemein als Polynome der folgenden Art beschreiben: Z 1 0 = Zn-i • IO"" 1 + . . . + z 2 • 102 + zx • 101 + z 0 • 10° + z_i • 1 0 - 1 + . . . . . . + z_m• 10-m Darin bedeuten: Z10: 10: Zj: 10': n: m:
Dezimalzahl Basis des Zahlensystems Dezimalziffer, 0 < Zj < 9 Stellenwert der Ziffer Zi 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„_! - b " - 1 + . . . + z 2 b 2 + Z l b 1 + z 0 - b ° + z_! - b - 1 + . . . • • • + z-m • b - m Darin bedeuten: Zb: b: z{: b1: n: m:
Zahl eines bestimmten Zahlensystems Basis des_Zahlensystems Ziffer, 0 < zK < b - 1 Stellenwert der Ziffer z\ 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 Basis Ziffern Stellenwerte
Dualsystem2
10 2 0 bis 9 Obis 1 ...loMoMCio- 1 ... . . . 2 3 2 2 2 1 2 °
Sedezimalsystem 16 0 bis F ...lóMó 1 16° 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. 282). Jedoch dekken diese Tabellen zumeist nur einen eng begrenzten Zahlenbereich ab; auch sind diese Tabellen nicht immer zur Hand. Aus diesen Gründen ist es nützlich, die diesen Tabellen zugrundeliegenden Umrechnungsverfahren zu kennen. a) Umrechnung von Dualzahlen und Sedezimalzahlen in Dezimalzahlen Diese Umrechnung benutzt die polynomiale Zahlendarstellung, und zwar ist Z 1 0 = z n _ ! b n _ 1 + . . . + z 2 b 2 + z1 b 1 + z 0 - b ° + z _ r b - 1 + . . . ... + z_m-b-m Darin bedeuten: Z 1 0 : gesuchte Dezimalzahl Zji Dualziffer (Sedezimalziffer) als Dezimalzahl geschrieben 1 b: 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 + l - 2 2 + 0 - 2 1 + 1 - 2 ° = 0 + 1 6 + 8 + 4 + 0 + 1 = 29 1 0
(2)
Die Sedezimalzahl A2E ist in eine Dezimalzahl umzurechnen. A2E 16 = A-16 2 + 2-16 1 + E - 1 6 0 = 10-256 + 2 16 + 14-1 = 2606 io
2
Gebrochene Dualzahlen sind im Zusammenhang mit der elektronischen Datenverarbeitung nicht üblich.
24
1. Die Darstellung von Daten in Bytemaschinen
(3)
Die Sedezimalzahl E.3 ist in eine Dezimalzahl umzurechnen. E.3 16 = E • 16° + 3 • 16
= 14 • 1 + 3 • Vi« = 14.1875 j 0
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. Z 1 0 = z „ _ 1 b n - 1 + . . . + z 3 -b 3 + z 2 - b 2 + Zj-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 zn_1 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 , + b(z 2 + b(z 3 + . . . + b Zn^))) . . .) Sodann werden die gesuchten Ziffern zf durch fortgesetzte Modulodivision3 dieses Polynoms mit der Basis b ermittelt. Dies ist möglich, weil die Ziffern Z{ wegen 0 < Zj < b — 1 stets kleiner als die Basis b sind und daher als Divisionsreste herausfallen. Betrachtet man das obige Hornerschema, so ist leicht einzusehen, daß bei der Division von Z , 0 durch b das Resultat zi
+ b(z 2 + b ( z 3 + . . . + b z„_ 1 )) . . .)
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 . O . . .) und als Rest bleibt zlt 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 yit 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
Zjo = z 0 + b (z t + b (z2 + b (z3 + b • z4))) ^ V ' yo ^ V ' y t = Zj + b (z2 + b (z3 + b • z 4 )) v v y 2 = z 2 + b(z 3 + b - z 4 ) y 3 = z3 + b z 4 W y4 Der schematische Ablauf des Algorithmus stellt sich dann wie folgt dar: Zio = yo : b = y t
Rest z„
y i : ' b = y2
Rest Zj
y2 : b = y 3
Rest z 2
y3 : b = y4
Rest z 3
y4 : b = 0
Rest z 4
Die Dezimalzahl Z 10 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
4
Rest 1 (z 2 )
2
Rest 0 (z 3 )
2:2=
1
Rest 0 (z 4 )
1:2=
0
Rest 1 (z s )
9:2=
Es ist also 38 10 = 1001102 Probe: 1 -2S + 0 - 24 + 0 - 2 3 + 1 -2 2 + 1-2 1 + 0 - 2° = 32 + 0 + 0 + 4 + 2 + 0 = 38,o
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 q )
2 :16 = 0
Rest 2 (z t )
Es ist also 38!o = 26 16 Probe: 2 • 161 + 6 • 16° = 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 10 = z_i • b " 1 + z_ 2 • b - 2 + . . . + z _ m • b _ m oder als Hornerschema geschrieben: •Z 10 = b ' H z - ! + b - * ( z _ 2 + b "
1
^ + • • • + b - 1 • z_ r a ))) . . .)
Die Ziffern z _ t 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 _ j + b~l(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 y,, dann läßt sich dieses Polynom wie folgt auflösen: .Zio = b - 1 ( z _ j + b - 1 ( z _ 2 + b _ 1 • z_3))
1.6 Exkurs: Zahlensysteme
27
Der schematische Ablauf des Algorithmus stellt sich dann wie folgt dar: Zio = y - i - b = z _ j + y_2 y _ 2 • b = z_ 2 + y_a y _ 3 • b = z_3 Der Dezimalbruch .Z 10 wird also im b-Zahlensystem durch die Ziffernfolge z _ j z_ 2 z_ 3 repräsentiert. Beispiele: (1)
Gegeben sei der Dezimalbruch 0.3; gesucht wird der entsprechende Sedezimalbruch ,Z 10 = .3 • 16 = 4 + .8 .8 • 16 = 12 + .8 . 8 ^ 1 6 ^ 2 + .8 usw.
Schreibt man die gefundenen Werte z_ i als Sedezimalziffern, so erhält man 0.3 10 = 0-4CC . . . ., 6 (2)
Gegeben sei die Dezimalzahl 213.04; gesucht wird die entsprechende Sedezimalzahl a) Umrechnung des ganzzahligen Teiles: 213 :16 = 13 13 :16 = 0
Rest 5 Rest 13(D)
b) Umrechnung des Dezimalbruchs: 0.04-16= 0.64
0
+0.64 0.24 0.84
0.84 • 16 = 13(D) + 0.44 usw.
28
X. Die Darstellung von Daten in Bytemaschinen
Es ist also 213.04,0 = D5.0A3D . . . . 16 Probe: 13 • 161 + 5 • 16° + 0 • 1 6 - 1 + 10 • 16 - 2 + 3 • 16~3 + 13 • 16~4 » 208 + 5 + 0 + 0.0391 + 0.0007 + 0.0002 = 213.04 lo d) Umrechnung von Dualzahlen in Sedezimalzahlen Für die Umrechnung einer Dualzahl Z 2 in eine Sedezimalzahl Z 16 benutzt man am einfachsten wieder die polynomiale Darstellung. Z 16 = z n _ j • 16— 1 + . . . + z 0 1 6 ° 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 führenden Nullen aufzufüllen) und diese dann in die entsprechenden Sedezimalziffern umcodiert. Beispiel: Gegeben sei die Dualzahl 111011011. Diese wird eingeteilt und umcodiert:, 00011i 1101!i 1011 1 D B Dann ist Z2 = l - ^ + D l ö 1 + B 1 6 ° = 1DB16 Zur Probe werden beide Zahlen in Dezimalzahlen umgerechnet: Z2 = 1 - 2 8 + 1 - 2 7 + 1 - 26 + 0 - 2 s + 1 - 24 + 1 - 23 + 0-2* + 1- 21 + 1 - 2° = 256 + 128 + 64 + 0 + 16 + 8 + 0 + 2 + 1 = 475 10 oder Z 16 = 1 • 162 + D • 161 + B • 16° = 1-256 + 13 -16 + 11-1 = 256 + 208 + 11 = 475 10 e) Umrechnung von Sedezimalzahlen in Dualzahlen Für die Umrechnung einer Sedezimalzahl Zi6 in eine Dualzahl Z2 empfiehlt sich ein analoges Vorgehen. Za = z n _ ! • 2 n _ 1 + . . . + zo • 2°
1.7 Die Zahlendarstellung im Gleitpunktregister
29
Die Dualziffern z n _ j 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 ¡1111Í 1010 i , Dann ist Z 1 6 = 1 • 2 9 + 0 • 2 8 + 1 • 27 + 1 • 26 + 1 -2S + 1 • 24 + l - 2 3 + 0-2 2 + 1-2 1 + 0-2° = 10111110102
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 Exp. «3
(2
56 55
32
Es werden nur die bit-Positionen 63 bis 32 des Gleitpunktregisters benutzt. Lange Gleitpunktzahlen 1 V Exp. «
«3 62
36 SS
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 Sedezimalziffern interpretiert und verarbeitet werden. Der Exponent gibt also den sedezimalen Stellenwert der äußerst linken Sedezimalziffer der Mantisse (bit-Positionen 55, 54, 53, 52) an. Beispiele: 63
32
0 ioo | 0001 + '65- 0
1110 E
0110 6
00..
+ 6 • 16° + E • 1 6 "
1
...0
= + 6.E
1 6
=
+ 6 . 8 7 5
63
1 0
32
1 oii; 1111 ,63- -2; -
1000 8 8
... 0
0....
-2 _ _ 0 . 0 8
16"
1 6
=
- 0 . 0 3 1 2 5
1 0
63
32
0 ioo ! 0010 1 +; 166 ~ r
1101 D
+ D • 16 =
0101 5 1
+
+ D 5 . 0 A 3 D
0000 0
5 • 16° 1 6
~
+
+
1010 A 0 • 1 6
_ 1
213.04io
0011 3 + A
1101 D • 1 6
- 2
+
3 • 1 6 ~
3
+ D • 1 6 ~
4
2. Maschineninstruktionen und Operandenadressierung 2.1 Allgemeine Vorbemerkungen Bytemaschinen verfügen 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 i, 2 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 Verwendimg: 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
Operanden teil
2.2 Die Instruktionen und ihte 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
i 6
Instruktionslänge
Instruktionstyp
0 0 1 1
2 Bytes (1 Halb wort) 4 Bytes (2 Halbworte) 4 Bytes (2 Halbworte) 6 Bytes (3 Halbworte)
RR RX RS, SI SS
0 1 0 1
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 fur 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: KR-Instruktionen RR symbolisiert eine „Register und Register"-Operation, z.B. Addieren auf 5, d.h. beide Operanden stehen in Operandenregistern. Im Arbeitsspeicher hat dieser Instruktionstyp folgendes Format: Ri
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
Speicheradr. d. 2. Operanden
binär:
oioi ! ion
t •
looo ! oooo
mio ! ooio .. . 1.
oooi !1 i m
Für Vergleichsoperationen gilt folgende Sonderform des RX-Formats: Op.-Code
M,
1. Byte
;
B
Xj
n,
'm
2. Byte
3. Byte
!
»
4. Byte
Mj ist ein Bedingungsschlüssel, der angibt, welches Resultat einer vorangehenden Vergleichs-, Arithmetik- oder shift-Operation zu einem Sprung zu der mit X2, B2 und D 2 gegebenen Adresse fuhrt. Beispiel: Springen, wenn zwei verglichene Operanden einander gleich sind. Springen
sedezimal:
4
,
f=-=H
! 7
g
oioo ! oui
binär:
Spningziel
i 1
7
A
looo !1 loio
! 0
F
Olli 1j 0000
! 1
A
u n ! ìoio
RS-Instruktionen RS bezeichnet eine „Register und Speicher"-Operation, z. B. Laden (mehrfach) Worte in die Register 4 bis 6; d.h. ein Operand (mehrere Speicherworte) steht im Arbeitsspeicher und der andere Operand (ausgedrückt durch den 1. und den 3. Operanden) ist eine zusammenhängende Folge von Registern. Im Arbeitsspeicher hat dieser Instruktionstyp folgendes Format: Op.-Code 1. Byte
Ri
J R, 1 2. Byte
n Bj
U I* 1 3. Byte
n D,
1
1
4. Byte
»-*
36
2. Maschineninstruktionen und Operandenadressierung
R.! und R 3 sind die niedrigste und höchste Nummer einer kontinuierlichen Folge von Festpunktregistern (1. Operand). B2 und D 2 ergeben die Speicheradresse des ersten einer kontinuierlichen Folge von Speicherworten (2. Operand). Beispiel für eine RS-Instruktion: Laden (mehrfach) 3 Worte in die Festpunktregister 4 bis 6. Laden mehrfach
sedezimal:
9
Reg. 4
Reg. 6
4
6
8
1
1 0100 | 0110
1001 \ 1000 1
binir:
Speicheradresse des 2. Operanden
\ 1
F
1
1 OHI ; oooi
4
i m ! oioo 1
Für shift-Operationen gilt folgende Sonderform des RS-Formats: Op.-Code
R,
l.Byte
1 ! 0 1 2. Byte
B2
!• 1 3. Byte
-
D2
-1 1 4. Byte
»
Ri ist die Nummer eines Festpunktregisters, dessen Inhalt der shift-Operation unterzogen werden soll; + D 2 ist die Steuergröße der shift-Operation. Beispiel: Logischer Links-shift in Register 4 um 7 bit-Positionen; sei gleich 2. Log. Linksshift
sedezimal:
8
1 !
Verschiebezahl A
9
looo ! 1001
binar:
Reg. 4
4
0100
0
8
0000
1000
!
\
0
0
0000
0000
|
5
0101
Sl-Instruktionen SI bezeichnet eine „Speicher und Direktoperand"-Operation, z. B. Übertragen eines Zeichens in ein Byte im Arbeitsspeicher. Der stets nur 1 Byte (8 bits) umfassende Direktoperand (2. Operand) ist Bestandteil der Instruktion. Im Arbeitsspeicher hat dieser Instruktionstyp folgendes Format: Op.-Code l.Byte
B, 2. Byte
'f 3. Byte
-
1 D, -i 4. Byte
*
2.2 Die Instruktionstypen und ihre Formate
37
B! und D t ergeben die Speicheradresse des ersten 1 Byte langen Operanden. I 2 ist der ebenfalls 1 Byte lange zweite Operand (Direktoperand), der aus irgendeinem der 256 möglichen bit-Muster bestehen kann. Beispiel für eine Sl-Instruktion: Übertragen eines „+"-Zeichens in ein Byte im Arbeitsspeicher: Übertragen Direktzeichen
Speicheradresse des 1. Operanden
A
A
T
sedezimal:
looi •! ooio
binär:
oioo !• ino
oioi ! oooo
oooo ! loio
SS-Instruktionen SS bezeichnet eine „Speicher und Speicher"-Operation, z. B. Addieren (Feld 2> auf (Feld 1 > oder Vergleichen (Feld 1 > mit (Feld 2>; d.h. beide Operanden stehen im Arbeitsspeicher. Die SS-Instruktionen treten in zwei Versionen auf, und zwar als SS (arithmetisch) und als SS (logisch). Der Unterschied ist, daß bei SS (arithmetisch) jeder Operand eine besondere Längenangabe hat und daß die Operation jeden Operanden in der angegebenen Länge verarbeitet; z. B. wird ein 3 Bytes langer Operand auf einen 5 Bytes langen Operanden addiert. Bei SS (logisch) hat hingegen nur der 1. Operand eine Längenangabe und die Operation verarbeitet beide Operanden in der Länge des 1. Operanden; z.B. wird ein 5 Bytes langer 1. Operand mit einem ebenso langen 2. Operanden verglichen. Im Arbeitsspeicher hat der Instruktionstyp SS (arithmetisch) folgendes Format:
SS (arithmetisch) Op.-Code 1. Byte
L, - 1 , L 2 - 1 I 2. Byte
B2
D, 3. Byte
4. Byte
5. Byte
6. Byte
Lj und L 2 sind die Längen (in Bytes) des ersten bzw. zweiten Operanden. Aus Gründen der internen Operationsabwicklung sind die Längenangaben um je 1 kleiner als die tatsächlichen Längen. Die maximalen Längen sind Li = 16. B 1; Di und B2, D 2 ergeben die Speicheradressen der beiden Operanden. Beispiel für eine Instruktion vom Typ SS (arithmetisch): Addieren gepackt (Feld 2> auf (Feld 1 >, wobei L! = 5 und L 2 = 3 ist.
38
2. Maschineninstruktionen und Operandenadressierung Addieren gepackt
L, - 1
/
binär:
8
F ! A
4 ! 2
im S 2 ± Ausdruck2 Einfaches Beispiel: MVC
FELD+13,ZAH L—4
Der Inhalt des mit ZAHL—4 adressierten Feldes wird in das mit FELD+13 adressierte Feld übertragen, und zwar in der Länge von FELD.
3.4 Maschinenbefehle
79
b) expliziter Längenschlüssel (der implizite Längenschlüssel der Felddefinition wird bei ersten Operanden ersetzt): S t ± Ausdruckt (Li), S 2 ± Ausdruck2 Einfaches Beispiel: MVC
FELD+13(5),ZAHL—4
Der Inhalt des mit ZAH L - 4 adressierten Feldes wird in der Länge 5 in das mit FELD+13 adressierte Feld übertragen. c) Mischformen (Beispiele): CLC MVC CLC
7(5,8),A—10 FELD+13,FELD A—3(200),0(8)
3.4.3 Beschreibung der wichtigsten Maschinenbefehle 3.4.3.1 Übertragungsoperationen im Arbeitsspeicher Befehl: MVC Typ:
(move characters; Übertragen Zeichen)
SS (logisch)
Formate symbolisch: MVC MVC MVC
DxCLLBO.DJP,) Si (Li), S 2 Su S 2
Format maschinenintern: Di 1. Byte
2. Byte
3. Byte
4. Byte
b, KS.Byte
6. Byte
Wirkungsweise: Übertragung von L, Bytes ab der durch + 208 in das mit FELD1+3 adressierte Feld. Es werden so viele Bytes übertragen, wie der implizite Längenschlüssel von FELD1 angibt. MVC 10(21,8) ,301 (8) Übertragen von 21 Bytes ab der expliziten Adresse + 301 in das mit + 10 adressierte Feld. MVC FELD1(30),FELD2—215 Übertragen von 30 Bytes ab der symbolischen Adresse FELD2—215 in das mit FELD1 adressierte Feld. Der explizite Längenschlüssel 30 rangiert vor dem impliziten Längenschlüssel von FELD1. MVC
FELD1+65(10),FELD2+74
Übertragen von 10 Bytes ab der symbolischen Adresse FELD2+74 in das mit FELD1+65 adressierte Feld. Der explizite Längenschlüssel 10 rangiert vor dem impliziten Längenschlüssel von FELD1. MVC
DRBER(3),DRBER—1
Löschen eines mit DRBER adressierten Feldes auf einer Länge von 3 Bytes. Das mit DRBER—1 adressierte Byte enthält ein „blanc". + ORBER +2 -1 1 1 11 4 ; o 2. Operand 1 i
l 2
1 1' (dieselbe DRBER Adresse)
1• +
+2
1. Operand
81
3.4 Maschinenbefehle
Befehl: MVI Typ:
(move immediate; Übertragen Direktkonstante)
SI
Formate symbolisch: MVI MVI
Di (Bi), I2 Sj, I 2
Format maschinenintern: 9
u
| 2
>
1. Byte
2. Byte
B,
I< 3. Byte
-
D, -1
•
4. Byte
Wirkungsweise: Das direkt im Befehl gespeicherte 8-bit-Muster I 2 wird in das mit ( B ^ + Dj adressierte Byte übertragen. Codierungsbeispiele: MVI
STELLE.C' '
In das mit STELLE adressierte Byte wird ein blanc ü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 IVp:
(move numerics; Übertragen Ziffernteile)
SS (logisch)
Formate symbolisch: MVN MVN MVN
D1(L1,B1),Da(B2) S ^ L O , S2 Su S2
82
3. Die Programmiersprache ASSEMBLER
Format maschinenintern: D
|
1
L, - 1
1. Byte
2. Byte
b.
1 !"
•
D,
J 4. Byte
3. Byte
•
B,
5. Byte
1 D, -{ 6. Byte
Wirkungsweise: Die Instruktion bewirkt die Übertragung von L j rechten Halbbytes (Ziffern) ab der durch (B2> + D 2 angegebenen Adresse in das mit + D2 angegebenen Adresse in das mit < B ^ + Dj 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.
FELDl nachher:
D
|
5
Weitere Codierungsmöglichkeiten wie bei MVC!
Befehl: MV0
(move with offset; Übertragen versetzt)
3. Die Programmiersprache ASSEMBLER
84
Typ:
SS (arithmetisch)
Formate symbolisch: MV0 MV0 MV0
D1(L1,B1),D2(La,Ba) S,(L,),S2(L2) Si, S 2
Format maschinenintern : B2
L, - 1 I L , - 1 1. Byte
2. Byte
3. Byte
4. Byte
S.Byte
6. Byte
Wirkungsweise: Der durch + D2 adressierte zweite Operand wird, um ein Halbbyte nach links versetz^ in den mit ( B ^ + Ü! 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 Lj = 3, die Länge von FELD2 sei L 2 = 3. FELD2
FELD1
MV0
0(2,8) ,0(3,7)
(Reg. 7>
85
3.4 Maschinenbefehle
MV0
0(4,9),11(2,9)
+ 11
4 ! 1
'h
4 0 i 0 o : 4 .. 1 , — < Reg. 9 > +0
1
MV0
! 4
4 ! F
F 1
RESULTO),RESULT(2)
Wegbringen der letzten pezimalstelle: RESULTI2) 2. Operand
1 1 1 2 i RESULTO!
o : i
1 •! 5
1 3 ! c 1
1. Operand
2 11
5 | C
1. Operand nach MV0
RESULT
3.4.3.2 Laden von Registern, Speichern von Registerinhalten Befehl: LA Typ:
(load address; Laden Adresse)
RX
Formate symbolisch12: LA
R„D2(X2,B2)
LA LA 12
Ri, S 2 ( X 2 ) Ri, S 2
Neben diesen Standard-Formaten gibt es bei RX-Instruktionen noch folgende Sonderformen, deren Einsatz insbesondere beim LA-Befehl sinnvoll sein kann: Rl,D
2
(,B
Rl,D
2
(X
R l , D
2
2 2
) )
statt statt statt
Ri,D2(0, R
B2)
, D
2
( X
R i , D
2
( 0 , 0 )
1
2
, 0 )
3. Die Programmiersprache ASSEMBLER
86
Format maschinenintern: 4
Ri
: i 1. Byte
i X2 i 2. Byte
B:
r f« 3. Byte
- D2 J I 4. Byte
•
Wirkungsweise: In die 24 niederstwertigen bits des mit R, adressierten Registers wird die durch + + D 2 angegebene Speicheradresse geladen. Die 8 höherwertigen bits von R t werden gleich Null gesetzt. Programmierhinweis: Die Angabe von X 2 oder B 2 oder von beiden kann unterbleiben. Im letzteren Falle wird in das Register R x der Wert D 2 geladen. Codierungsbeispiele: LA
3,FELD
Der Wert der Adresse FELD, d.h. + 15 adressierten Wortes wird in das Register 5 geladen.
3.4 Maschinenbefehle
L
89
7,W
Der Inhalt des durch W adressierten Wortes wird in das Register 7 geladen.
Befehl: LH Typ:
(load halfword; Laden Halbwort)
RX
Formate symbolisch: LH R l f D 2 (X2> B 2 ) LH Rj, S 2 (X 2 ) LH R 1( S 2 Format maschinenintern: r~~ 4 1 8 Ri | X2 B2 \m i i i i i 2. Byte 3. Byte 1. Byte
i - D, -1 • i ' 4. Byte
Wirkungsweise: Das mit + (B2> + D 2 adressierte Halbwort wird in die niederstwertigen 16 bits des mit R, adressierten Registers geladen. Die 16 höherwertigen bits des Registers werden mit dem Wert der bit-Position Nr. 15 gefüllt. Programmierhinweis: Die Speicheradresse des 2. Operanden muß auf eine Halbwortgrenze ausgerichtet sein (vgl. Seite 44). Codierungsbeispiele: LH
7,0(2,3) < Reg. 2) + < Reg. 3 > + 0 1 1 0 0 1 i 1110 1 0 0 ü ¡ 1 1 1 0 i
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
10 0 1 1 1 10 1 0 0 0 11 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 IS 14 13 12 11 10
9
8
7
6
5
4
3
2
1
0
90
3. Die Programmiersprache ASSEMßLER
3,HW(5)
LH
HW + < Indexreg. 5)
T 0000 ¡000 0
1 I I ! 10 0 0
Reg. 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 31 30 29 28 2 7 26 25 24 23 22 21 20 19 18 17 16
1
1 1 0 0 0 0 0 0 0 0 0 0 0
15 14 13 12 11 10 9
8
7
6
5
4
3
2
1
0
Befehl: IC Typ:
(insert character; Einfügen Zeichen (Byte))
RX
Formate symbolisch : IC IC IC
R 1 ; D 2 ( X 2 , B2) R „ S 2 (X 2 ) R1( S2
Format maschinenintern: 4
1 ! 3 1. Byte
Rt
| X2 2. Byte
Bi
1 3. Byte
- D, - ! — • 1 4. Byte
Wirkungsweise: Das mit + + D 2 adressierte Byte wird in die niederstwertigen 8 bits des mit Ri adressierten Registers übertragen. Die restlichen bits des Registers behalten ihre Werte. Codierungsbeispiel: IC
6,B(5)
91
3.4 Maschinenbefehle B + < Indexreg. 5 >
l 1 1 1 1J 0 0 0 1
Reg. 6 (vorher)
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 1 1 0 00 0 0 0 0 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 11 1
1
0 0 0 1
Reg. 6 (nachher)
Befehl: LCR Typ:
(load complement; Umladen und Komplementieren)
RR
Format symbolisch: LCR
R 1; R 2
Format maschinenintern: 1
| 3 l 1. Byte
R,
] R; I 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! geladen. Codierungsbeispiele: LCR Reg. 7
Reg.3
3,7
92
3. Die Programmiersprache ASSEMBLER
LCR
6,6
Reg. 6 1
1 0
31
1 0
komplementiert 31 0
' 0
0 0
0
1
1
Reg. 6
Befehl: LNR Typ:
(load negative; Umladen negativ)
RR
Format symbolisch: LNR R „ R2 Format maschinenintern: R, 1. Byte
2. Byte
Wirkungsweise: Der Inhalt des Registers R 2 wird in das Register R t 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: 1
! o I 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:
(load multiple; Laden mehrfach)
RS
Formate symbolisch: LM LM
R„ R 3 ,D 2 (B 2 ) Ri, R3, S 2
Format maschinenintern: 9
I ! I.Byte
8
R,
1 |
•
R, •
2. Byte
B, •
>
•
3. Byte
-
•
D,
1 i ••
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 + 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)
-
D2
T
1
•
1
2. Byte
3. Byte
4. Byte
Wirkungsweise: Der Inhalt (alle 32 bits) des mit Ri adressierten Registers wird in das mit + (B2> + D2 adressierte Wort gespeichert. Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44). Codierungsbeispiele ST
2,WORT
Der Inhalt des Registers 2 wird in das mit WORT 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:
(störe halfword; Speichern Halb wort)
RX
Formate symbolisch: STH STH STH
Ri, D 2 (X 2) B 2 ) R l S 2 (X 2 ) R l S2
Format maschinenintern: 4
1 1 Byte
0
Ri
1 1
X2
2. Byte
B2
¡4 3. Byte
•
D2
-! 4. Byte
+
96
3. Die Programmiersprache ASSEMBLER
Wiikungsweise: Die niederstwertigen 16 bits des mit R t adressierten Registers werden in das mit + + D 2 adressierte Halbwort gespeichert. Programmieihinweis: Die Adresse des 2. Operanden muß auf eine Halbwortgrenze ausgerichtet sein (vgl. Seite 44). Codierungsbeispiel: STH
5,HW0 RT(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
0 0 1 1 ! 110 1 H WORT + (Indexreg. 6)
00 0 0 ! 01 01 J—
Befehl: STC Typ:
(store character; Speichern Zeichen (Byte))
RX
Formate symbolisch: STC STC STC
Ri.DjiXj.Bj) R 1 ( S 2 (X 2 ) R „ S2
Format maschinenintern : 4
1 2 1. Byte
R, ! X, 2. Byte
1 B 3. Byte
n
11
4. Byte
•
97
3.4 Maschinenbefehle
Wirkungsweise: Die niederstwertigen 8 bits des mit Rj adressierten Registers werden in das mit + + D2 adressierte Byte gespeichert. Codierungsbeispiel: STC
4,BYTE
Register 4 1 1 0 0
1 0
0
1
1
1
1
1 1 0
0 0
0
0
0
0
1 0
1 0 0
0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 IS 14 13 12 11 10 9 8
1
1
1
1
5
4
3
2 1
1
1
i 0 0 11 ¡ 1 1 1 1 BYTE
Befehl: STM Typ:
(störe multiple; Speichern mehrfach)
RS
Formate symbolisch: STM RlRS.D^B,) STM Ri, R 3 , S 2 Format maschinenintern: 9 I1 0 1. Byte
Ri i R3 . .. .J 2. Byte
B2 3. Byte
• D2 -1 L.
.
•
4. Byte
Wirkungsweise: Die Inhalte der aufeinanderfolgenden Register R j bis R 3 werden in entsprechend viele Vollworte gespeichert, deren erstes mit + D 2 adressiert ist. Progranunierhinweis: 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
+«
Reg. 7
+7
+8
+9
+10
+11
Befehl: LER Typ:
(load register Single precision; Umladen kurz)
RR
Format symbolisch: LER
R 1( R 2
Format maschinenintern: 3
|
I
8
R,
1. Byte
|
Rj
l
2. Byte
Wirkungsweise: Der Inhalt des Gleitpunktregisters R 2 wird in das Gleitpunktregister R j 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
1
0
y unverändert
99
3.4 Maschinenbefehle
Befehl: LDR Typ:
(load register double precision; Umladen lang)
RR
Format symbolisch: LDR Rj, R 2 Format maschinenintern: 2
|1
8
Rt
1. Byte
i •
R2
2. Byte
Wirkungsweise: Der Inhalt des Gleitpunktregisters R 2 wird in voller Länge in das Gleitpunktregister R t umgeladen. Codierungsbeispiel: LDR
4,2
GP-Register 2 63 55
0
V 63
55
»
' i
GP-Register 4
Befehl: LE Typ:
(load Single precision; Laden GP-Wort)
RX
Formate symbolisch: LE LE LE
R i , D 2 ( X 2 , B2) R!,S2(X2) Ra> S 2
_
0
100
3. Die Programmiersprache ASSEMBLER
Format maschinenintern:
1. Byte
2. Byte
3. Byte
4. Byte
Wirkungsweise: Der Inhalt des mit + + D 2 adressierten Speicherwortes (32 bits) wird in die bit-Positionen 63 bis 32 des Gleitpunktregisters R j geladen. Die bitPositionen 31 bis 0 von R[ sind nach dieser Operation unverändert. Programmieihinweis: Die Adresse des 2. Operanden ist auf eine Wortgrenze auszurichten (vgl. Seite 44). Codierungsbeispiel : LE
2,W0RT
WORT
v
GP-Register 2
unverändert
Befehl: LD Typ:
(load doublé precision; Laden GP-Doppelwort)
RX
Formate symbolisch: LD LD LD
R u D 2 (X2) B 2 ) R„S2(X2) R l f S2
Format maschinenintern: 1 6
! 8 1 1. Byte
Ri
1 2. Byte
X2
n2
; 3. Byte
D2
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 t geladen. Programmierhinweis: Die Adresse des 2. Operanden ist auf eine Doppelwortgrenze auszurichten (vgl. Seite 44). Codierungsbeispiel: LD
4,DW0RT(1)
STE
(störe Single precision; Speichern GP-Wort)
DW0RT +
GP-Register 4
Befehl:
Typ:
RX
Formate symbolisch: STE STE STE
R 1( D 2 (X 2 , B 2 ) R 1( 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 + + D 2 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
« i I
.
1 1 1
i 1
A.
1 1
Befehl: STD Typ:
(störe double precision; Speichern GP-Doppelwort)
RX
Formate symbolisch: STD STD STD
Ri, D 2 (X 2 , B 2 ) R,, S 2 (X 2 ) Rx, S2
Format maschinenintern:
1. Byte
2. Byte
3. Byte
4. Byte
Wirkungsweise: Der Inhalt des Gleitpunktregisters R t wird in das mit + + D 2 adressierte Doppelwort im Arbeitsspeicher gespeichert.
103
3.4 Maschinenbefehle
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 > 1 1 i i i I i I
1 i i I
1 I I L__i
•>
1 I i I
1 i i I
i i i I
i i i L
3.4.3.3 Codetransformationen Befehl: PACK Typ:
(pack; Packen von gezonten Dezimalzahlen)
SS (arithmetisch)
Formate symbolisch: PACK PACK PACK
Di (Lj, B0, D2 (L 2j B 2 ) S ^ L O , S 2 (L 2 ) Su S 2
Format maschinenintern:
1. Byte
L, - 1 , Lj - 1 B, 2. Byte 3. Byte
D,
D2
B, 4. Byte
5. Byte
6. Byte
Wirkungsweise: Der durch + D2 adressierte 2. Operand wird (normalerweise) in der Länge L 2 aus der gezonten in die gepackte Form überfuhrt und in das durch + Di 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 —1— F | 0 F|0 F|7 F|2 .. i . 1
gepackte Zahl —r— 1 ¡0 4 | 3 1 | F i
Vorzeichen
Vorzeichen
Ist der erste Operand (empfangenes Feld) länger als erforderlich, um alle Ziffern aufzunehmen, so wird er (links) durch fuhrende 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. Programmierhinweis: Die genau passende Länge des empfangenden Feldes errechnet sich wie folgt: Länge des empfangenden Feldes = [(Länge des sendenden Feldes + 2)/2] 12 oder kürzer: Li = [(L2 + 2)/2], Ist die Länge des sendenden Feldes eine gerade Zahl, dann werden im empfangenden Feld L 2 Halbbytes mit Ziffern, 1 Halbbyte mit dem Vorzeichen und 1 Halbbyte mit einer 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 Li und L 2 sind je 16. Beispiele: a) ist die Länge des sendenden Feldes = 5, dann ist die Länge des empfangenden Feldes = [(5 + 2)12] = 3 b) ist die Länge des sendenden Feldes = 6, dann ist die Länge des empfangenden Feldes = [(6 + 2)12] = 4. Codierungsbeispiele: PACK
REFE,ZAHLEN
Die Länge von REFE sei 3, die Länge von ZAHLEN sei 5 ZAHLEN
REFE 12
[. . .] bedeutet, ganzzahliger Teil von . . .
3.4 Maschinenbefehle
PACK
REFE1,ZAHLEN
Die Länge von REFE1 sei 4, die Länge von ZAHLEN sei 5 ZAHLEN
I——I——n—I—
' t 0 ¡0 i : ? 3 | 0 I _i REFE1
2. Operand
w f t
1. Operand (wird mit führenden Nullen aufgefüllt).
5 1 F
PACK
REFE2,ZAHLEN
Die Länge von REFE2 sei 2, die Länge von ZAHLEN sei 5 ZAHLEN 1 1 —1— F j 1 F J 7 F ; 3 F', 0 F I S 1
2. Operand
1. Operand (die höherwertigen Ziffern 1 und 7 des 2. Operanden werden nicht berücksichtigt).
3 ¡0 s ; F
I
REFE2
PACK
REFE1 r ZAHLEN1
Die Länge von REFE1 sei 4, die Länge von ZAHLEN1 sei 6
1 F|4
1 —1— 1 1 —r— F ¡3 F i l F ¡ 2 F | 3 f ; i
—i— —1— 0 ¡ 4 3 ! 1 2 ¡3 1 i F > 1— REFE1
PACK
2. Operand
1. Operand (wird mit einer führenden Null aufgefüllt).
FELD(3),BETRAG(5)
In das Feld mit der symbolischen Adresse FELD und der expliziten Länge L t = 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,8),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
(unpack; Entpacken von gepackten Dezimalzahlen)
SS (arithmetisch)
Typ:
Formate symbolisch: UNPK UNPK UNPK
Di (Lj, Bj), D 2 (L2, B 2 ) Si (L t ), S 2 (L 2 ) Si, S 2
Format maschinenintern: D, 1. Byte
2. Byte
3. Byte
4. Byte
B2 S.Byte
D, 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) + Ü! adressierte Feld gespeichert. Die Verarbeitung verläuft von rechts nach links, also entgegengesetzt wie z. B. bei MVC. Das Vorzeichen wird aus dem Ziffemteil (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 führende (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. Programmieihinweis: 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: L t = 2#L 2 — 1. Die maximalen Werte für L t 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
5 !3
sV
1 5 •1 D
7 ! 1 3s
4\ F ;3
F ; s
2. Operand
F ;7 i
ZAHLEN
UNPK
F \ 1 I
D | 5
1. Operand
ZAHLEN1,REFE
Die Länge von ZAHLEN1 sei 6, die Länge von REFE sei 3. REFE 2. Operand
1. Operand (wird mit einer führenden Null aufgefüllt). ZAHLEN 1
UNPK
ZAHLEN2,REFE
Die Länge von ZAHLEN2 sei 4, die Länge von REFE sei 3. REFE
7
r !
—3 i — — i — : i 8 1 D
1
v
\ , /\ F 1! 1
ZAHLEN2
2
A•
F ; 3
F | 1
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
Di (L l s B^, D 2 (B 2 ) S^O/Sa S 1( S 2
Format maschinenintern : D
1 î
E
1. Byte
Li - 1 2. Byte
B,
1 î" ) 3. Byte
D,
1 J 4. Byte
•
B,
1
«
S.Byte
D2
1 I
•
6. Byte
Wirkungsweise: Die dezimal gepackten Zahlen des mit + D 2 adressierten Feldes werden entpackt und zusammen mit einer Aufbereitungsmaske zur Erzeugung eines bestimmten Druckbildes verarbeitet. Die Maske ist zuvor in das mit ( B j ) + Di 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, fuhrende Nullen unterdrückt und fuhrende Nullen durch Füllzeichen ersetzt werden. Die Maske (Schablone) kann aus folgenden Zeichen bestehen: (1)
Einfügungszeichen (alle druckbaren Zeichen und blanc)
(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 Einfugungszeichen sein. Es hat die Funktion eines Füllzeichens; d.h. es ersetzt etwaige fuhrende 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 (Einfugungszeichen) aus dem äußerst linken Byte der Maske die fuhrenden Nullen und etwaige andere Einfugungszeichen.
(5)
Ist die Nullenunterdrückung aufgehoben, so werden u. a. alle Einfugungszeichen gedruckt. Da Bytes mit positiven Vorzeichen die Nullenunterdrückung wieder wirksam machen, Bytes mit negativen Vorzeichen dagegen nicht, können negative Beträge rechts anschließend mit 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 t kann höchstens L t — 1 Ziffern aufnehmen, da das 1. Byte für das Füllzeichen reserviert ist.
Codierungsbeispiele: (1)
Maske l_i WVV
MASKE ZAHLEN
MVC ED
DRBER+1(5),MASKE DRBER+1(5),ZAHLEN
DC DS
X'4020202020' CL4
110
3. Die Programmiersprache ASSEMBLER ZAHLEN —1—
o ! o l\
4 ! 0
1 i
:
i
2\ 0
7
2 ^0
2 rt 0
2 | 0
DRBER+1
\
^ ^ 4 | 0 4 ! o
2. Operand
3\ 1
2 !
i 1 C
4 ! 5
N
1
U 1
F 1I 1
4 ! 0
I. Operand (nach MVC)
\
1
F ; l
1. Operand (nach ED)
DRBER+1
Druckbild:
(2)
11
Maske
MASKE REFE
i_>v,v[v.w MVC ED
DRBER+1 (9),MASKE DRBER+1(9),REFE
DC DS
X'40206B2021204B2020' CL4
REFE
1 1 ! 9
1 1 i 3
» ! ?
l\
1 5 | C —— 6
5
DRBER+1 4 : 0
2 \ 0
DRBER+1 " N 4 ! 0 Druckbild:
6 ! B
\ F ! 1
2 10 il
2 \ 1
2 \ 0 i\
1 4 i; B
F | 9
F ! 8
\ F 1! 7
4 1! B
^ 6 ; B 1,987.13
2 \ 0
2 \ 0
F ! 1
F ! 3
^
\
3.4 Maschinenbefehle
(3)
111
Maske vgl. (2) REFE
DRBER+1
Druckbild:
(4)
10.31
Maske vgl. (2) REFE
DRBER+1
Druckbild:
0.01
Kennzeichnung von negativen Beträgen (5)
Maske: l j [ v . V W —
BETRAG
MVC ED
DRBER+1 (8),=X'4021204B20202060' DRBER+1 (8),BETRAG
DS
CL3
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
Druckbild:
11.174
Die Nullenunterdrückung wird wieder eingeschaltet, da hier ein positiver Betrag vorliegt; also werden auch alle nachfolgenden Einfiigungszeichen durch das Füllzeichen (hier blanc) überschrieben. Schreiben von Schutzstemen: (7)
Maske: *VVV[V.VV* MVC
DRBER+1(10),MASKE
3.4 Maschinenbefehle
SUMME MASKE
113
ED
DRBER+1 (9),SUMME
DS DC
CL4 X'5C20202021204B20205C'
1 s ; c
s ;c
s ; c i
Druckbild:
•
•
s ; c •
•
1 F :3
1 F i' 1
CD
SUMME
I F 1 4
1 F 1 1 IM
5 |C .
31.41 • '
Der letzte Stern wird von der Wiedereinschaltung der Nullenunterdrückung durch den positiven Betrag nicht berührt; denn die E D-Operation geht hier nur über 9 Bytes. Einfügen von Texten:
(8)
Maske: lj vv v BIS V[V
ERGEBN SCH ABL
MVC ED
DRBER+1 (10),SCH ABL DRBER+1 (10),ERGEBN
DS DC
CL4 X'40202020C2C9 E2202120'
ERGEBN
Druckbild:
141BIS041
3. Die Programmiersprache ASSEMBLER
114 (9)
Maske: i—>VW BIS]V[V
ERGEBN MASKE
MVC ED
DRBER+1 (11),MASKE DRBER+1 (11),ERGEBN
DS DC
CL4 X'40202020C2C9 E222202120'
ERGEBN 1 ! 4
i ! o
DRBER+1 2 \ 0 ll
4 : «
DRBER+1 4 j 0
\
\ 1 F J 1
\ F : 4
4 ; i
3 : c
i C | 2
1 C S9 i
c ; 2
C | 9 J
\ F | !
+ + D2 adressierten Doppelwortoperanden gespeichert. Der Inhalt des Registers R t bleibt erhalten. Programmierhinweis: Der 2. Operand muß auf eine Doppelwortgrenze ausgerichtet sein (vgl. Seite 44).
3.4 Maschinenbefehle
117
Codierungsbeispiel:
D0W0RT
CVD
6.D0W0RT
DS
D
Reg. 6
Unterprogramme: CNVTDEGP CNVTGPDE Für die Codetransformationen von Dezimal- oder Dualzahlen in sedezimale Gleitpunktzahlen und zurück gibt es keine einfachen Instruktionen. Diese Transformationen müssen per Programm vorgenommen werden. Zwar enthält das Übersetzungsprogramm eine Routine für die Transformation von dezimal geschriebenen Gleitpunktkonstanten (Typen E und D) in den sedezimalen Gleitpunktcode, jedoch steht diese Routine dem Programmierer nicht zur Verfugung. Im folgenden werden zwei Routinen für derartige Codetransformationen vorgeschlagen, und zwar eine für die Transformation von EBCDI-verschlüsselten Dezimalzahlen in sedezimale Gleitpunktzahlen und eine für die Rücktransformation. Da man diese Routinen in der Regel zusammen benötigt, werden sie programmtechnisch zu einem einzigen intramodularen Unterprogramm mit zwei symbolischen Adreßeingängen vereinigt. Der Adreßeingang CNVTDEGP gehört zur Routine für die Umwandlung von Dezimalzahlen in sedezimale Gleitpunktzahlen und der Adreßeingang CNVTGPDE zur Routine für die entsprechende Rückumwandlung. Vor dem Aufruf des Unterprogramms CNVTDEGP muß die umzuwandelnde Dezimalzahl, die bis zu 16 gezonte Ziffern, einen Dezimalpunkt und einen Exponenten haben kann, normalisiert und aufbereitet werden: (1)
Ein etwaiger Dezimalpunkt und etwaige führende Nullen sind zu entfernen, um eine Mantisse zu erzeugen, die mit einer Ziffer 0 beginnt.
3. Pie Programmiersprache ASSEMBLER
118
(2)
Der Dezimalpunkt wird links vor der höchstwertigen Ziffer der Mantisse angenommen. Der Exponent ist entsprechend der Rechts- oder Linksverschiebung des Dezimalpunktes zu vermindern bzw. zu vergrößern.
(3)
Die Mantisse ist als positive, ungepackte Dezimalzahl rechtsbündig in einem 16 Bytes langen Feld mit der symbolischen Adresse F16, das Vorzeichen als Zeichenkonstante („+" oder „—") in einem Byte mit der symbolischen Adresse VZ und der Exponent als positive oder negative Dualzahl im Festpunktregister 4 zur Verfugung zu stellen. Die umgewandelte sedezimale Gleitpunktzahl steht dann mit langer Mantisse im Gleitpunktregister 0 bereit.
Vor dem Aufruf des Unterprogramms CNVTGPDE muß die umzuwandelnde sedezimale Gleitpunktzahl normalisiert und mit langer Mantisse im Gleitpunktregister 6 bereitgestellt werden. Die umgewandelte Dezimalzahl erscheint dann ebenfalls in Gleitpunktdarstellung, und zwar erscheint die Mantisse als vorzeichenlose (positive) ungepackte Dezimalzahl linksbündig mit 16 Stellen in Feld F16; der Dezimalpunkt ist links vor der höchstwertigen Ziffer der Mantisse anzunehmen; die Vorzeichen der Dezimalzahl und des dezimalen Exponenten erscheinen als Zeichenkonstanten („+" oder „ - " ) in den Feldern VZ bzw. VZE; der Exponent steht als positive Dualzahl im Festpunktregister 4 zur Verfügung. Der mathematische Hintergrund der Umwandlungen ist der folgende: (1)
Bei der Umwandlung einer dezimalen Gleitpunktzahl ± 0.xx . . . xflO* 11 in eine sedezimale Gleitpunktzahl ± O.yy . . . y*16 ± s wird zunächst die dezimale Mantisse als eine Dezimalzahl 0.xx . . . x* 10° verarbeitet. Die Umwandlung in das sedezimale Äquivalent ergibt eine Sedezimalzahl der Form O.yy . . . y*16°. Sodann wird in einer Tabelle die zur wahren Zehnerpotenz der Dezimalzahl gehörige sedezimale Gleitpunktzahl aufgesucht. Nun wird O.yy . . . y#16° in einem Gleitpunktregister mit dieser Sedezimalzahl multipliziert, und man erhält die gesuchte Sedezimalzahl.
(2)
Bei der Umwandlung einer sedezimalen in eine dezimale Gleitpunktzahl wird die Sedezimalzahl mit den Sedezimalzahlen in der bereits oben genannten Tabelle verglichen. Die umzuwandelnde Sedezimalzahl wird durch die erste Sedezimalzahl in der Tabelle, die größer als die umzuwandelnde ist, dividiert. Hierbei sind zwei Fälle möglich: Entweder hat
119
3.4 Maschinenbefehle
die erste größere Tabellenzahl eine kleinere Mantisse und einen um 1 größeren Exponenten oder bei gleichen Exponenten eine größere Mantisse als die umzuwandelnde Zahl. Auf jeden Fall entsteht aber bei der Division eine Sedezimalzahl mit dem Exponenten 0 zur Basis 16, also entweder O.uu . . . u*16 ± s /0.tt . . . t*16 ± s + 1 = O.yy . . . y#16° bei O.uu . . . u > O.tt . . . t oder O.uu . . . u*16 ± s /0.tt . . . t*16 ± s = O.yy . . . y#16° bei O.uu . . . u < O.tt . . . t Zugleich ist mit der Tabellenzahl O.tt . . . t*16 ±s ^ +1 ^ der entsprechende Exponent ±d zur Basis 10 bekannt. Die Umwandlung O.yy . . . y*16° ergibt eine Dezimalzahl 0.xx . . . x*10°. Diese wird mit 10 hoch ±d multipliziert, und man erhält die gesuchte Dezimalzahl. «
UMWANDLUNG V0N DEZIMALZAHLEN IN GP-ZAHLEN
CNVTDEGP STM LA MV I MVC CLI BE MVI PCK PACK MVC ZAP MV0 CVB ST MVC LD S BAL LDR MVIGW MVI ZAP CVB ST MVC LD S BAL ADR LM BR *
TAB
LPR M C
2.7.RETT27 6.PTABLE+600 GW.X'48' GW+5(3) ,«3X 1 00' VZ,C'+' PCK GW ,X'C8' F9.F16 MVIGW+1(1),GW DW.-P'O' DW+3(5),F9(5) 3,DW 3 FW GW+1(4),FW 2,GW 4 , = F' 91 7,TAB 0,2 GW.X'48' DW ,F9+5(4) 3 ,DW 3,FW GW+1(4) ,FW 2,GW 1 1 4, = F 7 7,TAB 0,2 2,7.RETT27 11 3,4 2, = F 1 8' 4,-F'O'
3. Die Programmiersprache ASSEMBLER
120
DIVIO EXITTAB
BL HD B DD BR
DIVIO 2,0(3,6) EXITTAB 2,0(3,6) 7
(33) (34) (35) (36) (37)
* UMWANDLUNG V0N GP-ZAHLEN IN DEZIMALZAHLEN CNVTGPDE
CD1
SUCHTAB CD
GEFUNDEN
LPR45
MANTISSE
ST7
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'++' 4,=F'600' 6 , = D101 CD1 VZ.C'-' 6,6 6 ,=D' 1 1 SUCHTAB VZE.C'-' 4.4 7 ,»F 1 76' 6.PTABLE(4) GEFUNDEN 4,8(4) 7,CD 6, PTABLE(4) 4,32 4 ,=F ' 8 ' 5,=F'75' 2,MANTISSE F9(5),DW+3 F9+4(l),=X'00' F9+5 4 ,=P'0' GW+1(7),FW7 6 ,GW 2,MANTISSE F9,DW+3(5) F16.F9 F16 + 15(1) ,=X'FF 1 Fie^'OOOOllll1 LPR45 F16{16) ,F16+1 5,-F'r 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 ,GU 6,7,GW 6,8 6,4 6.K0N471 ST7 6,4 7.FW7 6 ,DW
» KPNSTANTEN UND
2
BEREICHE
(38) (39) (40) (41) (42) «Ì (45) (46) 47) 48) 49) (50' (51' (52 (53' (54 (55 (56 (57 (58 (59 (60 (61 (62 (63 (64) (65) (66) (67) (68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (781 (79 (80)
ill! ISI (83) (84)
121
3.4 Maschinenbefehle
PTABLE
K0N471 GW DU FW FW7 F16 F9 VZ VZE RETT27
DC DC DC
D' 1E-751 D' 1E-741 D'1E-73 1
DC
D'1E74'
DS DS DS DS DC DS DC DS DS DS DS
D D F F 3X'001 CL16 X'F0' 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 • 16 7 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 wjrd 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.
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.
DW
+1
F9
+1
+2
+3
+4
+2
+3
+4
+5
+6
+7
(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 O.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 fuhrenden Nullen nach DW. F9 1 1•
0
DW
|
0
+5 X
\ \ \ \ N> 0
1 1
0
0
t 1
0
0
• 1
0
X'
+6
1 | X
i |
+4
X
X
1
1'
X
X
1' X
X
+7
1 1 X
\
+5
+8
1 1 X
X
1
w
X
x
|
1 |
c
; C
3.4 Maschinenbefehle
123
(21) Vgl. (12) (22) vgl. (13) (23) vgl. (14) (24) vgl. (15) (25) Vennindern 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- 1CT9. Sie werden bei der Umwandlung in eine Dualzahl (Sedezimalzahl) wie eine Dezimalzahl der Form xxxxxxx oder 0.xxxxxxx • 107 behandelt. Später wird die zu dieser Dezimalzahl äquivalente Sedezimalzahl in GP-Register 2 durch 10 16 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~75 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 (Reg. 7 ) ^ 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
X
+1 1
J
+2 X
1 X 1 X
+3 X
\ X
+4 x
: ±
125
3.4 Maschinenbefehle
(60) Überschreiben des Vorzeichens in F9 durch eine Null. (61) Übertragen einer gepackten Null (mit Vorzeichen) in die letzten 4 Bytes von F9. (62) Übertragen des zweiten Teils der sedezimalen Mantisse (der bereits im Unterprogramm MANTISSE korrigiert und nach FW7 gebracht wurde) zusammen mit sedezimalen Nullen in das GP-Wort GW. (63) Laden des zweiten Teils der Mantisse nach GP-Register 6. (64) Sprung in das Unterprogramm MANTISSE zur Konversion des zweiten Teils der sedezimalen Mantisse. (65) Addieren des zweiten Teils der umgewandelten Mantisse auf den Inhalt von F9. F9 1 o ;
+1 i x
x
:
+2 x
X
1
X
x
+ 3 + 4 r• i
X
DW+ +
x
;o
0
3 w.: *
+5 i— \ 0
+6 1 o l! o
+4 1 X
[
+7 o 1! o
+8 0 11 c
+6 i
+7 ; c —i—
+5 1 X
X
|
X
X
!
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.
126
3. Die Programmiersprache ASSEMBLER
Es wird also eine Dezimalzahl der Form 0 . x x . . . 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-Register 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
16'
X
X
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 16s ist, dann logische Rechtsverschiebung der Mantisse in FP-Register 6 und 7 um weitere 4-bit-Positionen. Reg. 6 0
0
X
16
X s
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
R 1 ; D 2 (B 2 ) R1; D2
Format maschinenintern : 8
1 1
1 A
R,
1. Byte
!
0
2. Byte
B2
'« 1 3. Byte
"
D,
\
•
4. Byte
Wirkungsweise: Der Inhalt der bit-Positionen 0 bis 30 des Registers R! wird um (B2> + 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)
3. Die Programmiersprache ASSEMBLER
128
Typ:
RS
Formate symbolisch: SLA SLA
R„ D2i
1 l1
»•
4. Byte
Wirkungsweise: Der Inhalt der bit-Positionen 0 bis 30 des Registers Ri 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
R „ D2(B2) R j , D2
Format maschinenintern: 1 !
8
1
Ri ! 0
E
1. Byte
2. Byte
B2
1« i 3. Byte
• '
D,
1 -1
•
4. Byte
Wirkungsweise: Der Inhalt des mit R t 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 Ri 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
Reg. 4
Reg. 5
Befehl: SLDA Typ:
(shift left double algebraical; algebraische Linksverschiebung im Doppelregister)
RS
Formate symbolisch: SLDA SLDA
R,, D 2 (B 2 ) R u D2
130
3. Die Programmiersprache ASSEMBLER
Format maschinenintern: 1 !
8
R,
F
1. Byte
; o
2. Byte
T B2
¡«
1
• D= "I1
3. Byte
»
4. Byte
Wirkungsweise: Der Inhalt des mit R j adressierten Registerpaares R 1( 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 t muß stets eine gradzahlige Registernummer sein. Der Inhalt aller 63 Stellen des Registerpaares wird verschoben; die Vorzeichenstelle in bitPosition 31 des Registers R t 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. 13
Reg. 12
Reg. 13
Befehl: SRL
Typ:
(shift right Single logical; logische Rechtsverschiebung eines Registerinhalts)
RS
Formate symbolisch: SRL SRL
R 1 ; D 2 (B 2 ) R „ D2
131
3.4 Maschinenbefehle
Format maschinenintern: 1 ! 8
8
1 R, ; o
1. Byte
r 'tf 1
n
2. Byte
D2 I
3. Byte
»
4. Byte
Wirkungsweise: Der Inhalt aller 32 bit-Positionen des Registers R t wird um + D 2 Stellen nach rechts verschoben. Von links werden Nullen nachgezogen; die rechten bits gehen verloren. Codierungsbeispiel: SRL
4,1(7)
Der Inhalt des Registers 7 sei 2; dann wird der Inhalt des Registers 4 um 3 Stellen nach rechts verschoben. 31
0
31
0
Befehl: SLL
Typ:
(shift left Single logical; logische Linksverschiebung eines Registerinhalts)
RS
Formate symbolisch: SLL SLL
R„D2(B2) R „ D2
Format maschinenintern : 8
1 j 1. Byte
9
R,
1 1
2. Byte
0
B,
"7 f. 3. Byte
-
D,
1 H 1
4. Byte
»
132
3. Die Programmiersprache ASSEMBLER
Wirkungsweise: Der Inhalt aller 32 bit-Positionen des Registers R t wird um (B2> + D2 Stellen nach links verschoben. Von rechts werden Nullen nachgezogen, die linken bits gehen verloren. Codierungsbeispiel: SLL
14,2
Der Inhalt des Registers 14 wird um 2 Stellen nach links verschoben.
3.4.3.5 Dezimalarithmetik Befehle:
Typ:
AP
(add packed; Addieren gepackt)
SP
(subtract packed; Subtrahieren gepackt)
SS (arithmetisch)
Formate symbolisch: AP AP AP
D1(L1,B1),D2(L3,ßa) S, (LO,'Sa (La) Sj, S2
SP SP SP
Di (Li, Bj), D2 (L2, B 2 ) Si (LO, Sa (La) Si, S2
Formate maschinenintern : (AP)
D,
L, - 1 ; L , - 1 1. Byte
2. Byte
3. Byte
B, W— I
4. Byte
5. Byte
4. Byte
5. Byte
r—
-j— 6. Byte
(SP) L, - 1 J L 2 • 1. Byte
2/Byte
I 3. Byte
D,
1_1Z 6. Byte
3.4 Maschinenbefehle
133
Wirkungsweise: Der Inhalt des durch + D 2 adressierten Feldes der Länge L 2 wird zum (vom) Inhalt des durch + Dj adressierten Feldes der Länge Lj addiert (subtrahiert). Das Resultat steht danach im ersten Feld. Die Verarbeitung verläuft von rechts nach links. Dezimalüberläufe fuhren zur Programmunterbrechung. Programmierhinweise: Beide Operanden müssen gepackt sein und es muß L t > L^ 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
SUMME
ZAHL
SUMME 8
SP
' C
DIFF=X'017C'
Die Länge von DI FF sei 2: DIFF
o !o 3
i
O
1
2
o: i DIFF
1
1 ! F 1
0
7
| C 1
7
|
1 l
D
2
I
9
134
3. Die Programmiersprache ASSEMBLER
AP
0(3,8),3(3,8)
+1
+2
(Reg. 8>
+1
K2
+3
Befehl: ZAP Typ:
(zero and add packed; Nullsetzen und Addieren)
SS (arithmetisch)
Formate symbolisch: ZAP ZAP ZAP
D1(L1>B1),Da(L2,B2) Si (L^, S 2 (L 2 ) Si, S 2
Format maschinenintern: L, - 1 ! L 2 - 1 1. Byte
2. Byte
B, 3. Byte
D, 4. Byte
5. 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 L t < ist, so führt 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 Li = 3, die Länge von ZAHL sei L2 = 2 ZAHL
— i 1 1 0 i
4
\ \ o
REFE
! i
o
! i
1
w
o
D
2
3 >
i
i | i
1
1
1 !
'
D
ZAP
REFE(2),=X'101 D'
MP
(multiply packed; Multiplizieren dezimal)
REFE
Befehl: Typ:
SS (arithmetisch)
Formate symbolisch: MP MP MP
D, (Li, Bi), D 2 (La, B,) Si (L,), S 2 (Li) S„ S 2
Format maschinenintern: L,- 1 1. Byte
2. Byte
B,
'(*3. Byte
D,
D, 4. Byte
S.Byte
6. Byte
Wirkungsweise: Der mit + Di adressierte 1. Operand (Multiplikand) wird mit dem durch + D 2 adressierten 2. Operanden (Multiplikator) multipliziert. Das Resultat erscheint rechtsbündig im Multiplikandenfeld; der Multiplikand geht also ver-
3. Die Programmiersprache ASSEMBLER
136
loren. Das Vorzeichen des Resultats wird nach den algebraischen Regeln gebildet; jedoch erhalten auch Nullprodukte ein negatives oder positives Vorzeichen. Programmierhinweise: Beide Operanden müssen dezimal gepackt sein. Der 2. Operand muß kürzer sein als der 1. Operand, und zwar darf das Multiplikatorfeld (2. Operand) höchstens 8 Bytes (d.h. 15 Ziffern plus Vorzeichen) lang sein. Das Multiplikandenfeld (1. Operand) kann variabel bis zu 16 Bytes, der Multiplikand selber aber nur bis zu 15 Bytes (29 Ziffern + Vorzeichen) lang sein. Jedoch muß die Bedingung Li = Länge des Multiplikanden + L 2 eingehalten werden; d. h. L 2 muß im Multiplikandenfeld enthalten sein, und zwar in Form führender Nullen. Das Resultat hat eine maximale Länge von 31 Ziffern plus Vorzeichen, wobei mindestens eine Ziffer eine fuhrende Null ist. Codierungsbeispiele:
PR0D MAND M0R
ZAP MP
PR0D,MAND PR0D,M0R
DS DS DS
CL16 CL15 C
MAND
-
—I —1— -1— —1— - r 1 1 9 ¡9 9 ¡9 • 9 ¡9 9 | 9 9 ¡9 9 i¡9 9 ¡9 9 ¡9 9 1¡9 9 i¡9 9 ¡9 9 ¡9 9 i¡9 9 1; 9 9|C (ZAP)
i —1— —1— —1— 1— — I - I —1— o lo 9 | 9 9 | 9 9 | 9 9|9 9 J 9 9 ; 9 9 ¡9 9 ¡9 9 ¡9 9 ¡9 9 ¡9 9 ¡9 9 | 9 9 \ 9 9|C > i . .1 i i
u
PR0D M0R I 9 ¡D •
—R-
1
1
—R-
—1—
0 j 8 9 ! 9 9 ¡9 9 ¡9 9 j 9 9 ! 9 9 | 9 9 ¡9 L
PR0D
I
(MP) 1 9 {9 »
L
—R—
1
9 ¡9 9 ' 9 9 ¡9 9 | 9 9 J 9 9 | 9 i 1
1
ID
..J
3.4 Maschinenbefehle MP
0(4,5),0(2,8)
+l +2 +3 1 0 |o o ;o 9 I 9 9 1 D
< Reg. 8 ) +1 —
1
1
—
9 ¡9 9¡D L_l I
(MP)
L, (Reg. 5) +1 +2 +3 —1— 0 ¡9 9 ¡8 0 ¡0 l i e
MP
0(5,9),=P'—13'
+2 +3 +4 1 0 | 0 0 | 0 o ! o o;i l i e i 1
4. Byte
Wirkungsweise: Der Dividend in Gleitpunktregister R t wird durch den Divisor dividiert, der in dem mit (X2> + (B2> + D2 adressierten Gleitpunktwort bzw. -doppelwort im Arbeitsspeicher steht. Der Quotient erscheint normalisiert in Rj. Zu den Einzelheiten des Divisionsablaufs vgl. die Ausführungen zu DER und DDR. Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Wort- bzw. Doppelwortgrenze ausgerichtet sein (vgl. Seite 44). 3.4.3.8 Vergleichsoperationen Befehl: CLC Typ:
(compare logical characters; Vergleichen Zeichen logisch)
SS (logisch)
Formate symbolisch: CLC Di (Li, B J , D 2 (B2) CLC Sx (Li), S2 CLC Si, S 2 Format maschinenintern : L,-1 1 1. Byte
2. Byte
D, 3. Byte
B2 4. Byte
5. Byte
6. Byte
Wirkungsweise: Der durch + D t adressierte Operand wird in der Länge L t logisch mit dem durch + D 2 adressierten Operanden verglichen. Der logische Vergleich
159
3.4 Maschinenbefehle
besteht im Gegensatz zum arithmetischen darin, daß die Operanden bit-weise ohne Berücksichtigung eines etwaigen numerischen Wertes oder gar eines Vorzeichens miteinander verglichen werden. Aus diesem Grunde sind für die Operanden auch alle möglichen bit-Muster zugelassen. Entsprechend dem Ergebnis des Vergleichs wird ein Bedingungsschlüssel in einem Anzeigeregister (Programmstatuswort) gesetzt. Die Ausführung des Befehls wird beendet, sobald Ungleichheit festgestellt wird oder alle Li Bytes miteinander verglichen sind. Der Vergleich erfolgt von links nach rechts. Die maximale Länge der Operandenfelder ist 256 Bytes. Auf Vergleichsoperationen folgen i. d. R. Verzweigungsoperationen (vgl. Kap. 3.4.3.9), die in bestimmter Weise auf den Bedingungsschlüssel des Anzeigeregisters reagieren. Die Aussage des Bedingungsschlüssels bezieht sich stets auf den 1. Operanden. Ist also der 1. Operand z.B. größer als der zweite, dann wird z.B. bei BH und BNL verzweigt. Codierungsbeispiele: CLC
FELD1,FELD2
Vergleichen des Inhalts von FELD1 mit dem Inhalt von FELD2 in der impliziten Länge von FELD1. CLC 14(200,8),FELD Vergleichen von 200 Bytes des durch + 10 gegebenen Adresse. CLC BH BL BE
FELD1.FELD2 GR0ESSER KLEINER GLEICH
Vergleichen mit ; Sprung nach GR0ESSER, wenn (FELD1 > größer (FELD2); Sprung nach KLEINER, wenn < FELD1 > kleiner < FELD2>; Sprung nach GLEICH, wenn (FELD1 > gleich < FELD2>. CLC BNH BNL
A,B NICHTGR NICHTKL
Vergleichen mit ; Sprung nach NICHTGR, wenn < A> kleiner oder gleich ; Sprung nach NICHTKL, wenn größer (oder gleich) .
160
3. Die Programmiersprache ASSEMBLER
CLC BNE
C,=C'ABC' WEITER
Vergleichen des Inhalts des Feldes C mit der als Literal definierten Zeichenkonstante 'ABC'; Sprung nach WEITER, wenn ABC.
Befehl: CLI
Typ:
(compare Jogical jmmediate; Vergleichen Byte mit Direktzeichen)
SI
Formate symbolisch: CLI CLI
Di (Bi), I 2 Sx, I 2
Format maschinenintern : 9
1 ;
s
.
1. Byte
1 ij •
1
n
2. Byte
3. Byte
n D,
1
.
>.
4. Byte
Wirkungsweise: Der Inhalt der durch (Bj) + Di adressierten Speicherstelle wird logisch, d.h. ohne Ansehen eines numerischen Wertes, mit dem direkt in der Instruktion gespeicherten bit-Muster I 2 verglichen. Dabei wird in Abhängigkeit vom Ergebnis des Vergleichs der Bedingungsschlüssel im Anzeigeregister (Programmstatuswort) gesetzt. Wie der CLC-Befehl, so wird auch der CLI-Befehl i.d.R. von bedingten Verzweigungsoperationen gefolgt, die in bestimmter Weise auf den Bedingungsschlüssel des Anzeigeregisters reagieren. Die Aussage des Bedingungsschlüssels bezieht sich stets auf den 1. Operanden. Codierungsbeispiele: CLI BNE
BYTE,C'A' NICHTA
Vergleichen des mit der symbolischen Adresse BYTE adressierten Byte mit dem Direktzeichen 'A'. Wenn ungleich, Sprung nach NICHTA.
3.4 Maschinenbefehle
CLI BL BH
161
7(3),X'1C' KLEINER GR0ESSER
Vergleichen des mit < Reg. 3 > + 7 adressierten Byte mit dem sedezimalen Direktwert "IC'. Wenn der Inhalt des Byte kleiner als das bit-Muster IC ist, Sprung nach KLEINER; wenn er größer ist, dann Sprung nach GR0ESSER; wenn er nicht kleiner und nicht größer ist, dann Fortsetzung des Programms mit der auf BH folgenden Instruktion.
Befehl: CP
Typ:
(compare decimal packed; Vergleichen arithmetisch dezimal gepackte Zahlen)
SS (arithmetisch)
Formate symbolisch: CP CP CP
D1(L1,Bi),D2(L2>Bj) Sj ( L j ) , S 2 ( L 2 )
s1; s2
Format maschinenintern: L, - 1 1. Byte
L, - 1
2. Byte
B, 3. Byte
D,
D, 4. Byte
5. Byte
6. Byte
Wirkungsweise: Der mit + D j adressierte 1. Operand wird in der Länge L j arithmetisch mit dem durch + D 2 adressierten und L 2 Bytes langen 2. Operanden verglichen. Der arithmetische Vergleich besteht darin, daß hierbei die numerischen Werte der Operanden unter Berücksichtigung der Vorzeichen verglichen werden. Die Vorzeichen-bit-Muster F, C, A und E werden gleichwertig als „+" und D, B gleichwertig als „—" behandelt. Die Vorzeichenstellen und alle Ziffernstellen werden bei beiden Operanden auf gültigen Code hin geprüft. Sind die Operanden ungleich lang, so wird der kürzere virtuell bis zur Länge des längeren Operanden mit fuhrenden Nullen aufgefüllt. Je nach dem Ergebnis
3. Die Programmiersprache ASSEMBLER
162
des Vergleichs wird ein Bedingungsschlüssel im Anzeigeregister gesetzt. Die Vergleichsoperation wird i. d. R. von bedingten Verzweigungsoperationen gefolgt, die in bestimmter Weise auf den Bedingungsschlüssel im Anzeigeregister reagieren. Die Aussage des Bedingungsschlüssels bezieht sich stets auf den 1. Operanden. Codierungsbeispiele : CP
0(2,8),5(3,7)
< Reg. 8 > 0 | 0
3
5
1 1 | D
1. Operand
i
2. Operand
Reg. 7 > + 5 0 | 0
1 •1 0
; c
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 (Reg. 9> + 0 adressierten 2. Operanden verglichen. Der 2. Operand wird während des Vergleichs virtuell mit fuhrenden Nullen auf 3 Bytes aufgefüllt.
Befehl: CR
Typ:
(compare registers; Vergleichen arithmetisch FP-Register mit FP-Register)
RR
Format symbolisch: CR
R „ R2
Format maschinenintern: R, 1. Byte
2. Byte
Ri
163
3.4 Maschinenbefehle
Wirkungsweise: Der Inhalt des mit R j 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: 5,6 KLEINER GR0ESSER 7,5
CR BL BH AR
GLEICH
Vergleichen < Reg. 5 > mit < Reg. 6 >; wenn (Reg. 5 > kleiner < Reg. 6 >, dann Sprung nach KLEINER; wenn größer , dann Sprung nach GR0ESSER; wenn weder kleiner noch größer, dann Fortsetzung des Programms mit GLEICH AR 7,5.
Befehl: C
Typ:
(compare; Vergleichen arithmetisch FP-Register mit Vollwort)
RX
Formate symbolisch: C C C
R „ D 2 ( X 2 , b2) Ri, S 2 (X 2 ) R j , S2
Format maschinenintern: 5
1 1 1 • Byte
9
R1
1 ,
2. Byte
•
X2
B,
1 ;-« 3. Byte
•
D2
i -j 4. Byte
»
164
3. Die Programmiersprache ASSEMBLER
Wirkungsweise: Der Inhalt des mit R t adressierten Registers wird arithmetisch, d.h. unter Berücksichtigung der Vorzeichen und der Zahlenwerte mit dem Inhalt des durch (X2> + (B2> + D 2 adressierten Vollwortes verglichen. Entsprechend dem Ergebnis des Vergleiches 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. Programmieihinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44). Codierungsbeispiele: C BH
7,=F'0' PLUS
Vergleichen des Inhalts von Register 7 mit der als Literal dargestellten „Vollwortnull". Verzweigen nach PLUS, wenn größer 0 ist. C BL
6,W0RD WEITER
Vergleichen mit ; wenn kleiner , dann Sprung nach WEITER. C BNE
5,5(3,4) A
Vergleichen mit dem Inhalt des durch (Reg. 3> + + 5 adressierten Vollwortes. Sprung nach A bei ungleich.
Befehl: CH
Typ:
RX
(compare halfword; Vergleichen arithmetisch FP-Register mit Halbwort)
165
3.4 Maschinenbefehle
Formate symbolisch: CH CH CH
R lf D 2 (X 2 , B 2 ) R „ S 2 (X 2 ) R 1( S 2
Format maschinenintern: 4
]
R,
9
1. Byte
1
'
X;
2. Byte
B,
+ D 2 angegebenen Adresse ausgeführt. Bei Nichtentsprechung setzt das Programm mit der auf BC folgenden Instruktion fort. Programmierhinweise: Das Setzen der bit-Maske M! 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
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, D 2 (0, D 2 (0, D 2 (0, D 2 (0, D 2 (0, D 2 (0, D 2 (0, D 2 (0,
BC BC BC BC BC BC BC BC BC BC BC
0, D 2 (0, 2, D 2 (0, 4, D 2 (0, 8, D2 (0, 13, D 2 (0, 11, D 2 (0, 7, D 2 (0, 2, D 2 (0, 1,D2(0, 4, D 2 (0, 8, D 2 (0,
explizite
B2) B2) B2) B2) B2) B2) B2) 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 (B2> + D2 = (Reg. 5> + 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
M b R2
Format maschinenintern : o
M
7 1. Byte
2. Byte
Wirkungsweise: Vergleichsoperationen, Arithmetikoperationen, Ladeoperationen und shiftOperationen bewirken das Setzen eines Bedingungsschlüssels im Anzeigeregister. Die BC R-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 Mj kann bis auf eine Ausnahme nur explizite durch die Angabe bestimmter Direktwerte erfolgen (vgl. BC auf S. 170). Die Ausnahme ist BCR 15,R 2 . 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
/
/
4
UPR0
3.UPR0 FELD1.FELD2
/•
' * I E0J | CLC
FELD1 =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: / "" / WEITER / t
MVC
l
\
*
\
\
*
\
\ UPR0^
UPR0 FELD1.FELD2
E0J CLC
FELD1 =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: ^BAL 3,UPR0 MVC FELD1,FELD2 • ^ . \i
/ ,/ /
/
/
/
2
'
/
\ i UPR0
/
• \ BAL ,3,UPR0 MVC FELD1,=X'01020C' 1 • \
1
1
EOJ ] ' = CLC J /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
Ri, D 2 (0, B 2 ) R 1( S 2
Format maschinenintern: 1 4 1 5
Ri ! 0
1. Byte
2. Byte
Ri
1
3. Byte
r> "j
1 i•
»
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 R j angegebene Register geladen. Danach verzweigt das Programm zu der mit + D 2 adressierten Instruktion. Codierungsbeispiel: ^BAL / yVIVC
3,UPR0 FELD1.FELD2
Ii I I
I
I
UPR0 \
CLC
FELD1 =X'00000C'
\\ "
V
BR
Die Adresse der MVC-Instruktion wird in das Register 3 geladen. Danach verzweigt das Programm zum Befehl mit der symbolischen Adresse UPR0. Der Befehl B R 3 bewirkt den Rücksprung zur MVC-Instruktion. 13
Vereinfachend wird hier nur der Fall der nicht indizierten Sprungadressen behandelt.
174
3. Die Programmiersprache ASSEMBLER
Befehl: BALR Typ:
(branch and link registers; Verzweigen zur Registeradresse nach Laden der Rücksprungadresse)
RR
Format symbolisch: BALR
R „ R2
Format maschinenintern: i 0 • 5 I 1. Byte
1 R, | R, I 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 R! adressierte Register geladen. Danach verzweigt das Programm zu der Instruktion, deren Adresse im Register R 2 steht. Codierungsbeispiele: LA
8,UPR0
BALR
11,8 FELD1,FELD2
^/yvc /
'
l I UPR0 I \ \
E0J CLC • •
\
• V
BR
FELD1,=X'00000C
11
3.4 Maschinenbefehle
175
Die Adresse UPR0 wird in das Register 8 geladen. BALR 11,8 bewirkt das Laden der Adresse von M VC . . . 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
Rj, D 2 (0, B 2 ) R u S2
Format maschinenintern : 4
! 6 1 1. Byte
R,
1 ',
2. Byte
0
B2
—T ]* 3. Byte
1 - D, "i
•
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 j 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 wild 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ält. 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 = < Reg. 7 > + 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
Rj, R 2
Format maschinenintern: 1 |
0
I
p R, | R,
6
I
1. Byte
2. Byte
Wirkungsweise: Der Inhalt des Registers Ri 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 j gleich Null, so fährt das Programm mit der auf BCTR folgenden Instruktion fort. Programmierhinweise: Ist der Anfangswert von R j gleich Null, so wird auf alle Fälle verzweigt, denn zuerst wird um 1 vermindert; d.h. es ist dann = — 1 0. Wird für R 2 eine Null gesetzt, so wird der Inhalt von R! 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
R„R3,D2(B2)
BXLE
R„ R3)D2(B2)
BXH
Rj.Ra, S2
BXLE
Rls R3) S2
Formate maschinenintern: 8 i! 6 1. Byte
1 Ri i R3 2. Byte
T B2 H 3. Byte
8
Ri •1 Ra
B2 \< 1 .
»; 7 1. Byte
2. Byte
3. Byte
p • D, -i 4. Byte
•
1 " D, -j
•
4. Byte
Wirkungsweise: Der Inhalt des Registers R 3 wird auf den Inhalt des Registers R! addiert. Danach wird die Summe in R t 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 t 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
4. Ubungsprogxamme
EDIT
231
232
PR0GO4 *
4. Übungsprogramme T I T L E 'UEBUNG41 START 216 PRINT N0GEN
»• DEFINITIONEN DES I0CS KARTE
LISTE
» >
DTFSR
BLKSIZE=36, DEVADDR=SYSRDR, DEVICE=READER, E0FADDR=ENDE, I(JAREA1 = EBER, RECF0RM-FIXUNB, TYPEFLE=INPUT
DTFSR B L K S I Z E = 1 3 2 , DEVADDR=SYSLST, DEVICE=PRINTER, I0AREA1-DRBER, RECFPRM-FIXUNB, TYPEFLE=?UTPUT DTFEN
* VORPROGRAMM • VP «
BALR 9 , 0 USING OPEN K A R T E , L I S T E
« HAUPTPROGRAMM *
LIES
C0NVT1
C0NVT2 SELECT
ADD
GET PACK CLI BNE MVN ZAP CVB PACK CLI BNE MVN ZAP CVB CLI BE CLI BE CLI BE CLI BE MVC PUT MVC B
KARTE 0P1,EBER+2(16) EBER+1,C'- 1 C0NVT1 Î P 1 + 15(1) , = X 1 DD ' DW.0P1 1,DW ßP2 ,EBER+20(16) EBER+19 ,C1 - 1 C0NVT2 0P2+15(1) , = X'DD 1 DW.0P2 2 ,DW EBER,C'A' ADD EBER,C'S' SUB EBER,CM' MULT EBER,C'D' DIV DRBER + 10(20) ,=C1UNGUELTIGE OPERATION' LISTE DRBER.DRBER-l LIES
AR MVI CVD ZAP UNPK
1,2 OPERATOR,C1+' 1 ,DW 0P1 DW DRBER+59(16),(JPl+7(9)
Spalte 73 *
« * * *
4. Übungsprogramme
• SUB
• MULT
CONVERTS
• DIV
• EDIT
ENDE
233
MVN UNPK HVI MVZ CP BNL MVI B
0P1+7(1),»X'FF' DRBER+55(4),0 P I + 5 ( 3 ) DRBER+54,C 1 +' DRBER+74(1),=X'FF' 0P1+15(1) , » P ' 0 1 EDIT DRBER+54 , C ' - ' EDIT
SR MV I B
1,2 0PERAT0R ,C 1 - 1 ADD+6
LR MR MVI ZAP C BE CVD ZAP MP MP C BNL AP SLL SRL CVD ZAP AP B
5,1 4,2 0PERAT0R,C1 * 1 ?P1,=P'0' 4 , = F' 0 ' C0NVERT5 4 ,DW 0P1.DW d P I , = P165536' 0P1,=P'65536' 5 ,=F10' C0NVERT5 (JP1,= P ' 2 1 4 7 4 8 3 6 4 8 ' 5,1 5,1 5,DW 0P2.DW 0P1.0P2 ADD+16
LR SRDA DR MVI CVD ZAP CVD ZAP MVC UNPK MVZ B
4,1 4,32 4,2 0PERAT0R , C ' / 1 5 ,DW 0P1 ,DW 4 ,DW 0P2.DW DRBER+76(4),=C'REST' DRBER+81(16),0P2 DRBER+96(1) , = X 1 FF 1 ADD+16
MVI MVC PACK UNPK MVC MVC PACK UNPK MVC PUT MVC B
DRBER+10 , C 1 ( 1 DRBER+11(1).EBER+l PFELD,EBER+2(16) DRBER+12(16) .PFELD DRBER+28(5) ,0PERAT0RDRBER+33(1) .EBER + 19 PFELD,EBER+20(16) DRBER+34(16) ,PFELD DRBER+50(4) , = C 1 ) « ' LISTE DRBER.DRBER-l LIES
CLUSE KARTE,LISTE TERM
234
4. Übungsprogramme
KONSTANTEN UNO BEREICHE EBER ORBER DU 0P1 0P2 OPERATOR PFELD
DS DC DS DS DS DS OC DS DC DS
CL80 X 1 40' CL132 D CL16 CL16
END
VP
C") ' CL1
C' ( ' CL9
Übung 5: Im Zuge einer Auftragsabwicklung sollen Rechnungen erstellt und geschrieben werden. Die erforderlichen Daten werden ausschließlich per Lochkarten eingegeben. Der Kartenstapel besteht aus zusammensortierten Kunden- und Bestellkarten. Erstere enthalten u. a. die Anschrift der Kunden und letztere das Bestelldatum, die Artikelnummern und die Bestellmengen. Das Tagesdatum und die Artikelpreise werden mit Hilfe von Vorlaufkarten eingegeben. Kartenformate: a) Kundenkarte
Vorname
Ort
Straße
b) Bestellkarte 13
KundenNr.
XX.XX.XX
Bestelldatum
15 -
ArtikelNr.
19
21 - 23
25 - 29
31 -
33
Menge
ArtikelNr.
Menge
65 - 69
71 - 73
ArtikelNr.
Menge
80
4. Übungsprogramme
235
c) Datumskarte 14 xx.xx.xx Tagesdatum
XXXXX
|
Nr. der zuletzt mit diesem Programm geschriebenen Rechnung
d) Preiskarte 65 ArtikelNr.
XXX .XX
Preis
ArtikelNr.
XXX .XX
Preis
69
71 - 78
80
4. Übungsprogramme
236
í«
a s a
s 3« 2—|H ÜJ u Z U 5
O Z Z X
u
DTFSR BLKSIZE=132, C|JNTR(JL=YES, DEVADDR=SYSLST, DEVICE=PRINTER, I0AREA1=DRBER, PRINTOV=YES, RECF0RH-FIXUNB, TYPEFLE=OUTPUT
« • « » « » «
DTFEN
BALR 8,0 USING *.8 OPEN KARTE,LISTE
< * > HAUPTPROGRAMM
P
A
•
NEXTRECH
«
» » « • * «
* VORPROGRAMM
LIES
Palte
DTFSR BLKSIZE=80, DEVADDR=SYSRDR, DEVICE«READER, E(JFADDR=ENDE, IOAREAUEBER, RECFORM=FIXUNB, TYPEFLE=INPUT
*
VP
S
LA GET CLI BNE MVC PACK B CLI BNE MVC B CLI BE CLI BNE
12.DRUCKEN KARTE EBER+79.CD' P DATUM.EBER RECHNR .EBER+9(5) LIES EBER+79 ,C 1 P 1 A PREISE,EBER LIES EBER+79,C'A' ARTIKEL EBER+79,C'K' LIES
CLI BE MVI CNTRL MVC BALR MVC MVI MVC BALR MVC BALR MVC
ERSTE,C'N' ENDRECHG ERSTE,C'N' LISTE,SK.l DRBER+10(10),=C'HERRN .FRAU' 11,12 DRBER+10(1),VNAME DRBER+ll.C'•' DRBER+12(12).NNAME 11,12 DRBER+10(22).ORT 11.12 DRBER + 10(24) .STRASSE
242
4. Übungsprogramme
*
ARTIKEL
WEITER1 CßMPl
'
C0MP2
RECHNE
L0AD
WEITER2
• ENDRECHG
HVC MVC BALR CNTRL MVC MV I B
DRBER+39(13) , = C'REGENSBURG,D.' 0RBER+52(8) .DATUM 11,12 LISTE,SP,1 KKNR.AKNR ERSTART, C'J' LIES
CLC BNE CLI BNE MVC MVC MVC AP MVC ED BALR CNTRL MVC BALR MVC MVI LA CLI BE AP MVC ED MVC MVC L LA CLC BE LA BC'T B MVC PACK MVC MVC PACK MP MVC ED BALR AP LA B
KKNR.AKNR LIES ERSTART,C'J' WEITER1 DRBER+10(20),«C'IHRE BESTELLUNG V0M' DRBER+30(8) .EBER+5 DRBER+45(12) ,«C'RECHNUNG NR.' RECHNR ®P'1' DRBER+57(6),=X'402120202020' DRBER+57(6),RECHNR 11,12 LISTE,SP,1 DRBER+11(58)»EINTE I LG 11,12 P0S,=X'OOOC' ERSTART,C'N' 10 .EBER + 14 0(10),X'40' LIES P0S ,-P ' 1' DRBER+10(4),-X'40202020' DRBER+10(4),P0S DRBER+18(5),0(10) DRBER+47(3) ,6(10) 1 , = F ' 6' 2,PREISE 0(5,2),0(10) RECHNE 2,13(2) 1.C0MP2 WEITER2 DRBER+54(6) ,6(2) MENGE,6(3,10) ZPREIS(3) ,6(2) ZPREIS+3(2) ,10(2) PREIS,ZPREIS MENGE,PREIS DRBER-f60(11) ,«X' 40202020202021204B2020 ' DRBER+60(11).MENGE 11,12 SUMME .MENGE 10.10(10) C0MP1
CNTRL MVC EX ED BALR MVC ZAP MP DP EX
LISTE,SP,1 DRBER+49(5),-C'SUMME' O.L0AD DRBER+60(11).SUMME 11.12 DRBER+49(8).«C'lliMMST' PR0D(8) .SUMME PR0D(8) .»X 1 H C ' PR0D(8) ,»X'100C' O.L0AD
243
4. Übungsprogramme ED BALR MVC AP EX ED BALR MVC CLI BNE CL0SE TERM
DRBER+60(11).PR0D+1 11,12 DRBER+49(5),»C'T0TAL' SUMME,PR0D O.L0AD DRBER+60(11) .SUMME 11,12 SUMME,=PL5'0' E0ü,C'J' NEXTRECH LISTE
ENDE
MVI EiJ.C'O' CLOSE KARTE B ENDRECHG
DRUCKEN
PUT MVC BR
LISTE DRBER,DRBER-1 11
• KONSTANTEN UND BEREICHE EBER AKNR NNAME VNAME 0RT STRASSE KKNR ERSTART P0S MENGE ZPREIS PREIS SUMME PR0D E0J DRBER DATUM PREISE RECHNR ERSTE EINTEILG
•
DS DS DS DS DS DS DS DS DS DS
0CL80 CL5 CL12 CL12 CL22 CL24 CL5 CL5 C CL2
DS DS DS DC DS DS DS DC DS DS DS DS DS DC DC
CLS CLS CL3 PL5 1 0 1 CL6 CL2 C1N' X' 40 1 CL132 CL8 CL78 CL3 C C'P0S. ART.-NR. C' WERT'
END
VP
BEZEICHNUNG
MENGE
PREIS
244
4. Übungsprogramme
Übung 6: Dieselben Adreßkarten, die in Übung 1 verarbeitet wurden, sollen im Arbeitsspeicher sortiert werden, und zwar einmal nach steigenden Personalnummern und einmal alphabetisch nach den ersten 5 Buchstaben der Familiennamen. Die sortierten Karten sollen wie in Übung 1 aufgelistet werden, jedoch hier unter Einbeziehung der Personalnummern in die Schreibpositionen 87 bis 91. Man gehe davon aus, daß mit einem Programmablauf maximal 100 Adreßkarten verarbeitet werden. Das Programm ist nach Möglichkeit unter weitgehender Verwendung intramodularer Unterprogrammtechnik zu entwickeln.
4. Übungsprogramme
245
246
4. Übungsprogramme
247
4. Übungsprogramme
,5 LISTE 1(132,8),0(8) 6
4. Übungsprogramme
253
Übung 8a: Lochkarten mit statistischen Erhebungsdaten sollen in Blöcken zu je 10 auf ein Magnetband gebracht werden. Kartenformat:
Berufe:
Schulbildung:
Einkommensgruppen:
SE AR AN BE 0H
V - Volksschule M — Mittelschule 0 — Oberschule
0 123 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 bis 9999 10000 bis 14999 15000 bis 19999 20000 bis 24999 25000 bis 29999 30000 bis 34999 35000 bis 39999 40000 bis 44999 45000 bis 49999 50000 bis u. m.
Blockformat: 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26
254
4. Übungsprogramme
PR0G8A *
TITLE START PRINT
1
UEBUNG8A' 216 0N ,N0DATA,N0GEN Spalte 7a
* « DEFINITIONEN DES I0CS KARTE
DTFSR
BLKSIZE'26, DEVADDR»SYSRDR, DEVICE=READER, E0FADDR-ENDE, I0AREA1-EBER, RECF0RM-FIXUNB, TYPEFLE=INPUT
DTFSR
BLKSIZE=260, DEVADDR=SYS010, DEVICE»TAPE, FILABL=STD, LABNAME-LAB, a 1 I0AREA1=ABER, RECF0RM=FIXBLK, RECSIZE'26, TYPEFLE-0UTPUT, W0RKA-YES
*
BAND
DTFEN
*
• V0RPR0GRAMM • VP BALR USING 0PEN
9,0 «,9 KARTE,BAND
• HAUPTPR0GRAMM • LIES GET MVC PUT B
KARTE W0RKAREA,EBER BAND ,W0RKAREA LIES
ENDE
KARTE,BAND
*
CL0SE TERM
• KONSTANTEN UND BEREICHE EBER ABER W0RKAREA LAB *
DS DS DS DC END
21
CL26 10CL26 CL26 44X'FF'
a1
VP
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
255
Ü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.
256
4. Übungsprogramme
¡111 ¡111 i ¡ 11 i ¡¡in I 111 lili ¡111 I Jill 1 tt, Hill I i 111 Í ¡111 Í ¡111 I Jill I ¡¡111 I 111 a z
a y
D 2 (B 2 )
97
Seite
i> R2 87
Codetransformationen Umwandeln dezimal gepackt in dual
CVB
Umwandeln dual in dezimal gepackt Aufbereiten zum Drucken
RX
RI, D 2 (X2, B 2 )
115
CVD
RX
ED
SSi
RI, D 2 ( X 2 , B 2 ) DI (Li, Bi), D 2 (B 2 )
108
Aufbereiten zum Drucken und Markieren
EDMK
SS!
D i a i . B j ) , 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
SS!
DI (Li, Bi), D 2 (B 2 )
Übersetzen und Prüfen mit Hilfe von CodeTabellen
TRT
SSi
Di (Li, Bi), D 2 (B 2 )
Entpacken
UNPK
SS a
Di (Li, Bi), D 2 ( L 2 , B 2 )
116
-
106
shift-Operationen in Festpunktregistern Links-shift arithmetisch (ohne bit-Position 31)
SLA
RS
Ri, D 2 (B 2 )
127
278
5. Anhang: Programmierhilfen Op.Code symb.
Typ
Operandenformat explizite
Seite
Links-shift im Doppelregister arithmetisch (ohne bit-Position 31 in R i )
SLDA
RS
R i , D 2 (B 2 )
129
Links-shift im Doppelregister logisch (mit bitPosition 31 in R j )
SLDL
RS
RI, D 2 ( B 2 )
Links-shift logisch (mit bit-Position 31)
SLL
RS
RJ, D 2 ( B 2 )
131
Rechts-shift arithmetisch (ohne bit-Position 31)
SRA
RS
Rl, D2(B2)
127
Rechts-shift im Doppelregister arithmetisch (ohne bit-Position 31 in Ri)
SRDA
RS
RI, D 2 ( B 2 )
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
Dezimal arithmetik Addieren gepackt
AP
ssa
D j a ^ B j ) , D2(L2) B2)
132
Dividieren gepackt
DP
ssa
D ! ( L I , BO, D 2 a ï , B 2 )
138
Multiplizieren gepackt
MP
ssa
DI (Li, Bi), D 2 ( L 2 , B 2 )
135
Subtrahieren gepackt
SP
ssa
Di (Li, Bi), D 2 (LJ, B 2 )
132
ssa
DI (LJ, Bi), D 2 ( L 2 , B 2 )
134
Übertragen gepackt, rechtbündig mit fuhrenden ZAP Nullen
Festpunktarithmetik Addieren FP-Wort
A
RX
R,, D2(X2> B2)
141
Addieren FP-Halbwort
AH
RX
R I , D 2 (X 2 , B 2 )
142
Addieren FP-Wort logisch
AL
RX
R I , D 2 (X 2 , B 2 )
-
Addieren FP-Register logisch Addieren FP-Register
ALR AR
RR RR
RI, R 2 RI, R2
140
Dividieren durch FP-Wort
D
RX
R l , D 2 (X 2 ) B 2 )
148
Dividieren durch FP-Register
DR
RR
RI, R2
146
Multiplizieren mit FP-Wort
M
RX
R l , D 2 (X 2 , B 2 )
144
5.2 Tabelle der Maschinenbefehle
279
Op.Code symb.
Typ
Operandenformat explizite
Seite
Multiplizieren mit FP-Halbwort
MH
RX
R j . D ^ X j , B2)
145
Multiplizieren mit FP-Register
MR
RR
S
RX
R >R2 R , D 2 (X 2 , B 2 )
143
Subtrahieren FP-Wort Subtrahieren FP-Halbwort
SH
RX
R , D2(X2, B2)
142
Subtrahieren FP-Wort logisch
SL
RX
R , D 2 ( X 2 , B2)
_
Subtrahieren FP-Register logisch
SLR
RR
_
Subtrahieren FP-Register
SR
RR
R .R2 R .R2
Instruktion
141
140
Gleitpunktarithmetik Addieren GP-Doppelwort
AD
RX
R , D 2 ( X 2 , B2)
151
Addieren GP-Register lang
ADR
RR
149
Addieren GP-Wort
AE
RX
R .RI R , D 2 ( X 2 , B2)
Addieren GP-Register kurz AER
RR
R >R2
149
Addieren GP-Wort unnormalisiert
AU
RX
R , D 2 ( X 2 , B2)
_
Addieren GP-Register kurz, unnormalisiert
AUR
RR
R ,R2
_
Addieren GP-Doppelwort unnormalisiert
AW
RX
R , D 2 ( X 2 , B2)
Addieren GP-Register lang, unnormalisiert
AWR
RR
R ,R2
_
Dividieren durch GP-Doppelwort
DD
RX
R , D 2 ( X 2 , B2)
157
Dividieren durch GP-Register lang
DDR
RR
Dividieren durch GP-Wort
DE
RX
R R2 R , D 2 ( X 2 , B2)
157
Dividieren durch GP-Register kurz
DER
RR
Halbieren GP-Register lang HDR Halbieren GP-Register kurz Multiplizieren mit GP-Doppelwort Multiplizieren mit GP-Register lang Multiplizieren mit GP-Wort
151
156
156
RR
R .RI R >R2
HER
RR
R ,R2
_
MD
RX
R , D 2 ( X 2 , B2)
155
MDR
RR
R ,R2
154
ME
RX
R , D 2 ( X 2 , B2>
155
-
5. Anhang: Programmierhilfen
280 Op.Code symb.
Typ
Operandenformat explizite
Seite
Multiplizieren mit GP-Register kurz
MER
RR
Ri> R2
154
Subtrahieren GP-Doppelwort
SD
RX
Ri, D2(X2, B2)
153
Subtrahieren GP-Register lang
SDR
RR
RI, R2
152
Subtrahieren GP-Wort
SE
RX
R I , D 2 ( X 2 , B2)
153
Subtrahieren GP-Register kurz
SER
RR
RI, R2
152
Subtrahieren GP-Wort unnormalisiert
SU
RX
RI, D 2 ( X 2 , B2)
-
Subtrahieren GP-Register kurz, unnormalisiert
SUR
RR
RI, R2
-
Subtrahieren GP-Doppelwort unnormalisiert
SW
RX
RI, D 2 ( X 2 , B2)
-
Subtrahieren GP-Register lang, unnormalisiert
SWR
RR
Ri, R2
-
Instruktion
Vergleichsoperationen Vergleichen FP-Register mit FP-Wort
C
RX
R , , D2 (X2, B 2 )
163
Vergleichen GP-Register mit GP-Doppelwort
CD
RX
RI, D 2 ( X 2 , B2)
166
Vergleichen GP-Register lang
CDR
RR
R,. R2
166
Vergleichen GP-Register mit GP-Wort
CE
RX
RL D2(X2, B2)
166
Vergleichen GP-Register kurz
-GER
RR
Ri, R2
166
Vergleichen FP-Register mit FP-Halbwort
CH
RX
R , , D2 (X2, B2)
164
Vergleichen Zeichen logisch
CLC
SSi
DjCLLB!), D2(B2)
158
Vergleichen logisch Direktzeichen
CLI
SI
Di(Bi), I2
160
Vergleichen gepackte Dezimalzahlen
CP
ssa
D ^ L l B O , D2(L2i B2)
161
Vergleichen FP-Register
CR
RR
RI, R2
162
Testen Byte mit Maske
TM
SI
Dl (Bi), I 2
167
Verzweigungsoperationen Verzweigen nach Laden der Rücksprungadresse
BAL
RX
Rl, D2 (X2, B2)
173
281
5.2 Tabelle der Maschinenbefehle
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
M,,R2
170
Vermindern Inhalt Register und Verzweigen bei # 0
BCT
RX
Rl, 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
Instruktion
RS
Ri, D 2 (B 2 )
178
Verzweigen wenn B2) RI, D 2 (X 2 , B2)
RX
Ri, D 2 (X 2 , B2)
170 170 170
5.3 Tabelle der 2er-Potenzen
n
2n
n
2n
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 2 4 8 16 32 64 128 256 512 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
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)
283
5.4 Umrechnungstabelle sedezimal - dezimal Z4 0 1 2 3 4 5 6 7 8 9 A B C D E F zj 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
Z 3 -16 3
4 8 12 16 20 24 28 32 36 40 45 49 53 57 61
0 096 192 288 384 480 576 672 768 864 960 056 152 248 344 440
z2
Z 2 -16 2
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
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
Zx-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
Sedezimalziffer Zj • 161 - Dezimalwert Sedezimalstelle mit dem Stellenwert 161
5.5 Tabelle der möglichen Bit-Muster im Byte (sedezimal) Halbbytes (sedezimal) 00 Ol 02 03 04 05 06 07 08 09 OA OB OC OD OE OF
Dezimalwert 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Maschineninstruktionen (symb. Op.Code)
Druckzeichen, Maskenzeichen
Seite
_ _ SPM BALR BCTR BCR SSK ISK svc
174 176 170
_ _ — — — —
_ -
284
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: Programmierhilfen
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 0R XR LR CR AR SR MR DR ALR SLR LPDR LNDR LTDR LCDR HDR
Druckzeichen, Maskenzeichen
93 92 -
91
Zifferzeichen Startzeichen für Nullen Endezeichen für Nullen
—
87 162 140 140 143 146
_ —
_ -
_ —
_ _
LDR CDR ADR SDR MDR DDR AWR SWR LPER LNER LTER LCER HER
LER CER AER SER MER DER AUR SUR STH LA
Seite
99 166 149 152 154 156
_ -
_ -
_ _ _ 98 166 149 152 154 156 Leerzeichen (blanc)
_ _
95 85
285
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
Maschineninstruktionen (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
-
)
88 163 141 141 144 148
'
-
i
$ *
1 1
-
102 -
LD CD AD SD MD DD AW SW STE
%
> ?
100 166 151 153 155 157 —
101 -
-
5. Anhang: Pogrammierhilfen
286
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
# @ •
= n
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 160 -
93 — —
SI0 n 0 HI (9 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
287
Seite -
-
-
-
-
A B c D E F G H I
MVN MVC MVZ NC CLC 0C
xc
I K L M N 0 P
Q R
—
—
81 79 82 —
158
5. Anhang: Programmierhilfen
288
Halbbytes (sedezimal)
Dezimalwert
DB DC DD DE DF EO El E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF FO Fl F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
Masch ineninstruktionen (symb. Op.Code)
Druckzeichen, Maskenzeichen
Seite
_ TR TRT ED EDMK
-
108
-
-
S T U V w X Y Z
-
-
MV0 PACK UN PK
ZAP CP AP SP MP DP
0 1 2 3 4 5 6 7 8 9
83 103 106 -
134 161 132 132 135 138 -
5.7 Fehleranzeigen des Übersetzerprogramms (Übersetzungsphase)
289
5.6 Tabelle der maschineninternen Instruktionsformate
1. Byte
3. Halbwort
2. Halbwort
1. Halbwort
4. Byte
3. Byte
2. Byte
5. Byte
6. Byte
Op.-Code
Op.-Code
Ri
I X2
Op.-Code
Ri 1 1*3
Op.-Code
D2
tL_
B,
¡«
D. -i"
•«-
D,
Op.-Code
L, - 1 ; L 2 - 1
B,
Op.-Code
L, - 1
B,
f-
D,
D2
5.7 Fehleranzeigen des Übersetzerprogramms (Übersetzungsphase)23 A D E
M 0 S T U Y
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 verfügbar 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.
290
5. Anhang: Programmierhilfen
5.8 Fehleranzeigen des Betriebssystems (Ablaufphase)24 P088 Nichtdecodierbarer Operationscode (meistens, wenn in Daten- oder Konstante nfelder verzweigt wird) P092 Adressierungsfehler (Ausrichtung verletzt, Adresse zu groß) P096 Unzulässiger Datencode P100 Exponent zu groß (bei Gleitpunktarithmetik) PI04 Division durch Null PI08 Mantisse gleich Null (bei Gleitpunktarithmetik) PI 12 Exponent zu klein (bei Gleitpunktarithmetik) PI 16 Dezimalüberlauf (bei Dezimalarithmetik) PI 20 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
291
Literaturverzeichnis [0] Dworatschek, S.: Einführung in die Datenverarbeitung. 5. Aufl. Berlin 1973. [ l j Germain, C. B.: Das Programmier-Handbuch der IBM/360. München 1971. [2] Fernsehkurs im Medien-Verbund: Einfuhrung in die Elektronische Datenverarbeitung, Band I, II, III. [3] IBM System/360: Principles of Operation. [4] IBM System/360: Maschinenlogik und Aufbau der Instruktionen. [5] IBM Betriebssystem/360: Die Assemblersprache. [6] IBM/360: Assembler mit Eingabe-/Ausgabe-Makro-Instruktionen, Teil I, II, III. [7] IBM-Handbuch der EDV-Organisation. [8] IBM System/360: Die Basic Assembler Sprache. [9] IBM System/360: Datenorganisation auf Speichereinheiten mit direktem Zugriff. DAS D-Handbuch. [10] IDV-Lernprogramm: Elektronische Datenverarbeitung I, II. Berlin 1971. [11] Lohr, K. P.: Assembler-Programmierung. Berlin 1972 (HMI-BM 42). [12] Niemeyer, G.: Ein integriertes Datenverarbeitungs- und Informationssystem. Berlin 1972. [13] Opler, A.: Das IBM-System/360 und seine Programmiertechniken. München-Wien 1968. [14] Payne, W. H.: Machine, Assembly and Systems Programming for the IBM/360. New York, N.Y. 1969. [15] Siemens System 4004: Zentraleinheiten 35, 45, 55. Beschreibung und Befehlsliste. [16] Siemens System 4004: Assembler. [17] Siemens Schriftenreihe „data praxis": Technik der Speicherung und Wiedergewinnung von Daten im direkten Zugriff. [18] Siemens Schriftenreihe „data praxis": Methoden zur Adressierung von Speichern mit direktem Zugriff. [19] Siemens System 4004: Systemkonventionen. [20] Siemens System 4004/35, 45, 55: PBS-Dienstprogramme. [21] Siemens System 4004/35, 45, 55: PBS-Organisationsprogramm. [22] Stabley, D. H.: System/360 Assembler Sprache. Stuttgart 1969. [23] Struble, G.: Assembler Language Programming. The System/360. [24] Univac Serie 9000: Technische Beschreibung 9200, 9300. [25] Univac Serie 9000: Programmierungs-Standard, Bibliothek Teil 1 und 2. [26] Wolters, M. F.: Der Schlüssel zum Computer. Düsseldorf 1969.
292
Stichwortverzeichnis
Stichwortverzeichnis 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ßkonstante 6 4 - 6 6 AE Addieren normalisiert kurz 151, 152 AER Addieren normalisiert kurz (Register) 149, 150 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 ff. absolute - 39, 40, 65, 185 ff. einfache - 38 ff. explizite - 68 ff. implizierte - 69 ff. indizierte - 42 ff. relative - 39, 40, 52, 53, 65 relative symbolische - 52, 7 7 - 7 9 symbolische - 40, 54, 66 ff. Assembler, siehe Umwandlungsprogramm ASSEMBLER 46 ff. Elemente des — 47 Assembleranweisungen 47, 180 ff. Aufbereiten zum Drucken 108 ff. Aufbereitungsmaske 109 Ausdrücke 48 ff. Ausfiihrungsphase 180, 188 B Verzweigen unbedingt 170 BAL Springen und Speichern Rücksprungadresse 173 BALR Springen (zu Registeradresse) und Speichern RUcksprungadresse 174 Basisadresse 39 absolute - 52, 185 ff. relative - 52, 53, 185 ff. Basisregister 31, 38 ff, 185 ff. BC Springen bedingt 169, 170 - erweiterter Bedingungscode 170 BCR Springen (zu Registeradresse) bedingt 170, 171 BCT Springen nach Zählen 175, 176 BCTR Springen (zu Registeradresse) nach Zahlen 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 190 ff. bit 9 - Positionen 9 ff. - 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 nicht kleiner 170 B0 Verzweigen bei Einsen-bit-Muster 170 BP Sprung bei positiv 170 Buchstabendarstellung 13, 15 BXH Springen, wenn Index größer 178, 179 BXLE Springen, wenn Index 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 kurz (Register) 166 CH Vergleichen Halb wort 165 CLC Vergleichen logisch 1 5 8 - 1 6 0 CLI Vergleichen logisch direkt 160 CL0SE Schließen einer oder mehrerer Dateien 208, 209 CNTRL Steuerung eines peripheren Geräts 213, 214 CNVTDEGP Umwandlung dezimal nach sedezimal Gleitpunkt 117 f f . CNVTGPDE Umwandlung sedezimal Gleitpunkt nach dezimal 117 ff. Codeumwandlung 16 ff.,103 ff. - 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 nach sedezimaler Gleitpunktzahl 117, 119ff. - sedezimal GP nach dezimal 117, 120 ff. CP Vergleichen dezimal 161, 162 CR Vergleichen algebraisch (Register) 162, 163 CSECT Definieren eines Programmabschnitts 189 ff. CVB Umwandeln in Dualzahl 115, 116 CVD Umwandeln in Dezimalzahl 116, 117
Stichwortverzeichnis
293
EX Ausführen 179, 180 D Dividieren (Wort) 148, 149 Dateierklärungen 203 ff. EXTRN Erklären externer Symbole 66, DC Definieren Konstante 182, 183 190 ff. DD Dividieren lang 157, 158 DDR Dividieren lang (Register) 156, 157 Festpunktkonstante 60, 61 DE Dividieren kurz 157, 158 Festpunktregister 10, 19 DER Dividieren kurz (Register) 156, 157 Dezimalbefehle (arithmetische) 132 ff. GET Lesen seriell 209, 210 Dezimalkonstante 6 2 - 6 4 Gleitpunktbefehle (arithmetische) 149-158 Dezimal gepackte Zahlendarstellung 16 ff. Gleitpunktkonstante 62 Direktoperanden 33 Gleitpunktregister 10, 29, 30 Direktwerte 49 ff. Gleitpunktzahl 29, 30 binäre - 51 dezimale - 50 Halbbyte 13, 18 sedezimale — 51 Halbwort 10, 18, 1 9 - 2 1 Zeichen - 51, 52 Halbwortgrenze 45 Distanzadresse 31, 32, 35, 38 ff., 185 ff. Ausrichtung auf - 44 ff., 60, 184 Doppelwort 10 Doppelwortgrenze 44 IC Laden Zeichen 90, 91 Indexregister 32, 42, 43 Ausrichtung auf — 44, 184 Instruktionen 47 DP Dividieren sedezimal 138, 139 Instruktionstypen 32 ff. DR Dividieren (Register) 146, 147 Formate der - 32 ff., 289 DROP Sperren von Basisregistern, die vorher durch USING zugewiesen wurden 188 Kilobyte 9 DS Definieren Speicherplatz 183-185 Komplementierung 20, 9 1 - 9 3 DTFDA Dateierklärung für Gerät mit Konstantentyp 56 ff., 182, 184 direktem Zugriff 204 ff. DTFEN Ende der Dateierklärungen 204 ff. DTFSR Dateierklärung für Gerät mit L Laden (FP-Wort) 88, 89 seriellem Zugriff 204 ff. LA Laden Adresse 85-87 Dualer Stellenwert 14, 18, 19, 23 Ladeadresse 39, 65, 185 ff. Duale Zahlendarstellung 17 ff., Ladebefehle 85 ff. Längenattribut 54 - im Halbwort 1 9 - 2 3 Längenschlüssel 56 - im Festpunktregister 1 9 - 2 3 expliziter - 56 - im Wort 1 9 - 2 3 impliziter - 57 Duplizierfaktor 56 LCR Laden Komplement 91, 92 LD Laden lang 100, 101 EBCDI-Code 11 ff. Buchstabendarstellung im - 12, 13, 15 LDR Laden lang (Register) 99 LE Laden kurz 99, 100 Sonderzeichendarstellung im - 13, 16 LER Laden kurz (Register) 98 Vorzeichendarstellung im - 12, 15 LH Laden Halbwort 89, 90 Zahlendarstellung im - 12, 15 Literal 54 ff. Zifferndarstellung im - 11, 15 ED Aufbereiten 108-115 - mit Adreßkonstante 64 ff. Einfugungszeichen in Druckmaske 109 - mit Binärkonstante 59, 60 Endezeichen in Druckmaske 109 - mit Dezimalkonstante 62—64 END Beenden der Umwandlung 191 ff. - mit Festpunktkonstante 6 0 - 6 2 Entpacken 17, 106-108 - mit Gleitpunktkonstante 62 ENTRY Definieren symbolische - mit Sedezimalkonstante 58, 59 Adresse als Einsprungstelle 191 ff. - mit Zeichenkonstante 57, 58 E0J Programmende (identisch mit Literalbereich 196 TERM) 215 LM Laden mehrfach 93, 94 EQU Wertzuweisung zu einem LNR Laden negativ 92 Symbol 4 9 - 5 1 , 181, 182 LPR Laden positiv 93 Erweiterter Bedingungscode bei VerzweiLR Umladen Registerwert 87, 88 gungsbefehlen 170 LT0RG Eröffnen eines Literalbereichs 196
Stichwortverzeichnis
294 M Multiplizieren Register mit Vollwort 144, 145 Makro 47, 198 ff. - Aufruf 47, 198, 202 - Bibliothek 198, 201, 202 - Definition 199 ff. Mischform - 200 Schlüsselwort - 200 Stellungs - 199, 200 System - 203 ff. - Umwandler 198, 201 Makros 47, 198 ff. - zur Dateidefinierung 203 ff. - zum Öffnen und Schließen von Dateien 208, 209 - zum Schreiben und Lesen 209-213 - zur Steuerung peripherer Geräte 213-215 Maschinenbefehle 47, 66 ff. Beschreibung der - 79 ff. Syntax der - 67-77 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 135-137 MR Multiplizieren Register 143, 144 MVC Übertragen Zeichen 79, 80 MVI Übertragen Direktzeichen 81 MVN Übertragen rechte Halbbytes (Ziffern) 81, 82 MV0 Übertragen Zeichen versetzt 83-85 MVZ Übertragen linke Halbbytes (Zonen) 82, 83 Nullenunterdrückung 108 ff. Objektprogramm 31, 46 0PEN Eröffnen von Dateien 208 Operanden 31, 66 ff. - Adressierung 34 ff., 38 ff. Ausrichtung der - 44, 45 Länge der - 44 Operationscode 66 ff. 0RG Setzen des Zuordnungszählers 195 PACK Packen von gezonten Dezimalzahlen 16, 17, 103-106 P RI NT Modifikation des Protokollumfangs 197, 198
Programmsegment 189 ff. Programm-Modul 189 ff. PRT0V Vorschub bei Formularende 207, 214, 215 PUT Schreiben seriell 210, 211 Quellenprogramm 46 ff. READ Lesen gestreut 211, 212 Register 10 Laden - 85 ff. -
Operanden 3 3 f f .
- inhalten, Speichern von 94 ff. Relative Adressierung 39 ff., 7 7 - 7 9 - bei RX- und RS-Instruktionen 77 - bei Sl-Instruktionen 78 - bei SS-Instruktionen 78, 79 RR-Instruktionen, echt 34 - symbolisch 67, 68 RS-Instruktionen, echt 35, 36 - symbolisch 71, 72 Rücksprungadresse 171 ff. RX-Instruktionen, echt 34, 35 - symbolisch 68, 69 - als Sprungbefehle 70, 71 S Subtrahieren (Wort) 141 Schutzsternschreibung 112, 113 SD Subtrahieren normal lang 153 SDR Subtrahieren normal lang (Register) 152, 153 SE Subtrahieren normal kurz 153 Sedezimale Schreibweise 13 ff. Buchstabendarstellung in - 15 Sonderzeichendarstellung in - 16 Zahlendarstellung in - 15 Zifferndarstellung in - 15 Sedezimalbrüche 26, 27 Sedezimalkonstante 58, 59 Sedezimalsystem 14 Sedezimalzahl 23 ff. Segment 189 ff. SER Subtrahieren normal kurz (Register) 152, 153 SH Subtrahieren Halbwort 142, 143 Shift-Befehle 127-132 Sl-Instruktionen, echt 36, 37 - symbolisch 72, 73 SLA Verschieben links 128 SLDA Verschieben links doppelt 129, 130 SLL Verschieben links logisch 131, 132 SP Subtrahieren dezimal 132, 133 Sonderzeichendarstellung 13, 16 Speicherbefehle 94 ff., 101-103 Speicheroperanden 31 Sprungbefehle 70, 71, 169-180
Stichwortverzeichnis SR Subtrahieren (Register) 140 SRA Verschieben rechts 127 SRDA Verschieben rechts doppelt 128,129 SRL Verschieben rechts logisch 130, 131 SS-Instruktionen, echt 37, 38 - symbolisch 7 3 - 7 7 ST Speichern (FP-Wort) 94, 95 START 189 Startzeichen in Druckmaske 108 STC Speichern Zeichen 96, 97 STD Speichern lang 102, 103 STE Speichern kurz 101, 102 Stellenwert 12 ff. dezimaler - 21, 22 dualer - 14, 23 sedezimaler — 23 STH Speichern Halbwort 95, 96 STM Speichern mehrfach 97, 98 Symbole 48, 49 Symbolische Maschineninstruktionen 66 ff. Syntax der - 6 7 - 7 7 Symboltabelle 49 System-Makros 203 ff. TERM Beenden des Programms 215 Tetrade 13 TITLE Drucken Kopfzeile 197 TM Testen mit Maske 167-169 Übertragungsbefehle 7 9 - 8 5 Übungsaufgaben 216 ff. Umwandlung 41, 43, 5 2 - 5 6 Umwandlungsprogramm 46 UNPK Entpacken 106-108 USING Deklarieren Basisregister 41, 185-187 Unterprogrammsprung 171 ff.
295 Vergleichsbefehle 158-169 Verzweigungsbefehle 169-180 Vollwort 10 Vollwortgrenze 45 Ausrichtung auf - 45, 6 0 - 6 2 , 184 Vorzeichendarstellung 12, 15, 20, 29, 30 WAITF Warten, bis eine E/A-Operation eines Großspeichers beendet ist 212, 213 Wertzuweisung siehe EQU WRITE Schreiben gestreut 212 Wort 18, 19, 20 Zahlendarstellung 12, 15, 16 ff. dezimal gepackte — 16, 17 dezimal gezonte - 12, 15 - dual 1 7 - 2 1 - im Festpunktregister 1 9 - 2 1 - 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 Zahlensysteme 21 ff. Umrechnung von - 23 ff. ZAP 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 - 5 2 ff. Steuerung des - 195, 196 Zweierkomplement 20
w DE
G
Walter de Gruyter Berlin-New York de Gruyter Lehrbuch
Wolfgang E. Spiess Friedrich G. Rheingans
Einführung in das Programmieren in FORTRAN 3., verbesserte Auflage. Groß-Oktav. 216 Seiten. Mit 19 Abbildungen und 13 Tabellen. 1972. Plastik flexibel D M 1 8 , - ISBN 3 1 1 003914 1
Wolfgang E. Spiess Gert Ehinger
Programmierübungen in F O R T R A N
Harald Siebert
Höhere FORTRAN-Programmierung
Groß-Oktav. 127 Seiten. 1973. Plastik flexibel D M 1 8 , I S B N 3 11 003777 7
In Zusammenarbeit mit der G E S Gesellschaft für elektronische Systemforschung e. V. Bühl Groß-Oktav. Etwa 160 Seiten. 1974. Plastik flexibel etwa D M 1 8 , - I S B N 3 11 0 0 3 4 7 5 1
Klaus Hambeck
Einführung in das Programmieren in C O B O L Groß-Oktav. V I I I , 162 Seiten. 1973. Plastik flexibel DM 18,- ISBN 3 1 1 0036258
Georg Bayer
Einführung in das Programmieren in A L G O L 2., verbesserte Auflage. Groß-Oktav. 172 Seiten. Mit 26 Abbildungen. 1971. Plastik flexibel D M 1 8 ISBN 3 1 1 0064332
Georg Bayer
Programmierübungen in A L G O L 60 Unter Mitarbeit von Lothar Potratz und Siegfried Weiß Groß-Oktav. 90 Seiten. 1971. Plastik flexibel D M 14,— ISBN 3 1 1 0 0 3 5 6 2 6
IDV-Lernprogramm: F O R T R A N Ein PU-Lehrgang für Ingenieure, Techniker, Ökonomen und Naturwissenschaftler 2 Bände in 1 Band. Quart. X X I V , 190 Seiten. 1971. Gebunden D M 4 8 , - I S B N 3 11 0035766 (Coproduktion mit dem Verlag Paul Haupt, Bern)