194 80 20MB
German Pages 332 [337] Year 1984
de Gruyter Lehrbuch Niemeyer • Programmieren in ASSEMBLER
Gerhard Niemeyer
Einführung in das
Programmieren in ASSEMBLER Systeme IBM, Siemens, Univac Interdata, IBM-PC/370 5. bearbeitete und erweiterte Auflage
W G DE
Walter de Gruyter • Berlin • New York 1984
Dr. rer. pol. Gerhard Niemeyer, o. Professor der Betriebswirtschaftslehre, insbes. Wirtschaftsinformatik, an der Universität Regensburg
CIP-Kurztitelaufnahme
der Deutschen
Bibliothek
Niemeyer, Gerhard: Einführung in das Programmieren in ASSEMBLER : Systeme IBM, Siemens, Univac, Interdata / Gerhard Niemeyer. 5. Aufl. - Berlin ; New York : de Gruyter, 1984. (De-Gruyter-Lehrbuch) ISBN 3-11-008758-8
© Copyright 1984 by Walter de Gruyter & Co., 1000 Berlin 30. Alle Rechte, insbesondere das Recht der Vervielfältigung und Verbreitung sowie der Übersetzung, vorbehalten. Kein Teil des Werkes darf in irgendeiner Form (durch Photokopie, Mikrofilm oder ein anderes Verfahren) ohne schriftliche Genehmigung des Verlages reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden. Printed in Germany. Satz und Druck: Mercedes-Druck, Berlin. Bindearbeiten: Dieter Mikolai, Berlin.
Vorwort Die Programmiersprache ASSEMBLER ist eine maschinenorientierte Sprache für Bytemaschinen der Serien IBM/360, IBM/370, Siemens 4004 und Univac 9000. Aufgrund der außerordentlich großen Verbreitung dieser Anlagen im Bereich der Wirtschaft und der öffentlichen Verwaltung gehört ASSEMBLER zu den meist verwendeten Programmiersprachen 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 fuhrenden Position verdrängen. Dies mag teils mit der absoluten Universalität und dem Testkomfort der ASSEMBLER-Sprache zusammenhängen und teils durch die spürbar längeren Übersetzungszeiten für die in problemorientierten Sprachen geschriebenen Programme begründet sein. Hinzu kommen sicherlich auch „gefühlsmäßige" Präferenzen durch die Programmierer, die an der Programmiersprache ASSEMBLER die größere Freiheit der Programm gestaltung und die größere Transparenz der eigentlichen Datenverarbeitungsvorgänge in der Maschine schätzen. In der Tat erscheinen diese Faktoren geeignet, insbesondere den Neuling auf dem Gebiet der elektronischen Datenverarbeitung für diese Tätigkeit zu interessieren und ihn gründlich in dieses Gebiet einzuführen. Aus diesem Grunde sieht das vom Verfasser konzipierte Informatik-Studium für Studenten der Wirtschaftswissenschaften an der Universität Regensburg u. a. eine Einführung in ASSEMBLER im Grundstudium vor. Uber diese didaktischen Überlegungen hinaus muß jedoch auch auf die Bedeutung der ASSEMBLER-Sprache als universelle Basis für ,.höhere" Programmieraufgaben, wie Systemprogrammierung, Compilerbau und Aufbau von Datenbank- und Informationssystemen hingewiesen werden. Das Erlernen der ASSEMBLER-Sprache schafft also einen idealen Ausgangspunkt für vielerlei berufliche Spezialisierungen im Bereich der elektronischen Datenverarbeitung. Das vorliegende Lehrbuch ist als möglichst umfassende Einführung in ASSEMBLER gedacht und kann darüber hinaus vom Programmierer auch als Nachschlagewerk benutzt werden; letzteres allerdings mit der Einschränkung, daß wegen der Knappheit des verfügbaren Raumes nicht der gesamte Sprachumfang dargestellt werden konnte. Jedoch dürfte das Gebotene für die meisten Aufgabenstellungen ausreichen. Das Lehrbuch ist in vier Hauptabschnitte unterteilt: Der erste Abschnitt behandelt die Datendarstellung in Bytemaschinen, der zweite die Maschineninstruktionen und der dritte die ASSEMBLER-Sprache.
6
Vorwort
Der vierte Abschnitt zeigt die Anwendung anhand mehrerer Beispiele, die von einfachen kaufmännischen Problemen bis hin zu Problemen, wie sie im Compilerbau vorkommen, reichen. Bei der Lektüre des Buches empfiehlt es sich, mit den Beispielen in Hauptabschnitt 4 zu beginnen. Die dabei auftretenden Fragen können dann unter 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. [42], [18] und [5] empfohlen. Regensburg, im Februar 1973
Gerhard
Niemeyer
Vorwort zur 5. Auflage Das anhaltend große Interesse an diesem Lehr- und Nachschlagewerk gab den Anstoß für einige umfangreiche Verbesserungen und Erweiterungen. So wurde ein Abschnitt über die Bedingungscodes im Programmstatuswort und deren Umsetzung in Prüfmaskenäquivalente der Sprungbefehle eingefügt. Konsequenterweise wurde damit die Angabe aller von den Instruktionen erzeugten Bedingungscodes sinnvoll. Femer wurden einige als sehr effizient und handlich erkannte Maschinenbefehle der /360-Generation zusätzlich in die Darstellung aufgenommen; hierbei handelt es sich um LTR, TR, AL, ALR, SL und SLR. Schließlich wurden einige wichtige Erweiterungen der /370-Generation berücksichtigt; hierbei handelt es sich um MVCL, ICM, STCM, SRP, CLM und CLCL. Die Aktualität der ASSEMBLER-Sprache wird durch die Einführung des IBM-PC/370 neuen Auftrieb erhalten. Dieser Mikrorechner deckt mit einigen kleine Einschränkungen den vollen Befehlsvorrat des Systems /370 ab und stellt unter dem Betriebssystem VM-CMS auch einen ASSEMBLER-Übersetzer zur Verfügung. Regensburg, im März 1984
Gerhard
Niemeyer
6
Vorwort
Der vierte Abschnitt zeigt die Anwendung anhand mehrerer Beispiele, die von einfachen kaufmännischen Problemen bis hin zu Problemen, wie sie im Compilerbau vorkommen, reichen. Bei der Lektüre des Buches empfiehlt es sich, mit den Beispielen in Hauptabschnitt 4 zu beginnen. Die dabei auftretenden Fragen können dann unter 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. [42], [18] und [5] empfohlen. Regensburg, im Februar 1973
Gerhard
Niemeyer
Vorwort zur 5. Auflage Das anhaltend große Interesse an diesem Lehr- und Nachschlagewerk gab den Anstoß für einige umfangreiche Verbesserungen und Erweiterungen. So wurde ein Abschnitt über die Bedingungscodes im Programmstatuswort und deren Umsetzung in Prüfmaskenäquivalente der Sprungbefehle eingefügt. Konsequenterweise wurde damit die Angabe aller von den Instruktionen erzeugten Bedingungscodes sinnvoll. Femer wurden einige als sehr effizient und handlich erkannte Maschinenbefehle der /360-Generation zusätzlich in die Darstellung aufgenommen; hierbei handelt es sich um LTR, TR, AL, ALR, SL und SLR. Schließlich wurden einige wichtige Erweiterungen der /370-Generation berücksichtigt; hierbei handelt es sich um MVCL, ICM, STCM, SRP, CLM und CLCL. Die Aktualität der ASSEMBLER-Sprache wird durch die Einführung des IBM-PC/370 neuen Auftrieb erhalten. Dieser Mikrorechner deckt mit einigen kleine Einschränkungen den vollen Befehlsvorrat des Systems /370 ab und stellt unter dem Betriebssystem VM-CMS auch einen ASSEMBLER-Übersetzer zur Verfügung. Regensburg, im März 1984
Gerhard
Niemeyer
Inhalt 1. Die Darstellung von Daten in Bytemaschinen 1.1 Die Organisation des Arbeitsspeichers und der Register 1.2 Der EBCDI-Code 1.2.1 Die Darstellung von Ziffern, Zahlen und Vorzeichen 1.2.2 Die Darstellung von Buchstaben und Sonderzeichen 1.2.3 Die sedezimale Schreibweise von bit-Mustern 1.3 Die dezimal gepackte Zahlendarstellung 1.4 Die duale Zahlendarstellung 1.5 Die Zahlendarstellung im Halbwort, Wort und Festpunktregister 1.6 Exkurs: Zahlensysteme 1.6.1 Die polynomiale Zahlendarstellung 1.6.2 Die Umrechnung von Zahlen in andere Zahlensysteme 1.7 Die Zahlendarstellung im Gleitpunktregister
9 9 11 11 12 13 16 17 19 21 21 23 29
2. Maschineninstruktionen und Operandenadressierung
31
2.1 Allgemeine Vorbemerkungen 2.2 Die Instrüktionstypen 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 2.6 Programmstatuswort, Bedingungsanzeige
31 32 38 38 42 44 44 45
3. Die Programmiersprache ASSEMBLER 3.1 Allgemeine Vorbemerkungen 3.2 Die Elemente der Sprache 3.3 Ausdrücke 3.3.1 Symbole 3.3.2 Direktwerte 3.3.3 Der Stand des Zuordnungszä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 Ubertragungsoperationen im Arbeitsspeicher 3.4.3.2 Laden von Registern, Speichern von Registerinhalten 3.4.3.3 Codetransformationen 3.4.3.4 shift-Operationen in Festpunktregistern 3.4.3.5 Dezimalarithmetik 3.4.3.6 Duale Festpunktarithmetik 3.4.3.7 Sedezimale Gleitpunktarithmetik 3.4.3.8 Vergleichsoperationen 3.4.3.9 Verzweigungsoperationen 3.4.3.10 Logische bit-Verknüpfungen
48 48 49 50 50 51 54 56 56 68 69 79 81 81 90 113 140 147 157 170 180 195 207
8
Inhaltsverzeichnis
3.5 Assembler-Anweisungen 3.5.1 Anweisungen zur Symbol-, Konstanten- und Felddefinition 3.5.2 Anweisungen zur Deklaration und Aufgabe von Basisregistem 3.5.3 Anweisungen zur Programmsegmentierung und Segmentverknüpfung 3.5.4 Anweisungen zur Steuerung des Zuordnungszählers 3.5.5 Anweisungen zur Modifikation des Übersetzungsprotokolls 3.6 Elementare Makroprogrammierung 3.6.1 Die Definition von Makros 3.6.1.1 Die Aufstellung der Instruktionsfolge 3.6.1.2 Die Definition des Makroaufrufs (Musteranweisung) 3.6.1.3 Steuerung des Assembler 3.6.1.4 Das Eintragen der Makrodefinition 3.6.2 Der Aufruf von Makros 3.7 Systemmakros 3.7.1 Systemmakros zur Definition von Dateien 3.7.2 Systemmakros zum öffnen und Schließen von Dateien 3.7.3 Makros zum Lesen und Schreiben von Dateien 3.7.4 Makros zur Steuerung peripherer Geräte 3.7.5 Das „Ende-Makro"
4. Ubungsprogramme Übung Übung Übung Übung Übung Übung Übung Übung Übung Übung Übung Übung
1: 2: 3: 4: 5: 6: 7: 8a: 8b: 9: 10: 11:
Auflisten von Adreßkarten Ausdrucken des Inhalts eines Festpunktregisters Dezimalarithmetik Dualarithmetik Rechnungsschreibung Sortieren von Adreßkarten numerisch und alphabetisch Programmsegmentierung bei Übung 1 Erzeugen einer Banddatei mit statistischen Erhebungsdaten Auszählen statistischer Merkmale von einer Banddatei Sedezimale Gleitpunktarithmetik Einrichten einer Buchhaltung auf einer Magnetplatte Multiplikation von Inzidenzmatrizen mit Zustandsvektoren
5. Anhang: Programmierhilfen 5.1 Lochkartenformat im ASSEMBLER 5.2 Tabelle der Maschineninstruktionen * 5.3 Tabelle der 2er-Potenzen 5.4 Umrechnungstabelle sedezimal - dezimal 5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal) 5.6 Tabelle der maschineninternen Instruktionsformate 5.7 Fehleranzeigen des Übersetzerprogramms (Übersetzungsphase) 5.8 Fehleranzeigen des Betriebssystems (Ablaufphase)
. . 212 213 217 . . 221 227 228 230 231 231 231 232 233 234 235 235 240 241 245 247
248 248 251 254 260 266 276 282 285 287 296 306 306
309 309 310 317 318 318 324 324 325
Literaturverzeichnis
326
Stichwortverzeichnis
328
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" - 1, wobei n von der Größe der jeweiligen Anlage abhängt. Speicherorganisation (logisch): Adressen:
507
508
509 xxxxxxxx
Byte
Byte
Byte
Die Größe des Arbeitsspeichers wird üblicherweise in Kilobytes (KB) ausgedrückt, wobei jedoch ein KB nicht 1000 Bytes, sondern 2 1 0 = 1024 Bytes sind. Byte-Maschinen gibt es mit Arbeitsspeichergrößen zwischen 8 und 8000 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 , j a " , „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 varüerbar ist, lassen sich nach den Gesetzen der Kombinatorik aus den 8 bits eines Byte 2* = 256 verschiedene bit-Muster bilden. 1
In Wirklichkeit besteht ein Byte aus 9 bits. Das 9. bit dient jedoch als „parity bit" ausschließlich der maschineninternen Funktionskontrolle bei der Datenübertragung und braucht daher den Programmierer nicht zu interessieren.
10
1. Die Darstellung von Daten in Bytemaschinen
Zur Veranschaulichung sind nachfolgend die 2 3 = 8 möglichen bit-Muster aus 3 bits dargestellt.
0 0 0 0 0 1 0 1 0 0 1 1
1 1 1 1
0 0 1 1
0 1 0 1
Zur Übung bilde man die 2 4 = 16 möglichen bit-Muster aus 4 bits. Ordnet man jedem bit-Muster eine bestimmte Bedeutung zu, so lassen sich in einem Byte 256 verschiedene Informationen verschlüsseln. Für bestimmte Zwecke können auch mehrere Bytes zu größeren logischen Einheiten zusammengefaßt werden, wodurch sich die Zahl der möglichen bitMuster beträchtlich steigern läßt. Die bit-Positionierung läuft dann entsprechend über die Bytegrenzen hinweg (vgl. dazu auch S. 18). Folgende Gruppierungen sind möglich: 2 Bytes (16 bits) = ein Halbwort 4 Bytes (32 bits) = ein Vollwort 8 Bytes (64 bits) = ein Doppelwort Der Zugriff zu diesen Gebilden erfolgt durch die Angabe der jeweils niedrigsten Byteadresse. b) Register Byte-Maschinen verfugen über 20 Operandenregister, zu denen der Programmierer direkten Zugriff hat. Von diesen sind 16 sogenannte Festpunktregister mit je 32 bits und 4 sogenannte Gleitpunktregister mit je 64 bits. Die einzelnen bits der Register werden in der Regel durch Flip-Flop-Schaltungen realisiert mit Kippzeiten im Nanosekundenbereich. Zum Vergleich sei erwähnt, daß die Ummagnetisierungszeiten im Arbeitsspeicher im Mikrosekundenbereich liegen. Die Zustandsänderungen der einzelnen bits vollziehen sich also in den Registern etwa um den Faktor 10 3 mal schneller als im Arbeitsspeicher. Deswegen werden die Register vor allem dann benutzt, wenn hohe Rechenleistungen erzielt werden sollen. Die Adressierung der 16 Festpunktregister geschieht durch die Nummern 0 bis 15 und die Adressierung der Gleitpunktregister durch die Nummern 0, 2, 4 und 6. Die Unterscheidung von Festpunkt- und Gleitpunktregistern mit gleichen Nummern geschieht durch den jeweiligen Befehlscode, mit dem die Register angesprochen werden; d . h . es gibt spezifische Festpunktregister- und spezifische Gleitpunktregisterbefehle.
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
0 0 0 0
1 1 1 1 1 1 1 1 1
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
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
7 6 s 4
0 1 2 3 4 5
6 7
8 9
3 2 1 0 (bit-Positionen)
Die Zahlendarstellung im EBCDI-Code erfolgt durch die logische Zusammenfassung mehrerer Ziffernbytes, wobei jedem Byte ein bestimmter dezimaler Stellenwert zugeordnet wird.
12
1. Die Darstellung von Daten in Bytemaschinen
Zahlendarstellung (Beispiel): Adressen:
317
318
319
i m ! oooi Tausender
im > ! oooo Hunderter
m i ! ooio i Zehner
320 1 i m !i oon 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 Vorzeichendarstellung (Beispiele): + 1023
1023
1111 ! 0001
1™ 1111 I 0000
1 1111 ] 0010
l
0
2
i i m ; oooi i 1
Uli ! 0000
i m ! ooio
0
1100 \ 0011 +
2
3
noi ; oon -
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-
13
1.2 Der EBCDI-Code
menhang nennt man auch die bit-Positionen 7 6 5 4 den „Zonenteil" und die bit-Positionen 3 2 1 0 den „Ziffernteil" des Byte.
Buchstabendarstellung bitPos.
3210
3 2 10
3 2 10
3 2 10
32 10
32 10
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 N V
F 0 W
G P X
H
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 bitPos.
32 10
J21 0
32 1 0
32 10
32 1 0
32 10
32 1 0
3210
7654
0000
0001
1010
1011
1100
1101
1110
1111
0100 0101 0110
blank
#
*
% @
—
1
>
> =
? n
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 P o s i t i o n Wichtig ist, daß die bit-Positionen in jeder Tetrade, also auch im linken Halbbyte von 0 bis 3 numeriert werden. Multipliziert man jetzt die Einsen eines bit-Musters mit den entsprechenden Stellenwerten und addiert man die Produkte, so erhält dieses bit-Muster einen bestimmten Dezimalwert. Dabei können sich Dezimalwerte zwischen 0 und 15 ergeben. Diesen Werten ordnet man schließlich die 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 • 22 + 1 • 21 + + 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 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
Dezimalwert
Sedezimalziffer
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
2 3 2 2 21 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
F0 Fl F2 F3 F4 F5 F6 F7 F8 F9
Zahlen dezimal
EBCDI (sedezimal)
(+) 1023 + 1023
F1F0F2F3 F1F0F2C3 od. F1F0F2A3 od. F1F0F2E3 F1F0F2D3 od. F1F0F2B3
-
1023
Buchstaben linkes Halbbyte
rechtes Halbbyte 1 2 3 4 5 6 7 8 9
C D E
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
16
1. Die Darstellung von D a t e n in B y t e m a s c h i n e n
Sonderzeichen linkes Halbbyte 4 5 6 7
0 blank &
/
rechtes Halbbyte A B C
D
*
( )
#
% @
E
F
>
9 n
In den nachfolgenden Ausführungen wird ausgiebig von der sedezimalen Schreibweise Gebrauch gemacht. Aus diesem Grund wird empfohlen, sich mit den Grundzügen dieser Schreibweise vertraut zu machen. Vor allem sollte stets beachtet werden, daß mit jeder Sedezimalziffer ein 4-bit-Muster gemeint ist, denn nur in dieser Form befinden sich die Daten in der Maschine.
1.3 Die dezimal gepackte Zahlendarstellung Eine Eigenheit von Bytemaschinen ist, daß arithmetische Operationen nicht im EBCDI-Code, sondern entweder im sogenannten dezimal gepackten oder im dualen Code oder in der sedezimalen Gleitpunktdarstellung vorgenommen werden. Der ASSEMBLER-Programmierer hat dabei für die Umcodierung zu sorgen; d. h. die im EBCDI-Code eingelesenen Zahlen müssen zum Zweck der Dezimalrechnung gepackt werden. Umgekehrt ist zu beachten, daß das Ausdrucken von Zahlen nur im EBCDI-Code möglich ist; d.h. die Resultate irgendwelcher Rechnungen müssen zu diesem Zweck wieder entpackt werden. Soll dual gerechnet werden, so ist zu beachten, daß die Umwandlung vom EBCDI-Code in den Dual-Code nur über den dezimal gepackten Code möglich ist. Das gleiche gilt auch für die Rückumwandlung. Die Code-Umwandlung in die und aus der sedezimalen Gleitpunkt-Darstellung ist nur mit Hilfe größerer Programmstücke möglich. Dabei werden in der Regel sowohl die dezimal gepackte als auch die duale Zahlendarstellung als Zwischenstufen benötigt. Der Vorgang des Packens besteht nun darin, daß die EBCDI-verschlüsselten Zahlen in ein anderes Bytefeld umgespeichert werden, wobei jedoch nur die rechten Halbbytes, also die Ziffernteile übertragen werden. Zugleich wird so übertragen, daß in den neuen Bytes beide Halbbytes mit Ziffern belegt werden; die ohnehin redundanten bit-Muster 1 1 1 1 (sedezimal: F) aus den linken Halbbytes entfallen dabei. Ausgenommen von dieser Regel ist die niederst-
17
1.4 Die duale Zahlendarstellung
wertige (äußerst rechte) Stelle des Zahlenfeldes. Hier wird das bit-Muster 1 1 1 1 (bzw. 1 1 0 1, falls die Zahl negativ ist) zum Zweck der Vorzeichendarstellung mit übertragen, jedoch tauschen Vorzeichen und Ziffer die Halbbytes. Der Vorgang des Entpackens verläuft genau entgegengesetzt, wobei die bitMuster 1 1 1 1 automatisch in die linken Halbbytes eingesetzt werden. Auch das Vorzeichen wechselt wieder das Halbbyte. Beispiele: 4
2
1111 ! 0100 i
i m ; ooio
Packen
0100
i
-
.
;'
noi ; ooii
X
0010
ooii ! noi
oooi ! oooo i
0101 ! 1100
u n ! oooo i
1100 ! 0101
\
Entpacken
1111 | 0001 1
3
X
In sedezimaler Schreibweise stellen sich diese Vorgänge wie folgt dar: F4
F2
D 3
4
2
3 D
0
5 C
I l X
Packen
1 Entpacken
J Fl
|
^
F0
C 5
1.4 Die duale Zahlendarstellung Die duale Zahlendarstellung spielt eine wichtige Rolle bei der Berechnung von Arbeitsspeicheradressen und bei der arithmetischen Verarbeitung numerischer Daten. Für letztere sind die Zahlen von der EBCDI-Verschlüsselung über die dezimal gepackte Form in die duale Codierung zu überfuhren.
18
1. Die Darstellung von Daten in Bytemaschinen
Die duale Zahlendarstellung tritt auf im Halbbyte, Byte, 1 1 / 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-Position
Die in diesen Bytegebilden dargestellten Zahlen haben dann folgenden Dezimalwert: z n _ ! - 2 " - 1 + z n _ 2 - 2 n - 2 + . . . + z 2 - 2 * + z, -21 + z 0 - 2 ° = Zahljo 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 • 2 S + 1 • 2 4 + 1 • 2 3 + 0 • 2 2 + 0 • 2 1 + 1 - 2 ° = 0 + 64 + 0 + 16 + 8 + 0 + 0 + 1 = 89io Die größte im Halbbyte darstellbare Zahl ist: 1111 2 = 2 3 + 2 2 + 2 1 + 2° = 8 + 4 + 2 + 1 = 1 5 1 0 = 2 4 - 1 Die Zahl der möglichen bit-Muster ist hingegen 16 = 2 4 . Die größte im Byte darstellbare Zahl ist: l l l l l l l l j = 2 7 + 2 6 + 2 S + 2 4 + 2 3 + 22 + 2 1 + 2° = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255,0
= 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 1 1 + 2 , 0 + 2®+ 2 8 + (2 8 - 1) = 2048 + 1024 + 512 + 256 + 255 = 4095,o = 212 - 1 Die Zahl der möglichen bit-Muster ist hingegen 4096 = 212. 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 u n d negative Zahlen mit einer 1 in der 15. bzw. 31. bit-Position. Ferner gilt flir 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: + 10i10 15
31
0
0
31
0
0 1 1 0 1 0 0 1 => 1 . . . . 10010111 - 7610
+ 7610
15 31
1
105lo
15
0
15 31
0
10110100 => 0
01001100
Das letzte Beispiel zeigt, daß die Komplementierung einer negativen Dualzahl (des Zweierkomplements) wieder die ursprüngliche positive Dualzahl ergibt. Die größten im Halbwort und Wort darstellbaren positiven Zahlen sind: 15 31
14 30
0
0
11
1 ,
was den Dezimalzahlen 2 spricht.
15
- 1 = 32767 bzw. 2 3 1 - 1 = 2 1 4 7 4 8 3 6 4 7 ent-
Die dem Betrag nach größtmöglichen negativen Zahlen im Wort und Halbwort sind: 15 31
14 30
1 00
0
0,
, s
was den Dezimalzahlen - 2 = - 3 2 7 6 8 bzw. -23' = - 2 1 4 7 4 8 3 6 4 8 entspricht; dabei wird also die Vorzeichenstelle zugleich auch als Ziffernstelle ausgenutzt. Die Komplemente dieser größten negativen Zahlen ergeben sich nach der genannten Regel ebenfalls zu 15 31
1 00
o
0,
1.6 Exkurs: Zahlensysteme
21
d. h. sie bleiben negativ. Daher ist die Komplementierung der größten negativen Zahlen nicht möglich. Die Dualzahl is 31
1 1 1
0
1 1
stellt eine dezimale - 1 dar, denn ihr Komplement ist 15 31
000
0
0 1,
also eine dezimale + 1. Die Dualzahl 15 31
1 1 1
0
1 10
stellt eine dezimale — 2 dar, denn ihr Komplement ist 15 31
0 0 0
o
0 1 0,
also eine dezimale + 2. Die Dualzahl 15 31
1 1 1
0
10 1
stellt eine dezimale - 3 dar, denn ihr Komplement ist 15 31
0 0 0
Ol
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 1 0 + 2 1
;
in Worten: neuntausendeinhundertzweiundsiebzig. Wählt man andere Stellenwerte, z.B. 1 0 , 1, '/io> malzahl 9-10+
1 -1 + 7 - V t o +
'/IOO.
so ergibt sich die Dezi-
2-Vioo;
die üblicherweise als 91,72 (in Worten: einundneunzig-Komma-siebenzwei) geschrieben wird. Aus den Beispielen erkennt man, daß es sich bei den Stellenwerten durchweg um 1 Oer-Potenzen handelt. Dezimalzahlen lassen sich daher allgemein als Polynome der folgenden Art beschreiben: Z 1 0 = z n _ ! • 1 0 " - 1 + . . . + z 2 • 102 + zx • 10 1 + z 0 • 10° + z _ j • 10" 1 + . . . in-m . . . j.T ~¿_m • iu
Darin bedeuten: Zio: 10: z;: 10': n: m:
Dezimalzahl Basis des Zahlensystems Dezimalziffer, 0 < Zj < 9 Stellenwert der Ziffer z\ Zahl der Ziffern „vor dem Komma" Zahl der Ziffern „nach dem Komma"
Nun läßt sich nicht nur auf der Basis 10, sondern auf der Basis jeder natürlichen Zahl größer 1 ein Zahlensystem aufbauen. Zwei solcher Zahlensysteme, nämlich das duale und das sedezimale, wurden bereits vorgestellt. Die allgemeine Form der Zahlensysteme lautet: Z b = z n _ 1 . b n " 1 + . . . + z 2 b 2 + z, b 1 + z 0 b° + z _ , b " 1 + . . . • ••+ z_mb^m Darin bedeuten: Zb : b: zt: b1: n: m:
Zahl eines bestimmten Zahlensystems Basis des Zahlensystems Ziffer, 0 < zx < b - 1 Stellenwert der Ziffer Zj Anzahl der Ziffern „vor dem Komma" Anzahl der Ziffern „nach dem Komma"
1.6 Exkurs: Zahlensysteme
23
Übersicht über die im ASSEMBLER relevanten Zahlensysteme: Dezimalsystem
Dualsystem 2
Sedezimalsystem
Basis
10
2
16
Ziffern
0 bis 9
0 bis 1
Obis F
Stellenwerte
...lOMO 1 10° 10"1... . . . 2 3 2 2 2 ' 2 °
...16 2 16 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. 317). Jedoch dekken diese Tabellen zumeist nur einen eng begrenzten Zahlenbereich ab; auch sind diese Tabellen nicht immer zur Hand. Aus diesen Gründen ist es nützlich, die diesen Tabellen zugrundeliegenden Umrechnungsverfahren zu kennen. a) Umrechnung von Dualzahlen und Sedezimalzahlen in Dezimalzahlen Diese Umrechnung benutzt die polynomiale Zahlendarstellung, und zwar ist Z I 0 = z n _ ! b n _ 1 + . . . + z 2 b 2 + z, b 1 + z 0 • b° + z . r b " ' + . . . • . . + z..m-b-m Darin bedeuten: Z 1 0 : gesuchte Dezimalzahl z¡: Dualziffer (Sedezimalziffer) als Dezimalzahl geschrieben b1:
dualer (sedezimaler) Stellenwert als Dezimalzahl geschrieben
Beispiele: (1)
Die Dualzahl 011101 ist in eine Dezimalzahl umzurechnen. 011101 2 = 0 - 2 5 + 1 - 2 4 + 1 • 2 3 + 1 - 2 2 + 0 • 2* + 1 - 2 ° = 0 + 1 6 + 8 + 4 + 0 + 1 = 29,o
(2)
Die Sedezimalzahl A2E ist in eine Dezimalzahl umzurechnen. A2E 16 = A • 162 + 2 16' + E • 16° = 10-250 + 2 -16 + 14-1 = 2606 1 0
2
Gebrochene Dualzahlen sind im Zusammenhang mit der elektronischen Datenverarbeitung nicht üblich.
24
(3)
1. Die Darstellung von Daten in Bytemaschinen
Die Sedezimalzahl E.3 ist in eine Dezimalzahl umzurechnen. E.3, 6 = E • 16° + 3 • 16' 1 = 14 • 1 + 3 • Vi« = 14.1875 10
b) Umrechnung ganzzahliger Dezimalzahlen in Dualzahlen und in Sedizimalzahlen Die Umrechnung von ganzzahligen Dezimalzahlen in andere Zahlensysteme geht ebenfalls von der bereits vorgeführten polynomialen Schreibweise aus; jedoch bricht hier wegen der Ganzzahligkeit das Polynom mit dem Stellenwert b° ab. Z 1 0 = z„_i b n _ 1 + . . . + z 3 b 3 + z 2 b 2 + z, b 1 + z 0 b° Bekannt sind jetzt aber die Dezimalzahlen Z 1 0 und die Basis b des Zahlensystems, in das Z 1 0 umgerechnet werden soll. Gesucht werden hingegen die Ziffern z„_! 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 j + b(z 2 + b(z 3 + . . . + b z n _i))) . . .) Sodann werden die gesuchten Ziffern z ; durch fortgesetzte Modulodivision3 dieses Polynoms mit der Basis b ermittelt. Dies ist möglich, weil die Ziffern Zj wegen 0 < Z; < b - 1 stets kleiner als die Basis b sind und daher als Divisionsreste herausfallen. Betrachtet man das obige Hornerschema, so ist leicht einzusehen, daß bei der Division von Z 1 0 durch b das Resultat zj + b(z 2 + b ( z 3 + . . . + b - z n _ 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 _ ! ) . . .) 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 y,, dann läßt sich dieses Polynom wie folgt auflösen: 3
Modulodivision ist eine Division, bei der als Resultat der jeweilige Divisionsrest genommen wird.
1.6 Exkurs: Zahlensysteme
25
Z,o = z 0 + b ( z , + b(z 2 + b ( z 3 + b • z 4 ))) ^ V ' yo v ' y, = Z! + b(z 2 + b ( z 3 + b • z 4 )) v y 2 = z 2 + b ( z 3 H^b z 4 ) y 3 = z3 + b
z^
74 Der schematische Ablauf des Algorithmus stellt sich dann wie folgt dar: Zio = yo : b = yi yi
:
Rest z 0
b = y2
Rest zt
y24rTb^y3
Rest z 2
y3 : b = y4
Rest z 3
y4 : b = 0
Rest z 4
Die Dezimalzahl Z 1 0 wird also im b-Zahlensystem durch die Ziffernfolge z 4 z 3 z 2 z, z 0 repräsentiert. Beispiele: (1)
Gegeben sei die Dezimalzahl 38; gesucht wird die entsprechende Dualzahl 38 : 2 = 19
Rest 0 (z 0 )
19:2=
9
Rest 1 (z,)
9:2=
4
Rest 1 (z 2 )
4:2=
2
Rest 0 (z 3 )
2:2=
1
Rest 0 (z 4 )
1:2=
0
Rest 1 (z 5 )
Es ist also 38 1 0 = 100110 2 Probe: 1 • 25 + 0 • 2 4 + 0 • 23 + 1 • 2 2 + 1 • 21 + 0 - 2 ° = 32 + 0 + 0 + 4 + 2 + 0 = 38 1 0
26
1. Die Darstellung von Daten in B y t e m a s c h i n e n
(2)
Gegeben sei die Dezimalzahl 38; gesucht wird die entsprechende Sedezimalzahl 38 : 16 = 2
Rest 6 (z 0 )
2 : 16 = 0
Rest 2 ( z , )
Es ist also 3 8 1 0 = 2 6 1 6 Probe: 2 -16 1 + 6 - 16° = 32 + 6 = 3 8 1 0 c) Umrechnung von Dezimalbrüchen in Sedezimalbrüche Diese Umrechnung ist vor allem für das Verständnis der sedezimalen Gleitpunktarithmetik von Bedeutung. Ausgangspunkt der Rechnung ist wieder die polynomiale Darstellung; diese sieht für Dezimalbrüche wie folgt aus: .Z 1 0 = z_ i - b " 1 + z _ 2 • b ~ 2 + • • • + z _ m
b"m
oder als Hornerschema geschrieben: ,Z 1 0 = b - 1 ( z _ 1 + b - » ( z _ 2 + b - ' ( z _ 3 + • • • + b " 1
z _ m ) ) ) . . .)
Die Ziffern z_1 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 1 0 mit b als Produkt z_, + b
1
(z_2 + b
1
(z_3 + . . . + b
1
• z _ m ) ) . . .)
ergibt. Spaltet man z _ t 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 i t dann läßt sich dieses Polynom wie folgt auflösen: •ZI0= b - ' ( z - i + b~1 (z_2 + b " 1 - z _ 3 ) )
1.6 Exkurs: Zahlensysteme
27
Der schematische Ablauf des Algorithmus stellt sich dann wie folgt dar: y _ i - b = z_i + y_2 y _ 2 • b = z_2 + y _ 3 y _ 3 - b = z_3 Der Dezimalbruch .Z 10 wird also im b-Zahlensystem durch die Ziffernfolge z _ ! z _ 2 z _ 3 repräsentiert. Beispiele: (1)
Gegeben sei der Dezimalbruch 0.3; gesucht wird der entsprechende Sedezimalbruch .3 • 16 = 4 + .8 .8-16 = 12 + .8 . 8 ^ = 7 2 + .8 usw.
Schreibt man die gefundenen Werte z_ j als Sedezimalziffem, so erhält man 0.31o
(2)
= 0.4CC . . . , 1 6
Gegeben sei die Dezimalzahl 213.04; gesucht wird die entsprechende Sedezimalzahl a) Umrechnung des ganzzahligen Teiles: 213 : 16 = 13 13:16=
0
Rest
5
Rest 13(D)
b) Umrechnung des Dezimalbruchs: 0.04 1 6 = 0.64
0
+0.64 0.24
0 . 2 4 ^ 6 ^ 3 ^ _ + 0.84 0.84-16 = 13(D) + 0.44 usw.
28
1. Die Darstellung von Daten in Bytemaschinen
Es ist also 213.04,0 = D5.0A3D . . . , 1 6 Probe: 13 • 161 + 5 • 16° + 0 • 1 6 _ 1 + 10•16~ 2 + 3 • 1 6 " 3 + 1 3 • 1 6 ~ 4 as 208 + 5 + 0 + 0.0391 + 0.0007 + 0.0002 = 213.04j O d) Umrechnung von Dualzahlen in Sedezimalzahlen Für die Umrechnung einer Dualzahl Z 2 in eine Sedezimalzahl Z , 6 benutzt man am einfachsten wieder die polynomiale Darstellung. Z16 = z n _ 1 - 1 6 n - 1 + . . . + z 0 1 6 ° Die Sedezimalziffern z n _ j bis z 0 erzeugt man sich aus der Dualzahl, indem man diese von rechts nach links in Tetraden einteilt (dabei ist die äußerst linke bit-Gruppe eventuell mit fuhrenden Nullen aufzufüllen) und diese dann in die entsprechenden Sedezimalziffern umcodiert. Beispiel: Gegeben sei die Dualzahl 111011011. Diese wird eingeteilt und umcodiert: 0001 i 11011 1011 > i 1 D B Dann ist Z 2 = 1 • 162 + D • 161 + B • 16° = 1DB 1 6 Zur Probe werden beide Zahlen in Dezimalzahlen umgerechnet: Z 2 = 1 • 2 8 + 1 • 2 7 + 1 • 2 6 + 0 • 2 S + 1 • 2 4 + 1 • 2 3 + 0 • 2 2 + 1 • 2 1 + 1 • 2° = 256 + 128 + 64 + 0 + 16 + 8 + 0 + 2 + 1 = 475,0 oder Z 1 6 = 1 • 162 + D 1 6 1 + B 1 6 ° = 1 - 256 + 13 -16 + 1 1 - 1 = 256 + 208 + 11 = 4 7 5 1 0 e) Umrechnung von Sedezimalzahlen in Dualzahlen Für die Umrechnung einer Sedezimalzahl Z , 6 in eine Dualzahl Z 2 empfiehlt sich ein analoges Vorgehen. Z2 = z n _ , - 2 n " 1 + . . . + z 0 - 2 °
1.7 Die Zahlendarstellung im Gleitpunktregistei
29
Die Dualziffern zn_1 bis z 0 erzeugt man sich aus den Sedezimalziffern, indem man diese in die entsprechenden Tetraden auflöst. Beispiel: Gegeben sei die Sedezimalzahl 2FA; diese Zahl wird in folgende Tetraden aufgelöst: 0010 ¡ l l l l l 1010 i ' Dann ist Z 1 6 = 1 • 2 9 + 0 • 2 8 + 1 • 2 7 + 1 • 2 6 + 1 • 2 5 + 1 • 2 4 + 1 • 2 3 + 0 • 22 + 1- 21 + 0 - 2 ° = 1011111010 2 Zur Übung rechne man beide Zahlen in Dezimalzahlen um.
1.7 Die Zahlendarstellung im Gleitpunktregister Eine Gleitpunktszahl setzt sich zusammen aus dem Vorzeichen, dem Exponenten und der Mantisse; dabei enthält die Mantisse die Ziffernfolge und der Exponent gibt den Stellenwert der äußerst linken Ziffer an. Es besteht die Möglichkeit, Zahlen in Gleitpunktregistern in zwei verschiedenen Längen darzustellen und zu verarbeiten, wobei sich diese Längenunterschiede allein auf die Mantisse beziehen. Kurze Gleitpunktzahlen V
Exp.
63
62
56 55
32
Es werden nur die bit-Positionen 63 bis 32 des Gleitpunktregisters benutzt. Lange Gleitpunktzahlen 1 V
Exp.
63 62
56 55
0
Es werden alle bit-Positionen des Gleitpunktregisters benutzt. Vorzeichen Positive Zahlen haben in der bit-Position 63 eine 0; negative Zahlen haben dort eine 1. Das Vorzeichen-bit ist das einzige Unterscheidungsmerkmal zwi-
1. Die Darstellung von Daten in Bytemaschinen
30
sehen positiven und negativen Gleitpunktzahlen. Eine Komplementierung wie bei den dualen Festpunktzahlen findet nicht statt. Exponent Für die Verschlüsselung der Exponenten stehen 7 bit-Positionen zur Verfugung. Damit lassen sich Dezimalzahlen zwischen 0 und 127 dual verschlüsseln. Um nun aber negative und positive Exponenten zur Verfügung zu haben, wird der 0 der Wert - 65, der 1 der Wert - 64, . . . . , der 65 der Wert 0, der 66 der Wert +1, . . . . , der 126 der Wert +61 und schließlich der 127 der Wert + 62 zugeordnet. Auf diese Weise gewinnt man Exponenten im Bereich von - 6 5 bis +62. Mantisse Die Mantisse bietet die Besonderheit, daß in ihr Dualzahlen verschlüsselt werden, daß aber die bit-Muster tetradenweise als Sedezimalziffern interpretiert und verarbeitet werden. Der Exponent gibt also den sedezimalen Stellenwert der äußerst linken Sedezimalziffer der Mantisse (bit-Positionen 55, 54, 53, 52) an. Beispiele: 63
32
0 100 1 0001 0110 + 65-0 6
1110
... 0
00..
E
+ 6 16° + E • 1 6 _ 1 = + 6 . E 1 6 = + 6 . 8 7 5 , 0 63
32
1 011 | Uli 63 ~ - 2
1000
... 0
0 . . .
8
-
8-16"
-2 _
_
-
0.08 1 6 = - 0.03125,0
63
32
0 ioo ! ooio + 66 ~ 1
1101
0101
D
5
0000 0
1010 A
0011 3
1101 D
+ D • 161 + 5 • 16° + 0 • 16 _ 1 + A • 16~ 2 + 3 • 16~ 3 + D • 16" 4 = + D 5 . 0 A 3 D , 6 ~ + 213.04 1 0
2. Maschineninstruktionen und Operandenadressierung 2.1 Allgemeine Vorbemerkungen Bytemaschinen verfugen in der Regel über einen Vorrat von mehr als 140 Maschinenfunktionen, die der Verarbeitung der Daten, also dem Datentransport, dem Datenvergleich, der Datenveränderung und der dynamischen Programm-Modifikation dienen. Diese Funktionen werden durch Maschineninstruktionen ausgelöst; dies sind Bytefolgen im Arbeitsspeicher, deren bitMuster nach der Decodierung durch das Steuerwerk die betreffenden Funktionsmoduln der Maschine aktivieren. Eine Folge von Maschineninstruktionen bildet das sogenannte Maschinenprogramm (Objektprogramm), mit dessen Hilfe eine entsprechende Folge von Maschinenfunktionen zur automatischen Abwicklung einer Datenverarbeitungsaufgabe gesteuert wird. Die Erzeugung der Maschineninstruktionen und der Objektprogramme im Arbeitsspeicher wird Gegenstand späterer Erörterungen sein. Im folgenden sollen zunächst der Aufbau und die Wirkung der Maschineninstruktionen und insbesondere der in ihnen verankerte Zugriff zu den Operanden behandelt werden. Dazu sei vorweg bemerkt, daß es bei Bytemaschinen 4 verschiedene Arten von Operanden gibt, und zwar Registeroperanden, Arbeitsspeicheroperanden, Direktoperanden und Kanalworte 4 . Registeroperanden werden dadurch adressiert, daß in den Maschineninstruktionen die Nummern der Operandenregister (Festpunktregister 0 bis 15, Gleitpunktregister 0, 2, 4, 6) verschlüsselt sind. Speicheroperanden werden durch Basisadreßregister, Distanzadressen und bei bestimmten Instruktionstypen zusätzlich durch Indexregister adressiert; dabei bestimmt sich die Speicheradresse eines Operanden aus dem Inhalt des Basisadreßregisters plus Distanzadresse bzw. aus dem Inhalt des Basisadreßregisters plus dem Inhalt des Indexregisters plus Distanzadresse. Die Registernummern und die Distanzadressen sind in den Instruktionen verschlüsselt. Direktoperanden schließlich sind unmittelbarer Bestandteil der betreffenden Maschineninstruktion, d.h. ihr Wert ist in der Instruktion verschlüsselt; eine Adressierung ist daher nicht erforderlich. 4
Kanalworte werden in dieser Einfuhrung nicht behandelt.
2.2 Die Instruktionstypen und ihre Formate
32
Zur Darstellung des A u f b a u s der Maschineninstruktionen werden üblicherweise Symbole verwendet, deren Bedeutung nachfolgend beschrieben wird. Op.-Code — Operationscode der I n s t r u k t i o n R — Operandenregister B - Basisadreßregister (Basisregister) X - Indexadreßregister (Indexregister) D — Distanzadresse (displacement) I — Direktoperand ( i m m e d i a t e o p e r a n d ) L - Länge eines Speicheroperanden (in Bytes) M — Bedingungsmaske bei Sprungbefehlen Die Buchstaben R , B, X , D , I, L u n d M werden m i t 1, i oder 3 indiziert, u m die O p e r a n d e n zu bezeichnen. Als Besonderheit bei den Registern gilt zu b e a c h t e n , daß es sich bei den Basisregistern (B) u n d Indexregistern (X) stets u m die Festpunktregister 0 bis 15 handelt. Die Operandenregister ( R ) k ö n n e n je nach O p e r a t i o n sowohl Festp u n k t - als auch Gleitpunktregister sein. Die Vergabe der S y m b o l e B, X u n d R richtet sich nur nach der aktuellen V e r w e n d u n g : Wenn eines der F e s t p u n k t register als Operandenregister für eine arithmetische o d e r logische Operation b e n u t z t wird, nennt m a n es R ; w e n n es als Basisregister verwendet wird, h e i ß t es B u n d w e n n es als Indexregister fungiert, heißt es X. Die S y m b o l e B, X u n d R sind somit nur funktionallogische Bezeichnungen. In einem Programm k a n n möglicherweise ein u n d dasselbe Festpunktregister alle 3 F u n k t i o n e n ausüben.
2.2 Die Instruktionstypen und ihre Formate Byte-Maschinen h a b e n 5 I n s t r u k t i o n s t y p e n , die e n t s p r e c h e n d der m i t ihnen angesprochenen O p e r a n d e n a r t e n mit den m n e m o t e c h n i s c h e n Kürzeln R R (Register u n d Register), R X (Register u n d indizierter Speicher), R S (Register u n d Speicher), SI (Speicher u n d D i r e k t o p e r a n d ) , SS (Speicher u n d Speicher) gekennzeichnet w e r d e n . Bei den SS-Instruktionen unterscheidet m a n die Versionen SS (logisch) u n d SS (arithmetisch), so d a ß m a n insgesamt auch von 6 I n s t r u k t i o n s t y p e n sprechen k a n n . Alle I n s t r u k t i o n e n h a b e n einen Operationsteil u n d einen Operandenteil.
Operationsteil 1 Byte
Operandenteil
2.2 Die Instruktionen und ihre Formate
33
Die Verschlüsselung des Operationsteils erfolgt im äußerst linken Byte. Dabei ist von Interesse, daß die bit-Positionen 7 und 6 die Verschlüsselung des Instruktionstyps und der Instruktionslänge übernehmen:
bit-Positionen
7 6
Instruktionslänge
Instruktionstyp
0 0 1 1
2 4 4 6
RR RX RS, SI SS
0 1 0 1
Bytes Bytes Bytes Bytes
(1 (2 (2 (3
Halbwort) Halbworte) Halbworte) Halbworte)
Durch diese Codierung wird das Steuerwerk u. a. in die Lage versetzt, das Befehlszählregister um die Bytezahl des jeweiligen Befehls zu erhöhen und damit auf die Adresse des nachfolgenden Befehls einzustellen. An das Byte zur Verschlüsselung des Operstionsteils schließen sich je nach Instruktionstyp 1, 3 oder 5 Bytes zur Verschlüsselung des Operandenteils an. Bei den Operanden handelt es sich einmal um Daten, die mit Hilfe der Instruktionen verarbeitet werden sollen. Diese Daten können in Operandenregistern, im Arbeitsspeicher oder in den Instruktionen selbst stehen. Der betreffende Operandenteil der Instruktionen besteht in diesen Fällen aus der Verschlüsselung der Registernummern oder Speicheradressen. Direktdaten sind in der Instruktion selbst verschlüsselt. Operanden können ferner aber auch Speicheradressen sein, die als Sprungziele dienen oder irgendwelchen Adreßrechnungen unterworfen werden sollen. Diese Adressen können ebenfalls in Operandenregistern stehen oder aber gleichsam als Direktoperanden auftreten. In diesen Fällen besteht der betreffende Operandenteil der Instruktionen ebenfalls aus der Verschlüsselung der Registernummern oder der betreffenden Speicheradressen. Operanden können sodann Steuergrößen für shift-Operationen sein. Sie treten in der Form von Speicheradressen als Direktoperanden auf. Es wird jedoch nicht auf eine Speicheradresse zugegriffen, sondern der Wert der „Adresse" bildet die Steuergröße. Operanden können schließlich Bedingungsschlüssel für Verzweigungsoperationen sein. Auch sie treten als Direktoperanden auf, indem sie wie Registernummern erscheinen. Es wird jedoch nicht auf ein Register zugegriffen, sondern die „Registernummer" bildet die Bedingungsmaske. Grundsätzlich haben alle Instruktionstypen zwei Operanden, mit Ausnahme einiger RS-Instruktionen, die drei Operanden haben. Jedoch läßt sich dieser Sonderfall so umdeuten, daß auch hier nur zwei Operanden im Spiel sind.
34
2. Maschineninstruktionen und Operandenadressierung
Ferner gilt, wenn auch mit vielen Ausnahmen, daß nur mit dem ersten Operanden etwas geschieht (Veränderung, Vergleich), während der zweite Operand für die betreffende Operation nur die Information liefert, selbst aber unverändert bleibt. In den Ausnahmefällen ist es genau umgekehrt, d.h. der zweite Operand ist Gegenstand der Operation und der erste Operand liefert die Information. Nachfolgend sollen die Instruktionstypen im einzelnen dargestellt und erläutert werden: RR-Instruktionen RR symbolisiert eine „Register und Register"-Operation, z.B. Addieren (Reg. 5> auf (Reg. 3> 5 , d.h. beide Operanden stehen in Operandenregistern. Im Arbeitsspeicher hat dieser Instruktionstyp folgendes Format: Op.-Code 1. Byte
R,
Ri 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 (Reg. 5> auf (Reg. 3> Addieren Register
1
»dezimal:
binär:
1 A
oooi ! loio
3
I 5
0011 i 0101 1
RX-Instruktionen RX bezeichnet eine „Register und indizierte Speicher"-Operation, z.B. subtrahieren Speicherwort von (Reg. 10>; d.h. ein Operand steht in einem Register und ein Operand im Arbeitsspeicher. Die Indizierung stellt eine besondere Form der Speicheradressierung dar, die in Kapitel 2.3.2 ausführlich behandelt wird. Im Arbeitsspeicher hat dieser Instruktionstyp folgendes Format: Op.-i'ode I Byte 5
R,
; x, 1 2. Byte
B; 'f i Byte
• D: .1 » 4. Byte
D i e S c h r e i b w e i s e ( R e g . i> b e d e u t e t : „ I n h a l t d e s R e g i s t e r s i " .
2.2 Die Instruktionstypen und ihre Formate
35
R! ist die Adresse des 1. Operanden (Nummer eines Festpunkt- bzw. Gleitpunktregisters), X 2 und B2 sind Nummern von Festpunktregistern, die als Indexregister und Basisregister zusammen mit der Distanzadresse D 2 die Adresse des 2. Operanden determinieren. Die Verschlüsselung der Distanzadresse in 3 Halbbytes (12 bits) begrenzt ihren Bereich auf 0 bis 4095. Beispiel für eine RX-Instruktion: Subtrahieren Wort von
2.2 Die Instxuktionstypen und ihre Formate
37
B t und D, 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 A sedezimal :
9
;
1001 \
binar:
2
4
0010
Speicheradresse des 1. Operanden A
'* A
0100
!
E
5
0
0
A
| 1110 1
0101
0000
0000
1010
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 , L2 2. Byte
D, 3. Byte
4. Byte
_1_ 5. Byte
6. Byte
L[ und L 2 sind die Längen (in Bytes) des ersten bzw. zweiten Operanden. Aus Gründen der internen Operationsabwicklung sind die Längenangaben u m je 1 kleiner als die tatsächlichen Längen. Die maximalen Längen sind Lj = 16. Bj, D[ und B 2 , 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.
2. M a s c h i n e n i n s t r u k t i o n e n u n d O p e r a n d e n a d r e s s i e r u n g
38 Addieren gepackt A_
sedezimal
L, - 1
L; - 1
4
2
~—1 F
binär:
i m
A
1 ! IOIO
8
0100 ! 0010
1000
Speicheradresse des 2. Operanden A
Speicheradresse des I. Operanden A
T
1 |
0
I
1
| 0000 I
0001
!
1
8
6
| 0110 I
1 ; i.
i
0
1000 1 0001 I
! 1
A
oooo ! ioio
Der Instruktionstyp SS (logisch) hat im Arbeitsspeicher folgendes Format: SS (logisch) Op.-Code
L, - 1
1. Byte
2. Byte
D, 3. Byte
4. Byte
5. Byte
6. Byte
L! ist die Längenangabe des 1. Operanden. Sie bestimmt zugleich auch die Länge des 2. Operanden. Die maximale Länge ist L! = 256. Beispiel für eine Instruktion vom Typ SS (logisch): Vergleichen logisch (Feld 1 > mit , wobei L! = 11 ist.
/
sedezimal:
binär:
Vergleichen logisch A D
: i
S
1 noi •! oioi
Li \
0
_
A ! 1
Speicheradresse des 1. Operanden A
1 A
i oooo ; ioio
7
Olli
| 1
1
1 I 0001
Speicheradresse des 2. Operanden V/
D
O
. 1101 | oooo 1
\
7
Olli
1
1
r | 0001 I
F
B
, T ,— 1111
[ 1010
1
Eine zusammenfassende Übersicht über alle Instruktionsformate befindet sich im Anhang auf Seite 289.
2.3 Die Arbeitsspeicheradressierung 2.3.1 Einfache Adressierung Bei der einfachen Adressierung werden Speicheradressen aus dem Inhalt der Basisregister Bj und aus den Distanzadressen Di gebildet: Speicheradresse = (Bj > + Dj Bj ist die Nummer irgendeines der 16 Festpunktregister, welches durch den Programmierer als Basisregister deklariert worden ist. Ferner muß der Program-
39
2.3 Die Arbeitsspeicheradressierung
mierer dafür sorgen, daß in dieses Basisregister eine absolute Speicheradresse, die sogenannte Basisadresse geladen wird. Das geschieht für gewöhnlich mit Hilfe der Instruktion BALR
Basisregister-Nr., 0
während der Ausführungsphase des Programms. Dieser Vorgang läßt sich folgen dermaßen erklären: Beim Laden des Programms erhält der Programmanfang eine absolute Ladeadresse, die das Ladeprogramm in das Befehlszählregister bringt. Angenommen, die BALR-Instruktion sei der Anfang des Programms: Sie lädt in der oben gezeigten Codierung den Inhalt des Befehlszählregisters in das angegebene Basisregister. Bevor jedoch dieser Befehl ausgeführt wird, ist das Befehlszählregister bereits um 2 (Länge der BALR-Instruktion) erhöht worden. Die Basisadresse ist also die Adresse der auf den Ladebefehl BALR folgen den Maschineninstruktion. Di ist die positive Differenz zwischen der Speicheradresse des Operanden i und der Basisadresse. Die Adressierung der Operanden im Arbeitsspeicher erfolgt also relativ zur Basisadresse. Aus diesem Grunde wird D; auch relative Adresse, Distanzadresse oder englisch: displacement genannt. Angenommen das Festpunktregister Nr. 7 sei Basisregister und < Reg. 7 > sei nach Ausführung des BALR-Befehls gleich 1000. Ferner möge ein Operand im Arbeitsspeicher die absolute Adresse 1050 haben. 1050
o
!
1052
3
i
i;
4
5
1 C i
Operand
Dann wird die Speicheradresse dieses Operanden wie folgt dargestellt: + Di = + Dj = 1000 + 50. Die Verschlüsselung dieser Adresse in der Maschineninstruktion lautet: »dezimal:
7 ! 0 1 oin | oooo
allgemein:
Bi »r
3
! 2
ooii ; ooio n 1| Dj
h•
Für die Verschlüsselung der Distanzadresse stehen bei allen dafür in Betracht kommenden Instruktionstypen 3 Halbbytes = 12 bits zur Verfügung. Damit lassen sich Werte zwischen 0 und 4095 darstellen.
40
2. Maschineninstruktionen und Operandenadressierung
Mit einem Basisregister lassen sich daher alle Operanden adressieren, die im Bereich der Speicheradressen + 0 bis + 4095 liegen, mit den Zahlen des obigen Beispiels also alle Operanden, die absolute Speicheradressen zwischen 1000 und 5095 haben. Überschreiten die Operandenadressen den höchsten Wert des Bereiches, so müssen ein oder mehrere zusätzliche Basisregister deklariert werden. Ferner muß der Programmierer dafür sorgen, daß die zusätzlichen Basisregister in der Ausfiihrungsphase des Programms die gewünschten Basisadressen erhalten. Werden beispielsweise die Register 8 und 9 als zusätzliche Basisregister deklariert, so muß der Programmierer Instruktionen vorsehen, die z. B. folgende Operationen ausführen: = + 4095 + 1 = 5096 (Reg. 9> = (Reg. 8> + 4095 + 1 = 9192 Durch Register 8 lassen sich dann alle Operanden mit Adressen zwischen 5096 und 9191 und durch Register 9 alle Operanden mit Adressen zwischen 9192 und 13287 erreichen. Dabei wird weiterhin als Beispiel eine absolute Speicheradresse von 1000 in Register 7 angenommen. Diese bei Byte-Maschinen praktizierte Art der Operandenadressierung im Arbeitsspeicher ist zweifellos komplizierter und aufwendiger als die direkte Adressierung, wie sie vorwiegend bei Wortmaschinen verwendet wird. Die relative Adressierung mit variabler Basisadresse und fester Distanzadresse hat jedoch entscheidende Vorteile: Der wichtigste Vorteil ist, daß auf diese Weise eine leichte Verschieblichkeit der Programme und der zugehörigen Datenfelder im Arbeitsspeicher ermöglicht wird. Dies aber ist eine wichtige Voraussetzung für die Realisation eines timesharing-Betriebes, bei dem die absolute Lage der Programme im Arbeitsspeicher variabel sein muß. Durch die leichte Variierbarkeit der Basisadressen in den Basisregistern wird dieses Ziel auf rationelle Weise erreicht. Ein weiterer Vorteil dieser Adressierungsmethode ist, daß der Programmierer in die Adreßrechnung eingreifen und dadurch bei bestimmten Problemen zu eleganten Lösungen kommen kann: der Inhalt von Basisregistern kann durch bestimmte Instruktionen im Programm verändert werden, wodurch sich recht flexible Adressierungsmöglichkeiten für einzelne Operanden ergeben. Normalerweise hat jedoch der Programmierer mit der Adreßrechnung nicht viel zu tun, da im ASSEMBLER die Operanden im Arbeitsspeicher in der Regel symbolisch, d.h. durch Vergabe sinnreicher mnemotechnischer Kürzel (Namen) adressiert werden. Der Programmierer hat lediglich für die Nominierung der
2.3 Die Arbeitsspeicheradressieiung
41
Basisregister und für das Laden der Basisadressen zu sorgen. Alles andere kann dem Übersetzerprogramm überlassen werden, welches aus den symbolischen Adressen die in den Maschineninstruktionen erforderlichen Distanzadressen Dj ermittelt. Um einen Eindruck von der Wirkungsweise des Übersetzerprogramms zu vermitteln, soll nachfolgend ein kleiner Ausschnitt eines ASSEMBLER-Programms „von Hand" übersetzt werden. Als Basisregister dient das Festpunktregister Nr. 7.
ASSEMBLER-Programm
FELD1 FELD2 ZAHL1 ZAHL2 RESULT WEITER
BALR 7,0 USING *,7 PACK FELD1, ZAHL1 PACK FELD2, ZAHL2 AP FELD1, FELD2 MVC RESULT, FELD1 B WEITER DS CL3 DS CL3 DC C'1125' DC C'21041' DS CL3 CLC ....
Länge dez.
Distanz- Maschinenprogramm adr. sedezimal dez. sedez 05 70
6
6 6 6 4 3
5 3 6
0 ' 6 •12 '18
24 •28
•31 4 '38 '43 '46
0
6 C 12 18
m
F2 F2 FA D2 47
23 24 22 02 F0
70|Ü) 701F 701C 702B 702E
70(22] 7026 701F 701C
1F
26 2B 2E
F1F1F2F5 F2F1F0F4F1 D5
Die Instruktion BALR 7,0 sorgt dafür, daß in Register 7 die Adresse der ersten nachfolgenden Maschineninstruktion (F2 23 70IC 7022) gebracht wird, und zwar die absolute Arbeitsspeicheradresse, die diese Instruktion nach dem Laden des Programms erhalten hat. Die Instruktion USING *,7 erzeugt keine Maschineninstruktion und belegt daher auch keinen Speicherplatz. Sie ist vielmehr eine Anweisung an das Übersetzerprogramm, das Register 7 als Basisregister in die Maschineninstruktion einzusetzen. Der Ubersetzungsvorgang spielt sich nun so ab, daß zunächst beginnend mit der auf BALR 7,0 folgenden Maschineninstruktion von allen Instruktionen,
42
2. Maschineninstruktionen und Operandenadressierung
Datenfeldern und Konstanten die Längen und daraus die Distanzadressen Dj berechnet werden 6 . Dabei erhält die erste Maschineninstruktion nach BALR 7,0 die Distanzadresse 0, denn diese Adresse wird ja wie gesagt in das Basisregister 7 geladen. In einem zweiten Durchgang werden sodann die Instruktionen und Konstanten übersetzt, wobei in die Maschineninstruktionen die Nummern der Basisregister und die Distanzadressen der Operanden eingesetzt werden. Weitere Einzelheiten werden bei der Behandlung der USING-Instruktion in Kapitel 3.5.2 gebracht.
2.3.2 Indizierte Adressierung Die indizierte Adressierung des Arbeitsspeichers ist für die jeweils zweiten Operanden in den RX-Instruktionen vorgesehen. Die Speicheradressen werden aus dem Inhalt von Indexregistern X 2 , dem Inhalt von Basisregistern B 2 und aus den Distanzadressen D 2 gebildet: Speicheradresse = + (B 2 > + D 2 X 2 ist die Nummer irgendeines der 16 Festpunktregister, welches der Programmierer als Indexregister benutzt. Wird jedoch das Register Nr. 0 verwendet, so entfällt die Indizierung. Hinsichtlich der Größen B 2 und D 2 gilt das unter 2.3.1 Gesagte. Angenommen es sei = 10, = 1000 und D 2 = 50, dann ist die Speicheradresse des betreffenden Operanden 10 + 1000 + 50 = 1060. Der Vorteil der indizierten Adressierung ist, daß durch einfache Variation des Inhalts eines Indexregisters eine Folge von Unterfeldern des mit (B2> + D 2 adressierten Operanden angesprochen werden kann. Beispiel: Eine Folge von 10 Wortoperanden im Arbeitsspeicher soll in einem Festpunktregister aufaddiert werden. Indexregister sei das Register 2 und Basisregister das Register 7. Ferner wird angenommen, daß das Basisregister nach dem Laden in der Ausfiihrungsphase des Programms den Wert 998 hat. Durch sukzessives Erhöhen des Indexregisters 2 um jeweils 4, werden die Wortgrenzen 1020, 1024, 1028, 1032 usw. adressiert (vgl. S. 43). Eine weitere Möglichkeit einer indizierten Adressierung bei RS-, SI- und SSInstruktionen kann sich der Programmierer schaffen, indem er die Inhalte der bei der Operandenadressierung verwendeten Basisregister entsprechend variiert.
6
Für alle symbolisch adressierten Instruktionen und Operanden werden diese Informationen darüber hinaus in einer sogenannten symbol table gesammelt, die im Übersetzungsprotokoll mit ausgedruckt wird.
2.3 Die Arbeitsspeicheradressieiung
TÌ
1 S i
O rw> O
43
rU »->J Ovû —Orj O r- rr» < nN mOw m, dann werden vor dem Absetzen und vor einer etwaigen Duplizierung rechts n - m Leerstellen angefügt. Beispiel: Das Literal wird abgesetzt als
=3CL6'ABCDE' A B (' D t
A B (' D b uj A B (' D b
3. Die Programmiersprache ASSEMBLER
60
Weitere Beispiele: Das Literal wird abgesetzt als
=CL1'J0E'
Das Literal wird abgesetzt als
=C'ABC+V
IT
A B C + 1
und erhält die implizite Länge 5. Das Literal wird abgesetzt als
=CL3'A' _____
b) Literal mit Sedezimalkonstante Allgemeines Format:
=kXLn'z!
zm'
Für Zj kann jede Sedezimalziffer zwischen 0 und F eingesetzt werden. Je zwei Sedezimalziffern belegen ein Byte. Die implizite Länge richtet sich daher nach der Zahl der belegten Bytes, und zwar ist L = [(m + l)/2] , 1 0 Beispielsweise belegen m = 4 Sedezimalziffern L = [(4 + l)/2] = 2 Bytes und m = 5 Sedezimalziffern L = [(5 + l)/2] = 3 Bytes. Ist m ungerade, dann wird im äußerst linken Byte des Konstantenfeldes das linke Halbbyte mit einer sedezimalen Null aufgefüllt. Beispiele: Das Literal wird abgesetzt als
=X'B1FC' B i 1f | c
I
Das Literal wird abgesetzt als
=X'C1F03' -i—i——1——1—
0]C 1 |F 0[ 3
Die Zahl der belegten Bytes darf 256 nicht überschreiten; m darf also maximal 512 sein. Bei Verwendung eines expliziten Längenschlüssels dominiert dieser; d.h. wenn n kleiner als die Zahl der belegten Bytes ist, dann werden vor dem Absetzen 10
Das Zeichen | . . . . | bedeutet
„ganzzahligeT
Teil von . . . .".
61
3.3 Ausdrücke
und vor einer etwaigen Duplizierung die äußerst linken Bytes der Konstante abgeschnitten. Beispiele: Das Literal wird abgesetzt als
=XL2'F0C1B' o ,c
Das Literal wird abgesetzt als
=2XL1'11F0' Fl0
I
Wenn die Länge n größer angegeben wird als für die in Hochkommas eingeschlossene Konstante Speicherplatz beansprucht wird, dann werden vor dem Absetzen und vor einer etwaigen Duplizierung die linken Bytes mit Nullen aufgefüllt. Beispiele: Das Literal wird abgesetzt als
=XL3'F01'
Das Literal wird abgesetzt als
=2XL2'FF'
1 0 ¡0 0 1 F 0 i 1
i 0 ¡0 F ! F 0 ¡0 F iF i
c) Literal mit Binärkonstante Allgemeines Format:
=kBLn'z!
zm'
Für Zj können die Dualziffern 0 und 1 eingesetzt werden. Je 8 Dualziffern belegen 1 Byte. Die implizite Länge des Literais richtet sich nach der Zahl der tatsächlich belegten Bytes; und zwar ist L = [(m + 7)/8], Ist m nicht durch 8 teilbar, dann wird das angefangene äußerst linke Byte mit dualen Nullen aufgefüllt. Beispiele: Das Literal wird abgesetzt als Das Literal wird abgesetzt als
=B'11010001' 1101 I 0001 I =B'110011110' 0000 i 0001 I
looi ! mo
Die Zahl der belegten Bytes darf maximal 256 betragen.
62
3. Die Programmiersprache ASSEMBLER
Wird ein expliziter Längenschlüssel angegeben, so gilt dieser vor der impliziten Länge; d.h. wenn n kleiner angegeben wird als die Zahl der sonst belegten Bytes, dann werden vor dem Absetzen und vor einer etwaigen Duplizierung die äußerst linken Bytes abgeschnitten. Beispiele: Das Literal wird abgesetzt als
=BL1'1000101111' 0010 l 1111
Das Literal wird abgesetzt als
=2BL1'111010000' noi
! oooo
i
1101 , 0000
Wenn n größer angegeben wird, als die Zahl der durch die Konstante belegten Bytes, dann werden vor dem Absetzen und vor einer etwaigen Duplizierung die äußerst linken Bytes mit dualen Nullen aufgefüllt. Beispiele: Das Literal wird abgesetzt als
=BL2'101' 0000 i 0101
oooo Das Literal wird abgesetzt als
=2BL2'11101101' 0000 l oooo
1110 , 1101
oooo
oooo
1110 I 1101
d) Literale mit Festpunktkonstanten (F und H) Allgemeines Format (Vollwort):
= kFLn'± z t
zm'
Allgemeines Format (Halbwort):
= kHLn'±z,
zm'
11
Für Zj können die Dezimalziffern 0 bis 9 eingesetzt werden. Zur Bezeichnung negativer Konstanten muß ein „-"-Zeichen und zur Bezeichnung positiver Konstanten kann ein „+"-Zeichen angegeben werden. Die damit dargestellten Dezimalzahlen werden bei der Übersetzung des Programms in Dualzahlen umgewandelt und in Bytes gespeichert, die sich auf Wort- bzw. Halbwortgrenzen befinden. 11
Es handelt sich um vereinfachte, aber voll funktionsfähige Formate, die für diese Einführung gewählt wurden. Die vollständigen Formate sehen darüber hinaus Präzisionsfaktoren und Exponenten vor, mit denen Einfluß auf den dargestellten Zahlenumfang g e n o m m e n werden kann. Einzelheiten sind den einschlägigen Handbüchern zu entnehmen.
3.3 Ausdrücke
63
Bei der Niederschrift der Konstanten sind die im Wort und Halbwort bestehenden Größenbeschränkungen zu beachten. Der im Wort (Halbwort) darstellbare Zahlenbereich erstreckt sich von - 2 3 1 = - 2 1 4 7 4 8 3 6 4 8 bis + 2 3 1 - 1 = = +2147483647 (bzw. von - 2 1 5 = - 3 2 7 6 8 bis + 2 1 5 - 1 = +32767). Die implizite Länge beträgt 4 für Wortkonstanten und 2 für Halbwortkonstanten. Wird ein expliziter Längenschlüssel verwendet, so unterbleibt die Ausrichtung der Konstanten auf Wort- bzw. Halbwortgrenzen, selbst wenn n = 4 bzw. n = 2 vorgegeben wird. Der explizite Längenschlüssel ist für beide Typen H und F begrenzt auf 1 < n < 8. Erlauben der explizite Längenschlüssel oder die implizite Länge die Darstellung größerer Zahlen (bis zu den oben genannten Grenzen) als die tatsächlich angegebenen, so kommt es zu einer Auffüllung mit führenden Nullen (bzw. bei den im Zweierkomplement dargestellten negativen Zahlen mit führenden Einsen). Überschreitet die Zahl die im Rahmen der impliziten oder expliziten Länge darstellbare Größe, so werden links bits einschließlich des Vorzeichens abgeschnitten. Beispiele: Das Literal wird abgesetzt als
= H ' - 1 '
tin I i m Das Literal wird abgesetzt als
im 1 im
(ausgerichtet)
=F'10'
oooo I oooo
0000 1 oooo
0000 I 0000
oooo !1 loio (ausgerichtet)
Das Literal wird abgesetzt als
=HL4'2'
oooo I oooo I
OOOO I oooo 1
oooo ! oooo 1
oooo !• ooio (nicht ausgerichtet)
Ein etwaiger Duplizierfaktor wird erst nach der Umwandlung in eine Dualzahl wirksam. Beispiel: Das Literal wird abgesetzt als
=2H'2'
oooo i oooo
0000 I 0010
oooo I oooo
oooo ; ooio (ausgerichtet)
3. Die Programmiersprache ASSEMBLER
64
e) Literale mit Gleitpunktkonstanten (E und D) Allgemeines Format (kurze Mantisse): =kELn'± Zi
z m E ± y! y 2 '
Allgemeines Format (lange Mantisse): =kDLn'± Zj
zmE ± y,y2'
Für Zj sind die Dezimalziffern 0 bis 9 einzusetzen. Davor, dazwischen oder danach kann ein Dezimalpunkt gesetzt werden. Zur Bezeichnung negativer Konstanten muß ein „-"-Zeichen und zur Bezeichnung positiver Konstanten kann ein „+"-Zeichen vor die Ziffer zt geschrieben werden. Auf die Ziffer z m kann ein positiver oder negativer Exponent im Bereich von — 75 bis + 75 folgen. Zur Bezeichnung eines negativen Exponenten muß ein „-"-Zeichen und zur Bezeichnung eines positiven Exponenten kann ein „+"-Zeichen vor die Exponentenziffer y, geschrieben werden. Gleitpunktkonstanten im E-Format belegen 4 Bytes und werden auf Vollwortgrenzen ausgerichtet. Gleitpunktkonstanten im D-Format belegen 8 Bytes und werden auf Doppelwortgrenzen ausgerichtet. Wird der explizite Längenschlüssel Ln verwendet, so unterbleibt die Ausrichtung. Gleitpunktkonstanten, die in der oben angegebenen Weise geschrieben werden, werden vom Assembler im Zuge der Umwandlung des Quellenprogramms in die in Kapitel 1.7 beschriebene Form gebracht; d.h. die Mantisse wird in eine Sedezimalzahl umgewandelt und der Exponent wird auf die Basis 16 umgerechnet. Beispiel: =E'+213.04' =E'21304E—2' =E'+.21304E3' =E'.21304E+3'
Die Literale
stellen ein und dieselbe Konstante dar; sie werden daher abgesetzt als 4l2
D;S
3'D
(vgl. dazu Seite 24 ff.). f) Literale mit Dezimalkonstanten (P und Z) Allgemeines Format (gepackt): = kPLn't z,
zm'
Allgemeines Format (gezont):
zm'
= kZLn'±Zj
3.3 Ausdrücke
65
Für Zj können die Dezimalziffern 0 bis 9 eingesetzt werden. Negative Zahlen müssen durch ein „ - " - Z e i c h e n und positive Zahlen können durch ein „+"-Zeichen gekennzeichnet werden. Die auf diese Weise dargestellten positiven oder negativen Dezimalzahlen werden in gepackter bzw. gezonter (EBCDI) Form abgespeichert. Je 2 gepackte und je 1 gezonte Ziffer belegen ein Byte; allerdings wird bei gepackten Zahlen im äußerst rechten Byte das rechte Halbbyte für die Vorzeichendarstellung benötigt, so daß gepackte Zahlen mit m Ziffern stets [m/2] + 1 Bytes belegen. Die Vorzeichendarstellung bei den gezonten Zahlen erfolgt im linken Halbbyte des äußerst rechten Byte. Wird kein Vorzeichen angegeben, so gelten die Dezimalkonstanten als positiv, und es wird bei der internen Darstellung an der betreffenden Vorzeichenstelle das bit-Muster C erzeugt. Wird ein Vorzeichen angegeben, so wird bei der internen Darstellung an der betreffenden Vorzeichenstelle bei „ + " das bit-Muster C und bei „—" das bitMuster D erzeugt. Beispiele: Das Literal wird abgesetzt als
=P'+12' 0 ] 1 21C
Das Literal wird abgesetzt als
=P'—123' i; 2 i
3 ;D
Das Literal wird abgesetzt als
=P'1234'
Das Literal wird abgesetzt als
=Z'+12'
—r— —i '— 0I1 2 ¡ 3 4 l c i I I
I I I '
F I l c; 2
Das Literal wird abgesetzt als
=Z'1234' —r—• —*1— F ! 1 F ! 2 F ; 3 C; 4 1 i 1
Die implizite Länge richtet sich nach der Zahl der tatsächlich belegten Bytes. Maximal dürfen 16 Bytes belegt werden. Wird ein expliziter Längenschlüssel verwendet, so dominiert dieser. Ist n kleiner als die Zahl der von der betreffenden Konstante benötigten Bytes, dann werden die linken (höchstwertigen) Dezimalziffern nicht dargestellt. Ist n größer
3. Die Programmiersprache ASSEMBLER
66
als die Zahl der benötigten Bytes, so werden die linken überschüssigen Bytes mit gepackten bzw. gezonten Nullen aufgefüllt. Beispiele: Das Literal wird abgesetzt als
=PL3' 125735' 2 i 5 7 ¡3 5 iC
Das Literal wird abgesetzt als
=PL3'—12' o;o _i
Das Literal wird abgesetzt als
T "
o; i 2 ¡D
=ZL3'125735' F\ 7Fi3 C! 5
Das Literal wird abgesetzt als
=ZL3'—12' f;o F i 1 D i 2
Bei den Dezimalkonstanten kann an beliebiger Stelle ein Dezimalpunkt angegeben werden, der allerdings bei der internen Darstellung als nicht existent behandelt wird. Beispiel: Das Literal wird abgesetzt als
=P'-13.75' 3 ! 75 D
g) Literale mit Adreßkonstanten (A, Y und V) Adreßkonstanten dienen in der Hauptsache zur symbolischen Adressierung von Programmteilen (Instruktionen, Daten- und Konstantenfelder), für die kein Basisregister zur Verfügung steht, bzw. die mit den Basisregistern des aufrufenden Programmteils nicht erreicht werden können. Dies gilt insbesondere auch für die Adressierung (für das Aufrufen) separater Programm-Moduln. Auf diese Verwendungszwecke sind die nachfolgenden vereinfachten Formatangaben abgestimmt. Allgemeine Formate:
= A (Ausdruck) = Y (Ausdruck) = V (Ausdruck)
67
3.3 Ausdrücke
Als Ausdrücke können eingesetzt werden: (1)
Symbole mit und ohne Distanz. Beispiele: = A(FELD); = A(FELD+200); = A(B2-7)
(2)
Zuordnungszähler mit und ohne Distanz. Beispiele: = A ( * ) = A(*—17); = AC+5000) .
Für die Adreßkonstanten gilt folgendes: Bei der Übersetzung werden den in Klammern angegebenen Ausdrücken Werte zugeordnet, die bei der Verwendung von Symbolen die Adreßdifferenzen von der relativen Adresse 0 (Programmanfang) bis zu der Adresse des Symbols ± Distanz darstellen. Bei der Verwendung des Zuordnungszählers wird dessen Wert *± Distanz zugewiesen; dabei stellt der Zuordnungszähler selbst die Adreßdifferenz von der relativen Adresse 0 bis zum ersten Byte der Instruktion dar, die das betreffende Literal verwendet. Beim Laden des Programms werden aus diesen relativen Adressen absolute Adressen gemacht. Die programmtechnische Realisation erfolgt in der Weise, daß bei der Umwandlung des ASSEMBLER-Programms in ein Objektprogramm eine Tabelle der Adreßkonstanten erzeugt wird, auf deren Werte das Ladeprogramm später die absolute Ladeadresse des Objektprogramms (absolute Adresse der relativen Adresse 0) addiert. Ihre besondere Effizienz erhalten die Adreßkonstanten durch die Tatsache, daß ihre Werte bis 2 3 1 — 1 bei A und V bzw. bis 2 1 5 — 1 bei Y gehen können, also weiter als jede bisher existierende Arbeitsspeichergröße. Man ist also nicht an die enge Begrenzung der relativen Adressen auf 4095 gebunden, wie sie bei der Operandenadressierung in den Maschineninstruktionen besteht. Die Verwendung der Adreßkonstanten geschieht zumeist so, daß man ihre Werte per Instruktion in irgendwelche Festpunktregister lädt, die man dann entweder als Sprungadreßregister in bestimmten Verzweigungsinstruktionen oder als explizite Basisregister verwendet. Beispiele: L
5,=A(FELD)
Laden des Wertes der Adreßkonstante in das Register Nr. 5. BR
5
Verzweigen zu der Adresse, die in Register Nr. 5 steht.
3. Die Programmiersprache ASSEMBLER
68
L
4,=A(RECHFLD—1)
Laden des Wertes der A d r e ß k o n s t a n t e in das Register Nr. 4. MVC
0(200,4),ZAHL
Übertragen des Inhaltes des Feldes ZAHL in der Länge 2 0 0 in das mit = adressierte Feld. Für die A d r e ß k o n s t a n t e des Typs V gilt speziell, daß sie den Zugriff zu externen Adressen (Adressen anderer Programm-Moduln) ermöglicht, sofern es sich u m symbolische Adressen von Instruktionen h a n d e l t . In diesen Fällen entfällt die EXTRN-Definition dieser Symbole. Beispiel: L BALR
5,=V(EING1) 7,5
ist äquivalent mit EXTRN EING1
L BALR
5,=A(EING1) 7,5
Im übrigen ist zu den K o n s t a n t e n n o c h a n z u m e r k e n , d a ß die T y p e n A u n d V in Wortlänge (4 Bytes) abgesetzt werden und d a ß sie auf Wortgrenzen ausgerichtet sind. Die K o n s t a n t e n des T y p s Y werden in Halbwortlänge (2 Bytes) abgesetzt u n d sind auf Halbwortgrenzen ausgerichtet. Die Ausrichtung entfällt bei allen T y p e n , wenn ein expliziter Längenschlüssel verwendet wird, z . B . = AL4(Ausdruck).
3.4 Maschinenbefehle Die symbolischen Maschineninstruktionen der Programmiersprache ASSEMBLER, die zur Unterscheidung von den echten Maschineninstruktionen als Maschinenbefehle bezeichnet werden, bestehen aus folgenden K o m p o n e n t e n : (1) (2) (3)
Symbolische Adresse (als Sprungziel wahlweise) Operationscode (fixiert) Operanden (Anzahl je nach Operation fixiert)
69
3.4 Maschinenbefehle
Im folgenden soll gezeigt werden, wie sich diese Komponenten bei den einzelnen Befehlen aneinanderfügen, insbesondere aber, wie die Operanden gebildet werden und was sie bedeuten. Bei der Operandenbildung und der symbolischen Adressierung dienen die zuvor behandelten Ausdrücke zur Angabe von Arbeitsspeicheradressen, Registernummern, Distanzadressen, Direktoperanden, Konstanten und Längenschlüsseln durch den Programmierer. Allerdings sind einige der Ausdrucksarten auf bestimmte Verwendungen beschränkt, was bei der Darstellung des Befehlsaufbaus entsprechend angezeigt wird. Wenn also im folgenden beispielsweise der Aufbau eines Befehls durch Symbol Op.-Code Symbol 1, Direktwert2 oder abgekürzt durch S
Op.-Code Si, I 2
beschrieben wird, so bedeuten die Buchstaben S und I, daß an den betreffenden Stellen des Befehls Symbole bzw. Direktwerte stehen müssen. Im einzelnen werden folgende Abkürzungen verwendet: B D I L LT M R S X
— Nummer eines expliziten Basisregisters — explizite Distanzadresse — Direktoperand — expliziter Längenschlüssel — Literal — explizite Bedingungsmaske (bei bedingten Verzweigungsbefehlen) — Nummer eines Operandenregisters — symbolische Adresse — Nummer eines Indexregisters.
Die bei diesen Abkürzungen verwendeten Indizes I, 2 und 3 bezeichnen die Nummer des Operanden. 3.4.1 Die Syntax der Maschinenbefehle Im folgenden werden für alle Instruktionsarten die gebräuchlichsten Möglichkeiten der Operandenbildung und die daraus resultierenden Formate dargestellt. Zur Abkürzung werden dabei die Pfeile =» und verwendet; => steht für „bezeichnet" und -» steht für „wird dargestellt durch". RR-Instruktionen Allgemeines Format: Symb.Adr.
Op.Code O p e r a n d i , Operand2
70
3. Die Programmiersprache ASSEMBLER
Operand 1 => Registernummer R, -* Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand 2 => Registernummer R 2 -*• Ausdruck Ausdruck vgl. oben! Das symbolische Befehlsformat lautet: S
Op.Code R 1 ; R 2
Einfaches Beispiel: LR
1,5
Der Inhalt des Registers Nr. 5 wird in das Register Nr. 1 geladen. RX-Instruktionen Allgemeines Format: Symb.Adr.
Op.Code Operandi, Operand2
Operand 1 => Registernummer R, -»• Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand2 =>• indiz. Speicheradr. D 2 (X 2 , B 2 ) -> Ausdr.l (Ausdr.2, Ausdr.3) Ausdruck 1 ist meistens ein Direktwert, ein Symbol, ein Längenattribut (L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 und Ausdruck 3 sind meistens Direktwerte oder Symbole. oder Operand2 => nicht indizierte Speicheradr. D 2 (,B 2 ) Ausdruck 1 und Ausdruck 3 vgl. oben!
Ausdr. 1 (,Ausdr.3)
oder Operand 2 => Inhalt Indexreg. + Distanzadr. D 2 (X 2 ).-> Ausdr. 1 (Ausdr. 2) Ausdruck 1 und Ausdruck 2 vgl. oben! oder Operand 2 => indizierte Speicheradr. S 2 ( X 2 ) ->• Symbol (Ausdruck) Ausdruck ist meistens ein Direktwert oder ein Symbol. oder Operand 2 => nicht indizierte Speicheradr. S 2 -> Symbol oder Operand 2 => Direktkonstante LT 2 -> Literal Die symbolischen Befehlsformate lauten: a) bei expliziter Adressierung (d.h. die Speicheradresse wird vom Programmierer durch D, B und evtl. X dargestellt)
3.4 Maschinenbefehle S S S
Op.Code Op.Code Op.Code
71 R 1 ; D 2 (X 2 , B 2 ) R , , D 2 (,B 2 ) Ri, D 2 (X 2 )
indiziert nicht indiziert indiziert ohne Basisregister
Einfache Beispiele: L
5,0(10,2)
Der Inhalt des mit + + D 2 = (Reg. 10> + + 0 adressierten Speicherfeldes wird in das Register 5 geladen. NEU
A
5,4(,2)
Der Inhalt des mit + D 2 = (Reg. 2 ) + 4 adressierten Speicherfeldes wird auf den Inhalt des Registers 5 addiert. LA
3,10(3)
Der Inhalt des Registers 3 wird um 10 erhöht. b) bei impliziter Adressierung ( d . h . die Speicheradresse wird vom Programmierer durch ein Symbol und evtl. X dargestellt) S S
Op.Code Op.Code
R,,S2(X2) Ri, S 2
indiziert nicht indiziert
Einfache Beispiele: AB
S
5,W0RT(1O)
Der Inhalt des mit Symbol + = W0RT + Bedingungsschlüssel Mi -> Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand2 => indiz. Speicheradr. D 2 (X 2 , B 2 ) -»• Ausdr. 1 (Ausdr.2, Ausdr.3) Diese Version ist selten. Ausdruck 1 ist meistens ein Direktwert, ein Symbol, ein Längenattribut (L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 und Ausdruck 3 sind meistens Direktwerte oder Symbole. oder Operand 2 =>• nicht indizierte Speicheradr. D 2 (,B 2 ) Ausdr. 1 (,Ausdr. 3) Diese Version ist selten. Ausdruck 1 und Ausdruck 3 vgl. oben! oder Operand 2 =>• indizierte Speicheradr. S 2 (X 2 ) Symbol (Ausdruck) Diese Version ist sehr selten. Ausdruck ist meistens ein Direktwert oder ein Symbol. oder Operand 2 nicht indizierte Speicheradr. S 2 -»• Symbol Diese Version wird fast ausschließlich benutzt. Die symbolischen Befehlsformate für diesen letzten Fall lauten: a) normal mit Bedingungsschlüssel S
Op.Code
Mi, S 2
b) erweiterter Bedingungscode S
Op.Code
S2
Einfache Beispiele: BC BE
8,NEU NEU
Beide Instruktionen bewirken dasselbe: Nach einer Vergleichsoperation wird bei Gleichheit (equality) zu der symbolischen Adresse NEU verzweigt. Bei Ungleichheit setzt das Programm mit der nächsten Instruktion fort.
3.4 Maschinenbefehle
73
Der erweiterte Bedingungscode impliziert den Bedingungsschlüssel M , . Bei der Ü b e r s e t z u n g wird dieser zunächst aus d e m Befehlscode e r m i t t e l t und dann in die b e t r e f f e n d e echte M a s c h i n e n i n s t r u k t i o n eingesetzt (vgl. S. 196).
RS-Instruktionen Allgemeines F o r m a t : S y m b . A d r . O p . C o d e O p e r a n d 1, O p e r a n d 3, O p e r a n d 2 O p e r a n d 1 =» R e g i s t e r n u m m e r
R , -*• A u s d r u c k
A u s d r u c k ist meistens ein D i r e k t w e r t o d e r ein S y m b o l . O p e r a n d 3 => R e g i s t e r n u m m e r
R 3 -> A u s d r u c k
A u s d r u c k vgl. o b e n ! O p e r a n d 2 => Speicheradr. D 2 ( B 2 ) A u s d r u c k 1 ( A u s d r u c k 2) A u s d r u c k 1 ist meistens ein D i r e k t w e r t , ein S y m b o l , ein L ä n g e n a t t r i b u t (L' S y m b o l ) o d e r der Wert des Z u o r d n u n g s z ä h l e r s (evtl. ± Distanz). A u s d r u c k 2 ist meistens ein D i r e k t w e r t o d e r ein S y m b o l . oder O p e r a n d 2 => Speicheradresse
S2
Symbol
oder O p e r a n d 2 => D i r e k t k o n s t a n t e L T 2
Literal
Die symbolischen B e f e h l s f o r m a t e l a u t e n a) bei expliziter Adressierung: S
Op.Code
Ri, R3, D 2 ( B 2 )
Einfaches Beispiel: LADEN LM
5,7,12(9)
In die Register 5, 6 u n d 7 w e r d e n 3 S p e i c h e r w o r t e geladen, d e r e n Adresse aus ( R e g . 9 ) + 12 b e r e c h n e t wird. b) bei impliziter Adressierung: S
Op.Code
R , , R 3 , S2
E i n f a c h e s Beispiel: STM
5,7,W0RTE
Die Inhalte der Register 5, 6 u n d 7 w e r d e n in 3 S p e i c h e r w o r t e g e b r a c h t , deren symbolische Adresse WORTE l a u t e t . Bei der Ü b e r s e t z u n g wird d e m S y m b o l W0RTE ein Basisregister u n d eine Distanzadresse z u g e o r d n e t , so daß die Adresse i n t e r n aus D 2 u n d B 2 b e r e c h n e t wird.
3. Die Programmiersprache ASSEMBLER
74
c) bei Literalverwendung: S
Op.Code
R l 5 R 3 , LT 2
Einfaches Beispiel: LM
3,5,=3F'0'
In die Register 3, 4 und 5 werden Nullen geladen. Statt einer Operandenadresse wird hier eine Direktkonstante verwendet, die bei der Übersetzung irgendwo im Arbeitsspeicher dargestellt wird. Die echte Maschineninstruktion erhält zur Berechnung der betreffenden Speicheradresse ein Basisregister und eine Distanzadresse. RS-Instruktionen in der Sonderform als shift-Befehle Allgemeines Format: Symb.Adr. Op.Code Operand 1, Operand 2 Operand 1 =» Registernummer R, Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand 2 => Verschiebezahl D 2 (B 2 ) Ausdruck 1 (Ausdruck 2) Ausdruck 1 ist meistens ein Direktwert oder ein Symbol. Ausdruck 2 wie Ausdruck 1! Die folgenden symbolischen Befehlsformate sind gebräuchlich: S
Op.Code
R u D 2 (B 2 )
Op.Code
R,, D 2
und S
Einfache Beispiele: SH
SRL
3,5(8)
Der Inhalt von Register 3 wird um 5 + < Reg. 8 > bit-Positionen nach rechts verschoben. SLDL
4,6
Der Inhalt des Registerpaares 4, 5 wird um 6 bit-Positionen nach links verschoben. Sl-Instruktionen Allgemeines Format: Symb.Adr. Op.Code Operand 1, Operand 2 Operand 1 => Speicheradresse D, (B 2 ) -> Ausdruck 1 (Ausdruck 2) Ausdruck 1 ist meistens ein Direktwert, ein Symbol, ein Längenattribut
75
3.4 Maschinenbefehle
(L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 ist meistens ein Direktwert oder ein Symbol. oder Operand 1 =*• Speicheradresse S, ->• Symbol
Operand 2 => Direktkonstante I 2 -> Direktwert (1 Byte) Die symbolischen Befehlsformate lauten a) bei expliziter Adressierung: S
Op.Code
D t ( B ^ , I2
Einfaches Beispiel: M0VE MVI 5(8),C'A' Die Direktkonstante A wird in das mit < Reg. 8 > + 5 adressierte Byte übertragen. b) bei implizierter Adressierung: S
Op.Code
S,, 1 2
Einfaches Beispiel: CLI
BYTE,X'0C'
Der Inhalt des mit BYTE adressierten Byte wird mit der sedezimalen Direktkonstante OC, also mit dem bit-Muster 0000 1100, verglichen. SS-Instruktionen (arithmetisch) Allgemeines Format: Symb.Adr. Op.Code Operand 1, Operand 2 Operand 1 und Operand 2 => Speicheradr. u. Längenschi. Di(L i ; B,) ->• Ausdr. 1 (Ausdr.2, Ausdr.3) Ausdruck 1 ist meistens ein Direktwert, ein Symbol, ein Längenattribut (L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 ist meistens ein Direktwert, ein Symbol oder ein Längenattribut (L' Symbol). Ausdruck 3 ist meistens ein Direktwert oder ein Symbol. oder Operand 1 und Operand 2 => Speicheradresse u. Längenschlüssel Sj(Lj) -»• Symbol (Ausdruck) Ausdruck ist meistens ein Direktwert, ein Symbol oder ein Längenattribut (L' Symbol). oder
3. Die Programmiersprache A S S E M B L E R
76
Operandi und Operand2
Speicheradresse S,
Symbol
oder Operand 2 => Direktkonstante LT2
Literal
Die symbolischen Befehlsformate lauten a) bei expliziter Adressierung und explizitem Längenschlüssel: S
Op.Code
D! (LL B,), D2 (L 2 , B2)
Einfaches Beispiel: PACK
0(2,7),5(4,7)
Der Inhalt des mit < Reg. 7 > + 5 adressierten 4 Bytes langen Feldes wird in das mit + 0 adressierte 2 Bytes lange Feld gepackt. b) bei impliziter Adressierung und implizitem Längenschlüssel (der Längenschlüssel der Felddefinition ist maßgebend): S
Op.Code
S,, S 2
Einfaches Beispiel: PACK
FELD1,FELD2
Der Inhalt des mit FELD2 adressierten Feldes wird in das mit FELD1 adressierte Feld gepackt. c) bei impliziter Adressierung und explizitem Längenschlüssel (der explizite Längenschlüssel dominiert): S
Op.Code
SI (L]), S2 (L 2 )
Einfaches Beispiel: PACK
A1(3),B1(4)
Der Inhalt des mit B1 adressierten und 4 Bytes langen Zahlenfeldes wird in der Länge 3 in das mit AI adressierte Feld gepackt. d) Mischformen (jeder Operand kann unabhängig vom anderen jede unter a) bis c) dargestellte Form haben): Einfache Beispiele: ADD PACK
AP
0(2,7), F E L D 2
SP
F E L D 1 (3),0(3,7)
PACK
FELD1,FELD2(4)
e) bei Literalverwendung: S S S
Op.Code Op.Code Op.Code
D, (LL BJ), LT2 S„ LT2 S,(L,), LT2
oder oder
77
3.4 Maschinenbefehle
Einfache Beispiele: AP
SUMME,=X'710C'
Die als Sedezimalkonstante dargestellte gepackte Dezimalzahl + 7 1 0 wird auf den Inhalt des mit SUMME adressierten Feldes addiert. SUBTR SP
FELD(3),=B'01111100'
Die als Binärkonstante dargestellte gepackte Dezimalzahl + 7 wird vom Inhalt des 3 Bytes langen und mit FELD adressierten Feldes subtrahiert. PACK
4(3,8),=C"12345'
Die als Zeichenkonstante dargestellte Zahl 12345 wird in ein 3 Bytes langes mit (Reg. 8> + 4 adressiertes Feld gepackt.
SS-Instruktionen (logisch) Allgemeines Format: Symb.Adr. Op.Code Operand 1, Operand 2 Operand 1 => Speicheradr. u. Längenschi. D j ( L j , B j ) Ausdr. 1 (Ausdr. 2, Ausdr. 3) Ausdruck 1, Ausdruck 2 und Ausdruck 3 vgl. bei SS (arithmetisch) oder Operand 1 => Speicheradr. u. Längenschi. S! ( L , ) -> Symbol (Ausdruck) Ausdruck vgl. bei SS (arithmetisch) oder Operand 1 => Speicheradresse
S[ -> Symbol
Operand 2 Speicheradresse D 2 (B 2 ) Ausdruck 1 (Ausdruck 2) Ausdruck 1 ist meistens ein Direktwert, ein Symbol, ein Längenattribut (L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 ist meistens ein Direktwert oder ein Symbol. oder Operand 2 =*• Speicheradresse
S 2 ^ Symbol
oder Operand 2
Direktkonstante LT 2 -» Literal
Die symbolischen Befehlsformate lauten: a) bei expliziter Adressierung und explizitem Längenschlüssel: S
Op.Code
D, ( L „ B,), D 2 ( B 2 )
78
3. Die Programmiersprache ASSEMBLER
Einfaches Beispiel: M0VE
MVC
10(200,12),310(12)
In das 200 Bytes lange und mit + 10 adressierte Feld werden 200 Bytes ab der Adresse , 1{ L 4. Byte
»
1 5. Byte
"•'
D,
1 !
r
6. Byte
Wirkungsweise: Die Instruktion bewirkt die Übertragung von L, rechten Halbbytes (Ziffern) ab der durch + D 2 angegebenen Adresse in das mit + Dj adressierte Feld, und zwar ebenfalls in die rechten Halbbytes. Die Übertragung erfolgt von links nach rechts. Maximal können 256 Halbbytes übertragen werden. Bedingungscode: Wird nicht verändert.
Codierungsbeispiele: MVN
BETR AG+3(1 ),=X'OD'
Das rechte Halbbyte der als Literal definierten Sedezimalkonstante OD, also das bit-Muster 1101, wird in das rechte Halbbyte des mit BETRAG+3 adres-
3.4 Maschinenbefehle
87
sierten Byte übertragen. Der Längenschlüssel 1 ist explizite anzugeben, wenn BETRAG einen anderen impliziten Längenschlüssel als 1 hat. MVN
FELD1.FELD2
FELD1 habe die implizite Länge 3. FELD1
FELD2
FELD! nachher:
Weitere Codierungsmöglichkeiten wie bei MVC!
Befehl: MVZ Typ:
(move zones; Übertragen Zonenteile)
SS (logisch)
Formate symbolisch: MVZ MVZ MVZ
D, ( L b B,), D 2 (B 2 ) S^L.XSj S1; S2
Format maschinenintern: Li I.Byte
2. Byte
D|
1 3. Byte
4. Byte
B2 5. B y t e
6. B y t e
Wirkungsweise: Die Instruktion bewirkt die Übertragung von L, linken Halbbytes (Zonen) ab der durch + D 2 angegebenen Adresse in das mit ( B j ) + Dj adressierte Feld, und zwar ebenfalls in die linken Halbbytes. Die Übertragung erfolgt von links nach rechts. Maximal können 256 Halbbytes übertragen werden. Bedingungscode: Wird nicht verändert.
88
3. Die Programmiersprache ASSEMBLER
C odierungsb eispiele: MVZ
FELD(1),=X'F0'
Das linke Halbbyte der als Literal definierten Sedezimalkonstante FO, also das bit-Muster 1111, wird in das linke Halbbyte des mit FELD adressierten Byte übertragen. Es wird angenommen, daß FELD einen impliziten Längenschlüssel > 1 hat, weswegen hier explizite der Längenschlüssel 1 angegeben werden muß, MVZ
FELD1.FELD2
FELD1 habe die implizite Länge 3. FELD 1
nachher:
D
FELD 2
D
i 5
I I
7
Weitere Codierungsmöglichkeiten wie bei MVC!
Befehl: MV0 Typ:
(move with offset; Übertragen versetzt)
SS (arithmetisch)
Formate symbolisch: MV0 MV0 MV0
D, ( L l B,), D 2 ( L 2 , B 2 ) S, (Lj), S 2 ( L 2 ) S,, S 2
Format maschinenintern: L, - l ] L , - 1 1. Byte
2. Byte
D, 3. Byte
4. Byte
S.Byte
6. Byte
Wirkungsweise: Der durch + D 2 adressierte zweite Operand wird, um ein Halbbyte nach links versetzt,in den mit + D] adressierten ersten Operanden übertragen. Die Verarbeitung verläuft von rechts nach links.
89
3.4 Maschinenbefehle
Ist der 1. Operand zu kurz, so werden die höherwertigen Bytes des 2. Operanden nicht übertragen. Ist der 1. Operand länger als erforderlich, so wird er mit führenden Nullen aufgefüllt.
Bedingungscode: Wird nicht verändert.
Codierungsbeispiele: MV0
FELD1,FELD2
Die Länge von FELD1 sei L j = 3, die Länge von FELD2 sei L 2 = 3. FELD2
FELD1
MV0
0(2,8),0(3,7)
(Reg. 7> I1
I
I
1 i 2
»1 • > 1 3 I, 4 5 iD
o !
4 ! 5 < Reg.
8>
0(4,91,11(2,9) (Reg. 9) + 11 i 4 4 | F \1 i
0 ' 0 (Reg. 9) +0
7777
r1 —— — " 7" — — 0 ! 4 i : 4 1
—
i— ' K !i
3. Die Programmiersprache ASSEMBLER
90 MV0
RESULTO),RESULK2)
Wegbringen der letzten pezimalstelle: RESULTI2)
RESULT 3.4.3.2 Laden von Registern, Speichern von Registerinhalten Befehl: LA Typ:
(load address; Laden Adresse)
RX
Formate symbolisch 12 : LA LA LA
R„D2(X2,B2) R„ S2(X2) R,, S 2
Format maschinenintern: 4
:
i — i X3
Ri
.
—
B,
I 'f
- d»
•
I.Byte
2. Byte
3. Byte
^ — • 1
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] werden gleich Null gesetzt. 12
N e b e n diesen Standard-I-'ormaten gibt es bei R X - l n s t r u k t i o n e n noch folgende Sonderf o r m e n , deren Einsatz insbesondere beim LA-Befehl sinnvoll sein k a n n : ,D
2
(,B
R , , D
R
2
( X
1
Ri,D2
2 2
) )
statt statt
statt
R , , D
2
R , , D
( 0 , 2
( X
B2) 2
, 0 )
R , , D 2 ( 0 , 0)
91
3.4 Maschinenbefehle
Bedingungscode: Wird nicht verändert. Programmierhinweis: Die Angabe von X 2 oder B 2 oder von beiden kann unterbleiben. Im letzteren Falle wird in das Register R[ der Wert D 2 geladen. Codierungsbeispiele: LA
3,FELD
Der Wert der Adresse FELD, d . h . + D 2 , wird in das Register 3 geladen. LA LA
4,15(5,0) 4,15(5)
oder
Der im Indexregister 5 gespeicherte Wert wird um D 2 = 15 erhöht und in das Register 4 geladen. LA LA
4,15(0,5) 4,15(,5)
oder
Der im Basisregister 5 gespeicherte Wert wird um D 2 = 15 erhöht und in das Register 4 geladen. In beiden Fällen handelt es sich um dasselbe Register 5. Ob es als Index- oder als Basisregister interpretiert wird, hängt von der Stellung in der Klammer ab. Wichtig ist femer, daß wann immer das Register 0 als Basis- oder Indexregister angegeben wird, dessen Inhalt mit Null angenommen wird! LA
7,FELD1 (5)
Der Wert der Adresse FELD1 wird um den Wert des Indexregisters 5 erhöht und in das Register 7 geladen. LA
8,FELD3+16(4)
Der Wert der Adresse FELD3+16 wird um den Inhalt des Indexregisters 4 erhöht und in das Register 8 geladen. LA
2,19(3,5)
Die Inhalte des Indexregisters 3 und des Basisregisters 5 werden zusammengezählt; sodann wird die Summe um D 2 = 19 erhöht und in das Register 2 gebracht. LA
2,5(2)
3. Die Programmiersprache ASSEMBLER
92
Der Inhalt des Indexregisters 2 wird u m D 2 = 5 e r h ö h t u n d in das Register 2 geladen; d . h . der Inhalt des Registers 2 wird u m 5 e r h ö h t . Dasselbe würde erreicht durch: LA 2,5(,2). LA
2,0(2,2)
Die Inhalte des Indexregisters 2 und des Basisregisters 2 werden zusammengezählt u n d die S u m m e wird in das Register 2 geladen; d . h . der Inhalt des Registers 2 wird verdoppelt. LA LA LA LA
5,4(0,0) 5,4(0) 5,4(,0) 5,4
oder oder oder
Der Wert D 2 = 4 wird in das Register 5 gebracht. LA
5,0
Das Register 5 wird gelöscht.
Befehl: LR Typ:
(load register; Umladen Registerwert)
RR
Format symbolisch: LR
R1; R2
Format maschinenintern: 1
i ]
8
R,
I.Byte
j I R2
2. Byte
Wirkungsweise: Der Inhalt des Registers R 2 (alle 32 bits) wird in das Register R , umgeladen. Bedingungscode: Wird nicht verändert.
93
3.4 Maschinenbefehle
Codierungsbeispiel: LR
5,14
Der Inhalt des Registers 14 wird in das Register 5 umgeladen.
Befehl: LTR Typ:
(load and test register; Umladen Register mit Test)
RR
Format symbolisch: LTR R1;R2 Format maschinenintem: i |
i
2
r,
1. Byte
1 ; R2
2. B y t e
Wirkungsweise: Der Inhalt des Registers R 2 (alle 32 bits) wird in das Register Ri umgeladen. Insoweit gleichen sich die Befehle LR und LTR. Zusätzlich wird bei LTR nach der Umladung der Inhalt des Registers R] auf Null, kleiner Null und größer Null getestet. Das Resultat des Vergleichs wird in einen Bedingungscode umgesetzt, worauf Sprungbefehle in bestimmter Weise reagieren (vgl. S. 195 ff.). Bedingungscode: 0: = 0 1: < R , X 0 2: < R , > > 0 3:
Befehl: L Typ:
RX
(load; Laden Vollwort)
94
3. Die Programmiersprache ASSEMBLER
Formate symbolisch: L L L
R „ D 2 (X 2) B 2 ) R.,S2(X2) R,,S2
Format maschinenintern: \
;
5
1
8
Ri
1. Byte
1
x2
B,
2. Byte
11 3. Byte
u2
1 -
4. Byte
Wirkungsweise: In das mit R , adressierte Register wird der gesamte Inhalt (32 bits) des durch + + D 2 adressierten Wortes geladen. Bedingungscode: Wird nicht verändert.
Programmieihinweis: Die Speicheradresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44 f.). Codierungsbeispiele: L
2,W0RT(3)
Der Inhalt des Wortes mit der (durch das Indexregister 3 modifizierten) symbolischen Adresse W0RT wird in das Register 2 geladen. L
5,15(7,9)
Der Inhalt des durch (Reg. 7 ) + (Reg. 9> + 15 adressierten Wortes wird in das Register 5 geladen.
L
7,W
Der Inhalt des durch W adressierten Wortes wird in das Register 7 geladen.
Befehl: LH
(load halfword; Laden Halbwort)
3.4 Maschinenbefehle
Typ:
95
RX
Formate symbolisch: LH LH LH
Ri, D 2 (X 2 , B 2 ) R 1? S 2 (X 2 ) R j , S2
Format maschinenintern: 4
1 8
R,
1. Byte
—
-
j X2
'
2. Byte
b3
1 ¡^ 3. Byte
1
-
D2 i * 4. Byte
Wirkungsweise: Das mit + + 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.
Bedingungscode: Wird nicht verändert. Programmierhinweis: Die Speicheradresse des 2. Operanden muß auf eine Halb wortgrenze ausgerichtet sein (vgl. Seite 44 f.). Codierungsbeispiele: LH
7,0(2,3) (Reg. 2) + < Reg. 3) + 0 J l 1 0 0 1 i 1110 1000 ¡ 1 1 1 0
Reg. 7 1 1 I I 1 1 1 1 1 I I 1 1 1 1 1 1 0 0. 1 1 1 1 0 1 0 0 0 I 1 1 0 31 30 29 2« 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 I (I
3. Die Programmiersprache ASSEMBLER
96 3,HW(5)
LH
HW +
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 31
30
2 9 2 8 27 26 25 24
23
22
21
20
19 18 17
li
1 1
15 14
13 12
1 0 0 0 0 0 0 0 0 0 0 0 11
10
9
7
6
5
4
3
2
1
0
Befehl. IC Typ:
(insert character; Einfiigen Zeichen (Byte))
RX
Formate symbolisch: IC IC IC
R „ D 2 ( X 2 , B2) R„S2(X2) R,, S 2
Format maschinenintern: 1 4
|
3
R,
1. B y t e
\ i 2. B y t e
X;
-
B2 3
Byle
D2
-1 1 4. Byte
Wirkungsweise: Das mit + + D 2 adressierte Byte wird in die niederstwertigen 8 bits des mit R, adressierten Registers übertragen. Die restlichen bits des Registers behalten ihre Werte. Bedingungscode: Wird nicht verändert.
3.4 Maschinenbefehle
97
Codierungsbeispiel : IC
6,B(5) B + (Indexreg. 5) i i i i!o o o i
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 0 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 I 1 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 1 1 1 1 0 0 0 1 Reg. 6 (nachher)
Befehl: ICM
Typ:
(insert characters under m a s k ; Einfügen Zeichenkette u n t e r Maskenkontrolle; ab System / 3 7 0 )
RS
Formate symbolisch: ICM ICM
R , , M 3 , D 2 (B 2 ) R,,M3,S2
Format maschinenintern: I F 1 1. Byte
R,
! M 1 3 2. Byte
co
B
3. Byte
- D, ^ i 4. Byte
•
Wirkungsweise: Ab der Speicheradresse + D 2 werden maximal vier aufeinanderfolgende Bytes in Abhängigkeit vom bit-Muster der Maske M 3 in das Register R ! übertragen. Die Auswahl der zu ladenden Registerpositionen wird durch die Maskenbits gesteuert: Jede auf 1 gesetzte bit-Position der Maske selektiert eine entsprechende Byte-Position im Register R ^
3. Die Programmiersprache ASSEMBLER
98
Im Arbeitsspeicher werden die Bytes von links nach rechts fortlaufend selektiert; d.h. bei z.B. 2 an beliebigen Stellen der Maske befindlichen 1-bits werden immer die ersten beiden Speicher-Bytes genommen. Bedingungscode: 0: Die Maske ist 0000 oder alle geladenen Bytes haben den Wert (sedezimal) 00 1: Das erste bit der eingefügten Bytefolge ist 1 2: Das erste bit der eingefügten Bytefolge ist 0 3: Codierbeispiele: ICM 3,9,BYTES Die mit Dezimalzahlen zwischen 0 und 15 angebbare Maske M 3 habe hier das bit-Muster 1001; Reg. 3 31
24
0
7
0
1
7
0 1
1
!
5
1 1
5
1!
Folglich werden zwei aufeinanderfolgende Bytes ab der Adresse BYTES in die bit-Positionen 24 bis 31 und 0 bis 7 des Registers 3 geladen. Programmierhinweis: = 1 5 1 0 = 1111 2 bewirkt das Laden von vier aufeinanderfolgenden Bytes und damit die Füllung des gesamten Registers; = 0]O = 0000 2 bewirkt keinerlei Übertragung. Befehl: LCR Typ:
(load complement; Umladen und Komplementieren)
RR
Format symbolisch: LCR
R,, R 2
99
3.4 Maschinenbefehle
Format maschinenintern: 1
| 3 l I.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 2 0 ) und in das Register R j geladen. Bedingungscode: 0: 1: 2: 3:
= 0 0 Überlauf
Codierungsbeispiele: LCR
3,7
Reg. 7 0 0 0
0 1
3]
komplementiert
31 1 1 1
0 0 1 1
Re(•3
LCR
6,6
Reg.6 1 1 0 1
1 1 31
komplementiert
31
0 0 0 0 1 1
0 0 Reg. 6
Befehl: LNR
(load negative; Umladen negativ)
100
3. Die Programmiersprache ASSEMBLER
Typ:
RR
Format symbolisch: LNR
Ri, R 2
Format maschinenintern: i
I
I 1. Byte
i
R, ; R2 L
—
2. Byte
Wirkungsweise: Der Inhalt des Registers R 2 wird in das Register R j umgeladen. Ist < R2> negativ, so wird dieser Inhalt unverändert übertragen; ist positiv, so wird dieser Inhalt vorher komplementiert. Bedingungscode: 0: = 0 1: ( R j ) < 0 2: 3: , 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.
Defehl: LPR Typ:
(load positive; Umladen positiv)
RR
Format symbolisch: LPR Rj, R 2
3.4 Maschinenbefehle
101
Format maschinenintern: i
! i
o
R,
1. Byte
; R2 i
2. Byte
Wirkungsweise: Der Inhalt des Registers R 2 wird in das Register R j umgeladen. Ist positiv, so wird dieser Inhalt unverändert übertragen; ist negativ, so wird dieser Inhalt vorher komplementiert.
Bedingungscode: 0: > 0 3: Uberlauf 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
R„ R 3 , D 2 ( B 2 )
LM
R1( R3, S2
Format maschinenintern: y
T 11 8 I.Byte
R,
1 j Rj
2. Byte
1 B, > 3. Byte
•
— V i 4. Byte
•
102
3. Die Programmiersprache ASSEMBLER
Wirkungsweise: In die aufeinanderfolgenden Register R^ bis R 3 werden die Inhalte entsprechend vieler Speicherworte geladen, deren erstes mit adressierte Wort im Arbeitsspeicher übertragen.
Befehl: STH Typ:
(störe halfword; Speichern Halbwort)
RX
Formate symbolisch: STH STH STH
R „ D 2 ( X 2 , B2) R„ S2(X2) R,, S 2
Format maschinenintern: 4
J 0 I. Byte
K,
! X2 2. Byte
B;
¡4 1 J. Byte
•
0, 11
4. Byte
•
104
3. Die Programmiersprache ASSEMBLER
Wirkungsweise: Die niederstwertigen 16 bits des mit R^ adressierten Registers werden in das mit + D 2 adressierte 2. Operand wird (normalerweise) in der Länge L 2 aus der gezonten in die gepackte Form überfuhrt und in das durch + 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. Beispiele für gezonte und gepackte Zahlenfelder:
F;O
gezonte Zahl T— — 1 — F ; o F | 7 F|2 1
gepackte Zahl
DL5
+ < 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. (42) Sprung nach CD1, wenn der Registerinhalt größer oder gleich Null (positiv) ist. (43) Wenn der Registerinhalt kleiner als Null (negativ) ist, dann wird ein „-"-Zeichen nach VZ gebracht. (44) Der Inhalt von GP-Register 6 erhält ein positives Vorzeichen. (45) Vergleichen des Inhalts von GP-Register 6 mit einer Eins. (46) Sprung nach SUCHT AB, wenn der Registerinhalt größer oder gleich Eins ist, d . h . einen positiven Exponenten hat. (47) Ist der Registerinhalt kleiner 1, dann ist der Exponent negativ, und es wird ein „-"-Zeichen nach VZE gebracht. (48) Das Indexregister 4 wird gelöscht, um auf den Tabellenwert 10" 7 5 zu kommen. (49) In den Schleifenzähler Register 7 und eine 76 laden. (50) Vergleichen der Gleitpunktzahl im GP-Register 6 mit einer indexadressierten Gleitpunktzahl aus der Dezimal-Sedezimal-Tabelle PTABLE. (51) Sobald die Gleitpunktzahl in Register 6 kleiner ist als eine Gleitpunktzahl aus der Tabelle, wird nach GEFUNDEN gesprungen. (52) Ist die Gleitpunktzahl in Register 6 noch größer oder gleich einem Tabellenwert, wird der Inhalt des Indexregisters 4 um 8 erhöht, um die nächst größere Gleitpunktzahl in der Tabelle zu adressieren. (53) Der Schleifenzähler 0 ist, dann Sprung nach CD; auf diese Weise wird die Schleife (50) bis (52) maximal 76mal durchlaufen.
3.4 Maschinenbefehle
(54) Division des Inhalts von GP-Register 6 durch den Tabellenwert, wodurch eine Sedezimalzahl der Form O.yy.. .y • 16° entsteht. (55) In FP-Register 4 steht der dem Tabellenwert entsprechende Exponent zur Basis 10, allerdings um 75 zu groß und mit 8 multipliziert; daher Vorbereitung einer Division durch shift 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 T ' j X
+2 X
1 |
+3
+4 1 • x ; ± . _ J
!
X
X
\ X
(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 1
(
0
|
x
X
! 1
+2 1 X
X
1
+3 X
X 1
+4 X
x
OW+
+
;
+5 1
0
o ; o
X
X
3 (x)
| i
0
+4 \
+6 I i 0
+7 1
o ! o
+5 X
|
o ! c
+6
+7
1
1
X
+8
X
X
[
(66) Entpacken des Inhalts von F9 nach F l 6 . (67) Überschreiben des Vorzeichens in F16 mit dem bit-Muster 1111 (sedezimal: F).
X
x
; c
136
3. Die Programmiersprache A S S E M B L E R
(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. Es wird also eine Dezimalzahl der Form O . x x . . . x • 1016 erzeugt, deren 16 Stellen die gesuchte Mantisse bilden. Die Mantisse der Sedezimalzahl O.y.. .y • 16° ist also um den Faktor 1016 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
16*
X
Reg. 7 X
X
X
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 165 ist, dann logische Rechtsverschiebung der Mantisse in FP-Register 6 und 7 um weitere 4-bit-Positionen.
16s
16°
3.4 Maschinenbefehle
137
(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.
Befehl:
Typ:
TR
(translate; übersetzen mit Tabelle)
SS
(logisch)
Formate symbolisch: TR TR TR
D^LLBO.DjPJ) S1(L1),S2 Sj.SJ
Format maschinenintern: L,i 1. Iiyte
1
2. Byte
3. Byte
4. Byte
5. B y t e
6. Byte
Wirkungsweise: Eine Folge von Li Zeichen wird ab der Adresse (Bj> + D, durch Zeichen aus einer mit D 2 (B 2 ) adressierten Tabelle ersetzt. Die Selektion (Adressierung) eines Tabellenzeichens erfolgt mit Hilfe der Dualzahl d(Z), die sich aus dem bit-Muster des zu ersetzenden Zeichens Z ergibt, also + D 2 + d ( Z ) . Bedingungscode: Wird nicht verändert.
138
3. Die Programmiersprache ASSEMBLER
Programmierhinweis: Wenn die zu ersetzenden Zeichen alle 256 möglichen bit-Muster annehmen können, sollte die Tabelle 256 Bytes lang sein, da sonst eventuell unkontrollierte Ersetzungen mit hinter der Tabelle liegenden bit-Mustern stattfinden. Anwendungsbeispiele: a) Beliebige 4-bit-Muster Z in einem rechten Halbbyte sollen in druckbare EBCDIC-Zeichen für die Sedezimalziffern übersetzt werden. Um mit 16 Tabellenfeldern auszukommen, wird das linke Halbbyte mittels eines logischen AND (Nl vgl. S. 212) auf Null gesetzt, wodurch die Werte von d(Z) auf 0 bis 15 begrenzt werden.
HEXTAB
Nl TR
ZEICHEN,B'00001111' ZEICHEN,HEXTAB
DC DC
X'FOFI F2F3F4F5F6F7F8F9' X'C1 C2C3C4C5C6'
Beispiel:
( ZEICHEN > = B'01011101'
0101 ; 1101 I
oooo ; noi Daraus errechnet der TR-Befehl d ( Z ) = 13 und adressiert damit HEXTAB+13. Die Tabelle ist so definiert, daß an dieser Stelle der EBCDI-Code für den Buchstaben D steht. Es ergibt sich also für den Wert 13 10 der Druckbuchstabe D mit dem die Sedezimalziffer D 16 dargestellt wird. HEXTAB
+13
+14
1100
1 0100
1100
0100
ZEICHEN
EBCDI-Code für den Buchstaben D
nach TR
139
3.4 Maschinenbefehle
Der TR-Befehl ersetzt den ursprünglichen Inhalt des Feldes ZEICHEN durch den Tabellenwert. b) Es soll eine Codier- und Decodierroutine für 20-stellige Namensfelder erstellt werden. Mit Hilfe eines NC-Befehls werden bei allen Zeichen die beiden höchstwertigen bits auf Null gesetzt, um die Code-Tabelle auf 65 Bytes begrenzen zu können. Codieren:
NAME MASKEN CNAME DNAME CODE
MVC NC TR
CNAME,NAME CNAME,MASKEN CNAME,CODE
DS DC DS DS DC DC DC DC DC DC DC
CL20 20B'00111111' CL20 CL20 C ' C'ZYXWVUTSR' 7C ' C'QPONMLKJI' 7C ' C' H G F E D C B A ' 23C' '
( C N A M E > = C'MAYER . . . '
Beispiel : CNAME D
:
4
C
1
E
+ 1
CNAME 1
! 1
!
4
o
1
;
1 ;
C
+2
l
2
|
—r-
"T
8
1 1
5
D
+3 8
o
:
!
9
4
+4 s
1
: ?
I
I
I
20
40
25
I
I
1 1
! o +5
0
!i 0 —
o
! ) nach NC ! d(Z)
(CODE + > 0 3: Codierungsbeispiel: SRDA
4,3
Reg. 4
10
Reg. 5
0 0 110
110
11110 1 1 0 Reg. 4
111
0
0 0 110 1
1 0 0 10 1
1 0
1 0 0
Reg. 5
Befehl: SLDA Typ:
RS
(shift left double algebraical; algebraische Linksverschiebung im Doppelregister)
144
3. Die Programmiersprache A S S E M B L E R
Formate symbolisch: SLDA SLDA
Rj, D2 (B2) R1; D2
Format maschinenintern: 8
I
1
;
R,
F
I Byte
o
2. B y t e
B>
F
-
1
-J 1
3. Byte
4
•
Byte
Wirkungsweise: Der Inhalt des mit R[ adressierten Registerpaares R , , R ! + 1 wird um soviele Stellen (bit-Positionen) nach links verschoben, wie der Wert + D 2 angibt; der 2. Operand ist hier also keine Arbeitsspeicheradresse, sondern eine Verschiebezahl. Ri 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.
Bedingungscode: 0: 1: 2: 3:
= 0 (RjXO (Rj>> 0 Überlauf 1
Codierungsbeispiel: SLDA
12,0(5)
Es sei 0 Überlauf
Programmierhinweise: Beide Operanden müssen gepackt sein und es muß Lt > L2 sein. Die maximale Länge der Operanden beträgt jeweils 16 Bytes.
148
3. Die Programmiersprache A S S E M B L E R
Codierungsbeispiele: AP
SUMME,ZAHL
Die Länge von SUMME sei 3, die Länge von Z A H L sei 2. SUMME
ZAHL SUMME 2 I 9
0 | 4 I
SP
DI F F , = X ' 0 1 7 C
Die Länge von DI FF sei 2: DIFF
0 ! 0 1
0 ! F l 2
3
o 0 ! 1 i
< Reg. 8 )
+1 7 1 3
+1
0(3,81,3(3,8) +2 4 !C i
>2
+3 i 2 11
i 0 | 0 i .
1 I • ,1 »j c
1
9 ! 0
5 ! D
3.4 Maschinenbefehle
149
Befehl: ZAP
Typ:
(zero and add packed; Nullsetzen und Addieren)
SS (arithmetisch)
Formate symbolisch: ZAP ZAP ZAP
D1(L1,B1),D2(L2,Bj) S.O-O.SjÌLJ) S „ S2
Format maschinenintern: L, - 1 ! L, 1. Byte
2. Byte
B, 3. Byte
D,
D, 4. Byte
S.Byte
6. Byte
Wirkungsweise: Die Instruktion lädt den mit + D 2 adressierten 2. Operanden der Länge L 2 < 16 rechtsbündig mit führenden Nullen in den mit ( B ^ + Di adressierten 1. Operanden der Länge L j < 16. Die Verarbeitung verläuft von rechts nach links. Wenn Li < ist, so fuhrt das zu einem Dezimalüberlauf und zur Programmunterbrechung.
Bedingungscode: 0: 1: 2: 3:
Summe = 0 Summe < 0 Summe > 0 Überlauf
Programmierhinweis: Der 2. Operand m u ß dezimal gepackte Ziffern und ein Vorzeichen enthalten.
Codierungsbeispiele: ZAP
REFE.ZAHL
Die Länge von REFE sei L, = 3, die Länge von ZAHL sei L2 = 2
3. Die Programmiersprache ASSEMBLER
150 ZAHL
i
>
i •; o
\ \
o ! o i
i >; d 2
3
4
1 ' 1' i ! o i
1
i
1 1'
l ! d .. J
REFE
ZAP
REFE(2),=X'101D'
MP
(multiply packed; Multiplizieren dezimal)
Befehl: Typ:
SS (arithmetisch)
Formate symbolisch: MP MP MP
D1(L„B1),D2(L2,B2) S,(L,), S2(L2) S,, S 2
Format masch inen intern: l. I.Byte
D,
i I l, - i 2. Byte
3 Byte
4. Byte
5 Byte
6
Byte
Wirkungsweise: Der mit + Dj 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 verloren. Das Vorzeichen des Resultats wird nach den algebraischen Regeln gebildet; jedoch erhalten auch Nullprodukte ein negatives oder positives Vorzeichen.
151
3.4 Maschinenbefehle
Bedingungscode: Wird nicht verändert.
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 L! = Länge des Multiplikanden + L2 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 führende Null ist. Codierungsbeispiele:
PR0D MAND M0R MANO i
ZAP MP
PR0D,MAND PR0D,M0R
DS DS DS
CL16 CL15 C
1— — r -
1
1
— —1—
9 i 9 9 |9 9 | 9 9 ! 9 9 ¡9 9 ¡9 1
9
I9
1
i
i
— I
-
1
1
- 1 — —1—
9 ¡9 9 ¡9 9 ¡9 9 ¡9 9 | 9 9 | 9 9 ; 9 9 ; c i
1
(ZAPI 3 4 : 6 7 8 9 10 II 12 13 14 15 , i ,2 1 1 1 0 ¡0 9 | 9 9 | 9 9 | 9 9| 9 9|9 9 ; 9 9 ; 9 9 | 9 9 ¡9 9 ¡9 9 | 9 9 •¡9 9 | 9 9 j 9 9|C i i i 1 i _ 1
v> Li
PR0D
M0R
I
9 | D
+1 0 ¡9 9 ¡8 0
(MP)
+2
+3
\ 0i!c
1 .
MP
0(5,9),=P'—13'
< Reg. 9 ) +1 +3 I 1 — I - —1— 0 1 0 0 1 0 0 | 0 o;i i ! c V Li (Reg. 9) +1
o! i 3
I
ID
(MP)
+2
+3
0 J 0 0 ¡0 0 1i 0 Ü 4
+4 3|D 1 ..
ZAHL1 +1
PACK ZAP MP
PR0D,ZAHL1+1 (3) M0R,ZAHL2 PR0D,M0R
FlO
F|1
0
0 I 0 •
+2
+3 i F|3 F| 1
(PACK) ¡0
1
1
1
3|F >
PROD
PR0D ZAHL1 ZAHL2
M0R
DS DS DS DS
CL4 CL4 CL2 CL2
ZAHL2
M0R (MP) PROD
1 0] 0 o ; 1
! i 6 | 33
3.4 Maschinenbefehle
Befehl: DP
Typ:
(divide packed; Dividieren dezimal)
SS (arithmetisch)
Formate symbolisch: DP DP DP
D , ( L „ B,), D 2 (L 2 , B 2 ) Si (L,), S 2 (L 2 ) S„ S 2
Format maschinenintem: —i—
D|
1 ! L, 1. Byte
2. Byte
3. Byte
4. Byte
S.Byte
6. Byte
Wirkungsweise: Der mit ( B ^ + D, adressierte 1. Operand (Dividend) wird durch den mit + D 2 adressierten 2. Operanden (Divisor) dividiert. Das Resultat (Quotient und Rest) wird im Feld des 1. Operanden gespeichert. Der Quotient steht links und der Rest, der die Länge L 2 hat, steht rechts. Quotient und Rest haben je ein Vorzeichen und beide stehen rechtsbündig. Das Vorzeichen des Quotienten wird nach den algebraischen Regeln gebildet. Der Rest hat stets das Vorzeichen des Dividenden. Die Adresse des Restes ergibt sich aus + Ü! + (L! — L 2 ). Bedingungscode: Wird nicht verändert. Programmierhinweise: Beide Operanden müssen dezimal gepackt sein. Der zweite Operand muß kürzer sein als der erste und darf höchstens 8 Bytes (15 Ziffern plus Vorzeichen) lang sein. Der Dividend muß mindestens eine führende Null haben. Codierungsbeispiele : ZAP DP
REFE,DIVIDEND REFE,DIVISOR
154
3. Die Programmiersprache ASSEMBLER
Die Länge von REFE sei L , = 5 , die Länge von DIVISOR sei L 2 = 2, die Länge von DIVIDEND sei L 2 = 4 (bzw. 5, b z w . 2). (1)
Division von 1,000,000 : 3 0 0
(2)
Division von 1 0 , 0 0 0 , 0 0 0 : 3 0 0 DIVIDEND
—I— —I— i ; o 0 ¡0 0 ¡0 o ;c
0 1
!
—I—1— 0 ¡0 0 ¡0 0 ¡0 0 ¡c
(ZAPI
(ZAPI
REFE
REFE
0 ¡ 0 1|0 0 ! t
Oll 0 ¡0 0 ! 0 o !
o 1! o o l c i
DIVISOR
3
(DP) REFE
1 0 ! 3 3 ¡ 3 3 ! c i l o 0¡C I —I
3 13 3 I 3
1
V Rest
Quotient
Division von 3 0 0 : 3 0 0
3 !0
(4)
DIVIDEND 10
¡0
L_
Rest
1_
DIVISOR
3:o 0 c i (DP)
(DP)
Quotient
9 IC
1 1 —1— i 0 |o o] 0 0 1 0 0 1 9 9.C 1 1 1
—I— 0'c
—i— —1— —I— 1 • 1 ojo « 0 ¡ 0 1 1:c 0 1 0 o ; c —V— v —
¡9
(ZAP)
DIVISOR 3
Rest
Division von 9 9 : 3 0 0
(ZAP) -
1
Quotient
0 ¡C
0 l o 0 1 0 0 1 0 3 1 0 o; c * 1 1
1
3 !c i l o ole
DIVIDEND —1 —1—
-r
¡0 0 ¡c
(DP)
REFE
REFE
1
DIVISOR
3 | 0 0 ¡c
(3)
0 ¡c
—i— i —1— 0¡ 0 0 ¡ 0 o ! r 0 ¡9 9 ;c 1 V Quotient
Rest
155
3.4 Maschinenbefehle
Befehl: SRP
(shift and round p a c k e d ; Verschieben und R u n d e n gepackt; ab System / 3 7 0 )
Typ:
SS
(arithmetisch; S o n d e r f o r m )
Formate symbolisch: SRP SRP SRP
D1(L„B1),D2(B2)II3 S,(L,),S2,l3 S,,S2,I3
Format maschinenintern:
Li - 1 1. Byte
2. Byte
B, 3. Byte
D, 4. Byte
S.Byte
6. Byte
Wirkungsweise: Eine gepackte Zahl mit der Adresse ( B ] ) + D , und der Länge L! wird u m + D 2 Stellen verschoben u n d mit dem Wert I 3 auf der (virtuellen) Stelle ( B ] ) + D j + L[ gerundet. + D 2 ist keine Adresse, sondern eine Verschiebezahl. Von dem errechneten Wert werden allerdings n u r die 6 niederstwertigen bits als Verschiebezahl b e n u t z t , d . h . der höchstmögliche Wert ist 2 6 — 1 = 63. Positive Verschiebezahlen bewirken eine Verschiebung nach links mit gleichzeitigem Nachziehen von Nullen. Negative Verschiebezahlen bewirken eine Verschiebung nach rechts, wobei aus dem Feld herausgeschobene Ziffern abgeschnitten werden. Die Vorzeichen-Tetrade bleibt von allen Verschiebungen unberührt. Bedingungscode: 0: 1: 2: 3:
< 1. Operand < 1. Operand < 1. Operand links wurden
>= 0 >> 0 >< 0 Ziffern herausgeschoben.
Programmierhinweis: Positive Verschiebezahlen erzeugt man leicht durch explizite Angaben des Displacement und Angabe des Basisregisters B 2 = 0 ; selbstverständlich kann auch ein positiver Wert in ein Basisregister B 2 > 0 geladen werden und alleine oder mit
3. Die Programmiersprache ASSEMBLER
156
einem Displacement D 2 die Verschiebezahl bestimmen. Negative Verschiebezahlen erhält man am besten durch Laden einer negativen Konstante oder durch Negativladen einer positiven Konstante oder durch Negativumladen in ein Basisregister B 2 > 0 und ein Displacement D 2 = 0. Für den Rundungswert I 3 können Zahlen von 0 bis 5 angegeben werden. Codierungsbeispiele: a) SRP
RESULT,3(0),0
Verschieben des Inhalts des Feldes RESULT um drei Ziffernstellen nach links ohne Rundung. RESULT
b) L SRP
6,F'—4' RESULT,0(6),0
Laden einer negativen Verschiebezahl in das Register 6, Verschieben des Inhalts von RESULT u m 4 Stellen nach rechts.
c) L LNR SRP
4,F'3' 4,4 ZAHL,1(4),5
Laden des Registers 4 mit einer 3; Umwandeln in eine - 3; Verschieben des Inhalts von ZAH L um 1 — 3 = — 2 Stellen (also nach rechts) und Aufrunden.
157
3.4 Maschinenbefehle
1
1 o
0
9
J i
8
7
r
—
6
1
i
: D
vorher
wird abgeschnitten
> 0
: i
V 0
o
0
9
1
: 8
I
7
D
wird zur Rundung benutzt und dann abgeschnitten
6 += 11
Der Überlauf 1 wird auf die niederstwertige Ziffer addiert. ZAHL i
\
0
0
o
1
;
o
0 Überlauf
Codierungsbeispiele: AR
4,5
Der Inhalt des Registers 5 wird zum Inhalt des Registers 4 addiert. Die Summe steht in Register 4 . SR
14,3
Der Inhalt des Registers 3 wird vom Inhalt des Registers 14 subtrahiert. Die Differenz steht in Register 14. SR
2,2
Der Inhalt des Registers 2 wird vom Inhalt des Registers 2 subtrahiert, d . h . das Register 2 wird gelöscht.
Befehle: A S
Typ:
(add; Addieren Vollwort) (subtract; Subtrahieren Vollwort)
RX
Formate symbolisch: A A A
R i , D 2 (X 2 > B 2 ) R „ S2 ( X 2 ) R „ S2
S
R „ D 2 ( X 2 , B2)
S
Ri,S2(X2)
S
R i , S2
3.4 Maschinenbefehle
159
Formate maschinenintern: 5
I i
R,
A
1. Byte
1
1
,
X3
—
1
1 B,
2. Byte
r«
1 -
3. Byte
D2
T
•
4 Byte
1 5
!
R,
B
1. Byte
;
X,
B,
2. Byte
'f* 1 3. Byte
-
D7
T 1
•
4. Byte
Wirkungsweise: Der Inhalt des mit + + D 2 adressierten Vollwortes wird zum (vom) Inhalt des mit R! adressierten Registers addiert (subtrahiert). Das Resultat steht in Register R,.
Bedingungscode: 0: 1: 2: 3:
Summe (Differenz) = 0 Summe (Differenz) < 0 Summe (Differenz) > 0 Überlauf
Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44 f.). Codierungsbeispiele: A
5,200(0,12)
Der Inhalt des mit < Basisreg. 12) + 200 adressierten Vollwortes wird zum Inhalt des Registers 5 addiert. Die Summe steht in Register 5. S
3,0(,9)
Der Inhalt des mit < Basisreg. 9 > + 0 adressierten Vollwortes wird vom Inhalt des Registers 8 subtrahiert. Die Differenz steht in Register 8. S
5,14(3,8)
Der Inhalt des mit (Indexreg. 3> + + 14 adressierten Vollwortes wird vom Inhalt des Registers 5 subtrahiert. Die Differenz steht im Register 5.
160
3. Die Programmiersprache ASSEMBLER
A
1O.W0RT
Der Inhalt des mit W0RT adressierten Vollwortes wird zum Inhalt des Registers 10 addiert.
Befehle: AH SH Typ:
(add halfword; Addieren Halbwort) (subtract halfword; Subtrahieren Halbwort)
RX
Formate symbolisch: AH AH AH
R „ D 2 ( X 2 , B2) R „ S 2 (X 2 ) R 1 ; S2
SH SH SH
Ri, D 2 (X 2 , B 2 ) R1; S 2 ( X 2 ) R j , S2
Formate maschinenintern:
4
!
! A I.Byte
R, 1 X;
! B 1 1. Byte
R, ! X,
4
Byte
2. Byte
T~" B, ' + (B 2 > + D 2 adressierten Halbwortes wird zum (vom) Inhalt des mit R[ adressierten Registers addiert (subtrahiert). Das Resultat steht in Register R,. Der Halbwortoperand wird vor seiner Verarbeitung zunächst auf Vollwortlänge erweitert, d . h . mit dem Wert der bit-Position 15 aufgefüllt. Bedingungscode: 0: 1: 2: 3:
Summe (Differenz) = 0 Summe (Differenz) < 0 Summe (Differenz) > 0 Überlauf
161
3.4 Maschinenbefehle
Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Halbwortgrenze ausgerichtet sein (vgl. Seite 4 4 f.).
Codierungsbeispiele: AH
7,H(5)
virtuell Reg. 7
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0
0 0 0 0 0 0 0 0
0010
0 0 0 0
1 0 1 0
0 0 1 1
(AH) Reg. 7
0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
SH
1 1 1 0
8,HALFW0RD+2
Der Inhalt des mit HALFW0RD+2 adressierten Halbwortes wird vom Inhalt des Registers 8 subtrahiert. Die Differenz steht in Register 8.
Befehle: AL ALR
(add logical; Addieren logisch Vollworte) (add logical registers; Addieren logisch Register)
Typen:
RX RR
162
3. Die Programmiersprache ASSEMBLER
Format symbolisch: AL AL AL
Ri,D 2 (X 2 ,B 2 ) Rj, S2 (X2) R,,S 2
ALR
R„R2
Format maschinenintern: R,
E
I.Byte
, |
1
!
x2
2. Byte
E
R,
t |
3. Byte
R2
•
•
1. Byte
2 Byte
CO
! «
5
J •
D,
,
4 . Byte
(ALR)
Wirkungsweise: Der Inhalt des Speicherwortes mit der Adresse + (X 2 > + D 2 (bzw. des Registers mit der Adresse R 2 ) wird auf den Inhalt des Registers R j addiert; das Resultat steht in R p Der Unterschied zur arithmetischen Addition besteht darin, daß hier die höchstwertige bit-Position nicht als Vorzeichen sondern als Dualziffer behandelt wird. Entsprechend anders werden die Bedingungsanzeigen gesetzt. Bedingungscode: 0: 1: 2: 3:
die die die die
Summe Summe Summe Summe
ist ist ist ist
Null und hat nicht Null und hat Null und hat nicht Null und hat
keinen Überlauf keinen Überlauf einen Überlauf einen Überlauf.
Programmierhinweis: Die Adresse des 2. Operanden bei AL muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44 f.).
Befehle: SL SLR
(substract logical; Subtrahieren logisch Vollworte) (subtract logical registers; Subtrahieren logisch Register)
163
3.4 Maschinenbefehle
Typen:
RX RR
Formate symbolisch: SL SL SL
R,,D2(X2,Bj) R,,S2(X2) R 1 ; S2
SLR
R,,R2
Formate maschinenintern: 5
1— ! F
1 R, 1 X, 2. Byte
1. Byte
'
R,
1 F
| R,
1
B:
3. Byte
1 — " D, -1
'" •
4. Byte
(SLR)
i
I.Byte
2. Byte
Wirkungsweise: Der Inhalt des mit < B 2 ) + (X2> + D 2 adressierten Speicherwortes (bzw. mit R 2 adressierten Registers) wird vom Inhalt des Registers R! subtrahiert; das Resultat steht in R!. Der Unterschied zur arithmetischen Subtraktion besteht auch hier in der andersartigen Setzung der Bedingungsanzeigen. Bedingungscode: 0:
1: die Differenz ist Null und hat keinen Überlauf 2: die Differenz ist Null und hat einen Überlauf 3: die Differenz ist nicht Null und hat einen Überlauf. Programmierhinweis: Die Adresse des 2. Operanden bei SL muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44 f.).
Befehl: MR
(multiply registers; Multiplizieren Register mit Register)
164
3. Die Programmiersprache ASSEMBLER
Typ:
RR
Format symbolisch: MR
R,, R2
Format maschinenintern: 1
I 1
;
C
Ri
1. B y t e
|
Ri
2. B y t e
Wirkungsweise: Der Inhalt des Registers R j + 1 (Multiplikand) wird mit dem Inhalt des durch R 2 adressierten Registers (Multiplikator) multipliziert. Der Inhalt des mit R[ adressierten Registers wird bei der Multiplikation ignoriert und durch das Produkt überschrieben, denn dieses steht anschließend rechtsbündig im Registerpaar R | , R, + 1.
Bedingungscode: Wird nicht verändert.
Programmierhinweise: R, muß eine gradzahlige Registernummer sein. Der Multiplikand ist in das ungradzahlige Register R, + 1 zu laden. Im Multiplikationsbefehl ist jedoch R, anzugeben.
Codierungsbeispiel: L L MR Reg
0 31
5,MKAND 1O,MKAT0R 4,10
5
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1
00 0
Multiplikand
165
3.4 Maschinenbefehle R e g . 10
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0
Multiplikator
(MR)
Reg. 4 0
Reg. 5
O O O O O O O i
0 0 0 0 0 0 0 1
63
O
O
O
O
O
O
O
O
j
0
0
0
0
Produkt
0
0
0 0
Befehl: M Typ:
(multiply; Multiplizieren Register mit Vollwort)
RX
Formate symbolisch: M M M
R „ D 2 ( X 2 , B2) R„ S2(X2) Rl5 S2
Format maschinenintern: T 5
|
— C
R,
1. B y t e
|
i
2. B y t e
X2
— B,
T '¡4
3. B y t e
1 •
D2
1
1
»
4. Byte
Wirkungsweise: Der Inhalt des Registers R , + 1 (Multiplikand) wird mit d e m Inhalt des d u r c h + (B 2 > + D 2 adressierten Vollwortes (Multiplikator) multipliziert. Der Inhalt von R , wird bei der Multiplikation ignoriert u n d durch das P r o d u k t überschrieben, denn dieses steht anschließend rechtsbündig im Registerpaar R „ R , + 1. Bedingungscode: Wird nicht verändert. Programmierhinweise: R ! m u ß eine gradzahlige Registernummer sein. Die Adresse des 2. O p e r a n d e n m u ß auf eine Vollwortgrenze ausgerichtet sein (vgl. S . 4 4 f . ) . Der Multiplikand
166
3. Die Programmiersprache ASSEMBLER
ist in das ungradzahlige Register R , + 1 zu laden; im Multiplikationsbefehl ist jedoch R ! anzugeben. Codierungsbeispiele: L M
7,= F'10' 6,= F'5'
Laden des Multiplikanden 10 nach Register 7 und multiplizieren des Registerpaares 6, 7 mit 5. L M
9,MKAND 8,MKAT0R
Laden des Multiplikanden nach Register 9 und multiplizieren des Registerpaares 8, 9 mit dem Multiplikator aus dem durch MKAT0R adressierten Vollwort.
Befehl: MH Typ:
(multiply halfword; Multiplizieren Register mit Halbwort)
RX
Formate symbolisch: MH MH MH
R , , D 2 ( X 2 , B2) R,, S 2 ( X 2 ) R j , S2
Format maschinenintern: 4
!
c
R,
1 Byte
! x2
: . Byte
1 B2
!•* 3. B y t e
I - D, -11
•
4, Byte
Wirkungsweise: Der Inhalt des durch R , adressierten Registers (Multiplikand) wird mit dem Inhalt des durch 0 3:
Codierungsbeispiele: AER
0,2
Der Inhalt des GP-Registers 2 wird auf den Inhalt des GP-Registers 0 addiert. Die Mantissen werden in der Länge von 6 Sedezimalziffern verarbeitet. Das Resultat erscheint normalisiert im GP-Register 0.
44
63 40
OC
10
2A
IC
AO
00
55
GP-Register 0
32
0 GP-Register 2
nach Exponentenangleichung:
44
00
00
IC
AO
00
GP-Register 2
nach Addition:
44
OC
10
46
Zwischensumme (siebenstellig)
A
nach Normalisierung:
43
C'l
04
6A
ADR
GP-Register
0
4,2
Der Inhalt des GP-Registers 2 wird auf den Inhalt des GP-Registers 4 addiert. Die Mantissen werden in der Länge von 14 Sedezimalziffern verarbeitet. Das Resultat erscheint normalisiert in GP-Register 4.
3. Die Programmiersprache ASSEMBLER
172 63 41
12
63
0
32
55
F0
10
10
0A
00
00
00
00
00
00
GP-Register 2
10
OA
BC
FO
GP-Register 4
0
55
41
GP-Register 4
AF
BC
AO
nach Addition: 63
S5
41
B2
AF
10
Befehle: AE
(add normalised single precision; Addieren GP-Wort und Normalisieren des Resultats) (add normalised double precision; Addieren GP-Doppelwort und Normalisieren des Resultats)
AD
Typ:
RX
Formate symbolisch: AE AE AE
AD AD AD
R „ D 2 ( X 2 , B2) R„ S 2 ( X 2 ) Rj, S 2
R„D2(X2)B2) R„ S 2 (X 2 ) R 1( S 2
Formate maschinenintern: 1 7
! 1
Ri
1. B y t e
6
! 1 I. Byte
1
r A
1
X2
a, B
2. B y t e
A
R,
] 1 2. B y t e
i« 3. B y t e
X;
n
!« 1 3. B y t e
1
n D 2
T 1I
4. Byte
D:
1 1
4. Byte
»•
173
3.4 Maschinenbefehle
Wirkungsweise: Der Inhalt des mit + (B 2 > + D 2 adressierten GP-Wortes (Charakteristik und 6 Sedezimalziffern) bzw. GP-Doppelwortes (Charakteristik und 14 Sedezimalziffern, vgl. S. 29) wird auf den Inhalt des GP-Registers R t addiert. Das Resultat erscheint normalisiert in R,. Im übrigen verlaufen die Operationen wie bei AER und ADR. Bedingungscode: 0: Summe = 0 1: Summe < 0 2: Summe > 0 3:
Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Wortgrenze bzw. Doppelwortgrenze ausgerichtet sein (vgl. S. 44 f.).
Befehle: SER
(subtract registers normalised single precision; Subtrahieren Register kurz und Normalisieren des Resultats) (subtract registers normalised double precision; Subtrahieren Register lang und Normalisieren des Resultats)
SDR
Typ:
RR
Formate symbolisch: SER
R,, R 2
Formate maschinenintern: J
:
u
1. Itylc
-
! I! 1 I »ylc
Ri
1 !
R,
2. Hyle
•\ K: 2 Itylc
K,
SDR
Ri, R 2
3. Die Programmiersprache ASSEMBLER
174
Wirkungsweise: Der Inhalt des Gleitpunktregisters R 2 wird vom Inhalt des Gleitpunktregisters R! abgezogen. Das Resultat erscheint normalisiert in R,. Die Operationen laufen genau wie die entsprechenden Additionen ab, nur daß vor der Ausführung das Vorzeichen des 2. Operanden umgekehrt wird. Bedingungscode: 0: Differenz = 0 1: Differenz < 0 2: Differenz > 0 3: Befehle: SE
(subtract normalised single precision; Subtrahieren GP-Wort und Normalisieren des Resultats) (subtract normalised double precision; Subtrahieren GP-Doppelwort und Normalisieren des Resultats)
SD
Typ:
RX
Formate symbolisch: SE SE SE
R „ D 2 ( X 2 , B2) R„ S2(X2) R „ S2
SD SD SD
R(, D 2 (X 2 , B 2 ) R„S2(X2) R , , S2
Formate maschinenintern: 1
1 7
|
B
1. B y t e
D
'
;
1
... V
B,
2. B y t e
i *
Dj
1 i
*•
4. Byte
3. Byte
i 6
! i 1
B
Byle
H,
!
X,
B;
• 1
By l e
3. B y t e
D,
"i 1
•
4. Byte
Wirkungsweise: Der Inhalt des mit + + D 2 adressierten GP-Wortes bzw. GP-Doppelwortes wird vom Inhalt des GP-Registers R , subtrahiert. Das Resultat erscheint normalisiert in R ^ Im übrigen gilt das gleiche wie für SER und SDR.
175
3.4 Maschinenbefehle
Bedingungscode: 0: Differenz = 0 1: Differenz < 0 2: Differenz > 0 3: Programmietfa inweis: Die Adresse des 2. Operanden muß auf eine Wortgrenze bzw. Doppelwortgrenze ausgerichtet sein (vgl. S. 44 f.).
Befehle: MER
(multiply registers normalised single precision; Multiplizieren Register kurz und Normalisieren des Resultats) (multiply registers normalised double precision; Multiplizieren Register lang und Normaliseren des Resultats)
MDR
Typ:
RR
Formate symbolisch: MER
Ri, R 2
MDR
R 1( R 2
Formate maschinenintern: 1 3
! 1
('
R,
1 Byle
:
;
;
R,
(MER)
K.
(MDR]
2. Byte
C
K,
1
Wirkungsweise: Der Multiplikand im Gleitpunktregister R, wird mit dem Multiplikator, der im Gleitpunktregister R 2 steht, multipliziert. Das Resultat wird normalisiert und erscheint in R,.
176
3. Die Programmiersprache ASSEMBLER
Der Multiplikationsvorgang spielt sich so ab, daß die Mantissen multipliziert und die Exponenten addiert werden. Die Summe der Exponenten wird um 65 vermindert, weil einerseits die Exponenten zur Basis 16 in der hier vorliegenden Gleitpunktdarstellung aus Codierungsgründen um 65 größer als ihr wahrer Wert sind (vgl. S. 30) und weil zum anderen bei der Addition zweier Exponenten dieser sogenannte 65er-Exzeß doppelt in die Exponentensumme eingeht, also (x + 65) + (y + 65) = x + y + 65 + 65. Dies ist zu korrigieren, denn es wird x + y + 65 benötigt. Hat das Mantissenprodukt führende Nullen, so werden diese durch 4-bit-weise Linksverschiebung bei gleichzeitiger Verkleinerung des Exponenten eleminiert. Die Linksverschiebung von je 4 Mantissen-bits bewirkt eine Verminderung des Exponenten um 1. Von rechts werden bei der Mantissenverschiebung Nullen nachgezogen. Bei MER sind an der Multiplikation je 6 Sedezimalziffern der Mantissen beteiligt; die Produktmantisse umfaßt jedoch 14 Sedezimalziffern, von denen allerdings die zwei niederstwertigen gleich Null sind. Bei MDR sind an der Multiplikation je 14 Sedezimalziffern der Mantissen beteiligt; die Produktmantisse umfaßt jedoch auch nur 14 Sedezimalziffern, wobei nötigenfalls die niederstwertigen Ziffern einer eventuell längeren Produktmantisse wegfallen.
Bedingungscode: Wird nicht verändert.
Codierungsbeispiel : MER
4,6
C2
10
00
00
GP-Regisler 4
43
01
00
00
GPRegister 6
C3
10
00
00
00
00
00
00
GP-Register 4
177
3.4 Maschinenbefehle
Befehle: ME
(multiply normalised single precision; Multiplizieren mit GP-Wort und Normalisieren des Resultats) (multiply normalised double precision; Multiplizieren mit GP-Doppelwort und Normalisieren des Resultats)
MD Typ:
RX
Formate symbolisch: ME
Ru D2(X2,B2)
MD
R „ D2(X2, B2)
Formate maschinenintern: 7
;
c
R)
1 Byte
6
1 I
,
X,
2. Byte
R,
C
l.Byte
H
3. Byte
1 ; x2
2. Byte
B2
B,
j«
3. Byte
-
D,
-I
»
[ME)
»
(MD)
4. Byte
D2
-I 1
4. Byte
Wirkungsweise: Der Multiplikand im Gleitpunktregister R , wird mit dem Multiplikator, der in dem mit + + D 2 adressierten Wort bzw. Doppelwort im Arbeitsspeicher steht, multipliziert. Das Resultat wird normalisiert und erscheint in R„ Die Einzelheiten des Multiplikationsvorgangs sind die gleichen wie bei MER und MDR. Bedingungscode: Wird nicht verändert.
Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Wort- bzw. Doppelwortgrenze ausgerichtet sein (vgl. Seite 44 f.). Codierungsbeispiele: ME
6,=E'125.2E—13'
178
3. Die Programmiersprache ASSEMBLER
Der Inhalt des GP-Registers 6 wird mit der als Literal dargestellten Gleitpunktkonstante multipliziert. Die dezimal geschriebene Gleitpunktkonstante wird bei der Übersetzung des Programms in die sedezimale Gleitpunktdarstellung (kurz) überführt.
GPK0N
MD
O,GPK0N
DC
D'0.1573215904E+5'
Der Inhalt des GP-Registers 0 wird mit der durch GPK0N adressierten Gleitpunktkonstante multipliziert. Die dezimal geschriebene Gleitpunktkonstante wird bei der Übersetzung des Programms in die sedezimale Gleitpunktdarstellung (lang) überführt.
Befehle: DER
(divide registers normalised single precision; Dividieren Register kurz und Normalisieren des Resultats) (divide registers normalised double precision; Dividieren Register lang und Normalisieren des Resultats)
DDR
Typ:
RR
Formate symbolisch: DER
R,, R 2
DDR
Formate maschinenintem:
3
|
D
K1
1. B y t e
:
\ I.Byte
!
K2
(DER)
R;
(DDR)
Byte
D
R,
\ 1 2. H y l e
R | , R2
179
3.4 Maschinenbefehle
Wirkungsweise: Der Dividend im Gleitpunktregister R^ wird durch den Divisor, der sich im Gleitpunktregister R 2 befindet, dividiert. Der Quotient erscheint normalisiert in R t ; ein Rest wird nicht erzeugt. Die Division läuft so ab, daß zunächst die Mantissen beider Operanden normalisiert und danach dividiert werden. Der Exponent des Divisors wird vom Exponenten des Dividenden subtrahiert und die Differenz wird um 65 erhöht, weil der aus internen Codierungsgründen (vgl. S. 3 0 ) für jeden Exponenten erforderliche 65er-Exzeß bei der Subtraktion verloren geht, also (x + 6 5 ) - (y + 6 5 ) = x - y. Dies ist zu korrigieren, denn es wird x - y + 65 benötigt. Eine Division durch Null führt zu einer Programmunterbrechung. Bedingungscode: Wird nicht verändert.
Befehle: DE
(divide normalised single precision; Dividieren normalisiert durch GP-Wort) (divide normalised double precision; Dividieren normalisiert durch GP-Doppelwort)
DD
Typ:
RX
Formate symbolisch: DE DE DE
R. , D 2 ( X 2 , B 2 ) R. , S 2 ( X 2 ) R, , S 2
DD DD DD
R, , D 2 ( X 2 , B 2 ) R. . S 2 ( X 2 ) Ri , S 2
Formate maschinenintem: 7
6
—1 : D 1 1 Byte
1 D 1 I.Byte
R,
1 !
1
Xj
2 Byte
Ri
j 2. Byte
B,
r
—1 -
D, 1
3. Byte
X2
B2
¡4
3. Byte
*
4 Byte D,
-j 1 4. Byte
,
180
3. Die Programmiersprache ASSEMBLER
Wirkungsweise: Der Dividend in Gleitpunktregister R, wird durch den Divisor dividiert, der in dem mit + + D 2 adressierten Gleitpunktwort bzw. -doppelwort im Arbeitsspeicher steht. Der Quotient erscheint normalisiert in R ( . Zu den Einzelheiten des Divisionsablaufs vgl. die Ausführungen zu DER und DDR. Bedingungscode: Wird nicht verändert. Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Wort- bzw. Doppelwortgrenze ausgerichtet sein (vgl. Seite 44 f.). 3.4.3.8 Vergleichsoperationen Befehl: CLC Typ:
(compare logical characters; Vergleichen Zeichen logisch)
SS (logisch)
Formate symbolisch: CLC CLC CLC
D ^ L , , B,), D 2 (B 2 ) S, (L,), S 2 S,, S 2
Format maschinenintern: L, - 1 1. Byte
2. Byte
B, 3. Byte
D, 4. Byte
5. Byte
6. Byte
Wirkungsweise: Der durch + Di adressierte Operand wird in der Länge L! logisch mit dem durch (B2> + D 2 adressierten Operanden verglichen. Der logische Vergleich besteht im Gegensatz zum arithmetischen darin, daß die Operanden bit-weise ohne Berücksichtigung eines etwaigen numerischen Wertes oder gar eines Vorzeichens miteinander verglichen werden. Aus diesem Grunde sind für die Operanden auch alle möglichen bit-Muster zugelassen. Entsprechend dem Ergebnis des Vergleichs wird ein Bedingungsschlüssel in einem Anzeigeregister (Pro-
3.4 Maschinenbefehle
181
grammstatuswort) gesetzt. Die Ausführung des Befehls wird beendet, sobald Ungleichheit festgestellt wird oder alle L j Bytes miteinander verglichen sind. Der Vergleich erfolgt von links nach rechts. Die maximale Länge der Operandenfelder ist 256 Bytes. Auf Vergleichsoperationen folgen i. d. R. Verzweigungsoperationen (vgl. Kap. 3.4.3.9), die in bestimmter Weise auf den Bedingungscode des Anzeigeregisters (PSW) reagieren. Die Aussage des Bedingungscodes bezieht sich stets auf den 1. Operanden. Ist also der 1.Operand z.B. größer als der zweite, dann wird z.B. bei BH und BN L verzweigt.
Bedingungscode: 0: 1. Operand = 2. Operand 1: 1. Operand < 2. Operand 2: 1. Operand > 2. Operand 3:
Codierungsbeispiele: CLC
FELD1,FELD2
Vergleichen des Inhalts von FELD1 mit dem Inhalt von FELD2 in der impliziten Länge von FELD1. CLC
14(200,8),FELD
Vergleichen von 200 Bytes des durch + 14 adressierten 1. Operanden mit 200 Bytes ab der Adresse FELD. CLC
FELD1,10(8)
Vergleichen des Inhalts von FELD1 in der impliziten Länge von FELD1 mit ebensovielen Bytes ab der durch + 10 gegebenen Adresse. CLC BH BL BE
FELD1,FELD2 GR0ESSER KLEINER GLEICH
Vergleichen < FELD1 > mit < FELD2 >; Sprung nach G R 0 E S S E R , wenn größer < F E L D 2 ) ; Sprung nach KLEINER, wenn kleiner ( FELD2>; Sprung nach GLEICH, wenn < F E L D 1 ) gleich < F E L D 2 ) . CLC BNH BNL
A,B NICHTGR NICHTKL
182
3. Die Programmiersprache ASSEMBLER
Vergleichen mit ; Sprung nach NICHTGR, wenn kleiner oder gleich ; Sprung nach NICHTKL, wenn größer (oder gleich) . 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: C LC L
Typ:
(compare logical characters long; Vergleichen Zeichen logisch in Langfeldern; ab System /370)
RR
Format symbolisch: CLCL
Ri,R2
Format maschinenintern: 0
1 !
1
F
I. Byte
R|
1 '
\
R,
2. Byte
Wirkungsweise: Zwei mit Ri und R 2 spezifizierte Speicherfelder werden logisch miteinander verglichen. Der Ablauf gleicht dem des CLC-Befehls, nur daß hier die Feldlängen größer als 256 Bytes sein können und daß für jedes Feld eine eigene Längenangabe erforderlich ist. Zur Operandenspezifikation werden zwei Registerpaare R i , Ri + 1 und R 2 , R 2 + 1 benötigt, wobei R[ und R 2 jeweils gerade Zahlen größer 1 und kleiner 15 sein müssen. Spezifikation des 1. Operanden (siehe auch MVCL auf S. 83): Die Adresse des 1. Operanden muß in die 24 niederstwertigen bit-Positionen des Registers R! geladen werden. Die Länge des 1. Operanden ist in die 24 niederstwertigen bit-Positionen des Registers R] + 1 zu laden.
183
3.4 Maschinenbefehle
Spezifikation des 2.Operanden (siehe auch MVCL auf S. 83): Die Adresse des 2. Operanden ist in die 24 niederstwertigen bit-Positionen des Registers R 2 und die Länge in die 24 niederstwertigen bit-Positionen des Registers R 2 + 1 zu laden. In die 8 höchstwertigen bit-Positionen des Registers R 2 + 1 ist ein Füllzeichen zu übertragen, wenn die Operanden verschieden lang sind. Mit diesem Füllzeichen werden die über den kürzeren Operanden hinausgehenden Bytes des längeren Operanden verglichen. Der Vergleich läuft byteweise von links nach rechts und endet beim ersten ungleichen Bytepaar aus beiden Operanden oder wenn die größte Operandenlänge erreicht ist. Die Registerinhalte von R i , R j + 1, R 2 , R 2 + 1 werden im Verlauf der Operation verändert.
Bedingungscode: 0: beide Operanden sind gleich 1: 1. Operand < 2. Operand 2: 1. Operand > 2. Operand 3:
Codierbeispiel:
LENFIL
LA LA LA L CLCL
2.FELD1 3,300 8,FELD2 9,LENFIL 2,8
DC
X'40000101'
(Länge 257)
Der Inhalt von FELD1 wird in der Länge 257 mit dem Inhalt von FELD2 und in der Länge 43 mit dem Füllzeichen verglichen. Programmierhinweis: Der Operand LENFIL muß ab System /370 nicht mehr auf Vollwortgrenze ausgerichtet werden.
184
3. Die Programmiersprache ASSEMBLER
Befehl: CLI
Typ:
(compare jogical immediate; Vergleichen Byte mit Direktzeichen)
SI
Formate symbolisch: CLI CLI
D^B,),^ S„ I 2
Format maschinenintern: , . , — 1 9 .
1 5
.
1. Byte
h
1 r* • 3. Byte
B,
2. Byte
—1 D, ^ 1 4. Byte
»
Wirkungsweise: Der Inhalt der durch + D) adressierten Speicherstelle wird logisch, d.h. ohne Ansehen eines numerischen Wertes, mit dem direkt in der Instruktion gespeicherten bit-Muster I 2 verglichen. Dabei wird in Abhängigkeit vom Ergebnis des Vergleichs der Bedingungsschlüssel im Anzeigeregister (Programmstatuswort) gesetzt. Wie der CLC-Befehl, so wird auch der CLI-Befehl i . d . R . von bedingten Verzweigungsoperationen gefolgt, die in bestimmter Weise auf den Bedingungscode des Anzeigeregisters (PSW) reagieren. Die Aussage des Bedingungscodes bezieht sich stets auf den 1. Operanden. Bedingungscode: 0: 1. Operand = Direktwert 1 : 1 . Operand < Direktwert 2 : 1 . Operand > Direktwert 3:
Codierungsbeispiele: CLI BNE
BYTE.C'A' NICHTA
Vergleichen des mit der symbolischen Adresse BYTE adressierten Byte mit dem Direktzeichen 'A'. Wenn ungleich, Sprung nach NICHTA.
185
3.4 Maschinenbefehle
CLI BL BH
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: CLM
Typ:
(compare logical under mask; Vergleiche logisch unter Maskenkontrolle; ab System /370)
RS
Format symbolisch: CLM
R1;M3,D2(B2)
CLM
Ri,M3,S2
Format maschinenintern: B
!
D
R,
1. Byte
1 1
Mj
2. Byte
B,
)• 1 3. Byte
•
D2
-1
•
4. Byte
Wirkungsweise: Die durch auf 1 gesetzte bit-Positionen der Maske M3 angezeigten Bytes des Registers R, werden mit entsprechend vielen aufeinanderfolgenden Bytes ab der Speicheradresse < B2> + D 2 verglichen. Bedingungscode: 0: Inhalt der ausgewählten Bytes in R, = Bytefolge im Speicher 1: Inhalt der ausgewählten Bytes in R] < Bytefolge im Speicher 2: Inhalt der ausgewählten Bytes in R! > Bytefolge im Speicher 3: Codierungsbeispiel: CLM
Es sei
2,9,BYTES
< Maske ) = 9,o= 1001 2 ;
186
3. Die Programmiersprache ASSEMBLER
dadurch werden das höchst- und das niederstwertige Byte aus dem Register 2 selektiert und mit den Bytes der Adressen BYTES und BYTES+1 verglichen. Reg.:
24
BYTES
Befehl: CP
Typ:
(compare decimal packed; Vergleichen arithmetisch dezimal gepackte Zahlen)
SS (arithmetisch)
Formate symbolisch: CP CP CP
D1(L„Bi),D2(L2,B2) Si(L,), S2(L2)
s,, s2
Format maschinenintern: L, - 1 1. Byte
L, - 1
2. Byte
B, 3. Byte
D, 4. Byte
S.Byte
6. Byte
Wirkungsweise: Der mit ( B ^ + D, adressierte 1. Operand wird in der Länge ]_! 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 Vorzeichen stellen 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 führenden Nullen aufgefüllt. Je nach dem Ergebnis
187
3.4 Maschinenbefehle
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 Bedingungscode im Anzeigeregister (PSW) reagieren. Die Aussage des Bedingungscodes bezieht sich stets auf den 1. Operanden. Bedingungscode: 0: beide Operanden sind gleich 1: 1. Operand < 2. Operand 2: 1. Operand > 2. Operand 3: Codierungsbeispiele : CP
0(2,81,5(3,7)
< Reg. 8 > 1. Operand
2. Operand
Das Resultat dieses Vergleichs ist ein Bedingungsschlüssel im Anzeigeregister, der aussagt, daß der 1. Operand kleiner als der 2. Operand ist. CP
ZAHL+2(3),0(2,9)
Der arithmetische Wert des 3 Bytes langen und mit ZAHL+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 führenden Nullen auf 3 Bytes aufgefüllt.
Befehl: CR
Typ:
RR
(compare registers; Vergleichen arithmetisch FP-Register mit FP-Register)
188
3. Die Programmiersprache ASSEMBLER
Format symbolisch: CR
R „ R2
Format maschinenintern: 1
I 9 1 l.Byte
R,
j R, I 2. Byte
Wirkungsweise: Der Inhalt des mit R , adressierten Registers wird arithmetisch, d . h . unter Berücksichtigung der Vorzeichen und der Zahlenwerte, mit dem Inhalt des durch R 2 adressierten Registers verglichen. Entsprechend dem Ergebnis des Vergleichs wird ein Bedingungscode im Anzeigeregister (PSW) gesetzt. In der Regel wird die Vergleichsoperation von bedingten Verzweigungsoperationen gefolgt, die in bestimmter Weise auf den Bedingungscode des Anzeigeregisters reagieren.
Bedingungscode: 0 : < R , > = 1: < R , X < R 2 > 2: < R , > > ( R 2 ) 3:
Codierungsbeispiel :
GLEICH
CR BL BH AR
5,6 KLEINER GR0ESSER 7,5
Vergleichen ; wenn ( R e g . 5> kleiner ( R e g . 6>, dann Sprung nach K L E I N E R ; wenn ( R e g . 5 > größer ( R e g . 6 ) , dann Sprung nach G R 0 E S S E R ; wenn weder kleiner noch größer, dann Fortsetzung des Programms mit GLEICH AR 7,5.
3.4 Maschinenbefehle
189
Befehl: C
Typ:
(compare; Vergleichen arithmetisch FP-Register mit Vollwort)
RX
Formate symbolisch: C C C
Ri,D2(Xa,B2) Ri, S 2 (X a ) R „ S2
Format maschinenintern: ;
9
Ri
1 Byte
1 ,
X2
2. Byte
•
eo
5
3. Byte
D]
1 J
.
4 . Byte
Wirkungsweise: Der Inhalt des mit R, adressierten Registers wird arithmetisch, d . h . unter Berücksichtigung der Vorzeichen und der Zahlenwerte mit dem Inhalt des durch + (B 2 > + D 2 adressierten Vollwortes verglichen. Entsprechend dem Ergebnis des Vergleiches wird ein Bedingungscode im Anzeigeregister (PSW) gesetzt. In der Regel wird die Vergleichsoperation von bedingten Verzweigungsoperationen gefolgt, die in bestimmter Weise auf den Bedingungscode des Anzeigeregisters reagieren. Bedingungscode: 0: = 2. Operand 1: < R , X 2. Operand 2: < R j > > 2. Operand 3: Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44 f.). Codierungsbeispiele: C BH
7,= F'0' PLUS
190
3. Die Programmiersprache A S S E M B L E R
Vergleichen des Inhalts von Register 7 mit der als Literal dargestellten „Vollwortnull". Verzweigen nach PLUS, wenn (Reg. 7> größer 0 ist. C BL
6,W0RD WEITER
Vergleichen (Reg. 6) mit (W0RD); wenn (Reg. 6> kleiner (WORD), dann Sprung nach WEITER. C BNE
5,5(3,4) A
Vergleichen (Reg. 5 > mit dem Inhalt des durch (Reg. 3 ) + (Reg. 4 > + 5 adressierten Vollwortes. Sprung nach A bei ungleich.
Befehl: CH
Typ:
(compare halfword; Vergleichen arithmetisch FP-Register mit Halbwort)
RX
Formate symbolisch: CH CH CH
Rj, D 2 (X 2 , B 2 ) Rj, S 2 (X 2 ) Rj, S 2
Format maschinenintern: 4
! 9 I.Byte
R, | X, t 2. B y t e
1 B; I* 3. B y t e
"T ' D; i
•
4. Byte
Wirkungsweise: Der Inhalt des durch R! adressierten Registers wird arithmetisch, d . h . unter Berücksichtigung der Vorzeichen und der Zahlenwerte, mit dem Inhalt des durch (X 2 > + (B2> + D 2 adressierten Halb Wortes verglichen. Der 2. Operand wird (virtuell) auf Vollwortlänge erweitert, und zwar mit dem Wert der bit-Position 15 aufgefüllt. Beide Operanden werden also als 32 bits lange Dualzahlen mit
3.4 Maschinenbefehle
191
Vorzeichen arithmetisch verglichen. Entsprechend dem Ergebnis des Vergleiches wird ein Bedingungscode im Anzeigeregister (PSW) gesetzt. In der Regel wird die Vergleichsoperation von bedingten Verzweigungsoperationen gefolgt, die in bestimmter Weise auf den Bedingungscode des Anzeigeregisters reagieren. Bedingungscode: 0: = 2. Operand 1: < R i > < 2. Operand 2: < R , ) > 2. Operand 3: Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Halbwortgrenze ausgerichtet sein (vgl. Seite 4 4 f.).
Codierungsbeispiel: CH
7,H(5)
Reg. 7
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 31 ">
1 0
H + 2: ( R , » ( R j > 3:
Befehle: CE CD
Typ:
RX
(compare single precision; Vergleichen arithmetisch GPRegister mit Gleitpunktwort) (compare double precision; Vergleichen arithmetisch GPRegister mit Gleitpunktdoppelwort)
193
3. Die Programmiersprache ASSEMBLER
Formate symbolisch: CE CE CE
CD CD CD
R , , D 2 ( X 2 ) B2) Ri,S2(X2) Ri, S 2
R 1 ; D 2 (X 2 , B 2 ) R „ S 2 (X 2 ) R,, S 2
Formate maschinenintern : 1 7
! >
1 9
R,
1. B y t e
1 i
X,
B,
2. B y t e
3. B y t e
: I
Ri
9
1. B y t e
D,
1 4
»
4. Byte
1
1
1 6
• •
i x3
2. B y t e
B,
!-« 3. B y t e
•
Dl
-J
»
4. Byte
Wirkungsweise: Der Inhalt des Gleitpunktregisters R j wird arithmetisch, d.h. unter Berücksichtigung der Vorzeichen, der Mantissen und der Exponenten mit dem Inhalt des durch + + D 2 adressierten Gleitpunktwortes bzw. -doppelwortes verglichen. Das Ergebnis des Vergleichs wird durch einen entsprechenden Bedingungsschlüssel im Anzeigeregister festgehalten; etwaige nachfolgende bedingte Verzweigungsoperationen reagieren darauf in ganz bestimmter Weise. Durch die Vergleichsoperationen erfolgt keine Normalisierung. Bedingungscode: 0: 2. Operand 3: Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Wort- bzw. Doppelwortgrenze ausgerichtet sein (vgl. Seite 44 f.).
Befehl: TM
(test under mask; Testen mit Maske)
194
3. Die Programmiersprache ASSEMBLER
Typ:
SI
Formate symbolisch: TM TM
D, (BO, I 2 Si, I 2
Format maschinenintern: 1
9
! 1
1
1. Byte
u< 2. Byte
1 B,
!« 1
•
3. Byte
D,
-j 1
»
4. Byte
Wirkungsweise: Das durch (Bj) + Di adressierte Byte wird mit dem Direktwert I 2 verglichen. Dieser Befehl erlaubt die Prüfung jeder einzelnen bit-Stelle des mit + Ü! adressierten Byte, und zwar wird jedes bit geprüft, welches in der Maske I 2 an der entsprechenden Stelle eine 1 hat. Hat ein bit in der Maske I 2 den Wert 0, so wird das entsprechende bit im Arbeitsspeicher nicht geprüft. In Abhängigkeit vom Ausgang des Vergleiches wird ein Bedingungscode im Anzeigeregister (PSW) gesetzt. Bedingungscode: 0: alle ausgewählten bits im 1. Operanden = 0 1: ausgewählte bits im 1. Operanden 0 und 1 2:
3: ausgewählte bits im 1. Operanden = 1. Die Reaktion auf den Bedingungscode im Anzeigeregister geschieht mittels der bedingten Sprungbefehle BZ, B0 und BM.
Die Reaktion auf den Bedingungsschlüssel im Anzeigeregister geschieht mittels der bedingten Sprungbefehle BZ, B0 und BM. 1. Sind alle getesteten bit-Stellen im Kernspeicher gleich Null, so wird mit BZ gesprungen (branch on zero), bei B0 und BM nicht! 2. Sind alle getesteten bit-Stellen im Kernspeicher gleich Eins, so wird mit B0 gesprungen (branch on ones), bei BZ und BM nicht! 3. Sind einige der getesteten bit-Stellen im Kernspeicher gleich Eins und einige gleich Null, so wird mit BM gesprungen (branch on mixed), bei BZ und B0 nicht!
195
3.4 Maschinenbefehle
Codierungsbeispiele: TM B0 BZ MVC
BYTE,B'11110000' EINSEN NULLEN FELD1,FELD2
Wenn das mit BYTE adressierte Byte den Inhalt l l l l x x x x hat, springt das Programm zur Adresse EINSEN; wenn BYTE den Inhalt OOOOxxxx hat, springt das Programm zur Adresse NULLEN; wenn BYTE z.B. den Inhalt O l l l x x x x hat, dann setzt es mit MVC . . . fort. C
TM BM AP
B,B'11001100' MIXED SUMME,ZAHL
Wenn das mit B adressierte Byte z.B. O l x x l l x x enthält, springt das Programm zur Adresse MIXED; wenn es hingegen l l x x l l x x oder OOxxOOxx enthält, dann setzt das Programm mit AP . . . fort.
3.4.3.9 Verzweigungsoperationen Befehl: BC Typ:
(branch on condition; bedingtes Verzweigen)
RX
Formate symbolisch 13 : BC BC
MuD2(0,B2) M,. S 2
Format maschinenintern13: 4
: 1. Byte
3
7
M,
i | 2. Byte
— 0 .... .
I B,
' + D 2 angegebenen Adresse ausgeführt. Bei Nichtentsprechung setzt das Programm mit der auf BC folgenden Instruktion fort.
Bedingungscode: Wird nicht verändert.
Programmierhinweise: Das Setzen der bit-Maske Mj erfolgt entweder explizite durch die Angabe bestimmter Direktwerte oder implizite durch einen erweiterten Bedingungscode. Es können, solange der Bedingungsschlüssel nicht verändert wird, mehrere Sprunginstruktionen hintereinander auf ein und dieselbe Anzeige bezug nehmen.
Erweiterter Bedingungscode Bedeutung
implizite
explizite
Unbedingter Sprung kein Sprung (übergehen) Sprung bei größer Sprung bei kleiner Sprung bei gleich Sprung bei nicht größer Sprung bei nicht kleiner Sprung bei ungleich Sprung bei positiv Sprung bei Einsen Sprung bei gemischt Sprung bei Nullen
B
D 2 (0, B 2 )
BC
15, D 2 (0, B 2 )
N0P BH BL BE BNH BNL BNE BP B0 BM BZ
D 2 (0, B 2 ) D2 (0, B 2 ) D2 (0, B 2 ) D2(0,B2) D 2 (0, B 2 ) D2 (0, B 2 ) D2 (0, B 2 ) D2 (0, B 2 ) D2 (0, B 2 ) D2 (0, B 2 ) D 2 (0, B 2 )
BC BC BC BC BC BC BC BC BC BC BC
0, 2, 4, 8, 13, 11, 7, 2, 1, 4, 8,
D 2 (0, B 2 ) D 2 (0, B 2 ) D 2 (0, B 2 ) D 2 (0, B 2 ) D 2 (0, B 2 ) D 2 (0, B 2 ) D 2 (0, B 2 ) D 2 (0, B 2 ) D 2 (0, B 2 ) D 2 (0, B 2 ) D2(0,B2)
Die 3 letzten Befehle werden in der Regel im Zusammenhang mit dem Befehl TM (test under mask) verwendet.
197
3.4 Maschinenbefehle
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 + D 2 = + 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> + D 2 = < Reg. 5 > + 19 gegebenen Adresse.
Befehl: BCR
Typ:
(branch on condition to register address; bedingtes Verzweigen zu der im Register angegebenen Adresse)
RR
Format symbolisch: BCR
M„R2
Format maschinenintern: 0
| 7 1 1. Byte
M, | R; i 2. Byte
Wirkungsweise: Vergleichsoperationen, Arithmetikoperationen, Ladeoperationen und shift-Operationen bewirken das Setzen eines Bedingungscodes im Anzeigeregister (PSW). Die BCR-Instruktion vergleicht die 4-bit-Maske M! mit dem Bedingungscode des Anzeigeregisters. Bei Entsprechung wird ein Sprung zu der in Register R 2 geladenen Adresse ausgeführt. Bei Nichtentsprechung setzt das Programm mit der auf BCR folgenden Instruktion fort. Bedingungscode: Wird nicht verändert.
198
3. Die Programmiersprache ASSEMBLER
Programmierhinweis: Das Setzen der bit-Maske M, kann bis auf eine Ausnahme nur explizit durch die Angabe bestimmter Direktwerte erfolgen (vgl. BC auf S. 195 f.). Die Ausnahme ist 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
/
/
I • I' E0J | CLC
i
UPR0
3,UPR0 FELD1.FELD2
FELD1 ,=X'00000C'
\ • \ ' BR
3
BAL lädt die Adresse von MVC nach Register 3 und springt zur Adresse UPR0; BR springt zu der in Register 3 geladenen Adresse. Der oben angedeutete Effekt könnte bei einmaligem Sprung in ein Unterprogramm auch wie folgt erzielt werden: / / WEITER /
\
MVC
UPR0 FELD1,FELD2
I
\
\
' N , N 0 D A T A , N 0 G E N DES
DTFSR
DTFSR
I0CS
BLKSIZE=80, DEVADDR»SYSRDR, DEVICE»READER, E0FADDR=ENDE, I0AREA1=EBER, RECF0RM=FIXUNB, TYPEFLE»INPUT BLKSIZE'132, C0NTR0L-YES, DEVADDR=SYSLST, DEVICE=PRINTER, IJ)AREA1»DRBER, PRINT0V=YES, RECF0RM-FIXUNB, TYPEFLE=»0UTPUT
DTFEN •
24
Oti
C
V
5
|
U.
o
•s 3
DO
S ? 3
c 3 ra J3 3
^
%
¿t
s:
Berufe:
Schulbildung:
Einkommensgruppen:
SE AR AN BE 0H
V — Volksschule M — Mittelschule 0 - Oberschule
0 1 2 3 4 5 6 7 8 9
- selbständig — Arbeiter — Angestellter - Beamter — ohne Beruf
Geschlecht: M — männlich W — weiblich Familienstand: L V G W
- ledig — verheiratet — geschieden - verwitwet
Weiterbildung: K L F U S
— keine — Lehre — Fachschule — Universitätsstudium — sonstige (Sekretärinnenschule, Dolmetscherschule etc.)
Blockformat: I - 26 1 - 26 I - 26 I - 26 I - ¿6 1
26 1
26 1
-
0 10000 15000 20000 25000 30000 35000 40000 45000 50000
26 1
bis bis bis bis bis bis bis bis bis bis
9999 14999 19999 24999 29999 34999 39999 44999 49999 u.m.
26 1 - 26
4.
286
PR0G8A
« *
1 UEBUNG8A1 216 ON.NODATA.NOGEN
TITLE START PRINT
DEFINITIONEN
DES
Spalte
IOCS
72
*
KARTE
Übungsprogramme
DTFSR
BLKSIZE=26, DEVADDR=SYSRDR, DEVICE=READER, E(JFADDR=ENDE , I j î A R E A 1 = EBER , RECF0RM=FIXUNB, TYPEFLE=INPUT
it *
BLKSIZE=260, DEVADDR=SYS010, DEVICE=TAPE, FILABL=STD, LABNAME=LAB, a 1 I0AREA1=ABER, R E C F O R M = F I X BL K , RECSIZE=26, TYPEFLE=OUTPUT, W0RKA=YES
* *
* * * *
*
BAND
DTFSR
* * * * » * *
DTFEN VORPROGRAMM VP
BALR USING OPEN
« *
9.0 * ,9 KARTE,BAND
HAUPTPR0GRAMM
*
LIES
» ENDE
* *
KARTE WORKAREA,EBER BAND . W O R K A R E A LIES
CLOSE TERM
KARTE,BAND
K O N S T A N T E N UND
EBER ABER WORKAREA L* A B
2 1
GET MVC PUT B
BEREICHE
DS DS DS DC
CL26 10CL26 CL26 44X'FF'
END
VP
21
D a s F e l d L A B e n t h ä l t I n f o r m a t i o n e n f ü r d e n E t i k e t t v e r g l e i c h . D a in d i e s e m
Programm
k e i n e E t i k e t t p r ü f u n g v o r g e s e h e n ist, w i r d d a s F e l d L A B m i t b i n ä r e n E i n s e n g e f ü l l t .
4. Übungsprogramme
287
Ü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.
4. Übungsprogramme
288
u o
«c Íz ÏÏ j
-r a j es
H I U K U OS W H
03 < H crt Z
g
B,
5.7 Fehleranzeigen des Übersetzerprogramms (Übersetzungsphase)23 A D E
M O S T U Y 2 3
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 w e r d e n nur die am häufigsten v o r k o m m e n d e n A n z e i g e n b e h a n d e l t . D i e A n z e i g e n erseheinen im Ü b e r s e t z u n g s p r o t o k o l l in der Spalte „tlags"; nähere E i n z e l h e i t e n vgl. die einschlägigen Handbücher der Hersteller.
5.8 Fehleranzeigen des Betriebssystems (Ablaufphase)
325
5.8 Fehleranzeigen des Betriebssystems (Ablaufphase)24 P088 Nichtdecodierbarer Operationscode (meistens, wenn in Daten- oder Konstantenfelder verzweigt wird) P092 Adressierungsfehler (Ausrichtung verletzt, Adresse zu groß) P096 Unzulässiger Datencode P I 0 0 Exponent zu groß (bei Gleitpunktarithmetik) P I 0 4 Division durch Null PI08 PI 12 PI 16 PI 20
2 4
Mantisse gleich Null (bei Gleitpunktarithmetik) Exponent zu klein (bei Gleitpunktarithmetik) Dezimalüberlauf (bei Dezimalarithmetik) Registerüberlauf (bei dualer FP-Arithmetik)
Es w e r d e n nur die a m h ä u f i g s t e n v o r k o m m e n d e n A n z e i g e n b e h a n d e l t . Die A n z e i g e n erscheinen auf d e m K o n s o l s c h r e i b e r p r o t o k o l l u n d als „ t y p e o f t e r m i n a t i o n " im Kerns p e i c h e r a u s z u g ( d u m p ) ; nähere E i n z e l h e i t e n vgl. die e i n s c h l ä g i g e n H a n d b ü c h e r der Hersteller.
Literaturverzeichnis [1] Alletsee, R., H. Jung und G. Umhauer: Assembler I, II und III. 3. Aufl., Berlin—Heidelberg—New York 1979. Nachdr. 1981. Assabgui, M.: Le langage d'assemblage. Paris 1972. Chapin, N.: 3 6 0 / 3 7 0 Programming in Assembly Language. 2nd ed., New York (N.Y.) e.a. 1973. Dworatschek, S.: Grundlagen der Datenverarbeitung. 6. Aufl., B e r l i n - N e w York 1977. Fernsehkurs im Medienverbund: Einführung in die Elektronische Datenverarbeitung, Band I, II, III. Flores I.: Assemblers and BAL. Englewood Cliffs ( N . J . ) 1971. Germain, C.B.: Das Programmier-Handbuch der IBM-DV-Systeme. 8. Aufl., München 1983. Huber, W.: Assembler. München 1973. IBM-Handbuch der EDV-Organisation. IBM Schule fur Datenverarbeitung: Programmieren in der IBM/360 Assembler-Sprache. ASS-PU, Text 1 - 4 , 2. Aufl., Sindelfingen 1970. IBM System/370: Die Assemblersprache. 1981. IBM System/360: Datenorganisation auf Speichereinheiten mit direktem Zugriff. DASD-Handbuch. IBM System/360: Maschinenlogik und Aufbau der Instruktionen. 1966. IBM System/370: Principles of Operation. 1975. IBM System/370: OSNS-DOS/VS-VM/370 Assembler Language. 1975. IDV-Lernprogramm: Elektronische Datenverarbeitung, I, II. Berlin 1971. Kuo, S. S.: Assembler Language for F O R T R A N , COBOL, and PL/1 Programmers. Reading (Mass.) e.a. 1974. Niemeyer, G.: Ein integriertes Datenverarbeitungs- und Informationssystem. Berlin 1972. Opler, A. (Hrsg.): Das IBM-System/360 und seine Programmiertechniken. 2. Aufl., München-Wien 1972. Payne, W. H.: Machine, Assembly and Systems Programming for the IBM/360. New York (N.Y.) 1969. Saxon, J. A., H. S. Englander and W. R. Englander: System/360 Programming. Englewood Cliffs (N.J.) 1968. Schwarzhuber, M.: Makrosprache. Berlin—München 1971. Siemens Schriftenreihe „data praxis": Methoden zur Adressierung von Speichern mit direktem Zugriff. Siemens Schriftenreihe „data praxis": Technik der Speicherung und Wiedergewinnung von Daten mit direktem Zugriff. Siemens System 4 0 0 4 BS 1000: Assembler, Beschreibung. Siemens System 4 0 0 4 BS 1000: Dienstprogramme.
Literaturverzeichnis
327
Siemens System 4 0 0 4 BS 1000: Ein-/Ausgabesystem. Siemens System 4 0 0 4 BS 1000: Organisationsprogramm. Siemens System 4 0 0 4 : Systemkonventionen. Siemens System 4 0 0 4 Zentraleinheiten 4 0 0 4 / 1 2 7 , 135-2,45-3. Beschreibung und Befehlsliste. Siemens 7 - 8 0 0 : Hardware Principles of Operation. 1979. Struble, G.: Assembler Language Programming. Reading (Mass.) 1969. Tuggle, S.: Assembler Language Programming: System/360 and 370. Chicago (III.) e.a. 1975. Univac Serie 9000: Programmierungs-Standard, Bibliothek Teil 1 und 2. Univac Serie 9000: Technische Beschreibung 9200, 9300. Wolters, M. F.(Hrsg.): Der Schlüssel zum Computer. 4 Bde. Neubearb. Aufl., Reinbeck b. Hamburg, 1983.
Stichwortverzeichnis A Addieren (Wort) 158 AD Addieren normalisiert lang 172 A D R Addieren normalisiert lang (Register) 170 Adresse, siehe Arbeitsspeicheradressierung Adreßkonstanten 6 6 - 6 8 AE Addieren normalisiert kurz 172 AER Addieren normalisiert kurz (Register) 170 AH Addieren Halbwort 160 AL Addieren FP-Wort logisch 161 A L R Addieren FP-Register logisch 161 AP Addieren dezimal 147 AR Addieren (Register) 157 Arbeitsspeicher 9 Organisation des - 9 Arbeitsspeicheradressierung 3 8 f f . absolute - 3 9 , 4 0 , 67, 217 f f . einfache - 3 8 ff. explizite - 6 9 f f . implizierte - 6 9 ff. indizierte - 4 2 ff. relative - 39, 40, 54, 55, 67 relative symbolische - 54, 7 9 - 8 1 symbolische - 4 0 , 56, 6 8 ff. Assembler, siehe Umwandlungsprogramm ASSEMBLER 4 8 ff. Elemente des - 49 Assembleranweisungen 49, 212 f f . Aufbereiten z u m Drucken 118 Aufbereitungsmaske 118 Ausdrücke 5 0 ff. Ausführungsphase 39, 212 ff. B Verzweigen unbedingt 196 B A L Springen und Speichern Rücksprungadresse 199 B A L R Springen (zu Registeradresse) und Speichern Rücksprungadresse 200 Basisadresse 39 absolute - 217 f f . relative - 54, 217 ff. Basisregister 31, 38 ff., 217 f f . BC Springen bedingt 195 - erweiterter Bedingungscode 196 BCR Springen (zu Registeradresse) bedingt 197
BCT Springen nach Zählen 202 BCTR Springen (zu Registeradresse) nach Zählen 203 Befehle, siehe Maschinenbefehle BE Verzweigen bei gleich 196 Befehlszählregister 33, 39 BH Verzweigen bei größer 196 Binärkonstante 61 Bindephase 221, 223 bit 9 - Positionen 9 ff. - Muster 9 ff. BL Verzweigen bei kleiner 196 BM Verzweigen bei gemischtem bit-Muster 196 BNE Verzweigen bei ungleich 196 B N H Verzweigen bei nicht größer 196 B N L Verzweigen bei Einsen-bit-Muster 196 BP Sprung bei positiv 196 Buchstabendarstellung 13, 15 B X H Springen, wenn Index größer 205 B X L E Springen, wenn Index kleiner oder gleich 205 Byte 9 BZ
Sprung bei Nullen-bit-Muster 196
C Vergleichen algebraisch (FP-Wort) 189 CD Vergleichen lang 192 CDR Vergleichen lang (Register) 191 CE Vergleichen kurz 192 CER Vergleichen kurz (Register) 191 CH Vergleichen Halbwort 190 CLC Vergleichen logisch 180 CLCL Vergleichen Zeichen logisch in Langfeld 182 CLI Vergleichen logisch direkt 184 CLM Vergleichen logisch unter Maskenkontrolle 185 CL0SE Schließen einer oder mehrerer Dateien 240 CNTRL Steuerung eines peripheren Geräts 245 CNVTDEGP Umwandlung dezimal nach sedezimal Gleitpunkt 127 ff. CNVTGPDE Umwandlung sedezimal Gleitpunkt nach dezimal 127 ff.
Stichwortverzeichnis Codeumwandlung 16 ff., 113 ff. - EBCD1 nach dezimal gepackt 1 1 3 - 1 1 6 - dezimal gepackt nach EBCDI 1 1 6 - 1 2 5 - dezimal gepackt nach dual 125 - dual nach dezimal gepackt 126 - dezimal nach sedezimaler Gleitpunktzahl 127 ff. - sedezimal GP nach dezimal 127 ff. CP Vergleichen dezimal 186 CR Vergleichen algebraisch (Register) 187 CSE CT Definieren eines Programmabschnitts 222, 224 ff. CVB Umwandeln in Dualzahl 125 CVD Umwandeln in Dezimalzahl 126 D Dividieren (Wort) 168 Dateidefinitionen 235 ff. DC Definieren Konstante 214 DD Dividieren lang 179 DDR Dividieren lang (Register) 178 DE Dividieren kurz 179 DER Dividieren kurz (Register) 178 Dezimalbefehle (arithmetische) 147 Dezimalkonstante 6 4 - 6 6 Dezimal gepackte Zahlendarstellung 16 ff. Direktoperanden 33 Direktwerte 51 ff. binäre - 53 dezimale - 52 sedezimale - 5 3 Zeichen - 53 f. Distanzadresse 31, 32, 35, 38 ff., 218 f. Doppelwort 10 Doppelwortgrenze 44
329 Duplizierfaktor 58 EBCDI-Code 11 ff. Buchstabendarstellung im - 12, 13, 15 Sonderzeichendarstellung im - 13, 16 Vorzeichendarstellung im - 12, 15 Zahlendarstellung im - 12, 15 Zifferndarstellung im - 11, 15 ED Aufbereiten 118 Einfügungszeichen in Druckmaske 118 f. Endezeichen in Druckmaske 118 END Beenden der Umwandlung 223 Entpacken 17, 116 ENTRY Definieren symbolische Adresse als Einsprungstelle 223 E 0 J Programmende (identisch mit TERM) 247 EQU Wertzuweisung zu einem Symbol 5 1 - 5 3 , 213 f. Erweiterter Bedingungscode bei Verzweigungsbefehlen 196 EX Ausführen 206 EXTRN Erklären externer Symbole 68, 222 Festpunktkonstante 62 Festpunktregister 10, 19 GET Lesen seriell 241 Gleitpunktbefehle (arithmetische) 170 ff. Gleitpunktkonstante 64 Gleitpunktregister 10, 29, 30 Gleitpunktzahl 29, 30
Ausrichtung auf - 44, 217 DP Dividieren dezimal 153 DR Dividieren (Register) 167 DROP Aufgaben von Basisregistern, die vorher durch USING zugewiesen wurden 220 DS Definieren Speicherplatz 215 DTFDA Dateierklärung für Gerät mit direktem Zugriff 236 DTFEN Ende der Dateierklärungen 236 DTFSR Dateierklärung fiir Gerät mit seriellem Zugriff 236 Dualer Stellenwert 14, 18, 19, 23 Duale Zahlendarstellung 17 ff.,
Halbbyte 13, 18 Halbwort 10, 18, 1 9 - 2 1 Halbwortgrenze 45 Ausrichtung auf - 44 ff., 217
-
Kilobyte 9 Komplementierung 20, 100 Konstantentyp 58 f.
im Halbwort 1 9 - 2 3 im Festpunktregister 1 9 - 2 3 im Wort 1 9 - 2 3
IC Laden Zeichen 96 ICM Einfügen Zeichenkette unter Maskenkontrolle 97 Indexregister 32, 42, 43 Instruktionen 4 8 Instruktionstypen 3 2 ff. Formate der - 32 ff., 324
330 L Laden (FP-Wort) 94 LA Laden Adresse 90 Ladeadresse 39, 67, 217 ff. Ladebefehle 90 ff. Längenattribut 56 Längenschlüssel 44, 58 expliziter - 44, 58 impliziter - 44, 59 LCR Laden Komplement 98 LD Laden lang 110 LDR Laden lang (Register) 108 LE Laden kurz 109 LER Laden kurz (Register) 107 LH Laden Halbwort 95 Literal 56 ff. - mit Adreßkonstante 66 ff. - mit Binärkonstante 61 f. - mit Dezimalkonstante 64 ff. - mit Festpunktkonstante 62 f. - mit Gleitpunktkonstante 64 - mit Sedezimalkonstante 60 f. - mit Zeichenkonstante 59 f. Literalbereich 228 LM Laden mehrfach 101 LNR Laden negativ 99 LPR Laden positiv 100 LR Umladen Registerwert 92 LTORG Eröffnen eines Literalbereiches 228 LTR Umladen FP-Register mit Test 93
M Multiplizieren Register mit Vollwort 165 Makro 49, 230 ff. - Aufruf 49, 2 3 0 f . , 234 f. - Bibliothek 230, 233 f. - Definition 230 ff. Mischform - 232 Schlüsselwort - 232 Stellungs - 231 f. System - 235 ff. - Umwandler 230, 234 Makros 49, 230 ff. - zur Dateidefinierung 235 ff. - zum Öffnen und Schließen von Dateien 240 f. - zum Schreiben und Lesen 241 ff. - zur Steuerung peripherer Geräte 245 f. Maschinenbefehle 49, 68 ff. Beschreibung der 81 ff. Syntax der - 69 ff.
Stichwortverzeichnis Maschineninstruktionen 31 ff. MD Multiplizieren mit GP-Doppelwort 177 MDR Multiplizieren GP-Register lang 175 ME Multiplizieren mit GP-Wort 177 M E R Multiplizieren GP-Register kurz 175 MH Multiplizieren Register mit Halbwort 166 MP Multiplizieren gepackt 150 MR Multiplizieren Register 163 Musteranweisung 231 f. MVC Übertragen Zeichen 81 MVCLÜbertragen Zeichen bei Langfeldern 83 MVI Übertragen Direktzeichen 85 MVN Übertragen rechte Halbbytes (Ziffern) 86 MV® Übertragen Zeichen versetzt 88 M V Z Übertragen linke Halbbytes (Zonen) 87
N bitweise UND-Verknüpfung mit indiziertem Speicherwort 209 NC bitweise UND-Verknüpfung feld mit Speicherfeld 211 Nl bitweise UND-Verknüpfung feld mit Diiektwert 212 NR bitweise UND-Verknüpfung mit Register 207 Nullenunterdrückung 118 f.
Register SpeicherSpeicherRegister
0 bitweise 0DER-Verknüpfung Register mit indiziertem Speicherwort 209 Objektprogramm 31, 48 OC bitweise 0DER-Verknüpfung Speicherfeld mit Speicherfeld 211 01 bitweise 0DER-Verknüpfung Speicherfeld mit Direktwert 212 OPEN Eröffnen von Dateien 240 Operanden 31, 68 ff. - Adressierung 34 ff., 38 ff. Ausrichtung der - 4 4 , 4 5 Länge der - 44 Operationscode 6 8 ff. OR bitweise 0DER-Verknüpfung Register mit Register 207 ORG Setzen des Zuordnungszählers 227
331
Stichwortverzeichnis PACK Packen von gezonten Dezimalzahlen 1 6 , 1 7 , 113 P RIN T Modifikation des Protokollumfangs 2 2 9 Programmsegment 221 f f . Programm-Modul 221 ff. P R T 0 V V o r s c h u b bei F o r m u l a r e n d e 239, 246 PUT Schreiben seriell 2 4 2 Quellenprogramm 4 8 READ Lesen gestreut 243 Register 10 Laden - 9 0 ff. - Operanden 33 ff. - Speichern von 102 ff. Relative Adressierung 39 ff., 79 f f . - bei RX- u n d RS-Instruktionen 79 - bei Sl-Instruktionen 80 - bei SS-Instruktionen 80 f. RR-Instruktionen, echt 34 - symbolisch 6 9 f. RS-Instruktionen, echt 35, 36 - symbolisch 73 f. Rücksprungadresse 198 ff. RX-Instruktionen, echt 34, 35 - symbolisch 70 ff. - als Sprungbefehle 72 f. S Subtrahieren (Wort) 158 Schutzsternschreibung 122 f. SD Subtrahieren normal lang 174 SDR Subtrahieren normal lang (Register) 173 SE Subtrahieren normal kurz 174 Sedezimale Schreibweise 13 ff. Buchstabendarstellung in - 15 Sonderzeichendarstellung in - 16 Zahlendarstellung in - 15 Zifferndarstellung in - 15 Sedezimalbrüche 26, 27 Sedezimalkonstante 6 0 f. Sedezimalsystem 14 Sedezimalzahl 23 ff. Segment 221 f. SE R Subrahieren normal kurz (Register) 173 SH Subtrahieren Halbwort 160 Shift-Befehle 140 f f .
Sl-Instruktionen, echt 36, 37 - symbolisch 74 f. SL Subtrahieren FP-Wort logisch 162 S L A Verschieben links 141 S L D A Verschieben links doppelt 143 S L L Verschieben links logisch 146 S L R Subtrahieren FP-Register logisch 162 SP Subtrahieren dezimal 147 Sonderzeichendarstellung 13, 16 Speicherbefehle 102 ff. Speicheroperanden 31 Sprungbefehle 72, 180 ff., 195 f f . SR Subtrahieren (Register) 157 S R A Verschieben rechts 140 S R D A Verschieben rechts doppelt 142 S R L Verschieben rechts logisch 145 SRP Verschieben und R u n d e n gepackt 155 SS-Instruktionen, echt 37, 38 - symbolisch 75 ff. ST Speichern (FP-Wort) 102 START 221 Startzeichen in Druckmaske 118 STC Speichern Zeichen 104 STCM Speichern Zeichenkette u n t e r Maskenkontrolle 105 STD Speichern lang 112 STE Speichern kurz 111 Stellenwert 12 f f . dezimaler - 21, 22 dualer - 14, 23 sedezimaler - 23 STH Speichern Halbwort 103 STM Speichern mehrfach 106 Symbole 5 0 f. Symbolische Maschineninstruktionen 68 f f . Syntax der - 6 9 f f . Symboltabelle 51 S y s t e m m a k r o s 235 ff. TERM Beenden des Programms 247 Tetrade 13 TITLE Drucken Kopfzeile 2 2 9 TM Testen mit Maske 193 TR Übersetzen mit Hilfe von Codetabellen 137 Übertragungsbefehle 81 ff. Übungsprogramme 2 4 8 ff. Umwandlung 41, 4 3 Umwandlungsprogramm 4 8
332
Stichwortverzeichnis
UNPK E n t p a c k e n 116 USING Deklarieren Basisregister 41, 217 Unterprogrammsprung 198 ff. Vergleichsbefehle 180 f f . Verzweigungsbefehle 195 ff. Vollwort 10 Vollwortgrenze 4 5 Ausrichtung auf - 45, 216 f. Vorzeichendarstellung 12, 15, 20, 29, 30 WAITF Warten, bis eine E/A-Operation eines Großspeichers beendet ist 244 Wertzuweisung, siehe EQU WRITE Schreiben gestreut 244 Wort 18, 19, 20 X fung 209 XC fung XI fung XR fung
bitweise exklusive 0 D E R - V e r k n ü p Register mit indiziertem Speicherwort bitweise exklusive 0 D E R - V e r k n ü p Speicherfeld mit Speicherfeld 211 bitweise exklusive 0 D E R - V e r k n ü p Speicherfeld mit Direktwert 212 bitweise exklusive 0 D E R - V e r k n ü p Register mit Register 207
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 Halb wort 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 149 Zeichendirektwert 53 f. Zeichenkettenverarbeitung 11 Zeichenkonstante 59 f. Zifferndarstellung 11, 15 Ziffernteil 113 Ziffernzeichen in Druckmaske 118 Zonenteil 113 Zuordnungszähler 54 ff. Stand des - 54 ff. Steuerung des - 227 Vorrücken des - 228 Z w e i e r k o m p l e m e n t 20
w DE
G G. Niemeyer
Walter de Gruyter Berlin-New York Einführung in das Programmieren in PASCAL Mit Sonderteil UCSD-PASCAL-System 2., verbesserte Auflage. 15,5 x 23 cm. 167 Seiten. 1983. Kartoniert DM 2 4 ISBN 311 009532 7 (de Gruyter Lehrbuch)
E. W. Mägerle
Einführung in das Programmieren in BASIC 2., durchgesehene Auflage. 15,5 x 23 cm. 112 Seiten. 1980. Kartoniert DM 19,80 ISBN 311008227 6 (de Gruyter Lehrbuch)
K. Hambeck
Einführung in das Programmieren in COBOL 3., verbesserte Auflage. 15,5 x 23 cm. X, 163 Seiten. 1981. Kartoniert DM 26,ISBN 311 008693 X (de Gruyter Lehrbuch)
A. Schulz
Einführung in das Programmieren in PL/1 2., neubearbeitete und erweiterte Auflage. 15,5 x 23 cm. 332 Seiten. 1984. Kartoniert DM 49,50 ISBN 3110099888 (de Gruyter Lehrbuch)
Einführung in das Programmieren in W. E. Spieß F. G. Rheingans FORTRAN 6. Auflage. 15,5 x 23 cm. 217 Seiten. Mit 19 Abbildungen und 13 Tabellen. 1980. Kartoniert DM 22,ISBN 3110081350 (de Gruyter Lehrbuch)
W. E. Spieß G. Ehinger H. Siebert
Programmierübungen in FORTRAN 2., durchgesehene und erweiterte Auflage. 15,5 x 23 cm. 157 Seiten. 1980. Kartoniert DM 26,ISBN 3110083671 (de Gruyter Lehrbuch)
Höhere FORTRAN Programmierung Eine Anleitung zum optimalen Programmieren 2., bearbeitete Auflage. 15,5 x 23 cm. 237 Seiten. 1980. Kartoniert DM 38,ISBN 3110082268 (de Gruyter Lehrbuch) Preisänderungen vorbehalten
w DE
G Ehinger/Fussy/ Herrmann/ Hoffmann Ch.-M. Hamann
Walter de Gruyter Berlin-New York FORTRAN-Lexikon Anweisungen und Begriffe 15,5 x 23 cm. XX, 492 Seiten. 360 Stichworte. 1982. Kartoniert DM 48,- ISBN 311 008359 0
Einführung in das Programmieren in LISP 15,5 x 23 cm. XIV, 287 Seiten. Mit 54 Abbildungen. 1982. Kartoniert DM 38,ISBN 311 008909 2 (de Gruyter Lehrbuch)
St. Hesse W. Kirsten
Einführung in die Programmiersprache MUMPS 15,5 x 23 cm. XIV, 259 Seiten. 1983. Kartoniert DM 39,50 ISBN 311009746 X (de Gruyter Lehrbuch)
G. Hommel St. Jähnichen C. H. A. Koster O. K. Ferstl E. J. Sinz
Methodisches Programmieren Entwicklung von Algorithmen durch schrittweise Verfeinerung 15,5 x 23 cm. 223 Seiten. 1983. Kartoniert DM 32,ISBN 311 009636 6 (de Gruyter Lehrbuch)
Software-Konzepte der Wirtschaftsinformatik 15,5 x 23 cm. X, 286 Seiten. 1984. Kartoniert DM 38,ISBN 311009901 2 (de Gruyter Lehrbuch)
A. Schulz
Methoden des Software-Entwurfs und Strukturierte Programmierung 2., bearbeitete und erweiterte Auflage. 15,5 x 23 cm. 181 Seiten. 1982. Kartoniert DM 49,50 ISBN 311 0088959 (de Gruyter Lehrbuch)
R. Klar
Digitale Rechenautomaten Eine Einführung 3., neu bearbeitete Auflage. 12 x 18 cm. 302 Seiten mit 126 Abbildungen, 35 Tabellen und 41 Beispielen. 1983. Kartoniert DM 26,80 ISBN 311 0083728 (Sammlung Göschen, Band 2050) Preisänderungen vorbehalten