Einführung in das Programmieren in ASSEMBLER: Systeme IBM, Siemens, Univac, Interdata [4. Aufl. Reprint 2019] 9783111346168, 9783110087581


223 65 17MB

German Pages 303 [304] Year 1982

Report DMCA / Copyright

DOWNLOAD PDF FILE

Table of contents :
Vorwort
Inhalt
1. Die Darstellung von Daten in Byte-Maschinen
2. Maschineninstruktionen und Operandenadressierung
3. Die Programmiersprache Assembler
4. Übungsprogramme
5. Anhang: Programmierhilfen
Literaturverzeichnis
Stichwortverzeichnis
Recommend Papers

Einführung in das Programmieren in ASSEMBLER: Systeme IBM, Siemens, Univac, Interdata [4. Aufl. Reprint 2019]
 9783111346168, 9783110087581

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

de Gruyter Lehrbuch Niemeyer • Programmieren in A S S E M B L E R

Gerhard Niemeyer

Einführung in das

Programmieren in ASSEMBLER Systeme IBM, Siemens, Univac Interdata 4. Auflage

w DE

G Walter de Gruyter • Berlin • New York 1982

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

CIP-Kurztitelaufnahme der Deutschen Bibliothek Niemeyer, Gerhard: Einführung in das Programmieren in ASSEMBLER : Systeme IBM, Siemens, Univac, Interdata / Gerhard Niemeyer. 4. Aufl. - Berlin ; New York : de Gruyter, 1982. (De-Gruyter-Lehrbuch) ISBN 3-11-008758-8

© Copyright 1982 by Walter de Gruyter & Co., vormals G. J. Göschen'sehe Verlagshandlung, J. Guttentag, Verlagsbuchhandlung Georg Reimer, Karl J. Trübner, Veit & Comp., Berlin 30. Alle Rechte, insbesondere das Recht der Vervielfältigung und Verbreitung sowie der Übersetzung, vorbehalten. Kein Teil des Werkes darf in irgendeiner Form (durch Photokopie, Mikrofilm oder ein anderes Verfahren) ohne schriftliche Genehmigung des Verlages reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden. Printed in Germany. Satz: Mercedes-Druck, Berlin. - Druck: Color-Druck, Berlin. Bindearbeiten: Dieter Mikolai, Berlin.

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

6

Vorwort

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

Gerhard Niemeyer

Vorwort zur 3. Auflage Einem Wunsch zahlreicher Benutzer meines Buches folgend, wird die 3. Auflage um den Befehlsvorrat zur logischen bit-Verknüpfung erweitert. Die sich daraus ergebenden Seitenverschiebungen wurden mit der bestmöglichen Sorgfalt in die Befehlstabelle und das Stichwortverzeichnis eingearbeitet. Regensburg, im Januar 1979

Gerhard Niemeyer

Vorwort zur 4. Auflage Nachdem die neuen Computergenerationen von IBM und Siemens (IBM Serien 30 und 43, Siemens Serie 75) ihre Architektur und damit auch den Befehlsvorrat im wesentlichen beibehalten haben, bleibt die Sprache ASSEMBLER auch für die nächsten Jahre aktuell. Der mit dem vorliegenden Buch erreichte Standard machte es möglich, die 4. Auflage bis auf einige geringfügige Druckfehlerkorrekturen unverändert herauszugeben. Regensburg, im September 1981

Gerhard Niemeyer

Inhalt 1. Die Darstellung von Daten in Bytemaschinen 1.1 Die Organisation des Arbeitsspeichers und der Register 1.2 Der EBCDI-Code 1.2.1 Die Darstellung von Ziffern, Zahlen und Vorzeichen 1.2.2 Die Darstellung von Buchstaben und Sonderzeichen 1.2.3 Die sedezimale Schreibweise von bit-Mustern 1.3 Die dezimal gepackte Zahlendarstellung 1.4 Die duale Zahlendarstellung 1.5 Die Zahlendarstellung im Halbwort, Wort und Festpunktregister 1.6 Exkurs: Zahlensysteme 1.6.1 Die polynomiale Zahlendarstellung 1.6.2 Die Umrechnung von Zahlen in andere Zahlensysteme 1.7 Die Zahlendarstellung im Gleitpunktregister

9 9 11 11 12 13 16 17 19 21 21 23 29

2. Maschineninstruktionen und Operandenadressierung

31

2.1 Allgemeine Vorbemerkungen 2.2 Die Instruktionstypen und ihre Formate 2.3 Die Arbeitsspeicheradressierung 2.3.1 Einfache Adressierung 2.3.2 Indizierte Adressierung 2.4 Die Länge der Operanden 2.5 Die Ausrichtung von Operanden im Arbeitsspeicher

31 32 38 38 42 44 44

3. Die Programmiersprache ASSEMBLER 3.1 Allgemeine Vorbemerkungen 3.2 Die Elemente der Sprache 3.3 Ausdrücke 3.3.1 Symbole 3.3.2 Direktwerte 3.3.3 Der Stand des Zuordnungszählers 3.3.4 Längenattribute 3.3.5 Literale 3.4 Maschinenbefehle 3.4.1 Die Syntax der Maschinenbefehle 3.4.2 Die relative symbolische Adressierung 3.4.3 Beschreibung der wichtigsten Maschinenbefehle 3.4.3.1 Übertragungsoperationen im Arbeitsspeicher 3.4.3.2 Laden von Registern, Speichern von Registerinhalten 3.4.3.3 Codetransformationen 3.4.3.4 shift-Operationen in Festpunktregistern 3.4.3.5 Dezimalarithmetik 3.4.3.6 Duale Festpunktarithmetik 3.4.3.7 Sedezimale Gleitpunktarithmetik 3.4.3.8 Vergleichsoperationen 3.4.3.9 Verzweigungsoperationen 3.4.3.10 Logische bit-Verknüpfungen

46 46 47 48 48 49 52 54 54 66 67 77 79 79 85 103 127 132 140 149 158 169 180

8

Inhaltsverzeichnis 3.5 Assembler-Anweisungen 3.5.1 Anweisungen zur Symbol-, Konstanten- und Felddefinition 3.5.2 Anweisungen zur Deklaration und Aufgabe von Basisregistern 3.5.3 Anweisungen zur Programmsegmentierung und Segmentverknüpfung 3.5.4 Anweisungen zur Steuerung des Zuordnungszählers 3.5.5 Anweisungen zur Modifikation des Übersetzungsprotokolls 3.6 Elementare Makroprogrammierung 3.6.1 Die Definition von Makros 3.6.1.1 Die Aufstellung der Instruktionsfolge 3.6.1.2 Die Definition des Makroaufrufs (Musteranweisung) 3.6.1.3 Steuerung des Assembler 3.6.1.4 Das Eintragen der Makrodefinition 3.6.2 Der Aufruf von Makros 3.7 Systemmakros 3.7.1 Systemmakros zur Definition von Dateien 3.7.2 Systemmakros zum Öffnen und Schließen von Dateien 3.7.3 Makros zum Lesen und Schreiben von Dateien 3.7.4 Makros zur Steuerung peripherer Geräte 3.7.5 Das „Ende-Makro"

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

1: 2: 3: 4: 5: 6: 7: 8a: 8b: 9: 10: 11:

Auflisten von Adießkarten Ausdrucken des Inhalts eines Festpunktregisters Dezimalarithmetik Dualarithmetik Rechnungsschreibung Sortieren von Adreßkarten numerisch und alphabetisch Programmsegmentierung bei Übung 1 Erzeugen einer Banddatei mit statistischen Erhebungsdaten Auszählen statistischer Merkmale von einer Banddatei Sedezimale Gleitpunktarithmetik Einrichten einer Buchhaltung auf einer Magnetplatte Multiplikation von Inzidenzmatrizen mit Zustandsvektoren

5. Anhang: Programmierhilfen 5.1 Lochkartenformat im ASSEMBLER 5.2 Tabelle der Maschineninstruktionen * 5.3 Tabelle der 2er-Potenzen 5.4 Umrechnungstabelle sedezimal - dezimal 5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal) 5.6 Tabelle der maschineninternen Instruktionsformate 5.7 Fehleranzeigen des Übersetzerprogramms (Übersetzungsphase) 5.8 Fehleranzeigen des Betriebssystems (Ablaufphase)

184 185 189 . . 193 199 200 202 203 203 203 204 205 206 207 207 212 213 217 219

220 220 223 226 232 238 248 254 257 259 268 278 278

281 281 282 288 289 289 295 295 296

Literaturverzeichnis

297

Stichwortverzeichnis

299

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

507

508

xxxxxxxx

509 xxxxxxxx

Byte

Byte

Byte

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

7 6 5 4 3 2 1 0 x x x x x x x x

Byte

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

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

10

1. Die Darstellung von Daten in Bytemaschinen

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

0 0 1 1

0 1 0 1

1 1 1 1

0 0 1 1

0 1 0 1

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

11

1.2 Der EBCDI-Code

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

1 1 1 1 1 1 111 111 111 111 111 111 111 111

7 6 5 4

dezimal 0 0 0 0 0 0 0 1 0 0 10 0 0 11 0 10 0 0 10 1 0 110 0 111 10 0 0 10 0 1

0 1 2 3 4 5 6 7 8 9

3 2 1 0 (bit-Positionen)

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

12

1. Die Darstellung von Daten in Bytemaschinen

Zahlendarstellung (Beispiel): Adressen:

1 im ! oooi

317

318

319

im ! oooo

320

im ! ooio

1 im ! ooii

Tausender

Hunderter

Zehner

Einer

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

1023

im ! oooi i

1 im ! oooo 0

1 "T — im ! ooio lioo ! ooii 2 + 3

1 im ! oooi I

1111 ! oooo 1

im ! ooio

noi ;1 ooii

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

1.2 Der EBCDI-Code

13

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

Pos.

3210

3 2 10

3210

3 2 10

32 10

3 2 10

3 2 10

3 2 10

3 2 10

76 54

0001

0010

0011

0100

0101

0110

Olli

1000

1001

1100 1101 1110

A J

B K S

c

D M U

E N V

F

G P X

H

0

I R Z

L T

W

Q

Y

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

Pos.

32 1 0

32 10

32 1 0

32 10

32 10

32 10

32 1 0

32 10

7654

0000

0001

1010

1011

1100

1101

1110

1111

0100 0101 0110

blank &


=

? ff

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

1. Die Darstellung von Daten in Bytemaschinen

14

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

Dezimalwert

Sedezimalziffer

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

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

0 1 2 3 4 5 6 7 8 9 A B C D E F

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

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

2 3 2 2 2 1 2° (duale Stellenwerte) Anm.: Die Zeichen A bis F sind hier nicht als Buchstaben, sondern als Sedezimalziffem zu verstehen!

15

1.2 Der EBCDI-Code

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

Ziffern dezimal

EBCDI (sedezimal)

0 1 2 3 4 5 6 7 8 9

F0 Fl F2 F3 F4 F5 F6 F7 F8 F9

Zahlen dezimal

EBCDI (sedezimal)

(+) 1023 + 1023

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

-

1023

Buchstaben linkes Halbbyte

rechtes Halbbyte 1 2 3 4 5 6 7 8 9

C D E

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

16

1. Die Darstellung von Daten in Bytemaschinen

Sonderzeichen linkes Halbbyte 4 5 6 7

0

1

rechtes Halbbyte A B C




1!

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

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

17

1.4 Die duale Zahlendarstellung

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

4 1111 ! i

0100

1

3

i m ! ooio

noi ; ooii

0100

| t

ooii ! noi

0001

i 0000 1

oioi ! lioo

Uli 1 0000

lioo ! oioi

Packen

.

Entpacken

Uli

! 0001 1

0010

1

X

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

F2

D 3

4

2

3 D

1 l X

Packen

/ 1 X 1

Entpacken Fl

0

F0

5 C

C 5

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

18

1. Die Darstellung von Daten in Bytemaschinen

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

1.5 Die Zahlendarstellung im Halbwort, Wort und Festpunktregister

19

Der duale Stellenwert ergibt sich aus dem Ausdruck 2bit-Position

Die in diesen Bytegebilden dargestellten Zahlen haben dann folgenden Dezimalwert: z n _ i • 2 n _ 1 + z n _ 2 .- 2n~2 + . . . + z 2 • 2 2 + z1 • 2 1 + z 0 • 2° = Zahl 10 Dabei haben die zt die Werte 0 oder 1 und n ist die Anzahl der Dualziffern. Beispiel: 01011001 2 = 0 - 2 7 + 1 • 2 6 + 0 • 2 5 + 1 • 2 4 + 1 • 2 3 + 0 • 2 2 + 0 • 2 1 + 1 - 2 ° = 0 + 64 + 0 + 16 + 8 + 0 + 0 + 1 = 89 1 0 Die größte im Halbbyte darstellbare Zahl ist: 11112 = 2 3 + 2 2 + 2 1 + 2° = 8 + 4 + 2 + 1 = 15 10 = 2 4 - 1 Die Zahl der möglichen bit-Muster ist hingegen 16 = 24. Die größte im Byte darstellbare Zahl ist: 11111111 2 = 2 7 + 2 6 + 2 5 + 2 4 + 2 3 + 2 2 + 2 1 + 2° = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 - 255 10 = 28- 1 Die Zahl der möglichen bit-Muster ist hingegen 256 = 2 8 . Die größte in IV2 Bytes darstellbare Zahl ist: I I I I I I I I I I I I 2 = 2 1 1 + 2 1 0 + 2 9 + 2 8 + (2 8 - 1) = 2048 + 1024 + 512 + 256 + 255 = 4095 1 0 = 2 1 2 — 1 Die Zahl der möglichen bit-Muster ist hingegen 4096 = 2 12 . Die Zahlen 15, 255 und 4095 treten im Zusammenhang mit der Adreßrechnung sehr häufig auf. Es wird daher empfohlen, sie im Gedächtnis zu behalten.

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

20

1. Die Darstellung von Daten in Bytemaschinen

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

0

- 105 10 0

01101001

15 31

0

1 . . . . 10010111

— 76io 15 31

+ 76io O

15 31

O

1 . . . . 10110100 =>0

01001100

Das letzte Beispiel zeigt, daß die Komplementierung einer negativen Dualzahl (des Zweierkomplements) wieder die ursprüngliche positive Dualzahl ergibt. Die größten im Halb wort und Wort darstellbaren positiven Zahlen sind: 15 31

14 30

0

0

11

1,

was den Dezimalzahlen 2 spricht.

15

- 1 = 32767 bzw. 2 3 1 - 1 = 2147483647 ent-

Die dem Betrag nach größtmöglichen negativen Zahlen im Wort und Halbwort sind: 15 31

14 30

1 00

o

0,

IS

was den Dezimalzahlen - 2 = - 3 2 7 6 8 bzw. - 2 3 1 = -2147483648 entspricht; dabei wird also die Vorzeichenstelle zugleich auch als Ziffernstelle ausgenutzt. Die Komplemente dieser größten negativen Zahlen ergeben sich nach der genannten Regel ebenfalls zu 15 31

1 00

0

0,

1.6 Exkurs: Zahlensysteme

21

d.h. sie bleiben negativ. Daher ist die Komplementierung der größten negativen Zahlen nicht möglich. Die Dualzahl 15 31

1 1 1

0

1 1

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

000

o

0 1,

also eine dezimale + 1. Die Dualzahl 15 31

1 1 1

0

1 10

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

31

0 0 0

o

0 1 0,

also eine dezimale + 2. Die Dualzahl

15

31

1 1 1

o

10 1

stellt eine dezimale — 3 dar, denn ihr Komplement ist 15 31

0 0 0

Ol

o

1,

also eine dezimale + 3. Zur Übung stelle man die Zahlen — 4 bis - 10 im Dual-Code dar und überprüfe sie durch Rückkomplementierung.

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

22

1. Die Darstellung von Daten in Bytemaschinen

10 und der 2 den Stellenwert 1 zu, so erhält man die Dezimalzahl 9 • 1000 + 1 • 100 + 7 • 10 + 2 • 1 ; in Worten: neuntausendeinhundertzweiundsiebzig. Wählt man andere Stellenwerte, z.B. 10, 1, 1 / 10 , Vioo, so ergibt sich die Dezimalzahl 9 - 1 0 + 1-1 + 7-Vio+2-Vioo; die üblicherweise als 91,72 (in Worten: einundneunzig-Komma-siebenzwei) geschrieben wird. Aus den Beispielen erkennt man, daß es sich bei den Stellenwerten durchweg um 1 Oer-Potenzen handelt. Dezimalzahlen lassen sich daher allgemein als Polynome der folgenden Art beschreiben: Z,o = Z n - l • 1 0 n _ 1 + . . . + z 2 • 102 + Z j • 101 + Z 0 • 10° +

Z_j

• 10" 1 + . . .

Darin bedeuten: Z10: 10: z,: 101: n: m:

Dezimalzahl Basis des Zahlensystems Dezimalziffer, 0 < zt < 9 Stellenwert der Ziffer Z; Zahl der Ziffern „vor dem Komma" Zahl der Ziffern „nach dem Komma"

Nun läßt sich nicht nur auf der Basis 10, sondern auf der Basis jeder natürlichen Zahl größer 1 ein Zahlensystem aufbauen. Zwei solcher Zahlensysteme, nämlich das duale und das sedezimale, wurden bereits vorgestellt. Die allgemeine Form der Zahlensysteme lautet: Zb = z n _ 1 b n k

n - l

+ . . . + z 2 b 2 t z ^ b 1 + z 0 b° + z _ 1 - b " 1 +

• • •+ z-m•b-m Darin bedeuten: Zb: b: zi: b': n: m:

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

1.6 Exkurs: Zahlensysteme

23

Übersicht über die im ASSEMBLER relevanten Zahlensysteme: Dezimalsystem

Dualsystem2

Sedezimalsystem

Basis

10

2

16

Ziffern

0 bis 9

Obis 1

0 bis F

Stellenwerte

...lOMO 1 10° 10" 1 ... . . . 2 3 2 2 2 1 2 °

. . . l ó 2 ^ 1 1 6 ° 16" 1 ...

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

Dualziffer (Sedezimalziffer) als Dezimalzahl geschrieben

b: 1

dualer (sedezimaler) Stellenwert als Dezimalzahl geschrieben

Beispiele: (1)

Die Dualzahl 011101 ist in eine Dezimalzahl umzurechnen. 011101 2 = 0 • 2 S + 1 • 2 4 + 1 • 2 3 + 1 • 2 2 + 0 • 2 1 + 1 • 2° = 0+16 + 8 + 4 + 0 + 1 =

(2)

2910

Die Sedezimalzahl A2E ist in eine Dezimalzahl umzurechnen. A2E 1 6 = A - 1 6 2 + 2 -16 1 + E - 1 6 ° = 10-25b + 2 - 1 6 + 1 4 - 1 = 2 6 0 6 1 0

2

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

24

(3)

1. Die Darstellung von Daten in Bytemaschinen

Die Sedezimalzahl E.3 ist in eine Dezimalzahl umzurechnen. E.3 16 = E• 16° + 3 • 16 _1 = 14 1 + 3 - 7 i 6 = 14.1875 10

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

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

1.6 Exkurs: Zahlensysteme

25

Z 1 0 = z 0 + b (z, + b (z2 + b (z 3 + b • z 4 ))) > v ' Yo v ' v Yi = z t + b(z 2 + b(z 3 + b -z 4 )) > v ' y 2 = z 2 + b(z 3 -t-^b -z 4 ) y3 = z3 + b

z^ /4

Der schematische Ablauf des Algorithmus stellt sich dann wie folgt dar: Z10 = Yo : b = yi

Rest z 0

Yi : b = y 2

Rest zl

y ^ b = y3

Rest z 2

y3 : b = y4 y4 : b = 0

Rest z 3 Rest z 4

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

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

Rest 0 (z 0 )

19 : 2 = 9

Rest 1 (zO

9:2 = 4

Rest 1 (z 2 )

2

Rest 0 (z 3 )

2:2=

1

Rest 0 (z 4 )

1:2=

0

Rest 1 (z s )

Es ist also 38 1 0 = 1001102 Probe: 1 • 2 5 + 0 • 2 4 + 0 • 23 + 1 • 2 2 + 1 • 2 1 + 0 • 2° = 32 + 0 + 0 + 4 + 2 + 0 = 38 1 0

1. Die Darstellung von Daten in Bytemaschinen

26

(2)

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

Rest 6 (z 0 )

2 : 16 = 0

Rest 2 ( z ^

Es ist also 38 1 0 = 26 1 6 Probe: 2 -16 1 + 6 - 1 6 ° = 32 + 6 = 38 1 0 c) Umrechnung von Dezimalbrüchen in Sedezimalbrüche Diese Umrechnung ist vor allem für das Verständnis der sedezimalen Gleitpunktarithmetik von Bedeutung. Ausgangspunkt der Rechnung ist wieder die polynomiale Darstellung; diese sieht für Dezimalbrüche wie folgt aus: ,Z 1 0 = z_i • b " 1 + z _ 2 • b - 2 + . . . + z _ m • b - m oder als Hornerschema geschrieben: •Z,o = b "

1

^ , + b _ 1 ( z _ 2 + b - 1 (z_ 3 + . . . + b - 1

z _ m ) ) ) . . .)

Die Ziffern z_l bis z _ m werden nun nicht durch fortgesetzte Modulodivision, sondern durch fortgesetzte Multiplikation mit der Basis b gewonnen. Betrachtet man das obige Hornerschema, so ist leicht einzusehen, daß sich bei der Multiplikation von ,Z 10 mit b als Produkt z_ i + b _ 1 ( z _ 2 + b - 1 (z_ 3 + . . . + b _ 1 • z _ m ) ) . . .) ergibt. Spaltet man z _ i ab und multipliziert man den Rest wieder mit b, so ergibt sich z _ 2 usw. Geht man ohne Beschränkung der Allgemeinheit von einem Polynom (minus) dritten Grades aus und bezeichnet man alle im Laufe des Algorithmus auftretenden Multiplikanden mit yj, dann läßt sich dieses Polynom wie folgt auflösen: .Z 1 0 = b - 1 (z_i + b - 1 (z_2 + b _ 1 • z _ 3 ) ) J

1.6 Exkurs: Zahlensysteme

27

Der schematische Ablauf des Algorithmus stellt sich dann wie folgt dar: y _ i • b = z _ ! + y_2 y_2 • b = z_2 + y_3 y _ 3 - b = z_3 Der Dezimalbruch .Z 10 wird also im b-Zahlensystem durch die Ziffernfolge z _ ! z _ 2 z _ 3 repräsentiert. Beispiele: (1)

Gegeben sei der Dezimalbruch 0.3; gesucht wird der entsprechende Sedezimalbruch .3 • 16 = 4 + .8 .8-16 = 12 + .8 .8^16^1.8 usw.

Schreibt man die gefundenen Werte z_i als Sedezimalziffern, so erhält man 0.3 1 0 (2)

=

0.4CC . . . , 1 6

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

Rest

5

Rest 13(D)

b) Umrechnung des Dezimalbruchs: 0.04-16=

0

+0.64

0.64 0 6 ^ 1 0 ( A ) j t 0.24 0 . 2 4 ^ 1 6 j = ^ J ^ + 0.84 0.84-16 = 13(D) + 0.44 usw.

28

1. Die Darstellung von Daten in Bytemaschinen

Es ist also 213.04 1 0 = D5.0A3D . . . , 1 6 Probe: 13 • 161 + 5 • 16° + 0 • 1 6 _ 1 + 1 0 • 1 6 - 2 + 3 • 1 6 - 3 + 1 3 • 1 6 - 4 « 208 + 5 + 0 + 0.0391 + 0.0007 + 0.0002 =

213.04,0

d) Umrechnung von Dualzahlen in Sedezimalzahlen Für die Umrechnung einer Dualzahl Z 2 in eine Sedezimalzahl Z , 6 benutzt man am einfachsten wieder die polynomiale Darstellung. Z16 = z „ - i

l6n-1 + . . . + z016°

Die Sedezimalziffern z n _ i bis z 0 erzeugt man sich aus der Dualzahl, indem man diese von rechts nach links in Tetraden einteilt (dabei ist die äußerst linke bit-Gruppe eventuell mit fuhrenden Nullen aufzufüllen) und diese dann in die entsprechenden Sedezimalziffern umcodiert. Beispiel: Gegeben sei die Dualzahl 111011011. Diese wird eingeteilt und umcodiert: 0001! 1101! 1011 i i 1

D

B

Dann ist Z 2 = 1 162 + D 1 6 1 + B 1 6 ° = 1DB 16 Zur Probe werden beide Zahlen in Dezimalzahlen umgerechnet: Z 2 = 1 • 2 8 + 1 • 2 7 + 1 • 2 6 + 0 • 2 S + 1 • 2 4 + 1 • 2 3 + 0 • 2 2 + 1 • 2 1 + 1 • 2° = 256 + 128 + 64 + 0 + 16 + 8 + 0 + 2 + 1 = 475 1 0 oder Z , 6 = 1 • 162 + D 1 6 1 + B 1 6 ° = 1 - 2 5 6 + 13 16 + 11-1 = 2 5 6 + 2 0 8 + 11 = 475,0

e) Umrechnung von Sedezimalzahlen in Dualzahlen Für die Umrechnung einer Sedezimalzahl Z 1 6 in eine Dualzahl Z 2 empfiehlt sich ein analoges Vorgehen. Z 2 = z n _ 1 - 2 n - 1 + . . . + z 0 -2°

1.7 Die Zahlendarstellung im Gleitpunktregister

29

Die Dualziffern z n _ t bis z 0 erzeugt man sich aus den Sedezimalziffern, indem man diese in die entsprechenden Tetraden auflöst. Beispiel: Gegeben sei die Sedezimalzahl 2FA; diese Zahl wird in folgende Tetraden aufgelöst: 0010 ¡ l l l l i 1010 , i Dann ist Z 1 6 = 1 -2 9 + 0 - 2 8 + 1 -2 7 + 1 -2 6 + 1 -2 S + 1 -2 4 + 1 -2 3 + 0 - 2 2 + 1 • 21 + 0 • 2° = 1011111010 2 Zur Übung rechne man beide Zahlen in Dezimalzahlen um.

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

V Exp.

63 62

56 55

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

V Exp.

63 62

56 55

0

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

1. Die Darstellung von Daten in Bytemaschinen

30

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

0 +

32

r100 | 0001 65- 0

0110

1110

6

E

.. .0

00..

+ 6 - 1 6 ° + E • 1 6 _ 1 = + 6.E16 = + 6.87510 63 1 "

32 011 | 1111

1000

63 ~ - 2

... 0

0....

8 -

8

-2

16"

_

_

0.0816 = — 0.0312510

63 0 +

32 100 ! 0010 l 66- 1

1101

0101

0000

1010

0011

1101

D

5

0

A

3

D

+ D • 161 + 5 • 16° + 0 • 16 _ 1 + A • 1 6 - 2 + 3 • 16~ 3 + D • 16~ 4 = + D 5 . 0 A 3 D 1 6 ~ + 213.04,0

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

Kanalworte werden in dieser Einführung nicht behandelt.

32

2.2 Die Instruktionstypen und ihre Formate

Zur Darstellung des Aufbaus der Maschineninstruktionen werden üblicherweise Symbole verwendet, deren Bedeutung nachfolgend beschrieben wird. Op.-Code R B X D I L M

— Operationscode der Instruktion — Operandenregister — Basisadreßregister (Basisregister) — Indexadreßregister (Indexregister) — Distanzadresse (displacement) — Direktoperand (immediate operand) — Länge eines Speicheroperanden (in Bytes) — Bedingungsmaske bei Sprungbefehlen

Die Buchstaben R, B, X, D, I, L und M werden mit 1, i oder 3 indiziert, um die Operanden zu bezeichnen. Als Besonderheit bei den Registern gilt zu beachten, daß es sich bei den Basisregistern (B) und Indexregistern (X) stets um die Festpunktregister 0 bis 15 handelt. Die Operandenregister (R) können je nach Operation sowohl Festpunkt* als auch Gleitpunktregister sein. Die Vergabe der Symbole B, X und R richtet sich nur nach der aktuellen Verwendung: Wenn eines der Festpunktregister als Operandenregister für eine arithmetische oder logische Operation benutzt wird, nennt man es R; wenn es als Basisregister verwendet wird, heißt es B und wenn es als Indexregister fungiert, heißt es X. Die Symbole B, X und R sind somit nur funktionallogische Bezeichnungen. In einem Programm kann möglicherweise ein und dasselbe Festpunktregister alle 3 Funktionen ausüben.

2.2 Die Instruktionstypen und ihre Formate Byte-Maschinen haben 5 Instruktionstypen, die entsprechend der mit ihnen angesprochenen Operandenarten mit den mnemotechnischen Kürzeln RR (Register und Register), RX (Register und indizierter Speicher), RS (Register und Speicher), SI (Speicher und Direktoperand), SS (Speicher und Speicher) gekennzeichnet werden. Bei den SS-Instruktionen unterscheidet man die Versionen SS (logisch) und SS (arithmetisch), so daß man insgesamt auch von 6 Instruktionstypen sprechen kann. Alle Instruktionen haben einen Operationsteil und einen Operandenteil.

Operationsteil 1 Byte

Operandenteil

2.2 Die Instruktionen und ihre Formate

33

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

7 6

Instruktionslänge

Instruktionstyp

0 0 1 1

2 4 4 6

RR RX RS, SI SS

0 1 0 1

Bytes (1 Bytes (2 Bytes (2 Bytes (3

Halbwort) Halbworte) Halbworte) Halbworte)

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

34

2. Maschineninstruktionen und Operandenadressierung

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

2. Byte

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

2. Maschineninstruktionen und Operandenadressierung

38 Addieren gepackt

F

!

im !

1

Speicheradresse des 1. Operanden A — • l 0 1 ¡

L, - 1 ,

,

A

4

2

— -

8

!

1010

0100

0010

1000

•••• 1

!

sedezimal

binär:

L, - 1

0000

0001

6

8

0110

1000

Speicheradresse des 2. Operanden /\ 1 — 1 ; 1 0

0001

0000

A

1010

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

L, - 1

1. Byte

2. Byte

B2 3. Byte

d2

K-

6. Byte

S.Byte

4. Byte

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

binär:

D

•:

s

noi •! oioi

Speicheradresse des 1. Operanden A

Li - 1 A

o

:

i 0000 ¡

A

7

1010

Olli

:

Speicheradresse des 2. Operanden A

i

D

0

0001

1101

0000

1

Olli

!

1

F

0001

1111

!

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

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

B

1010

39

2.3 Die Arbeitsspeicheradressierung

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

Basisregister-Nr., 0

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

1051

1052

V— Operand

Dann wird die Speicheradresse dieses Operanden wie folgt dargestellt: + Dj = + Di = 1000 + 50. Die Verschlüsselung dieser Adresse in der Maschineninstruktion lautet: sedezimal:

binär:

allgemein:

7 ¡ 0 1 Olli ¡ 0000 1 ¡ I"

B

3

1 1: 2



1 oon ; ooio

D¡ »i

»

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

40

2. Maschineninstruktionen und Operandenadressierung

Mit einem Basisregister lassen sich daher alle Operanden adressieren, die im Bereich der Speicheradressen (Bj > + 0 bis < B; > + 4095 liegen, mit den Zahlen des obigen Beispiels also alle Operanden, die absolute Speicheradressen zwischen 1000 und 5095 haben. Überschreiten die Operandenadressen den höchsten Wert des Bereiches, so müssen ein oder mehrere zusätzliche Basisregister deklariert werden. Ferner muß der Programmierer dafür sorgen, daß die zusätzlichen Basisregister in der Ausfuhrungsphase des Programms die gewünschten Basisadressen erhalten. Werden beispielsweise die Register 8 und 9 als zusätzliche Basisregister deklariert, so muß der Programmierer Instruktionen vorsehen, die z. B. folgende Operationen ausfuhren: = 28

. > 3 1 4 ^ 8 4 5 ^ 3 ,8 3 >46 6

0 6 C 12

m 1F 18

26 2B 2E

F2 F2 FA D2 47

23 24 22 02 F0

70|[C] 70(22] 701F 7026 701C 701F 702B 701C 702E

F1F1F2F5 F2F1F0F4F1 D5

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

42

2. Maschineninstruktionen und Operandenadressierung

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

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

6

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

43

2.3 Die Arbeitsspeicheradressierung

U vO n vD vO O OS OS r- r- r- r- r.S *o

oc rJ \û o o -ôV oo OO O

1 3g I •«

8 -hO ~O ÎSO

a

o

II

s

a aa .5 • M'

— m — es vo >5 r*-

tÎÎÎÎÎÎlÎ gj

5

IO

ÍS s?

°

oí .. 7

44

2. Maschineninstruktionen und Operandenadressierung

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

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

2.5 Die Ausrichtung von Operanden im Arbeitsspeicher

45

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

H V D

1

2

H

3

4

H V

5

6

H

7

8

H V D

9

10

H

11

12

H V

13

14

H

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

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

Der Name ASSEMBLER für eine bestimmte Programmiersprache führt oft zu Mißverständnissen, da im allgemeinen diese Bezeichnung für die Übersetzerprogramme von maschinenorientierten Programmiersprachen aller möglichen Computersysteme verwendet wird. Um Verwechslungen auszuschließen, wird in dieser Arbeit die Programmiersprache durch die Buchstabenfolge ASSEMBLER und das Übersetzelprogramm durch das Wort Assembler gekennzeichnet.

3.2 Die Elemente der Sprache

47

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

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

Die Bindephase sorgt dafür, daß andere separat übersetzte Programm-Moduln, die durch das Programm angesprochen werden, mit dem erstgenannten Programm(-Modul) zu einem lauffähigen Programm verknüpft werden. Die Ladephase speichert das gebundene Programm ab einer bestimmten Ladeadresse in den Arbeitsspeicher.

48

3. Die Programmiersprache ASSEMBLER

3.3 Ausdrücke Ausdrücke sind jene Bestandteile der ASSEMBLER-Sprache, mit denen der Programmierer im Rahmen bestimmter syntaktischer Regeln beim Niederschreiben von Befehlen die von ihm gewünschten Arbeitsspeicheradressen, Registernummern, Distanzadressen, Direktoperanden, Konstanten und Längenschlüssel angeben kann. Man unterscheidet einfache Ausdrücke (terms) und komplexe Ausdrücke. Bei letzteren sind mehrere terms durch die arithmetischen Operatoren + - * ( ) miteinander verknüpft. Komplexe Ausdrücke werden selten benötigt, da sie eigentlich nur der Erstellung ganz allgemein gehaltener Quellenprogramme dienen. Bei der Übersetzung in Objektprogramme erhalten einfache wie komplexe Ausdrücke bestimmte feste Werte (Adressen, Registernummern etc.) zugeordnet. Eine größere Flexibilität der Objektprogramme läßt sich also durch die Verwendung komplexer Ausdrücke nicht erzielen. Aus diesem Grunde werden in dieser Einführung nur die einfachen Ausdrücke behandelt. Einfache Ausdrücke sind die folgenden: (1) Symbole, (2) Direktwerte, (3) der Stand des Zuordnungszählers, (4) die Längen von Instruktionen, Datenfeldern und Konstantenfeldern, (5) Literale. Um diese Ausdrücke bei der Erstellung von ASSEMBLER-Programmen sicher handhaben zu können, ist eine etwas ausführlichere Behandlung erforderlich. 3.3.1 Symbole Symbole sind Kombinationen aus 1 bis 8 zulässigen Zeichen. Zulässige Zeichen sind die Buchstaben A bis Z, die Sonderzeichen # und die Ziffern 0 bis 9. Das erste Zeichen muß ein Buchstabe oder eines der drei zulässigen Sonderzeichen sein. Leerzeichen innerhalb eines Symbols sind nicht erlaubt. Das Umwandlungsprogramm ordnet jedem Symbol einen Wert zu; dies geschieht entweder automatisch oder auf Veranlassung des Programmierers. (1) automatische Wertzuweisung: In diesem Fall stellen die Symbole stets relative Arbeitsspeicheradressen von Datenfeldern, Konstantenfeldern und Maschineninstruktionen dar; dabei handelt es sich um jene Adressen, auf denen die Felder und Instruktionen relativ zum Programmanfang abgesetzt werden. (2) Wertzuweisung durch den Programmierer: In diesem Fall werden die Symbole in der Regel zur expliziten Bezeichnung von Registern, Distanzadressen und Längenangaben benutzt. Die Wertzuweisung erfolgt aufgrund einer entsprechenden Assembleranweisung. Der Programmierer hat jedoch darauf zu achten, daß der zuzuweisende Wert nicht negativ und nicht größer als 2 2 4 — 1 ist.

49

3.3 Ausdrücke

Beispiele für Symbole: @123, DP, L1, BASISI, FELD, F1@#

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

EQU EQU EQU

5 9 200

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

MVC DS

DP(L1 ,BASIS1 ),FELD CL256

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

0(7,8),FELD

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

ZAHL1.ZAHL3+5

3. Die Programmiersprache ASSEMBLER

50

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

EQU

5

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

BYTE,C'1'

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

BYTE,255

Darin ist: I 2 = 255 MVC

2(200,81,0(7)

Darin sind: Dj = 2, Lt = 200, B t = 8, D 2 = 0, B2 = 7 SR

15,4

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

4,3(5,8)

Darin sind: R, = 4, D2 = 3, X2 = 5, B2 = 8 ADR

EQU

10000

51

3.3 Ausdrücke

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

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

c) Binäre Diiektwerte Binäre Direktwerte sind voizeichenlose Dualzahlen im Bereich von 0 bis 11 .

1 24

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

WERT

CLI MVC EQU

BYTE,B'11111111' 2(200,8),0(B'111') B'111011110001'

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

52

3. Die Programmiersprache ASSEMBLER

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

0(7),C'+' FELD+1,C'A' BYTE.C'V 7(8),C' '

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

Distanzadressen (rei. zur Basisadresse)

18 22 28

10

14 20

ASSEMBLERBefehle BE AP MVC

*+10 FELD1,ZAHL1 DRBER.FELD1

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

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

3.3 Ausdrücke

53

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

19 +1

20 +2

1 4 ¡7

1 8 ! 0 a|o

\

21 +3

22 +4

1 1 ! 4 F ¡A 1

23 +5

24 +6

25 +7

1 5 ! 5 AIO 1

BE

26 +8

27 28 +9 +10

5! 1 a ! o

6 : ? D12 1 A

a|o

o! 5

4|3

- 1 — A | 0 s : 1 i *

AP

M VC

Beispiel: Adressen (rel. zum Programmanfang)

Distanzadressen (rel. zur Basisadresse)

26 30 36 40

10 14 20 24

ASSEMBLERBefehle LA MVC CLI BNE

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

Der Befehl BNE * - 1 4 bewirkt, daß das Programm zur Instruktion LA 5,1 (0,5) verzweigt, sofern eine bestimmte Bedingung erfüllt ist. Der Assembler berechnet aus der Angabe *—14 die relative Speicheradresse 26 und zieht davon die relative Basisadresse ab, die hier mit 16 angenommen wird; also 26 - 16 = 10 (sedezimal: A). Wird als Basisregister das Register 8 deklariert, so wird als Sprungadresse 800A in die echte Maschineninstruktion eingesetzt. relative Adressen (dezimal, dezimal und relativ zum * ) : 26 27 28 29 30 31 32 33 34 35 36 37 38 39 -14-13-12-11-10-9 -8 -7 -6 -5 -4 -3 -2 -1 1 —1— 4 1 1 5! 0 1 LA

5 »1 0 o l l •

d; 2

1 —1— 0] 1 S i l 1

1 f ;•i

MVC

1 1 —1— 5 ] 0 0 1 0 9 ! 5 4 ; E 8 :1 1 1 CLI

40 *

1—

F : 1 4 ]»7

7;o8 BNE

1 1 \0 o ; a » •

3. Die Programmiersprache ASSEMBLER

54

Der Sinn der Verwendung des Zuordnungszählers bei der symbolischen Adressierung besteht vor allem darin, dem Programmierer das Erfinden von Symbolen zu ersparen. Im übrigen ist jedoch vor dieser Adressierweise zu warnen; denn einmal können dem Programmierer bei der Berechnung der relativen Speicheradressen sehr leicht Fehler unterlaufen, zum anderen kommt durch diese Adressierweise eine gewisse Starrheit in das ASSEMBLER-Programm, da die Distanzen nach jeder Einfügung, Herausnahme oder Typenänderung von Instruktionen im Zuge von Programmkorrekturen neu berechnet werden müssen. 3.3.4 Längenattribute Der Programmierer kann bei der Erstellung von ASSEMBLER-Programmen auf die Längenattribute von Datenfeldern, Konstantenfeldern und Maschineninstruktionen Bezug nehmen. Dies geschieht mit Hilfe der Ausdrücke L' Symbol und L' *± Distanz. Die mit diesen Ausdrücken erzeugten Werte werden vom Programmierer vor allem für die explizite Angabe von anderen Längenattributen und von Distanzadressen in Maschinenbefehlen verwendet. Wird die Form L' Symbol verwendet, so bekommt dieser Ausdruck einen Wert, der der Länge des (bzw. der) mit „Symbol" symbolisch adressierten Feldes (bzw. Instruktion) entspricht. Wird die Form L' *± Distanz benutzt, so bekommt dieser Ausdruck einen Wert, der der Länge des (bzw. der) mit „*± Distanz" relativ adressierten Feldes (bzw. Instruktion) entspricht. Beispiele: MVC

FELD1(L'FELD2),FELD2

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

FELD,L'FELD(5,8)

d.h. der Inhalt des mit m, dann werden vor dem Absetzen und vor einer etwaigen Duplizierung rechts n — m Leerstellen angefügt. Beispiel: Das Literal wird abgesetzt als

=3CL6'ABCDE' A

B C

D E

A B C D

E

A B C D

E i_i

58

3. Die Programmiersprache ASSEMBLER

Weitere Beispiele: Das Literal wird abgesetzt als

=CL1'J0E'

Das Literal wird abgesetzt als

=C'ABC+1'

IT

A B C +

1

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

=CL3'A'

b) Literal mit Sedezimalkonstante Allgemeines Format:

=kXLn'z!

zm'

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

=X'B1FC' 111

Das Literal wird abgesetzt als

F]C

=X'C1F03' "I—1——1——'— 0 ; C

I

1I F

I

0 !3

I

Die Zahl der belegten Bytes darf 256 nicht überschreiten; m darf also maximal 512 sein. Bei Verwendung eines expliziten Längenschlüssels dominiert dieser; d.h. wenn n kleiner als die Zahl der belegten Bytes ist, dann werden vor dem Absetzen 10

Das Zeichen [ . . . . ] bedeutet „ganzzahliger Teil von . . . .".

59

3.3 Ausdrücke

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

=XL2'F0C1B' o |c i ;B

Das Literal wird abgesetzt als

=2XL1'11FO' F l 0 _1_

F , 0

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

=XL3'F01' 0 !o 0 ! F ol 1

Das Literal wird abgesetzt als

=2XL2'FF' o !o

F ¡F

0 ¡0

F !f t

c) Literal mit Binärkonstante Allgemeines Format:

=kBLn'z!

zm'

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

=B'11010001' 1101 I 0001 I =B'110011110' 0000 i 0001

1001

1110

Die Zahl der belegten Bytes darf maximal 256 betragen.

60

3. Die Programmiersprache ASSEMBLER

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

=BL1'1000101111' 0010 I 1111

Das Literal wird abgesetzt als

=2BL1'111010000' 1101

0000

1101 ; 0000

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

=BL2'101' 0000 i 0000

Das Literal wird abgesetzt als

0000 i 0101

=2BL2'11101101' 0000 I 0000

1110

1101

0000 I 0000

1110 i 1101

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

= kFLn'± Zj = kHLn'±z,

zm' zm'

11

Für z; können die Dezimalziffern 0 bis 9 eingesetzt werden. Zur Bezeichnung negativer Konstanten muß ein „-"-Zeichen und zur Bezeichnung positiver Konstanten kann ein „+"-Zeichen angegeben werden. Die damit dargestellten Dezimalzahlen werden bei der Ubersetzung des Programms in Dualzahlen umgewandelt und in Bytes gespeichert, die sich auf Wort- bzw. Halbwortgrenzen befinden. 11

Es handelt sich um vereinfachte, aber voll funktionsfähige Formate, die für diese Einführung gewählt wurden. Die vollständigen Formate sehen darüber hinaus Präzisionsfaktoren und Exponenten vor, mit denen Einfluß auf den dargestellten Zahlenumfang genommen werden kann. Einzelheiten sind den einschlägigen Handbüchern zu entnehmen.

61

3.3 Ausdrücke

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

Das Literal wird abgesetzt als

=H'-1' 1 im ! im

im ! im

(ausgerichtet)

=F'10' oooo ! oooo

oooo 1 oooo 0000 ! 0000

0000 ! 1010 (ausgerichtet)

Das Literal wird abgesetzt als

=H L4'2' oooo ! oooo

oooo •! oooo

oooo ; 0000 . .1

0000 ! 0010 i (nicht ausgerichtet)

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

=2H'2' oooo j oooo

0000 ; 0010 1

oooo ! oooo 1

1 oooo ; ooio (ausgerichtet)

3. Die Programmiersprache ASSEMBLER

62

e) Literale mit Gleitpunktkonstanten (E und D) Allgemeines Format (kurze Mantisse): =kELn'± Zj

z m E ± yiy2'

Allgemeines Format (lange Mantisse): =kDLn'± Zl

z m E ± y1y2'

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

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

stellen ein und dieselbe Konstante dar; sie werden daher abgesetzt als —I— 4l2 DiS 0 ' A 3 !d (vgl. dazu Seite 28). f) Literale mit Dezimalkonstanten (P und Z) Allgemeines Format (gepackt): = kPLn± z, Allgemeines Format (gezont): = kZLn'±Zj

zm' zm'

63

3.3 Ausdrücke

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

=P'+12' 0 •11 2 I! c

Das Literal wird abgesetzt als

=P'—123'

Das Literal wird abgesetzt als

=P'1234'

Das Literal wird abgesetzt als

=Z'+12'

Das Literal wird abgesetzt als

=Z'1234'

i —i— 1|2 3¡D

0|l 2 ¡3 4 ]c

i F I 1 C]2 • I •

—;—r-1——1——r— F i 1 F| 2 F 1 3 C \ 4

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

3. Die Programmiersprache ASSEMBLER

64

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

=PL3'125735' 2 I 5 7 ¡3

l_

l_

5 IC _L

Das Literal wird abgesetzt als

=P L3'—12' —i— o ; o oli 2 ¡D i _l

Das Literal wird abgesetzt als

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

I

I

Das Literal wird abgesetzt als

=ZL3'—12' F

;o

F, 1

DI2

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

=P'—13.75' 0|1

3¡7

5 ¡D

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

= A (Ausdruck) = Y (Ausdruck) = V (Ausdruck)

65

3.3 Ausdrücke

Als Ausdrücke können eingesetzt werden: (1)

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

(2)

Zuordnungszähler mit und ohne Distanz. Beispiele: = A(*); = A(*—17); = A(*+5000) .

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

5,=A(FELD)

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

5

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

3. Die Programmiersprache ASSEMBLER

66 L

4,=A(RECHFLD—1)

Laden des Wertes der Adreßkonstante in das Register Nr. 4. MVC

0(200,4),ZAHL

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

5,=V(EING1) 7,5

ist äquivalent mit EXTRN EING1

L BALR

5,=A(EING1) 7,5

Im übrigen ist zu den Konstanten noch anzumerken, daß die Typen A und V in Wortlänge (4 Bytes) abgesetzt werden und daß sie auf Wortgrenzen ausgerichtet sind. Die Konstanten des Typs Y werden in Halbwortlänge (2 Bytes) abgesetzt und sind auf Halbwortgrenzen ausgerichtet. Die Ausrichtung entfällt bei allen Typen, wenn ein expliziter Längenschlüssel verwendet wird, z.B. = AL4(Ausdruck).

3.4 Maschinenbefehle Die symbolischen Maschineninstruktionen der Programmiersprache ASSEMBLER, die zur Unterscheidung von den echten Maschineninstruktionen als Maschinenbefehle bezeichnet werden, bestehen aus folgenden Komponenten: (1) (2) (3)

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

67

3.4 Maschinenbefehle

Im folgenden soll gezeigt werden, wie sich diese Komponenten bei den einzelnen Befehlen aneinanderfügen, insbesondere aber, wie die Operanden gebildet werden und was sie bedeuten. Bei der Operandenbildung und der symbolischen Adressierung dienen die zuvor behandelten Ausdrücke zur Angabe von Arbeitsspeicheradressen, Registernummern, Distanzadressen, Direktoperanden, Konstanten und Längenschlüsseln durch den Programmierer. Allerdings sind einige der Ausdrucksarten auf bestimmte Verwendungen beschränkt, was bei der Darstellung des Befehlsaufbaus entsprechend angezeigt wird. Wenn also im folgenden beispielsweise der Aufbau eines Befehls durch Symbol Op.-Code Symbol 1, Direktwert2 oder abgekürzt durch S

Op.-Code S,, I 2

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

— Nummer eines expliziten Basisregisters - explizite Distanzadresse — Direktoperand — expliziter Längenschlüssel — Literal — explizite Bedingungsmaske (bei bedingten Verzweigungsbefehlen) - Nummer eines Operandenregisters — symbolische Adresse — Nummer eines Indexregisters.

Die bei diesen Abkürzungen verwendeten Indizes l, 2 und 3 bezeichnen die Nummer des Operanden. 3.4.1 Die Syntax der Maschinenbefehle Im folgenden werden für alle Instruktionsarten die gebräuchlichsten Möglichkeiten der Operandenbildung und die daraus resultierenden Formate dargestellt. Zur Abkürzung werden dabei die Pfeile => und ->• verwendet; => steht für „bezeichnet" und steht für „wird dargestellt durch". RR-Instruktionen Allgemeines Format: Symb.Adr.

Op.Code Operandi, Operand2

68

3. Die Programmiersprache ASSEMBLER

Operand 1 =»• Registernummer R j Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand 2 => Registernummer R 2 Ausdruck vgl. oben!

Ausdruck

Das symbolische Befehlsformat lautet: S

Op.Code R h R 2

Einfaches Beispiel: LR

1,5

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

Op.Code Operand 1, Operand 2

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

Symbol

oder Operand 2 => Direktkonstante LT2 ->• Literal Die symbolischen Befehlsformate lauten: a) bei expliziter Adressierung (d.h. die Speicheradresse wird vom Programmierer durch D, B und evtl. X dargestellt)

3.4 Maschinenbefehle

S S S

Op.Code Op.Code Op.Code

69

R,, D 2 (X 2 , B 2 ) Rj, D 2 ( 3 2 ) Rj, D 2 (X 2 )

indiziert nicht indiziert indiziert ohne Basisregister

Einfache Beispiele: L

5,0(10,2)

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

A

5,4(,2)

Der Inhalt des mit + D 2 = + 4 adressierten Speicherfeldes wird auf den Inhalt des Registers 5 addiert. LA

3,10(3)

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

Op.Code Op.Code

R,, S 2 (X 2 ) R 1} S 2

indiziert nicht indiziert

Einfache Beispiele: AB

S

5,W0RT(1O)

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

3.K0NST

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

Op.Code

R u LT 2

Einfaches Beispiel: L0ESCH

L

7,=F'0'

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

3. Die Programmiersprache ASSEMBLER

70

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

Op.Code Operand 1, Operand 2

b) erweiterter Bedingungscode: S

Op.Code Operand 2

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

Op.Code

ML S 2

b) erweiterter Bedingungscode S

Op.Code

S2

Einfache Beispiele: BC BE

8,NEU NEU

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

71

3.4 Maschinenbefehle

Der erweiterte Bedingungscode impliziert den Bedingungsschlüssel M,. Bei der Übersetzung wird dieser zunächst aus dem Befehlscode ermittelt und dann in die betreffende echte Maschineninstruktion eingesetzt (vgl. S. 170). RS-Instruktionen Allgemeines Format: Symb.Adr. Op.Code Operand 1, Operand 3, Operand 2 Operand 1 =» Registernummer R j -»• Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand 3 => Registernummer R 3 -»• Ausdruck Ausdruck vgl. oben! Operand 2 => Speicheradr. D2 (B 2 ) ->• Ausdruck 1 (Ausdruck 2) Ausdruck 1 ist meistens ein Direktwert, ein Symbol, ein Längenattribut (L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 ist meistens ein Direktwert oder ein Symbol. oder Operand 2 => Speicheradresse S 2

Symbol

oder Operand 2 => Direktkonstante LT2 -*• Literal Die symbolischen Befehlsformate lauten a) bei expliziter Adressierung: S

Op.Code

R 1 ; R 3 , D2 (B 2 )

Einfaches Beispiel: LADEN LM

5,7,12(9)

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

Op.Code

R I , R 3 , S2

Einfaches Beispiel: STM

5,7,WORTE

Die Inhalte der Register 5, 6 und 7 werden in 3 Speicherworte gebracht, deren symbolische Adresse WORTE lautet. Bei der Übersetzung wird dem Symbol WORTE ein Basisregister und eine Distanzadresse zugeordnet, so daß die Adresse intern aus D2 und B2 berechnet wird.

3. Die Programmiersprache ASSEMBLER

72

c) bei Literalverwendung: S

Op .Code

R 1( R 3 , LT2

Einfaches Beispiel: LM

3,5,=3F'0'

In die Register 3, 4 und 5 werden Nullen geladen. Statt einer Operandenadresse wird hier eine Direktkonstante verwendet, die bei der Übersetzung irgendwo im Arbeitsspeicher dargestellt wird. Die echte Maschineninstruktion erhält zur Berechnung der betreffenden Speicheradresse ein Basisregister und eine Distanzadresse. RS-Instruktionen in der Sonderform als shift-Befehle Allgemeines Format: Symb.Adr. Op.Code Operand 1, Operand 2 Operand 1 => Registernummer Ri -*• Ausdruck Ausdruck ist meistens ein Direktwert oder ein Symbol. Operand 2 =*• Verschiebezahl D2 (B2) Ausdruck 1 (Ausdruck 2) Ausdruck 1 ist meistens ein Direktwert oder ein Symbol. Ausdruck 2 wie Ausdruck 1! Die folgenden symbolischen Befehlsformate sind gebräuchlich: S

Op.Code

R „ D2 (B 2 )

Op.Code

Ri, D 2

und S

Einfache Beispiele: SH

SRL

3,5(8)

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

4,6

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

73

3.4 Maschinenbefehle

(L' Symbol) oder der Wert des Zuordnungszählers (evtl. ± Distanz). Ausdruck 2 ist meistens ein Direktwert oder ein Symbol. oder Operand 1 => Speicheradresse S! ->• Symbol Operand 2 => Direktkonstante I 2 ->• Direktwert (1 Byte) Die symbolischen Befehlsformate lauten a) bei expliziter Adressierung: S

Op.Code

Ü! (BO, 12

Einfaches Beispiel: M0VE

MVI

5(8),C'A'

Die Direktkonstante A wird in das mit < Reg. 8 > + 5 adressierte Byte übertragen. b) bei implizierter Adressierung: S

Op.Code

SL I 2

Einfaches Beispiel: CLI

BYTE.X'OC'

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

3. Die Programmiersprache ASSEMBLER

74

Operandi und Operand2 => Speicheradresse Si -> Symbol oder Operand 2 => Direktkonstante LT 2

Literal

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

Op.Code

Ü! (L,, Bi), D2 (L 2 , B 2 )

Einfaches Beispiel: PACK

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

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

Op.Code

Sx, S2

Einfaches Beispiel: PACK

FELD1,FELD2

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

Op.Code

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

Einfaches Beispiel: PACK

AI (3),B1 (4)

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

AP SP PACK

0(2,7),FELD2 FELD1 (3),0(3,7) FELD1,FELD2(4)

e) bei Literalverwendung: S S S

Op.Code Op.Code Op.Code

Ü! (Li, B0, LT 2 S„ LT2 Sj (Li), LT 2

oder oder

3.4 Maschinenbefehle

75

Einfache Beispiele: AP

SUMME,=X'710C'

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

FELD(3),=B'01111100'

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

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

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

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

Symbol

oder Operand 2

Direktkonstante LT 2 ->• Literal

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

Op.Code

Ü! (L 1; Bj), D2 (B 2 )

76

3. Die Programmiersprache ASSEMBLER

Einfaches Beispiel: M0VE

MVC

10(200,121,310(12)

In das 200 Bytes lange und mit + D j adressierte Byte übertragen. Codierungsbeispiele: MVI

STELLE,C' '

In das mit S T E L L E adressierte Byte wird ein blank übertragen. MVI

0(7),P'-1'

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

BYTE+3,X'F1'

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

Befehl: MVN Typ:

(move numerics; Übertragen Ziffernteile)

SS (logisch)

Formate symbolisch: MVN MVN MVN

D, ( L „ B,), D2 (B2) S , ^ ) , S2 S,, S2

82

3. Die Programmiersprache ASSEMBLER

Format maschinenintern: D

;

i

L, - 1

1. Byte

2. Byte

B,



D,

3. Byte

J 4. Byte

»

B*

Ì5. Byte

-

Di

I -1 6. Byte

Wirkungsweise: Die Instruktion bewirkt die Übertragung von L! rechten Halbbytes (Ziffern) ab der durch + D 2 angegebenen Adresse in das mit + D j adressierte Feld, und zwar ebenfalls in die rechten Halbbytes. Die Übertragung erfolgt von links nach rechts. Maximal können 256 Halbbytes übertragen werden.

Codierungsbeispiele: MVN

BETRAG+3(1 ),=X'OD'

Das rechte Halbbyte der als Literal definierten Sedezimalkonstante OD, also das bit-Muster 1101, wird in das rechte Halbbyte des mit BETRAG+3 adressierten Byte übertragen. Der Längenschlüssel 1 ist explizite anzugeben, wenn BETRAG einen anderen impliziten Längenschlüssel als 1 hat. MVN

FELD1,FELD2

FELD1 habe die implizite Länge 3. FELD1

FELD2

FELD1 nachher:

Weitere Codierungsmöglichkeiten wie bei MVC!

Befehl: MVZ

Typ:

(move zones; Übertragen Zonenteile)

SS (logisch)



3.4 Maschinenbefehle

83

Formate symbolisch: MVZ MVZ MVZ

Di (Li, B ^ , D 2 (B 2 ) S ^ L , ) , S2 S l S2

Format maschinenintern: L, 1 1. Byte

2. Byte

D, 3. Byte

D,

B, 4. Byte

S.Byte

6. Byte

Wirkungsweise: Die Instruktion bewirkt die Übertragung von Lj linken Halbbytes (Zonen) ab der durch + D 2 angegebenen Adresse in das mit + D, adressierte Feld, und zwar ebenfalls in die linken Halbbytes. Die Übertragung erfolgt von links nach rechts. Maximal können 256 Halbbytes übertragen werden. Codierungsbeispiele: MVZ

FELD(1 ),=X'F0'

Das linke Halbbyte der als Literal definierten Sedezimalkonstante FO, also das bit-Muster 1111, wird in das linke Halbbyte des mit FELD adressierten Byte übertragen. Es wird angenommen, daß FELD einen impliziten Längenschlüssel > 1 hat, weswegen hier explizite der Längenschlüssel 1 angegeben werden muß. MVZ

FELD1,FELD2

FELD1 habe die implizite Länge 3. FELD 1

FELD 2

FELDl nachher:

D

i

5

Weitere Codierungsmöglichkeiten wie bei MVC!

Befehl: MV0

(move with offset; Übertragen versetzt)

84

3. Die Programmiersprache ASSEMBLER

Typ:

SS (arithmetisch)

Formate symbolisch: MV0 MV0 MV0

D, ( L l B O , D 2 (L 2 , B 2 ) Sj (L^, S 2 (L 2 ) S l S2

Format maschinenintern: L, - 1 ! L2 - 1 1. Byte

2. Byte

B2

D. 3. Byte

4. Byte

d2

S.Byte

6. Byte

Wirkungsweise: Der durch (B2> + D2 adressierte zweite Operand wird, um ein Halbbyte nach links versetzt, in den mit + D t adressierten ersten Operanden übertragen. Die Verarbeitung verläuft von rechts nach links. Ist der 1. Operand zu kurz, so werden die höherwertigen Bytes des 2. Operanden nicht übertragen. Ist der 1. Operand länger als erforderlich, so wird er mit führenden Nullen aufgefüllt. Codierungsbeispiele: MV0

FELD1,FELD2

Die Länge von FELD1 sei L, = 3, die Länge von FELD2 sei L 2 = 3. FEL02

FELD1

MV0

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

(Reg. 7>

(Reg. 8>

85

3.4 Maschinenbefehle MV0

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

4 ! 1

0 i 0

;V/

1 0 1 4

1

! 4

1 4 ! F

F !

(Reg. 9> +0 MV0

RESULTO),RESULK2)

Wegbringen der l e t z t e n p e z i m a l s t e l l e : RESULTI2I

i : 2

i : s

3 !C

1. Operand

1 5 | C

1. Operand nach MV0

RESULTO)

0 1 1 RESULT

2 : • i

3.4.3.2 L a d e n v o n R e g i s t e r n , S p e i c h e r n v o n R e g i s t e r i n h a l t e n Befehl: LA Typ:

(load address; L a d e n Adresse)

RX

Formate s y m b o l i s c h 1 2 : LA LA LA 12

R I , D 2 ( X 2 , B2) Ri> S 2 ( X 2 ) Ri, S2

Neben diesen Standard-Formaten gibt es bei RX-Instruktionen noch folgende Sonderformen, deren Einsatz insbesondere beim LA-Befehl sinnvoll sein kann: Rl,D2(,B2) Rl,D2(X2) R1;D2

statt statt statt

R 1 ; D 2 ( 0 , B2) R1,D2(X2,0) R j , D 2 (0, 0)

86

3. Die Programmiersprache ASSEMBLER

Format maschinenintern: 4

Ri

! 1

i X2
+

1 1 1 l] 0 0 0 1

Reg. 6 (vorher) 0

0

0

0

0

0

0 0

0

0

0

0

1 1

1

1 0

0

0 0

0

0

1

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 0

0

0

0

0

0

0

0

0

0

0 0

1

1

1 1 0

0 0

0

0 0

1 0

0 0

8 7 6

1 1

1 1

5

0

0

0

0 0

4

3

2

1 0

1

0

0 0

1

Reg. 6 (nachher)

Befehl: LCR Typ:

(load complement; Umladen und Komplementieren)

RR

Format symbolisch: LCR

R h R2

Format maschinenintern: R, 1. Byte

2. Byte

Wirkungsweise: Der Inhalt des Registers R 2 wird komplementiert (d. h. positive Zahlen werden negativ und negative Zahlen werden positiv gemacht, vgl. dazu auch Seite 20) und in das Register R j geladen. Codierungsbeispiele: LCR

3,7

Reg. 7 0 0

0

31 31 1 1 1 Reg . 3

0 komplementiert

1 0 0

1 1

92

3. Die Programmiersprache ASSEMBLER

LCR

6,6

Reg. 6 1

1

1

1 0

1 0

31 komplementiert 31 0

0 0

0

0

1



Reg. 6

Befehl: LNR Typ:

Qoad negative; Umladen negativ)

RR

Format symbolisch: LNR R u R2 Format maschinenintern: R, 1. Byte

2. Byte

Wirkungsweise: Der Inhalt des Registers R 2 wird in das Register R j umgeladen. Ist negativ, so wird dieser Inhalt unverändert übertragen; ist positiv, so wird dieser Inhalt vorher komplementiert. Codierungsbeispiele: LNR

3,3

Der Inhalt des Registers 3 wird negativ gemacht oder bleibt negativ. LNR

7,1

Der Inhalt des Registers 1 wird nötigenfalls durch Komplementieren negativ gemacht und in Register 7 geladen.

3.4 Maschinenbefehle

93

Befehl: LPR Typ:

(load positive; Umladen positiv)

RR

Format symbolisch: LPR Rj, R 2 Format maschinenintern: ' I

i

, 0 1 1. Byte

R,

| R, I 2. Byte

Wirkungsweise: Der Inhalt des Registers R 2 wird in das Register R[ umgeladen. Ist positiv, so wird dieser Inhalt unverändert übertragen; ist negativ, so wird dieser Inhalt vorher komplementiert. Codierungsbeispiel: LPR

15,3

Der Inhalt des Registers 3 wird nötigenfalls durch Komplementieren positiv gemacht und in Register 15 geladen.

Befehl: LM Typ:

(¡oad multiple; Laden mehrfach)

RS

Formate symbolisch: LM LM

Ri, R 3 , D2 (B2) R,, R 3 , S 2

Format maschinenintern: 9

| 1. Byte

8

R,

1 j 2. Byte

1 R3

B:

> 3. Byte

4. Byte

3. Die Programmiersprache ASSEMBLER

94

Wirkungsweise: In die aufeinanderfolgenden Register R^ bis R 3 werden die Inhalte entsprechend vieler Speicherworte geladen, deren erstes mit (B2> + D 2 adressiert ist. Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44). Codierungsbeispiele: LM

7,10,15(2)

(Reg.2) +15

+16

+17

+18

+19

Reg. 7

+20

+21

+22

Reg. 8

LM

+23

+24

+25

Reg. 9

+26

+ 27

+28

+29

+30

Reg. 10

3,4,WORTE

Zwei Speicherworte ab der Adresse W0RTE werden in die Register 3 und 4 geladen.

Befehl: ST Typ:

(störe; Speichern Vollwort)

RX

Formate symbolisch: ST ST ST

R,, D 2 (X 2 , B 2 ) R!,S2(X2) R,, S 2

3.4 Maschinenbefehle

95

Format maschinenintern: 1 1 0

5

T

1 B2 ¡x

1

R, ] X2 2. Byte

1. Byte

3. Byte

- D2 i . 1 4. Byte

Wirkungsweise: Der Inhalt (alle 32 bits) des mit Rx adressierten Registers wird in das mit + (B2> + D 2 adressierte Wort gespeichert. Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44). Codierungsbeispiele ST

2.W0RT

Der Inhalt des Registers 2 wird in das mit W0RT adressierte Vollwort im Arbeitsspeicher übertragen. ST

5,W(7)

Der Inhalt des Registers 5 wird in das mit W + < Indexreg. 7 > adressierte Wort im Arbeitsspeicher übertragen.

Befehl: STH Typ:

(store halfword; Speichern Halbwort)

RX

Formate symbolisch: STH STH STH

R l t D 2 (X 2) B 2 ) R 1 ; S 2 (X 2 ) R u S2

Format maschinenintem: 4

! 0 l.Byte

Ri t» 2. Byte

». BÏ 1 — • D2 -!1 3. Byte 4. Byte

96

3. Die Programmiersprache ASSEMBLER

Wirkungsweise: Die niederstwertigen 16 bits des mit R; adressierten Registers werden in das mit + + D 2 adressierte Halbwort gespeichert. Programmierhinweis : Die Adresse des 2. Operanden muß auf eine Halb wortgrenze ausgerichtet sein (vgl. Seite 44). Codierungsbeispiel : ST H

5,HW0RT(6)

Register 5

0 0 0 0 1 0 10 0 0 1 0 1 0 10 0 0 1 1 1 10 10 0 0 0 0 10 1 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9

ooi

8

1 ! lioi

7

6

5

4

Befehl:

Typ:

(store character; Speichern Zeichen (Byte))

RX

Formate symbolisch: STC STC STC

R^D^Xj.Bj) R,, S 2 (X 2 ) R 1( S 2

Format maschinenintern: 1 2 1 1. Byte

Ri , X2 1 2. Byte

, • D2 -Il

CD

4

3. Byte

4. Byte



2

1

0

oooo ! oi o i

H WORT + (Indexreg. 6>

STC

3

97

3.4 Maschinenbefehle

Wirkungsweise: Die niederstwertigen 8 bits des mit R j adressierten Registers werden in das mit + + D2 adressierte Byte gespeichert. Codierungsbeispiel: STC

4.BVTE

Register 4

1 10 0 10 0 1 1 1 1 1 10 0 0 0 0 0 0 10 10 0 0 1 1 1 1 1 1 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 >958 4 3 2 1

I

0 0 11 ! 1 1 1 1 BYTE

Befehl: STM Typ:

(störe multiple; Speichern mehrfach)

RS

Formate symbolisch: STM R „ R 3 , D2 (B 2 ) STM R 1 ; R3, S2 Format maschinenintern: 1 9

1 i

0

1. Byte

R,

! R3 1 — 2. Byte

B2

I*

3. Byte

Dj

I

*

4. Byte

Wirkungsweise: Die Inhalte der aufeinanderfolgenden Register Ri bis R 3 werden in entsprechend viele Vollworte gespeichert, deren erstes mit (B2> + D 2 adressiert ist. Programmierhinweis: Die Adresse des 2. Operanden muß auf eine Vollwortgrenze ausgerichtet sein (vgl. Seite 44).

3. Die Programmiersprache ASSEMBLER

98 Codierungsbeispiel: STM

5,7,W0RTE

Reg. 5

WORTE +1

Reg. 6

+2

+ 3 + 4 + 5 + 6

Reg. 7

+7

+8

+9

+10

+11

Befehl: LER Typ:

(load register Single precision; Umladen kurz)

RR

Format symbolisch: LER

Ri, R 2

Format maschinenintern: 3

| 8 I 1. Byte

R,

| R, l 2. Byte

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

0,6

GP-Register 6 63

GP-Register 0

55

32 31

^

0

V" unverändert

99

3.4 Maschinenbefehle

Befehl: LDR Typ:

(load register double precision; Umladen lang)

RR

Format symbolisch: LDR R1; R2 Format maschinenintern: 2 , 8

R,

i

1. B y t e

,

R,

I

2. B y t e

Wirkungsweise: Der Inhalt des Gleitpunktregisters R 2 wird in voller Länge in das Gleitpunktregister R ] umgeladen. C odierungsbeispiel: LDR

4,2

GP-Register 2 63

55

0

63

55

0

GP-Register 4

Befehl: LE Typ:

(load Single precision; Laden GP-Wort)

RX

Formate symbolisch: LE LE LE

Ri, D 2 (X 2 , B 2 ) Ri, S 2 ( X 2 ) Rj, S2

100

3. Die Programmiersprache ASSEMBLER

Format maschinenintern: 7

; 8 1

I B, U

Ri ,« X2

1. Byte



2. Byte

3. Byte

1 " D> 1



4. Byte

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

2,W0RT

WORT

GP-Register 2

V

unverändert

Befehl: LD Typ:

(load double precision; Laden GP-Doppelwort)

RX

Formate symbolisch: LD LD LD

R1;D2(X2,B2) R|, S 2 (X 2 ) R,, S 2

Format maschinenintern: 1

1

6

! 1. Byte

8

Ri

! X2 1 2. Byte

B2

1 I1 3. Byte

D,

i

1 4. Byte

101

3.4 Maschinenbefehle

Wirkungsweise: Der Inhalt des mit + + D 2 adressierten Doppelwortes im Arbeitsspeicher (64 bits) wird in das Gleitpunktregister R[ geladen. Programmierhinweis: Die Adresse des 2. Operanden ist auf eine Doppelwortgrenze auszurichten (vgl. Seite 44). Codierungsbeispiel: LD

4,DW0RT(1 )

DW0RT + < Indexreg, 1)

GP-Register 4

Befehl: STE Typ:

(störe Single precision; Speichern GP-Wort)

RX

Formate symbolisch: STE STE STE

R „ D2 (X2, B 2 ) Rj, S 2 (X 2 ) Ri, S 2

Format maschinenintern:

1. Byte

2. Byte

3. Byte

4. Byte

3. Die Programmiersprache ASSEMBLER

102

Wirkungsweise: Der Inhalt der bit-Positionen 63 bis 32 des Gleitpunktregisters R^ wird in das mit + + D2 adressierte Speicherwort gespeichert. Programmierhinweis: Die Adresse des 2. Operanden ist auf eine Wortgrenze auszurichten (vgl. Seite 44). Codierungsbeispiel: STE

0,W+4

GP-Register 0 63 55

32 31

W+4

0

« l»

i 1

l i , 1

!

Befehl: STD Typ:

(störe double precision; Speichern GP-Doppelwort)

RX

Formate symbolisch: STD R j . D j i X j , B2) STD R l t S 2 (X 2 ) STD R[, S 2 Format maschinenintern:

1. Byte

2. Byte

3. Byte

4. Byte

Wirkungsweise: Der Inhalt des Gleitpunktregisters wird in das mit + + D2 adressierte Doppelwort im Arbeitsspeicher gespeichert.

3.4 Maschinenbefehle

103

Programmierhinweis: Die Adresse des 2. Operanden ist auf eine Doppelwortgrenze auszurichten (vgl. Seite 44). Codierungsbeispiel: STD

6,D+8(7)

GP-Register 6 63

55

32 31

0

v D+8+ (Indexreg. 7 >

1i i 1

1

1

i I 1

i t I

1

_ i

I i

11

1

I

i i I

i i I

1

i i I

r

> i L

3.4.3.3 Codetransformationen Befehl: PACK Typ:

(pack; Packen von gezonten Dezimalzahlen)

SS (arithmetisch)

Formate symbolisch: PACK D 1 ( L 1 , B i ) , D 2 ( L 2 , B 2 ) PACK Si(L,), S 2 (L 2 ) PACK S 1; S 2 Format maschinenintern: L, l.Byte

L,- 1 2. Byte

3. Byte

4. Byte

5. Byte

6. Byte

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

104

3. Die Programmiersprache ASSEMBLER

Beispiele für gezonte und gepackte Zahlenfelder: —

gezonte Zahl

gepackte Zahl

;—TT——i-]—1—r-i—|

—i——i— i |

F | 0 F ; 0 F | 7 F | 2 D | 5

1 ¡0

Voizeichen

4 13

1 ¡F

Vorzeichen

Ist der erste Operand (empfangendes Feld) länger als erforderlich, um alle Ziffern aufzunehmen, so wird er (links) durch führende Nullen aufgefüllt. Ist das empfangende Feld zu kurz, um alle Ziffern aufzunehmen, so werden die (linken) höherwertigen Ziffern des 2. Operanden (sendendes Feld) nicht berücksichtigt. Programmieihinweis: Die genau passende Länge des empfangenden Feldes errechnet sich wie folgt: Länge des empfangenden Feldes = [(Länge des sendenden Feldes + 2)/2] oder kürzer: Li = [(L2 + 2)/2]. Ist die Länge des sendenden Feldes eine gerade Zahl, dann werden im empfangenden Feld L2 Halbbytes mit Ziffern, 1 Halbbyte mit dem Vorzeichen und 1 Halbbyte mit einer führenden Null belegt. Ist die Länge des sendenden Feldes eine ungerade Zahl, dann werden L 2 Halbbytes mit Ziffern und 1 Halbbyte mit dem Vorzeichen belegt. Die maximalen Werte für L, und L2 sind je 16. Beispiele: a) ist die Länge des sendenden Feldes = 5, dann ist die Länge des empfangenden Feldes = [(5 + 2)/2] = 3 b) ist die Länge des sendenden Feldes = 6, dann ist die Länge des empfangenden Feldes = [(6 + 2)/2] = 4. Codierungsbeispiele: PACK

REFE,ZAHLEN

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

1. Operand

3.4 Maschinenbefehle

PACK

REFE1.ZAHLEN

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

I — — 11— — 1— — r1— ~ F | 7 F', 3 F | 0 F ; s i 1 i

0 «¡ 0

«¡7

— r ~

3 | 0

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

5|F

PACK

2. Operand

REFE2,ZAHLEN

Die Länge von REFE2 sei 2, die Länge von ZAHLEN sei 5 1 F Î1

F|7

F|3

—i— 1 F •: o F | 5

1. Operand (die höherwertigen Ziffern 1 und 7 des 2. Operanden werden nicht berücksichtigt).

REFE2

PACK

2. Operand

REFE1.ZAHLEN1

Die Länge von REFE1 sei 4, die Länge von ZAHLEN 1 sei 6

2. Operand

—1— —i— U|4 3 ; i •

PACK

1 |F

1. Operand (wird mit einer fuhren den Null aufgefüllt).

FELD(3),BETRAG(5)

In das Feld mit der symbolischen Adresse FELD und der expliziten Länge L! = 3 sollen L 2 = 5 Bytes aus dem Feld mit der symbolischen Adresse BETRAG gepackt werden.

106

3. Die Programmiersprache ASSEMBLER

Anm.: Bei Befehlen des Typs SS (arithmetisch) ist auch die implizite oder explizite Länge des 2. Operanden relevant. Daher ist die explizite Länge L 2 anzugeben, wenn sie von der impliziten Länge des 2. Operanden abweichen soll. PACK 0(4,81,3(6,8) In das mit < Reg. 8 > + 0 adressierte Feld der Länge 4 sollen 6 Bytes aus dem mit < Reg. 8 > + 3 adressierten Feld gepackt werden. PACK

FELD+27 (5),BETRAG

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

Befehl: UNPK Typ:

(unpack; Entpacken von gepackten Dezimalzahlen)

SS (arithmetisch)

Formate symbolisch: UNPK UNPK UNPK

D, (Li, BO, D2 (L 2 , B 2 ) S! (L,), S 2 (L 2 ) Sj, S 2

Format maschinenintern: Li - i ! L2 - 1 1. Byte

2. Byte

D, 3. Byte

4. Byte

S.Byte

6. Byte

Wirkungsweise: Der durch + D 2 adressierte 2. Operand wird (normalerweise) in der Länge L 2 aus der gepackten in die gezonte Form überfuhrt und in das durch (Bj) + Di adressierte Feld gespeichert. Die Verarbeitung verläuft von rechts nach links, also entgegengesetzt wie z. B. bei MVC. Das Vorzeichen wird aus dem Ziffernteil (rechtes Halbbyte) des niederstwertigen Byte des 2. Operanden unverändert in den Zonenteil (linkes Halbbyte) des niederstwertigen Byte des 1. Operanden übertragen. Ist der 1. Operand (empfangenes Feld) länger als erforderlich, um alle Ziffern aufzunehmen, so wird er (links) durch fuhrende (gezonte) Nullen aufgefüllt.

3.4 Maschinenbefehle

107

Ist der 1. Operand zu kurz, um alle Ziffern aufzunehmen, so werden die (linken) höherwertigen Ziffern des 2. Operanden nicht berücksichtigt.

Programmierhinweis: Die genau passende Länge des empfangenden Feldes errechnet sich wie folgt: Länge des empfangenden Feldes = Länge des sendenden Feldes » 2 — 1 oder kürzer: Li = 2*L 2 — 1. Die maximalen Werte für L! und L 2 sind je 16! Codierungsbeispiele: UNPK

ZAHLEN,REFE

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

1. Operand ZAHLEN

UNPK

ZAHLEN1,REFE

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

F

!

F

0

1 ! I

0

1 ; i

F

F

1 | 3 1

F

|

7

ZAHLEN1

UNPK

C

! 7

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

ZAHLEN2,REFE

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

1

i 3

1

!

^ A . 3/

N

, F

! I

/ 1

2AHLEN2

1

F

;

3

2

F

1 ;

i

8

1 |

D

X

D

\

8

2. Operand

1. Operand (die Ziffer 7 des 2. Operanden wird nicht berücksichtigt).

108

3. Die Programmiersprache ASSEMBLER

UNPK

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

In das Feld mit der symbolischen Adresse FELDA+4 und der Länge 7 sollen 4 Bytes aus dem Feld mit der symbolischen Adresse FELDB+2 entpackt werden.

Befehl: ED

Typ:

(edit packed data; Aufbereiten gepackter Zahlen zum Drucken)

SS (logisch)

Formate symbolisch: ED ED ED

D, (Li, Bj), D 2 (B 2 ) S, (L,), S 2 Si, S 2

Format maschinenintern: L, - 1 ]. Byte

2. Byte

D, 3. Byte

4 . Byte

S.Byte

6. Byte

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

Einfugungszeichen (alle druckbaren Zeichen und blank)

(2)

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

(3)

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

(4)

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

3.4 Maschinenbefehle

109

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

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

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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

Codierungsbeispiele:

(1)

Maske l-iVVVV MVC

DRBER+1(5),MASKE

ED

DRBER+K5),ZAHLEN

MASKE

DC

X'4020202020'

ZAHLEN

DS

CL4

110

3. Die Programmiersprache ASSEMBLER ZAHLEN 1 0 | 0 l\

4 ! 0

1 i ; i 2\

2

I. Operand (nach MVC)

2 : o

2

4 \ 0

4 ! 0

1 F' ! 1 I

Maske

\

0

F

\o

1 :

1

11

Druckbild:

MASKE REFE

2. Operand

2 10

DRBER+1

(2)

11 7 1 C

3\

DRBER+1

1 4 | 0

4 ! 5

i_j V,V [ V.VV MVC ED

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

DC DS

X'40206B2021204B2020' CL4

I. Operand (nach ED)

111

3.4 Maschinenbefehle

(3)

Maske vgl. (2) REFE 0

1_ i : o

0

3 : i

7 !D

3\

6

DRBER+1 4 \ 0

2

6

B

2

0

2

°

.

4 »! 0 DRBER+1

4

4

0

Druckbild:

(4)

0

4

\'

2 \ 0

\

F 11

1 F 1 0

0 ; 1

7 ! C

0

l 4 ;B

2 l 0

4 ! B 1

F

3

F : i

4 ! B i

2 \0 il

2 ^0

\

0

1 N 1\

10.31

Maske vgl. (2) REFE 0

0

0 2

DRBER+1

-T

\

0

\

®

/

4 ; 0

2

o

6

4 «! 0 DRBER+1

4

0

4 ! 0 1

B

2

0

1 2 : i

4

0

4

2 i 0 ll

\

Druckbild:

.. J

0

! F ! 0

i 4 iB 1

0.01

Kennzeichnung von negativen Beträgen (5)

2

Maske:

BETRAG

uj[v.VVV-

MVC ED

D R B E R + 1 (8),=X'4021204B20202060' D R B E R + 1 (8),BETRAG

DS

CL3

\

l \ \ F 11 F ; o i

3. Die Programmiersprache ASSEMBLER

112

BETRAG

Druckbild:

13.578-

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

(6)

Maske vgl. (5) BETRAG 1 1 i! ' 1 /

DRBER+1 1 4 ; 0

4 | 0 i DRBER+1

• : 7

1

\'

2 \ 0

F !1

i F l 1 1

Druckbild:

5

3\

/

2

4 ; C

1

i 4 \B

4 :B

2^0

\\ F !1

2

\

0

1 f i ^

2 1 0 Ii

F ]4 i

6 j 0

I 4 | 0

11.174

Die Nullenunterdrückung wird wieder eingeschaltet, da hier ein positiver Betrag vorliegt; also werden auch alle nachfolgenden Einfügungszeichen durch das Füllzeichen (hier blank) überschrieben. Schreiben von Schutzsternen: (7)

Maske:

*VVV[V.VV *

MVC

DRBER+K10), MASKE

3.4 Maschinenbefehle

SUMME MASKE

ED

DRBER+1 (9),SUMME

DS DC

CL4 X'5C20202021204B20205C' 1 j 0 1

0

—r 5 ; c

o

2

c L_

5

*>

113

0

0

2

C

5

» ;

5

! c

L

Drockbüd:

-1 ; 3

1

! i

1

4

c C l

KU K 0

2

c

F

\

1 2 \ 0

| 3 i

1 i i

F

1 4 jB

2 \ 0

4

F

1

|

B

1 ; 4

...

2

\o

i

F I! '

,

s ; c

T

S

| C

• • • • 31.41

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

Maske:

ERGEBN SCHABL

ljYVVBISV[V

MVC ED

DRBER+1 (10) ,SCH ABL DRBER+1 (10),ERGEBN

DS DC

CL4 X'40202020C2C9 E2202120'

/r

ERGEBN 1 i 1/

JRBER+l 4

j

0

)RBER+1 4

| 0

2

F

!

4

1

0

l \U 0

\

:

1

Druckbild:

2

F

°

2

!^

F

1

,\ 0

i

;

i

i

141BIS041

4

:

i

i

3

4

c

C

!

2

C

1 2

C

1

:

i

c

'

^

!

1

|

i

9

E

|

2

9

E

;

2

\uu 2

F

i

0

2

0

F

1 1

1

| 4

2

F

\

0

> 1 i

114

3. Die Programmiersprache ASSEMBLER

(9)

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

ERGEBN MASKE

MVC ED

DRBER+K11), MASKE DRBER+K11),ERGEBN

DS DC

CL4 X'40202020C2C9E222202120'

ERGEBN i

1 DRBER+1

4 ; o

4

2 /

i : o i

4

2

!\

F

1 ' i

o

2

\ 1

F

:

3

1 ;

c

C

1 !

2

C

i 1

9

E

2

2

c

;

2

c

!

9

E ; 2

4

\ 4

F

|

Druckbild:

(10) Maske vgl. (9) ERGEBN

.

4

0

\

!

3\

tf

DRBER+1

4 ! 0

/

: i

1

14 IBIS

41

;

I

1 |

2

2

0

4

|

2

\

1

2

F

J

4

F

\

\\\\ 0

1 |

3.4 Maschinenbefehle

115

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

141

Befehl: CVB

Typ:

(convert to binary; Umwandeln gepackte Dezimalzahl in Dualzahl)

RX

Formate symbolisch: CVB CVB CVB

RLDjO^BJ) Rj, S 2 (X 2 ) R l S2

Format maschinenintern:

1. Byte

: . Byte

3. Byte

4 . Byte

Wirkungsweise: Der Inhalt des mit + O.tt . . . t oder O.uu . . . u * 1 6 ± s / 0 . t t . . . t * 1 6 ± s = O.yy . . . y * 1 6 ° bei O.uu . . . u < O.tt . . . t Zugleich ist mit der Tabellenzahl O.tt . . . t * 1 6 ± s ( + 1 ) der entsprechende Exponent ±d zur Basis 10 bekannt. Die Umwandlung O.yy . . . y * 1 6 ° ergibt eine Dezimalzahl O.xx . . . x*10°. Diese wird mit 10 hoch ±d multipliziert, und man erhält die gesuchte Dezimalzahl.

* >

U M W A N D L U N G VON O E Z I M A L Z A H L E N

CNVTDEGP

PCK

MVIGW

*

TAB

STH LA MV I MVC CLI BE MVI PACK MVC ZAP MV0 CVB ST MVC LD S BAL LDR MVI ZAP CVB ST MVC LD S BAL ADR LM BR LPR M C

2.7.RETT27 6.PTABLE+600 GW,X'481 G W + 5 ( 3 ) ,»3X'00 1 VZ,C'+' PCK GW , X 1 C 8 1 F9.F16 MVIGW+1(1),GW " ,»P 1 0 1 DW D W + 3 ( 5 ) ,F9(5) 3 ,DW 3,FW GW+1(4),FW 2 ,GW 4 , = F1 9 1 7 ,TAB 0,2 GW ,X 1 48 1 DW ,F9 + 5(4) 3 ,DW 3 ,FW GW+1(4),FW 2,GW 4 , = F' 7 1 7 ,TAB 0,2 2.7.RETT27 11 3,4 2 , = F1 81 4 , =F101

IN G P - Z A H L E N (1) (2) (3) (4) (5) (6) (7 (8) (10) (11) 12) (13) (14) (15) (16) (17 (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32)

120

DIVID EXITTAB

3. Die Programmiersprache ASSEMBLER BL MD B DD BR

» * UMWANDLUNG CNVTGPDE

CD1

SUCHTAB CD

GEFUNDEN

LPR45

MANTISSE

ST7

DIVID 2,0(3,6) EXITTAB 2,0(3,6) 7

V0N G P - Z A H L E N

IN D E Z I M A L Z A H L E N

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

2,7,RETT27 VZ(2) , = C 1 ++ 1 4,=F'600 1 6,=D101 CD1 VZ.C'-' 6,6 6 ,=D ' 1 ' SUCHTAB VZE ,C1 - ' 4,4 7,=F'76' 6,PTABLE(4) GEFUNDEN 4,8(4) 7,CD 6,PTABLE(4) 4,32 4,=F181 5,=F'75 1 2,MANTISSE F9(5),DW+3 F9+4(1),=X100' F9+5(4), = P101 GW+1(7),FW7 6 ,GW 2,MANTISSE F9,DW+3(5) F16.F9 F16+15(1),=X1FF1 F16 , B 1 0 0 0 0 1 1 1 1 ' LPR45 F16(16),F16+1 5 , = F ' 11 4,5 2,3,RETT27 5,7 ,RETT27 + 12 11

MD STD LM SLDL SRDL CD BNL SRDL ST CVD BR

6.PTABLE+664 6 ,GW 6 ,7 ,GW 6,8 6,4 6.K0N471 ST7 6,4 7 ,FW7 6 ,DW 2

* K0NSTANTEN UND

*

(33) (34) (35) (36) (37)

BEREICHE

(38) (39) (40) (41) (42)

SSI

(45) (46) (47) (48) (49) (50) (51) (52) (53) (54) (55)

i"! (58) (59)

181 (62) (63) (64) (65) (66)

(67) (68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (78) (79) (80)

ill! (83) (84) (85) (86)

3.4 Maschinenbefehle

PTABLE

K0N471 GW DW FW FW7 F16 F9 VZ VZE RETT27

121

DC DC DC

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

DC DC DC DS DS DS DS DC DS DC DS DS DS DS

D11E741 D'1E75' X'47100 D D F F 3X100' CL16 X' F01 CL9 CL1 CL1 6F

Kommentare zu den Instruktionen der Programmstücke CNVTDEPG und CNVTGPDE: ( 1 ) Retten der Registerinhalte 2 bis 7 in das Feld RETT27. ( 2 ) Laden der Adresse von 10° in der Potenztabelle nach Register 6. ( 3 ) Im Feld GW soll die sedezimale Gleitpunktzahl aufgebaut werden. Daher wird das bit-Muster 0100 1000 (sedezimal: 48) in das erste Byte von GW gebracht, um vorab ein positives Mantissenvorzeichen und den Exponenten 72 ~ 7 zur Basis 16 darzustellen. Letzteres ist nötig, weil bei der Umwandlung der dezimalen Mantisse im Festpunktregister zunächst eine Zahl y • 167 entsteht. ( 4 ) Die letzten 3 Bytes von GW werden mit sedezimalen Nullen aufgefüllt, weil diese Stellen nicht benötigt werden. ( 5 ) Prüfen, ob die Dezimalzahl tatsächlich positiv ist. ( 6 ) Wenn ja, dann Sprung nach PCK. ( 7 ) Andernfalls wird in das erste Byte von GW das bit-Muster 1100 1000 (sedezimal: C8) gebracht, um ein negatives Mantissenvorzeichen und den Exponenten 72 ~ 7 zur Basis 16 darzustellen (vgl. 3). ( 8 ) Die Mantisse der Dezimalzahl wird aus F16 nach F9 gepackt. ( 9 ) Übertragen der Charakteristik als Direktwert in die Instruktion mit der Adresse MVIGW. (10)

dw

1 0 j 0

i 0 |0 1

0

0

o j o !

i o ; o 1

•i 0 | 0 I

1 0 10 1

1 0 I c

122

3. Die Programmiersprache ASSEMBLER

(11) Die ersten 5 Bytes (9 Dezimalziffern und eine führende Null) werden aus F9 um ein Halbbyte nach links versetzt nach DW gebracht. F9

+1

+2

+3

+4

(12) Konversion der gepackten Dezimalzahl aus DW in eine Dualzahl und Laden in Register 3. (13) Speichern der Dualzahl aus Register 3 in das Feld FW. (14) Übertragen der Dualzahl aus FW in das 2., 3., 4. und 5. Byte von GW. (15) Laden der sedezimalen Gleitpunktzahl aus GW in das Gleitpunktregister 2. (16) Vermindern des dezimalen Exponenten in Register 4 um 9. Dies geschieht für den späteren Ausgleich des Fehlers, der dadurch entsteht, daß die ersten 9 Mantissenstellen der Zahl 0.x.. .x • 10° bei der Konvertierung in eine Dualzahl (Sedezimalzahl) wie eine Dezimalzahl der Form xxxxxxxxx oder 0.xxxxxxxxx • 109 behandelt werden. Später wird die zu dieser Dezimalzahl equivalente Sedezimalzahl in GP-Register 2 durch 109 dividiert. (17) Sprung in das Programmstück TAB, um die zum Exponenten der Dezimalzahl gehörige sedezimale Gleitpunktzahl zu ermitteln, mit der dann der Inhalt des Gleitpunktregisters 2 im Wege der Multiplikation bzw. Division korrigiert wird. (18) Umladen des Inhalts des Gleitpunktregisters 2 in das Gleitpunktregister 0, weil dort die sedezimale Gleitpunktzahl erscheinen soll. (19) vgl. (3) bzw. (7). (20) Übertragen der letzten 4 Bytes (7 Dezimalziffern und Vorzeichen) aus F9 rechtsbündig und mit führenden Nullen nach DW. F9

j 0 i' 0 DW

0 1 0 +1

1

0 | 0 +2

N0 j >0 •

+3

X

+5 1 | X

+6 X

1' X

j +4

X

X

+7

1 1 X

[ +5

X

1

1r

X

X

1 X

+8 1

x | C

i \ X 1 +6

x ; C +7

3.4 Maschinenbefehle

123

(21) Vgl. (12) (22) vgl. (13) (23) vgl. (14) (24) vgl. (15) (25) Vermindern des dezimalen Exponenten in Register 4 um weitere 7. Die restlichen 7 Mantissenstellen der Dezimalzahl 0.x.. .x • 10° entsprechen einer Dezimalzahl der Form O.OOOOOOOOOxxxxxxx•10° oder O.xxxxxxx-10~ 9 . Sie werden bei der Umwandlung in eine Dualzahl (Sedezimalzahl) wie eine Dezimalzahl der Form xxxxxxx oder O.xxxxxxx • 10 7 behandelt. Später wird die zu dieser Dezimalzahl äquivalente Sedezimalzahl in GP-Register 2 durch 10 1 6 dividiert. (26) vgl. (17) (27) Addieren des Inhalts des Gleitpunktregisters 2 auf den Inhalt des Gleitpunktregisters 0, in welchem jetzt die gesuchte sedezimale Gleitpunktzahl steht. (28) Wiederherstellen der alten Registerinhalte 2 bis 7. (29) Sprung aus dem Unterprogramm. (30) Umladen des dezimalen Exponenten aus Register 4 in das Register 3, wobei dieser nötigenfalls in eine positive Dualzahl komplementiert wird. (31) Multiplikation des Registerpaares 2, 3 mit einer dualen 8, wodurch in Register 3 die relative Adresse der zugehörigen sedezimalen Gleitpunktzahl in der Tabelle PTABLE entsteht. (32) Prüfen, ob der Exponent in Register 4 negativ ist. (33) Wenn ja, dann Sprung nach DIV. (34) Multiplikation des Inhalts des Gleitpunktregisters 2 mit der zum dezimalen Exponenten gehörigen Sedezimalzahl aus der Tabelle PTABLE, die mit < Reg. 3 > + < Reg. 6 > adressiert wird. (35) Verzweigen nach EXITTAB. (36) Division . . . analog (34). (37) Rücksprung aus der Routine TAB. (38) vgl. (1) (39) Die Vorzeichen der dezimalen Mantisse und des Exponenten werden vorab als positiv angenommen. (40) Laden einer 600 in das Indexregister 4, um auf den Tabellenwert 10° zu kommen. (41) Vergleichen des Inhalts des GP-Registers 6 mit Null.

124

3. Die Programmiersprache ASSEMBLER

(42) Sprung nach CD1, wenn der Registerinhalt größer oder gleich Null (positiv) ist. (43) Wenn der Registerinhalt kleiner als Null (negativ) ist, dann wird ein „—"•Zeichen nach VZ gebracht. (44) Der Inhalt von GP-Register 6 erhält ein positives Vorzeichen. (45) Vergleichen des Inhalts von GP-Register 6 mit einer Eins. (46) Sprung nach SUCHT AB, wenn der Registerinhalt größer oder gleich Eins ist, d.h. einen positiven Exponenten hat. (47) Ist der Registerinhalt kleiner 1, dann ist der Exponent negativ, und es wird ein „-"-Zeichen nach VZE gebracht. (48) Das Indexregister 4 wird gelöscht, um auf den Tabellenwert 10 - 7 5 zu kommen. (49) In den Schleifenzähler Register 7 und eine 76 laden. (50) Vergleichen der Gleitpunktzahl im GP-Register 6 mit einer indexadressierten Gleitpunktzahl aus der Dezimal-Sedezimal-Tabelle PTABLE. (51) Sobald die Gleitpunktzahl in Register 6 kleiner ist als eine Gleitpunktzahl aus der Tabelle, wird nach GEFUNDEN gesprungen. (52) Ist die Gleitpunktzahl in Register 6 noch größer oder gleich einem Tabellenwert, wird der Inhalt des Indexregisters 4 um 8 erhöht, um die nächst größere Gleitpunktzahl in der Tabelle zu adressieren. (53) Der Schleifenzähler (Reg. 7 > wird um eine Eins vermindert und auf Null geprüft; wenn 0 ist, dann Sprung nach CD; auf diese Weise wird die Schleife (50) bis (52) maximal 76mal durchlaufen. (54) Division des Inhalts von GP-Register 6 durch den Tabellenwert, wodurch eine Sedezimalzahl der Form O.yy.. .y • 16° entsteht. (55) In FP-Register 4 steht der dem Tabellenwert entsprechende Exponent zur Basis 10, allerdings um 75 zu groß und mit 8 multipliziert; daher Vorbereitung einer Division durch shift nach Register 5. (56) Division des Doppelregisters 4, 5 durch 8. (57) Vermindern des Quotienten in Register 5 um 75. (58) Sprung in das Unterprogramm MANTISSE zur Konversion des ersten Teils der sedezimalen Mantisse. (59) Übertragen des ersten Teils der umgewandelten Mantisse nach F9. F9

0 |X

+1

"T XjX

+:

X 1| X

+3

1 X ] X 1

+4

1 X !±

3.4 Maschinenbefehle

125

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

o ;

x

X

+1 —r i I

X

X

+2 1 1 1

+3 X

1 X 1

+4 X

x

DW+

+

! 0

+5 • i

o ; o

3 (x)

;

x

+6 !

o i; o

+4 l X

\ •

+7

o !o

+5 1 X

X

[ »

+8

+6 1 X

X

J

o ! c +7

X

x

;

(66) Entpacken des Inhalts von F9 nach F16. (67) Überschreiben des Vorzeichens in F16 mit dem bit-Muster 1111 (sedezimal: F). (68) Prüfen, ob das erste Byte von F16 eine Null enthält. (69) Wenn nein, Sprung nach LPR45. (70) Wenn ja, Inhalt von F16 um eine Stelle nach links versetzen und (71) vermindern des dezimalen Exponenten in FP-Register 5 um 1. (72) Umladen des dezimalen Exponenten mit positivem Vorzeichen nach FP-Register 4. (73) Wiederherstellen der alten Registerinhalte 2 und 3. (74) Wiederherstellen der alten Registerinhalte 5 bis 7. (75) Rücksprung aus dem Unterprogramm. (76) Unterprogramm zur Konversion der sedezimalen Mantisse: Multiplikation des Inhalts von GP-Register 6 mit 108. Grund: Die sedezimale Mantisse der Zahl O.y.. .y • 16° wird in 2 gleichen Teilen zu je 7 Sedezimalziffern konvertiert, wodurch jeweils 8 Dezimalziffern entstehen.

C

126

3. Die Programmiersprache ASSEMBLER

Es wird also eine Dezimalzahl der Form O.xx... x • 10 16 erzeugt, deren 16 Stellen die gesuchte Mantisse bilden. Die Mantisse der Sedezimalzahl O.y.. .y • 16° ist also um den Faktor 10 16 zu klein, weswegen jede Teilmantisse mit 108 zu multiplizieren ist. (77) Speichern des Inhalts von GP-Regjster 6 nach GW. (78) Laden des Inhalts von GW in die FP-Register 6 und 7. (79) Herausschieben der Charakteristik durch logische Linksverschiebung der Gleitpunktzahl in FP-Register 6 und 7 um 8-bit-Positionen. (80) Logische Rechtsverschiebung der Mantisse in FP-Register 6 und 7 um 4-bit-Positionen. Reg. 6 0

X

X

X

Reg. 7 X

X

X

X

X

16*

X

X

X

X

X

X

0

16°

(81) Prüfen, ob nach Multiplikation mit 108 der Stellenwert der ersten Sedezimalziffer der Mantisse tatsächlich 166 ist. (82) Wenn ja, dann Sprung nach ST7. (83) Wenn der Stellenwert aufgrund maschineninterner Abrundungsfehler nur 165 ist, dann logische Rechtsverschiebung der Mantisse in FP-Register 6 und 7 um weitere 4-bit-Positionen. ^ O

Reg. 6 O

x 16 s

x

x

x

Reg. 7 x

x

x

x

x

x

x

x

x

x

16°

(84) Speichern des zweiten Teils der Mantisse aus FP-Register 7 in FW7. (85) Konvertieren des Inhalts von FP-Register 6 in eine Dezimalzahl. (86) Rücksprung aus dem Unterprogramm. Betrachtet man die Länge dieser Routinen, so wird sofort deutlich, daß die Anwendung der sedezimalen Gleitpunktarithmetik nur dann gerechtfertigt ist, wenn relativ wenige Eingabedaten einer relativ großen Anzahl von Rechenoperationen unterzogen und dabei wenige Ausgabedaten erzeugt werden. Ferner ist die Gleitpunktarithmetik dann unumgänglich, wenn in einem Datenverarbeitungsproblem Zahlengrößen auftreten, die mit der dezimalen oder dualen Festpunktarithmetik nicht mehr zu bewältigen sind. In allen anderen Fällen wäre die Anwendung der sedezimalen Gleitpunktarithmetik allein wegen des mit der Codetransformation verbundenen Maschinenzeitaufwandes unwirtschaftlich.

3.4 Maschinenbefehle

127

3.4.3.4 Shift-Operationen in Festpunktregistern Befehl: SRA

Typ:

(shift right Single algebraical; algebraische Rechtsverschiebung eines Registerinhalts)

RS

Formate symbolisch: SRA SRA

Ri, D 2 (B 2 ) Rj, D 2

Format maschinenintem : 8

!

!

A

R,

1. Byte

! 1

0

2. Byte

B2

11 11 k——• 1

3. Byte

1 D, -1 I



4. Byte

Wirkungsweise: Der Inhalt der bit-Positionen 0 bis 30 des Registers R, wird um + D 2 Stellen nach rechts verschoben; der zweite Operand ist also keine Arbeitsspeicheradresse, sondern eine Verschiebezahl. Von links werden bits nachgezogen, die den Wert des Vorzeichen-bit haben. Das Vorzeichen-bit in Position 31 bleibt jedoch unverändert. Die rechten bits gehen verloren. Codierungsbeispiel: SRA

3,0(8)

Der Inhalt des Registers 8 sei 2; dann wird der Inhalt des Registers 3 algebraisch 2 Stellen nach rechts verschoben.

Befehl: SLA

(shift left single algebraical; algebraische Linksverschiebung eines Registerinhalts)

128

3. Die Programmiersprache ASSEMBLER

Typ:

RS

Formate symbolisch: SLA SLA

R 1 ; D 2 (B 2 ) R „ D2

Format maschinenintern : ; i

B

R,

1 • Byte

|

0

2. Byte

D,

00

8

3. Byte

I

-j



4. Byte

Wirkungsweise: Der Inhalt der bit-Positionen 0 bis 30 des Registers R, wird um + D2 Stellen nach links verschoben; der zweite Operand ist also keine Arbeitsspeicheradresse, sondern eine Verschiebezahl. Von rechts werden Nullen nachgezogen. Die linken bits gehen verloren; das Vorzeichen-bit in Position 31 bleibt jedoch unverändert. Codierungsbeispiel: SLA

5,3

Der Inhalt des Registers 5 wird algebraisch um 3 Stellen nach links verschoben. 31

Befehl: SRDA

Typ:

RS

(shift right double algebraical; algebraische Rechtsverschiebung im Doppelregister)

3.4 Maschinenbefehle

129

Formate symbolisch: SRDA SRDA

Rj, D 2 (B2) Rj, D 2

Format maschinenintem: R, 1. Byte

D,

2. Byte

3. Byte

4. Byte

Wirkungsweise: Der Inhalt des mit R[ adressierten Registerpaares R,, R , + 1 wird um soviele Stellen (bit-Positionen) nach rechts verschoben, wie der Wert + D 2 angibt; der 2. Operand ist also keine Arbeitsspeicheradresse, sondern eine Verschiebezahl. R! muß stets eine gradzahlige Registernummer sein. Der Inhalt aller 63 Stellen des Registerpaares wird verschoben. Die Vorzeichenstelle in bit-Position 31 des Registers R! bleibt unberührt. Von links werden bit-Werte nachgezogen, die der Vorzeichenstelle entsprechen, also binäre Nullen bei „+" und binäre Einsen bei „—". Codierungsbeispiel: SRDA

4,3

Reg. 4

Reg. 5

11110 1 1 0

0 0 110 1

Reg. 4

1 0

1 0 0

Reg. 5

Befehl: SLDA Typ:

(shift left double algebraical; algebraische Linksverschiebung im Doppelregister)

RS

Formate symbolisch: SLDA SLDA

Ri, D 2 (B 2 ) R „ D2

130

3. Die Programmiersprache ASSEMBLER

Format maschinenintern: - 1

8

I I

;

R,

F

1. Byte

o

2. Byte

1

Ba

!•"



D,

3. Byte

-1



4. Byte

Wirkungsweise: Der Inhalt des mit R! adressierten Registerpaares R,, R, + 1 wird um soviele Stellen (bit-Positionen) nach links verschoben, wie der Wert + D 2 angibt; der 2. Operand ist hier also keine Arbeitsspeicheradresse, sondern eine Verschiebezahl. R j muß stets eine gradzahlige Registernummer sein. Der Inhalt aller 63 Stellen des Registerpaares wird verschoben; die Vorzeichenstelle in bitPosition 31 des Registers R j bleibt unberührt. Von rechts werden Nullen nachgezogen. Codierungsbeispiel: SLDA

12,0(5)

Es sei (Reg. 5> = 2; dann wird der Inhalt des Doppelregisters 12, 13 um 2 bit-Positionen nach links verschoben. Reg. 12

Reg. 1 3 '

Reg. 12

Reg. 13

Befehl: SRL

Typ:

(shift right Single logical; logische Rechtsverschiebung eines Registerinhalts)

RS

Formate symbolisch: SRL SRL

R „ D 2 (B 2 ) R „ D2

131

3.4 Maschinenbefehle

Format maschinenintern: 1 !

8

8

1 ;

R,

1. Byte

o

1

B,

2. Byte

' L 2 sein. Die maximale Länge der Operanden beträgt jeweils 16 Bytes. Codierungsbeispiele: AP

SUMME,ZAHL

Die Länge von SUMME sei 3, die Länge von ZAHL sei 2. SUMME -1 0 j

SUMME 4

i

;

2

3

+

i

3

2

: 3 •

;

c

3 ; o

1

5

1

0

! 3

! C i

1 0 ID

2

1

2

5 !C

i ! i

+

ZAHL

SUMME =

1 i

0

1 2 '

4

:

5

SP

8

1 ' C

i

DIFF,=X'017C'

Die Länge von DI FF sei 2: DIFF 0

! 1 3

o

DIFF

0

0

i

F

|

C

1

2

; i

] I

7

SUMME i 2 j 9 1

• 9

i | 0 I

| 5

l | D I

134

3. Die Programmiersprache ASSEMBLER

AP (Reg. 8 )

0(3,8),3(3,8)

+1

+2

+3

Befehl: ZAP Typ:

(zero and add packed; Nullsetzen und Addieren)

SS (arithmetisch)

Formate symbolisch: ZAP ZAP ZAP

Di (L ls B^, D2 (Li, B 2 ) S! (LO, S 2 (L 2 ) S,, S 2

Format maschinenintern : L, - 1 ! Lj - 1 B, 1. Byte

2. Byte

3. Byte

D, 4. Byte

B2

-L5. Byte

6. Byte

Wirkungsweise: Die Instruktion lädt den mit + D 2 adressierten 2. Operanden der Länge L 2 < 16 rechtsbündig mit fuhrenden Nullen in den mit + Di adressierten 1. Operanden der Länge L t < 16. Die Verarbeitung verläuft von rechts nach links. Wenn Li < ist, so fuhrt das zu einem Dezimalüberlauf und zur Programmunterbrechung. Programmierhinweis : Der 2. Operand muß dezimal gepackte Ziffern und ein Vorzeichen enthalten.

3.4 Maschinenbefehle

135

Codierungsbeispiele: ZAP

REFE,ZAHL

Die Länge von REFE sei L! = 3, die Länge von ZAHL sei L 2 = 2 ZAHL 1

v\ o

i 0 1

1 ; t

0

4

3

! o

i 1 | D

1. Operand

1 1 | c

2. Operand

Das Resultat dieses Vergleichs ist ein Bedingungsschlüssel im Anzeigeregister, der aussagt, daß der 1. Operand kleiner als der 2. Operand ist. CP

ZAHL+2(3),0(2,9)

Der arithmetische Wert des 3 Bytes langen und mit ZAH L+2 adressierten 1. Operanden wird mit dem arithmetischen Wert des 2 Bytes langen und mit + 0 adressierten 2. Operanden verglichen. Der 2. Operand wird während des Vergleichs virtuell mit führenden Nullen auf 3 Bytes aufgefüllt.

Befehl: CR

Typ:

(compare registers; Vergleichen arithmetisch FP-Register mit FP-Register)

RR

Format symbolisch: CR

Rj, R 2

Format maschinenintern: 1

; 1. Byte

9

R,

1 ] '

2. Byte

R2

163

3.4 Maschinenbefehle

Wirkungsweise: Der Inhalt des mit R ! adressierten Registers wird arithmetisch, d . h . unter Berücksichtigung der Vorzeichen und der Zahlenwerte, mit dem Inhalt des durch R 2 adressierten Registers verglichen. Entsprechend dem Ergebnis des Vergleichs wird ein Bedingungsschlüssel im Anzeigeregister gesetzt. In der Regel wird die Vergleichsoperation von bedingten Verzweigungsoperationen gefolgt, die in bestimmter Weise auf den Bedingungsschlüssel des Anzeigeregisters reagieren. Codierungsbeispiel:

GLEICH

CR BL BH AR

5,6 KLEINER GR0ESSER 7,5

Vergleichen < Reg. 5 > mit < Reg. 6 >; wenn < Reg. 5 > kleiner < Reg. 6 >, dann Sprung nach KLEINER; wenn + + Di adressierten Byte, und zwar wird jedes bit geprüft, welches in der Maske I 2 an der entsprechenden Stelle eine 1 hat. Hat ein bit in der Maske I 2 den Wert 0, so wird das entsprechende bit im Arbeitsspeicher nicht geprüft. In Abhängigkeit vom Ausgang des Vergleiches wird ein Bedingungsschlüssel im Anzeigeregister gesetzt. Die Reaktion auf den Bedingungsschlüssel im Anzeigeregister geschieht mittels der bedingten Sprungbefehle BZ, B0 und BM. 1. Sind alle getesteten bit-Stellen im Kernspeicher gleich Null, so wird mit BZ gesprungen (branch on zero), bei B0 und BM nicht! 2. Sind alle getesteten bit-Stellen im Kernspeicher gleich Eins, so wird mit B0 gesprungen (branch on ones), bei BZ und BM nicht! 3. Sind einige der getesteten bit-Stellen im Kernspeicher gleich Eins und einige gleich Null, so wird mit BM gesprungen (branch on mixed), bei BZ und B0 nicht! Codierungsbeispiele: TM B0 BZ MVC

BYTE,B'11110000' EINSEN NULLEN FELD1,FELD2

Wenn das mit BYTE adressierte Byte den Inhalt 111 lxxxx hat, springt das Programm zur Adresse EINSEN; wenn BYTE den Inhalt OOOOxxxx hat, springt das Programm zur Adresse NULLEN; wenn BYTE z.B. den Inhalt 011 lxxxx hat, dann setzt es mit MVC . . . fort. C

TM BM AP

B,B'11001100' MIXED SUMME,ZAHL

3.4 Maschinenbefehle

169

Wenn das mit B adressierte Byte z.B. Olxxllxx enthält, springt das Programm zur Adresse MIXED; wenn es hingegen l l x x l l x x oder OOxxOOxx enthält, dann setzt das Programm mit AP . . . fort.

3.4.3.9 Verzweigungsoperationen Befehl: BC Typ:

(branch on condition; bedingtes Verzweigen)

RX

Formate symbolisch13: BC BC

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

Format maschinenintern13: r 4

!

7

l.Byte

M,

! 0 I 2. Byte

B:

',•*

1 3. Byte

—P -

D3

1 4. Byte

»

Wirkungsweise: Vergleichsoperationen, Arithmetikoperationen, Ladeoperationen und shiftOperationen bewirken das Setzen eines Bedingungsschlüssels im Anzeigeregister. Die BC-Instruktion vergleicht die 4-bit-Maske M! mit dem Bedingungsschlüssel des Anzeigeregisters. Bei Entsprechung wird ein Sprung zu der mit + D 2 angegebenen Adresse ausgeführt. Bei Nichtentsprechung setzt das Programm mit der auf BC folgenden Instruktion fort. Programmierhinweise: Das Setzen der bit-Maske Mj erfolgt entweder explizite durch die Angabe bestimmter Direktwerte oder implizite durch einen erweiterten Bedingungscode. Es können, solange der Bedingungsschlüssel nicht verändert wird, mehrere Sprunginstruktionen hintereinander auf ein und dieselbe Anzeige bezug nehmen. 13

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

170

3. Die Programmiersprache ASSEMBLER

Erweiterter Bedingungscode Bedeutung

implizite

explizite

Unbedingter Sprung kein Sprung (übergehen) Sprung bei größer Sprung bei kleiner Sprung bei gleich Sprung bei nicht größer Sprung bei nicht kleiner Sprung bei ungleich Sprung bei positiv Sprung bei Einsen Sprung bei gemischt Sprung bei Nullen

B

D 2 (0, B 2 )

BC

15, D 2 (0, B 2 )

N0P BH BL BE BNH BNL BNE BP B0 BM BZ

D 2 (0, D 2 (0, D 2 (0, D2(O, D 2 (0, D 2 (0,

BC BC BC BC BC BC BC BC BC BC BC

0,D2(0, 2, D 2 (0, 4, D 2 (0, 8, D2 (0, 13, D 2 (0, 11,D 2 (0, 7,D2(0, 2, D 2 (0, 1,D2(0, 4, D 2 (0, 8,D2(0,

B2) B2) B2) B2) B2) B2)

D2(O, B2)

D 2 (0, D 2 (0, D 2 (0, D 2 (0,

B2) B2) B2) B2)

B2) B2) B2) B2) B2)

B2) B2) B2) B2) B2) B2)

Die 3 letzten Befehle werden in der Regel im Zusammenhang mit dem Befehl TM (test under mask) verwendet. Codierungsbeispiele (für den unbedingten Sprung): B

WEITER

oder

BC

15.WEITER

Unbedingter Sprung zu der durch die symbolische Adresse WEITER angegebenen Kernspeicheradresse. B 2(,9) Unbedingter Sprung zu der durch + D2 = (Reg. 9> + 2 gegebenen Adresse. Der gleiche Effekt wird erreicht durch: B

2(0,9)

oder

B BC

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

B

2(9,0)

oder

B

2(9)

Unbedingter Sprung zu der durch + D2 = + 19 gegebenen Adresse.

Befehl: BCR

(branch on condition to register address; bedingtes Verzweigen zu der im Register angegebenen Adresse)

171

3.4 Maschinenbefehle

Typ:

RR

Format symbolisch: BCR

Mj, R 2

Format maschinenintem: o

7

M,

. Byte

;

R;

2. Byte

Wirkungsweise: Vergleichsoperationen, Arithmetikoperationen, Ladeoperationen und shiftOperationen bewirken das Setzen eines Bedingungsschlüssels im Anzeigeregister. Die BCR-Instruktion vergleicht die 4-bit-Maske M! mit dem Bedingungsschlüssel des Anzeigeregisters. Bei Entsprechung wird ein Sprung zu der in Register R 2 geladenen Adresse ausgeführt. Bei Nichtentsprechung setzt das Programm mit der auf BCR folgenden Instruktion fort. Programmierhinweis: Das Setzen der bit-Maske M, kann bis auf eine Ausnahme nur explizite durch die Angabe bestimmter Direktwerte erfolgen (vgl. BC auf S. 170). Die Ausnahme ist BCR 15,R2. Für diesen unbedingten Sprung kann man auch den erweiterten Befehlscode BR R 2 schreiben. Codierungsbeispiele (für den unbedingten Sprung): BR wird vielfach zusammen mit BAL bzw. BALR verwendet, um den Rücksprung aus einem Unterprogramm zu ermöglichen, in welches mit BAL oder BALR hineingesprungen wurde. Der Rücksprung erfolgt zu der Adresse, die mit BAL oder BALR in das Register R 2 geladen wurde. BAL MVC

/

i

/

UPR0

3,UPR0 FELD1.FELD2

/•

/ ' I E®J i CLC \

F E LD1 ,=X'00000C'

'

\; \

BR

3

3. Die Programmiersprache ASSEMBLER

172

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

I

l

\

*

\

'

\

S, \ UPR0\

UPR0 FELD1,FELD2

MVC

E0J CLC

F E LD1 ,=X'00000C'

\ • \

^B

WEITER

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

/ / i/ /

/

,

2/

^!

//

^BAL 3,UPR0 MVC FELD1 ,FELD2 • \ • V * \ BAL ,3,UPR0 MVC VELD1,=X'01020C' • \ \ \

V / UPR0

E0J I 1 2 CLC | /FELD1,=X'00000C' • "

/ BR

/

/

/ /

3

3.4 Maschinenbefehle

173

Befehl: BAL

Typ:

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

RX

Formate symbolisch: 13 BAL BAL

Rj, D 2 (0, B 2 ) Rj, S 2

Format maschinenintern: 4 . ...

! 1

R,

5

1. Byte

I •]

0

2. Byte

B •>2

1 >4 1« 3. Byte

Pi

"1

1 "

1 \

1

~ »•

4. Byte

Wirkungsweise: Der Inhalt des Befehlszählregisters, das zur Zeit der Ausführung der BALInstruktion die Adresse der nachfolgenden Instruktion enthält, wird in das mit Ri angegebene Register geladen. Danach verzweigt das Programm zu der mit + D 2 adressierten Instruktion. Codierungsbeispiel: BAL / yvivc

/

3.UPR0 FELD1,FELD2

/

/

/

i

UPR0 \

CLC

FELD1 ,=X'00000C'

\ " \ * Y

BR

3

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

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

3. Die Programmiersprache ASSEMBLER

174

Befehl: BALR

Typ:

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

RR

Format symbolisch: BALR

Rj, R 2

Format maschinenintern: 1 0 | 5

1 R, | R,

I

I

1. Byte

2. Byte

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

BALR /yVC

8,UPR0

11,8 FELD1,FELD2

/ ? :

i •

/ I I UPR0 I \

E0J CLC •

\ • \• V

BR

FELD1 ,=X'00000C'

11

175

3.4 Maschinenbefehle

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

7,0

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

Befehl: BCT Typ:

(branch on count; Verzweigen nach Zählen)

RX

Formate symbolisch: 13 BCT BCT

R,, D 2 ( 0 , B 2 ) R 1; S 2

Format maschinenintern: 4

1 1 6 1. Byte

r,

1 ; 2. Byte

o

- T B, '¡* 3. Byte

1 - D; -j



4. Byte

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

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

3. Die Programmiersprache ASSEMBLER

176

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

SR SR L A A BCT

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

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

3,A

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

3,4(0,7)

Sprungadresse = + D 2 = + 4 BCT BCT BCT

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

oder oder

Sprungadresse = + 0

Befehl: BCTR

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

3.4 Maschinenbefehle

Typ:

177

RR

Format symbolisch: BCTR

Rl5 R2

Format maschinenintern: 0

1 1 6 I 1. Byte

R,

1 | R2 I 2. Byte

Wirkungsweise: Der Inhalt des Registers R) wird um 1 vermindert. Danach wird der Inhalt geprüft. Ist dieser ungleich Null, so verzweigt das Programm zu der in R 2 befindlichen Speicheradresse. Ist der Inhalt von R , gleich Null, so fährt das Programm mit der auf BCTR folgenden Instruktion fort.

Programmierhinweise: Ist der Anfangswert von R 2 gleich Null, so wird auf alle Fälle verzweigt, denn zuerst wird ( R ^ um 1 vermindert; d . h . es ist dann ( R ^ = — 1 ¥= 0. Wird für R 2 eine Null gesetzt, so wird der Inhalt von Ri zwar um 1 vermindert, es wird aber nicht verzweigt, da der Inhalt von R 2 = 0 nicht verwendet wird. Codierungsbeispiel (vgl. dazu auch S. 176):

ADD

LA SR SR L A A BCTR

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

3. Die Programmiersprache ASSEMBLER

178

Befehle: BXH BXLE

Typ:

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

RS

Formate symbolisch: BXH BXH

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

BXLE BXLE

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

Formate maschinenintern : T ! 6 i 1. Byte

Ri t R3 2. Byte

1 B, ¡« 3. Byte

• D2 J

1 i' 7

Ri 1 R3 1

B,

1 - D2 -J

8

8

1. Byte

2. Byte

3. Byte



4. Byte

»

4. Byte

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

L L L

1,ANFANG 2.INKREM 3,ENDE

3.4 Maschinenbefehle

0P

179

Operationen

BXLE

1,2,0P

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

SR SR L L L A A BXLE

14,14 5,5 1,= F T 2,=F'1' 3,N 5,W0RTE(14) 14,=F'4' 1,2,ADD

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

Befehl: EX Typ:

RX

(execute; Ausführen)

3. Die Programmiersprache ASSEMBLER

180 Formate symbolisch: EX EX

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

Format maschinenintern: 1 1 4 | 4 R, ! X, i 1 l.Byte 2. Byte

B,

!« 3. Byte

- D, -j • J. _ 4. Byte

Wirkungsweise: Die mit + + D 2 adressierte Instruktion wird durch den Inhalt von R! modifiziert und ausgeführt. Danach setzt das Programm mit der auf EX folgenden Instruktion fort. Ist die auszuführende Instruktion eine Sprunginstruktion, so setzt das Programm mit der angesprungenen Instruktion fort. Die Modifikation der auszuführenden Instruktion unterbleibt, wenn R! = 0 ist. Letzteres sei der hier allein interessierende Fall. Codierungsbeispiel :

A1

MVC

FELD1.FELD2+3

EX AP

0,A1 REFE,FELD1

Durch EX wird die mit A1 adressierte Instruktion MVC . . . ausgeführt, danach wird die Instruktion AP . . . ausgeführt.

3.4.3.10

Logische Bit-Verknüpfungen

Befehle: NR OR XR Typ:

RR

(and register) (or register) (exclusive or register)

3.4 Maschinenbefehle

181

Formate symbolisch: NR OR XR

R j , R2 R1;R2 RPR2

Formate maschinenintem:

2. Byte

1. Byte

—1 1 1!

6

• 1 ;

1 R1 j

(OR)

R2

2. Byte

1. Byte

i

(NR)

!

4

7

1. Byte

1 R, 1 1 ,

(XR)

L

2. Byte

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

A

r

A A A A

r

2j 0 1 0 1

=> => =>

=>

lj 0 0 0 1

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

V V V V V

r

2j 0 1 0 1

=>

=> =>

=> =>

r

lj 0 1 1 1

3. Die Programmiersprache ASSEMBLER

182

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

V

0 0 1 1

V V V V

r

2j 0 1 0 1

=>

=>

r

lj 0 1 1 0

Codierbeispiel: NR

5,6

Register 6 n

....

31

0

A

Register 5 n

....

31

. . _

n

....

31

0101010 0

li V

Register 5

0100101

o 1 onono 0

Die oben gezeigte Operation dient dem Nullsetzen einzelner bits in R5. Die Wirk von < R 6 > ist dabei die einer bit-Maske: Alle XQ = 1 lassen die r5j unverändert; r6j = 0 schalten (bzw. lassen) die r 5 j auf Null. Weitere Anwendungen vgl. Übung (Seite 278). Befehle: N 0 X Typ:

RX

Formate symbolisch: (Vgl. z.B. L a u f S . 88).

(and) (or) (exclusive OR)

3.4 Maschinenbefehle

183

Formate maschinenintern: 5

1 |

I

R

1

J

2

!

X

R

1

3. Byte

1. Byte

X

j

2

B

°2

+

r

(O)

4. Byte

—I

2 ! 3. Byte

2. Byte

(N)

4. Byte

°2 " t

2

2

1

7

!' 3. Byte

2. Byte

1. Byte

1

B

2. Byte

1. Byte

5

T

R

4

(X)

4. Byte

Wirkungsweise: Analog NR, OR, XR; die bit-Maske steht hier jedoch in einem indiziert adressierten Speicherwort. Programmierhinweis: Der Speicheroperand muß auf eine Wortgrenze ausgerichtet sein (vgl. S. 44 f.). Befehle:

Typ:

NC OC XC

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

SS

(logisch)

Formate symbolisch: (Vgl. z.B. MVCaufS. 79 ff.). Formate maschinenintern: (NC)

1. Byte

2. Byte

3. Byte

4. Byte

5. Byte

6. Byte

184

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

Wirkungsweise: Analog NR, OR, XR; die bit-Maske sowie die zu verändernde bit-Kette stehen hier jedoch beide im Arbeitsspeicher, und es wird in der Länge des ersten Operanden verknüpft. Befehle: N' Ol XI Typ:

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

SI

Formate symbolisch: (Vgl. z.B. MVI auf S. 81). Formate maschinenintem : 9

1 J• 4

1. Byte

h

Bl

2. Byte

i

2. Byte

2. Byte

4. Byte

(Ol)

! 4. Byte

3. Byte B

1. Byte



3. Byte B

1. Byte

i

1

i

J

3. Byte

D

1 j

(XI)

4. Byte

Wirkungsweise: Analog NR, OR, X R ; die bit-Maske steht hier jedoch im Direktoperand I2 und die zu verändernde bit-Kette steht in einem Byte des Arbeitsspeichers.

3.5 Assembler-Anweisungen Assembleranweisungen dienen dazu, die Arbeitsweise des Assemblers (des Übersetzerprogramms) zu steuern und zu modifizieren. Sie erzeugen keine Maschineninstruktionen, sind also nicht für die Ausführungsphase, sondern nur für die Umwandlungsphase des Maschinenprogramms existent. Allerdings reicht ihre Wirkung insofern in die Ausführungsphase hinein, als während der Übersetzungsphase mit ihrer Hilfe z. T. die Maschineninstruktionen modifiziert werden.

185

3.5 Assembler-Anweisungen

3.5.1 Anweisungen zur Symbol-, Konstanten- und Felddefinition Anweisung: EQU

(equate Symbol; Gleichsetzen eines Ausdrucks mit einem Symbol)

Allgemeines Format: S

EQU

Ausdruck

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

EQU EQU EQU

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

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

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

D1 D2 B1 B2 L1

MVC

DI (L1 ,B1 ),D2(B2)

EQU EQU EQU EQU EQU

17 0 8 B1 L'FELD

186

(2)

3. Die Programmiersprache ASSEMBLER

Wenn ein komplexer, umständlich zu schreibender Ausdruck in mehreren Befehlen vorkommt, so ist es rationeller, diesen einmal mit einem einfachen Symbol gleichzusetzen und dann in den Befehlen dieses Symbol zu verwenden. Beispiel: MVC AP

FELD,D

Übertragen eines „+" nach 0PERAT0R Konvertieren (Reg. l ) in eine gepackte Dezimalzahl in DW

Überschreiben des Vorzeichens mit 1101 in 0 PI

Übertragen des Resultats aus DW rechtsbündig nach 0P1

I

C0NVT1

Entpacken d. Resultats aus pPl in 2 Teilen l. d. Druckbereich (vgl. S.231)

Übertragen d. ersten Zahl aus 0 PI rechtsbündig nach DW

I

Übertragen eines „ + " für das Resultat in den Druckbereich

Konvertieren der ersten Zahl in eine Dualzahl in Reg. 1 Packen der zweiten Zahl aus EBER nach 0P2

Überschreiben des Vorzeichens mit 1101 in 0P2

Fehlermeldung in Druckbereich übertragen

Überschreiben d. Vorzeichens des Resultats in 0P1 durch 1111

Übertragen eines „ - " für das Resultat in den Druckbereich

234

4. Übungsprogramme

SUB Subtrahieren (Reg. 2> von (Reg. 1>

Übertragen eines „ - " nach 0PERAT0R

DIV Übertragen d. 1. Teils d. Prod. aus DW rechtsbündig nach 0P1

Multiplikation d. 1. Teils des Produktes mit 2 3 2 in PP1

Multiplizieren

S0RT

LA CLC

M0VE

RAUS LIST

NEXT

§

DRUCK

SR MVC LR B LA LR CLC BE CLI BE LA CLC BNL MVC LR B C BE MVC LA MVC B BR

13,13 C0MP , = X 1 FFFFFFFFFF' 10,5 CLC 10,80(10) 2.3 0(2,10) ..C'/»' M0VE 0(10) ,X '40' LA 2.0(10,2) 0(5,2) ,C0MP LA C0MP ,0(2) 13.10 LA 13 ,»F ' 0 1 RAUS 0(80,6),0(13) 6,80(6) 0(80,13) ,-80C' ' S0RT 7

CNTRL MVC CNTRL BAL MVC LA CLC BE AP UNPK MVZ MVC MVC MVC MVC MVC BAL PRT0V B

LISTE,SK,1 DRBER+10(79).HEADDER LISTE,SP, ,1 9,DRUCK EBER,0(4) 4,80(4) EBER(2),=C'/»' RAUS LFDNR ,EINS DRBER+3(3),LFDNR DRBER+5(1) ,F DRBER+8(12).NNAME DRBER+22(12).VNAME DRBER+36(22) ,0RT DRBER+60(24).STRASSE DRBER+85(5),PNR 9,DRUCK LISTE, 12, LIST NEXT

PUT MVC BR

LISTE DRBER(132) .ORBER-l 9

« « KONSTANTEN UNO BEREICHE LFDNR EINS F EBER PNR VNAME NNAME

LT0RG DC DC DC DS DS DS DS

X'OOOC' X'IC' X 1 FF ' 0CL80 CL5 CL12 CL12

4. Übungsprogramme

254 0RT STRASSE

DRBER HEADDER

C0MP S0RTBER1 S0RTBER2 •

DS DS OS DC DC DC CS DC DS DC DS DC DS DC OS

CL22 CL24 CL5 X ' 401 132X'40' C'NAHE' CL9 C1V0RNAME1 CLU C'ßRT' CL17 CSTRASSE' CU8 C'PNR" CL5

DS DS DS DS

100CL80 CL2 100CL80 CL2

END

VP

Übung 7: Das Beispiel aus Übung 1 soll unter weitgehender Verwendung der intermodularen Unterprogrammtechnik programmiert werden. Dabei sind selbständige Moduln (1.) für die Definitionen des I0CS einschließlich der I0-Bereiche, (2.) für das Vor- und Hauptprogramm, (3.) für die Konstanten und Bereiche und (4.) für die Druckroutine zu schreiben. Die Bedeutung dieser Aufgabe ist vor allem in der Separierung der Dateierklärungen vom eigentlichen Programm zu sehen, da auf diese Weise eine allgemeine Dateierklärung fur alle möglichen Programme erzeugt werden kann. Kartenformat und Listenformat: wie bei Übung 1.

PR0G71

> « *

TITLE CSECT PRINT EXTRN ENTRY ENTRY ENTRY ENTRY

'UEBUNG7.SEGMENT1 U N , N 0 D A T A , N(JG EN ENDE KARTE LISTE DRBER EBER

D E F I N I T I O N DES

KARTE

DTFSR

I0CS

BLKSIZE-80, DEVADDR«SYSRDR, DEVICE-READER, E0FADDR-ENDE, I0AREA1-EBER,

Spalte

7a

4. Übungsprogramme

255 Spalte RECF0RM>FIXUNB, TYPEFLE=INPUT

*

LISTE

DTFSR

* *

EBER DRBER *

BLKSIZE=132, C0NTR0L=YES, DEVADDR=SYSLST, DEVICE®PR INTER, I0AREA1=DRBER, PRINT0V=YES, RECF0RM=FIXUNB, TYPEFLE=?UTPUT

DTFEN DS DC DS

CL80 X'40' CL132

END

PR0G72

TITLE START PRINT EXTRN EXTRN EXTRN EXTRN EXTRN EXTRN EXTRN EXTRN ENTRY

'UEBUNG7,SEGMENT2' 216 0N,N0DATA,N0GEN KARTE LISTE EBER DRBER HEADDER LFDNR EINS F ENDE

* V0RPR0GRAMM *

VP

BALR USING 0PEN LM L

7,0 *.7 KARTE,LISTE 8,13,ADRESS 4 ,«V(DRUCKE)

» HAUPTPR0GRAMM • NEUBLATT

NEXT

CNTRL MVC BALR CNTRL GET AP UNPK HVZ MVC MVC MVC MVC BALR PRT0V B

LISTE,SK.l 11(58,8),0(9) 6,4 LISTE,SP,1 KARTE 0(2,10),0(1,11) 4(3,8),0(2,10) 6(1,8),0(13) 9(12,8),17(12) 23(12,8),5(12) 37(22,8) ,29(12) 61(24,8),51(12) 6,4 LISTE,12,NEUBLATT NEXT

72 * * * * » * * *

4. Übungsprogramme

256 ADRESS

DC DC DC DC DC DC

A(ORBER-1) A(HEADDER) A(LFDNR) A(EINS) A(EBER) A(F)

CL0SE TERM

KARTE.LISTE

END

VP

TITLE CSECT PRINT ENTRY ENTRY ENTRY ENTRY DC DC DC DC DS DC DS DC DS DC

'UEBUNG7 »SEGMENT3'

• • ENDR0UTINE ENDE »

PR0G73

LFDNR EINS F HEADDER

0N.N0DATA.N0GEN LFDNR EINS F HEADDER X'OOOC' X'IC' X 1 FF 1 C NAME' CL9 C VORNAME' CL11 C'JRT' CL17 CSTRASSE'

END

PR0G74

DRUCKE

TITLE CSECT PRINT EXTRN ENTRY BALR USING PUT MVC BR END

'UEBUNG7 .UNTERPR0GRAMM' 0N,N0DATA,N0GEN LISTE DRUCKE 5,0 •,5 LISTE 1(132,8) .0(8) 6

4. Übungsprogramme

257

Übung 8a: Lochkarten mit statistischen Erhebungsdaten sollen in Blöcken zu je 10 auf ein Magnetband gebracht werden. Kartenformat: 5

XXX XX

lfd.

6

7

M W

Nr.

8

9

SE AR AN BE 0H

16

xx.xx.xx Geburtsdatum

17

L V G W

18 - 20

XXX Körpergröße

21

-

23

XXX Körpergewicht

1 3

5 ä

v M

9

4> o. 3 a

e

X

0

25

§

2 eo r3 i

o

•s u

26

K L F U

s

9

"O

•c

24

00 "O jD

3

t

•3 ja



I

Berufe:

Schulbildung:

Einkommensgruppen:

SE AR AN BE 0H

V - Volksschule M - Mittelschule 0 — Oberschule

0 1 2 3 4 5 6 7 8 9

— selbständig - Arbeiter — Angestellter - Beamter — ohne Beruf

Geschlecht: M — männlich W — weiblich Familienstand: L V G W

— — — —

ledig verheiratet geschieden verwitwet

Weiterbildung: K L F U S

— keine — Lehre — Fachschule - Universitätsstudium - sonstige (Sekretärinnenschule, Dolmetscherschule etc.)

-

0 10000 15000 20000 25000 30000 35000 40000 45000 50000

bis 9999 bis 14999 bis 19999 bis 24999 bis 29999 bis 34999 bis 39999 bis 44999 bis 49999 bis u. m.

Blockformat: 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26 1 - 26

4. Übungsprogramme

258

PR0G8A x

TITLE START PRINT

1 UEBUNG8A ' 216 ON ,NODATA,NOGEN

Spalte

* « DEFINITIONEN DES IOCS KARTE

« BAND

DTFSR

DTFSR

#

72

BLKSIZE=26, DEVADDR=SYSRDR, DEVICE-READER, EOFADDR=ENDE, IÜAREA1=EBER, RECFORM=FIXUNB, TYPEFLE=INPUT

X

BLKSIZE=260, DEVADDR=SYS010, DEVICE=TAPE, FILABL=STD , LABNAME=LAB, a 1 I0AREA1=ABER, RECF0RM=FIXBLK, RECSIZE=26, TYPEFLE=OUTPUT W0RKA*YES

* * * « * *

*

X

IE X X

X

X X

DTFEN

*

« V0RPR0GRAMM • BALR USING OPEN

VP

tt

9,0 «,9 KARTE,BAND

« HAUPTPROGRAMM * LIES

S ENDE «

GET MVC PUT B

KARTE WORKAREA,EBER BAND.UORKAREA LIES

CLOSE TERM

KARTE,BAND

* KONSTANTEN UND BEREICHE » EBER ABER U0RKAREA LAB x

21

DS DS DS DC

CL26 10CL26 CL26 44X 1 FF'

END

VP

21

Das Feld LAB enthält Informationen für den Etikettvergleich. Da in diesem Programm keine Etikettprüfung vorgesehen ist, wird das Feld LAB mit binären Einsen gefüllt.

4. Übungsprogramme

259

Übung 8b: Die in Übung 8a aufgebaute Banddatei soll statistisch ausgewertet werden; Und zwar soll eine Kombinationstabelle aufgestellt werden, die die Aufgliederung der Merkmalsträger nach Alter, Geschlecht und Familienstand ausweist. Kartenformat/Blockformat: wie Übung 8a Listenformat: siehe nächste Seite.

260

4. Übungsprogramme

4. Übungsprogramme

262

4. Übungsprogramme

263

4. Übungsprogramme ENDE Vorschub auf neuen Formularanfang

1 Adresse der Kombinationstabelle TAB nach Reg. 8 laden

Laden einer Druckschablone in den Druckbereich

Übertragen der Tabellenüberschrift in den Druckbereich

Adresse von KLASSK0N (Altersklassen) nach Reg. 4 laden

Aufbereiten einer Besetzungszahl zum Drucken

Anfangswert 15 d. Schleifenzählers nach Reg. 5 laden

Adrefipegel in Reg. 3 auf nächste. Besetzungszahl in TAB einstellen

Laden d. Adr. von TAB aus Reg. 8 nach Reg. 3

Adrefipegel in Reg. 6 auf Summenfeld der nächsten Spalte einstellen

Adresse des Feldes SUMMEN nach Reg. 6 laden

Adrefipegel in Reg. 7 auf nächstes Feld im Druckbereich einstellen

Vorschub um eine Leerzeile

Tab. eint eilung „MAENNLICH, WEIBLICH, INSGESAMT" in den Druckbereich

Adresse des Druckbereichs DRBER+1 nach Reg. 7 laden Tab.einteilung nach Familienstand in den Druckbereich bringen

Übertragen einer Altersklasse in den Druckbereich Adrefipegel in Reg. 4 auf die nächste Altersklasse einstellen AP2

Anfangswert 18 d. Schleifenzählers nach Reg. 2 laden

Add. der Besetzungszahl einer Altersklasse auf das Summenfeld der betr. Spalte

(Reg. 5> um 1 vermin-^ dem und auf Null Prüfen

I

= 0

/ B A L 11, PUT ( (Drucken ei\ n e r Zeile)

Adrefipegel in Reg. 8 auf nächste Zeile von TAB einstelle« Reg. 2 um 1 vermindern und auf Null prüfen

#0

4. Übungsprogramme

264

Vorschub um eine Leerzeile

Anfangswert 15 d. Schleifenzählers nach Reg. 5 laden

T

BAL 11, PUT (Drucken der Summenzeile)

Adresse des Feldes SUMMEN nach Reg. 6 laden Adresse des Druckbereichs DRBER + 1 nach Reg. 7 laden

Schließen der Dateien

Übertragungen d. Wortes SUMMEN in den Druckbereich

E0J

MVC PUT

Übertragungen einer Druckschablone in den Druckbereich

Adrefimodifikation in Reg. 8: ' 1E74 ' 0'1E75' X'4710000000000000' n 0 F F 3X'00' CL16 X 1 FO ' CL9 CL1 CL1 6F

CNVTDEGP

STM

2.7.RETT27

CNVTGPDE

STM

2.7.RETT27

END

VP

K0N471 GW DW FW FW7 F16 F9 VZ VZE RETT27 «

Die Übungsbeispiele 1 bis 9 benutzen ausschließlich Karten- und Banddatein. Eine Vorführung der Benutzung von Plattendateien hätte wegen des notwendigen Umfangs den Rahmen dieses Lehrbuchs gesprengt. Eine ausführliche Darstellung dieser Programmiertechnik findet sich jedoch in: Niemeyer, G.: „Ein integriertes Datenverarbeitungs- und Informationssystem". Berlin 1972 [12],

278

4. Ü b u n g s p r o g r a m m e

Zur Durchführung einer selbständigen Programmierübung wird folgende Aufgabe vorgeschlagen: Übung 10a: Eine Buchhaltung ist auf einer Magnetplatte einzurichten. Übung 10b: Ein Buchungsprogramm für alle möglichen Geschäftsvorfälle ist zu schreiben. Übung 10c: Ein Programm für den Periodenabschluß (Bilanz und G + V-Rechnung) ist zu schreiben. Übung lOd: Ein Programm für das Ausdrucken von Konten ist zu schreiben. Übung 11: Multiplikation von Inzidenzmatrizen mit Zustandsvektoren:

PR0G1O

TITLE 1 U E B U N G 1 0 1 START 216 PRINT N0GEN

* DEFINITIONEN • LISTE

DTFSR

• « • VP

DES

I0CS

BLKSIZE=132, C0NTR0L=YES, DEVADDR=SYSLST, DEVICÉ=PRINTER, I0AREA1=DRBER, RECF0RM=FIXUNB, TYPEFLE=0UTPUT

DTFEN V0RPR0GRAMM BALR 3,0 U S I N G *,3 UPEN LISTE CNTRL L I S T E , S K , 1 MVC DRBER(12),ZVEKT0R BAL 12,PUT HAUPTPR0GRAMM

IC

LA SR SR SR SR IC IC SLL

8,8 4.4 5.5

6.6

7.7 4, VEKT0RZ 5,MATRIX(7) 6,1

Spalte

4. Übungsprogramme

NR BZ 0 LA NULL BCT STC * AUSDRUCKEN MVC LA LA MVC SCH LA BAL BCT LA MVC LA LA SLL C C BM MVI B EINS MVI LA LA SLL BCT • BAL CLOSE TERM

4.5 NULL 6,=F'1' 7.1(7) 8,IC 6.VEKT0RV DRBER(4),=C'A = 7.ZMATRIX 8.8 DRBER+4(8),0(7) 7.8(7) 12.PUT 8,SCH 7.DRBER 0(4.7)..C'V = 1 7.4(7) 8,8 6,24 6 ,aF' 0 ' EINS 0(7),C'O1 LA 0(7), C'l' 7.1(7) 6,1 8.C 12,PUT LISTE

• UNTERPROGRAMM PUT

PUT MVI MVC BR

LISTE DRBER,X140' DRBER+1(131),DRBER 12

* KONSTANTEN UND BEREICHE DRBER ZVEKT0R VEKT0RZ VEKT0RV MATRIX

ZMATRIX

DC DC DC DS DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC

C1321 ' C Z = 01000 B '01000000' C B1 00000000' B1'10000000' B1 01000000' B '00110000' B''00000000' B '00000000' B1 00000000' B1'00000000' C 00000000' C 10000000' C 01000000' C 00110000' C 00000000' C 00000000' C 00000000' C 00000000'

END

VP

279

280

Dieser Programmablaufplan beschreibt die wichtigsten Teile Druckroutinen dar, sie sind selbsterklärend.

4. Übungsprogramme

des Programms; die Übrigen Teile stellen

5. Anhang: Programmierhilfen 5.1 Lochkartenformat im Assembler

Reicht das Operandenfeld nicht aus, so können mehrere Fortsetzungskarten gelocht werden. Hat eine Karte eine Fortsetzungskarte, so ist dies durch ein beliebiges Zeichen in Spalte 72 der vorangehenden Karte anzuzeigen. Die Operanden werden ab Spalte 16 der Fortsetzungskarte gelocht.

282

5. Anhang: Progiammierhilfen

5.2 Tabelle der Maschineninstruktionen

Op.Code symb.

Instruktion

Typ

Operandenformat explizite

Seite

Übertragungsoperationen im Arbeitsspeicher Übertragen Zeichen

MVC

SSj

Di (Li, Bi), D 2 (B 2 )

79

Übertragen Direktzeichen

MVI

SI

DI (Bi), I 2

81

Übertragen rechte Halbbytes (Ziffern)

MVN

SSi

Di (Lj, Bi), D 2 (B 2 )

81

Übertragen Zeichen um 1 Halbbyte nach links versetzt

MV0

SS a

Dj ( L L B O , D 2 ( L 2 , B 2 )

83

Übertragen linke Halbbytes (Zonen)

MVZ

SSi

DI (Li, Bj), D 2 (B 2 )

82

Laden von Registern, Speichern von Registerinhalten Laden FP-Wort

L

RX

RI, D 2 (X 2 , B 2 )

88

Laden Adresse

LA

RX

R 1 ; D 2 (X 2 , B 2 )

85

Umladen FP-Register komplementiert

LCR

RR

Ri, R 2

91

Umladen GP-Register lang, mit umgekehrten Vorzeichen

LCDR

RR

RI, R 2

Umladen GP-Register kurz, mit umgekehrten Vorzeichen

LCER

RR

r

Laden GP-Doppelwort

LD

RX

Umladen GP-Register lang Laden GP-Wort

LDR LE

RR RX

Ri, R 2 R | , D 2 (X 2 , B 2 )

99 99

Umladen GP-Register kurz Laden Halbwort Laden mehrfach FP-Worte

LER LH LM

RR RX RS

R i . R2 R l , D 2 (X 2 , B 2 ) Ri, R 3 , D 2 (B 2 )

98 89 93

Umladen FP-Register negativ

LNR

RR

RI, R 2

92

Umladen GP-Register lang, negativ

LNDR

RR

Rl. R2

-

Umladen GP-Register kurz, negativ

LNER

RR

RL. R2

-

Umladen FP-Register positiv

LPR

RR

Ri, R 2

Umladen GP-Register lang, positiv

LPDR

RR

Ri. R2

I > R2 R 1 ) D 2 ( X 2 , B2)

100

93 -

5.2 Tabelle der Maschinenbefehle

283

Instruktion

Op.Code symb.

Typ

Operandenformat explizite

Umladen GP-Register kurz, positiv

LPER

RR

R

Umladen FP-Register

LR

RR

l> R 2 RI, R 2

Umladen FP-Register mit Test

LTR

RR

Rii R2

-

Umladen GP-Register lang mit Test

LTDR

RR

Ri. R2

-

Umladen GP-Register kurz mit Test

LTER

RR

Ri, R 2

-

Einfügen Zeichen (Byte)

IC

RX

R 1 ( D 2 (X 2 ) B 2 )

90

Speichern FP-Register in Wort

ST

RX

R 1 i D 2 ( X 2 ) B2)

94

Speichern FP-Register in Byte

STC

RX

R , , D 2 ( X 2 ) B2)

96

Speichern GP-Register in Doppelwort

STD

RX

R I , D 2 ( X 2 ; B2)

103

Speichern GP-Register in Wort

STE

RX

RI, D 2 (X 2 , B 2 )

101

Speichern FP-Register in Halbwort

STH

RX

RI, D 2 (X 2) B 2 )

95

Speichern FP-Register mehrfach in Worte

STM

RS

RI, R3. D 2 (B 2 )

97

Seite



87

Codetransformationen Umwandeln dezimal gepackt in dual

CVB

Umwandeln dual in dezimal gepackt Aufbereiten zum Drucken

RX

RI, D 2 (X 2 , B 2 )

115

CVD

RX

RI, D 2 (X 2 , B 2 )

116

ED

SSi

Di (Li, Bi), D 2 (B 2 )

108

Aufbereiten zum Drucken und Markieren

EDMK

SSi

DI (Lj, B!), D 2 (B 2 )

-

Packen

PACK

ss a

Di (Li, Bi), D 2 ( L 2 , B 2 )

103

Übersetzen mit Hilfe von Code-Tabellen

TR

SSi

DI (Li, Bi), D 2 (B 2 )



Übersetzen und Prüfen mit Hüfe von CodeTabellen

TRT

SSi

D, (Li, Bi), D 2 (B 2 )

Entpacken

UNPK

SSa

DI (LI, BI), D 2 (L 2 , B 2 )

106

shift-Operationen in Festpunktregistern Links-shift arithmetisch (ohne bit-Position 31) W

SLA

RS

RI, D 2 (B 2 )

127

284

5. Anhang: Programmierhilfen Op.Code symb.

Typ

Operandenformat explizite

Seite

Links-shift im Doppelregister arithmetisch (ohne bit-Position 31 in R j )

SLDA

RS

Ri, D 2 (B 2 )

129

Links-shift im Doppelregister logisch (mit bitPosition 31 in Ri)

SLDL

RS

RI, D 2 (B 2 )

Links-shift logisch (mit bit-Position 31)

SLL

RS

RI, D 2 (B 2 )

131

Rechts-shift arithmetisch (ohne bit-Position 31)

SRA

RS

RI, 1>2(B2)

127

Rechts-shift im Doppelregister arithmetisch (ohne bit-Position 31 in R,)

SRDA

RS

RI,D2(B2)

128

Links-shift im Doppelregister logisch (mit bitPosition 31 in R j )

SRDL

RS

Ri, D 2 (B 2 )

Rechts-shift logisch (mit bit-Position 31)

SRL

RS

Ri, D 2 (B 2 )

Instruktion

130

Dezimalarithmetik DI (Lj, Bi), D 2 ( L 2 , B 2 )

132

Di (LI, Bi), D 2 ( L 2 , B 2 )

138

DI (Lj, Bi), D 2 ( L 2 , B 2 )

135

SP

ssa ssa ssa ssa

Di (LI, BI), D 2 ( L 2 , B 2 )

132

ZAP

ssa

DI (Li, Bi), D 2 ( L 2 , B 2 )

134

Addieren gepackt

AP

Dividieren gepackt

DP

Multiplizieren gepackt

MP

Subtrahieren gepackt Übertragen gepackt, rechtbündig mit führenden Nullen

Festpunktarithmetik Addieren FP-Wort

A

RX

RI, D 2 (X 2 , B 2 )

141

Addieren FP-Halbwort

AH

RX

RI, D 2 ( X 2 i B 2 )

142

Addieren FP-Wort logisch

AL

RX

Ri, D 2 (X 2 , B 2 )

-

Addieren FP-Register logisch Addieren FP-Register

ALR AR

RR RR

R

Ri, R 2

140

Dividieren durch FP-Wort

D

RX

RI, D 2 ( X 2 , B 2 )

148

Dividieren durch FP-Register

DR

RR

RI, R 2

146

Multiplizieren mit FP-Wort

M

RX

RI, D 2 (X 2 , B 2 )

144

l> R2

5.2 Tabelle der Maschinenbefehle

285

Instruktion

Op.Code symb.

Typ

Operandenformat explizite

Seite

Multiplizieren mit FP-Halbwort

MH

RX

R I D 2 (X 2 , B 2 )

145

Multiplizieren mit FP-Register

MR

RR

S

RX

RI R2 R I D 2 ( X 2 , B2)

143

Subtrahieren FP-Wort Subtrahieren FP-Halbwort

SH

RX

R I D 2 (X 2 , B 2 )

142

Subtrahieren FP-Wort logisch

SL

RX

R I D 2 (X 2 , B 2 )



Subtrahieren FP-Register logisch

SLR

RR

RI R2

_

Subtrahieren FP-Register

SR

RR

RI R2

140

141

Gleitpunktarithmetik Addieren GP-Doppelwort

AD

RX

Addieren GP-Register lang

ADR

RR

R I D 2 ( X 2 , B2) RI R2

149

Addieren GP-Wort

AE

RX

R I D 2 ( X 2 i B2)

151

Addieren GP-Register kurz AER

RR

RI R2

149

Addieren GP-Wort unnormalisiert

AU

RX

R I D 2 (X 2 , B 2 )

_

Addieren GP-Register kurz, unnormalisiert

AUR

RR

RI R2

_

Addieren GP-Doppelwort unnormalisiert

AW

RX

R I D 2 (X 2 , B 2 )

Addieren GP-Register lang, unnormalisiert

AWR

RR

RI R2

_

Dividieren durch GP-Doppelwort

DD

RX

R I D 2 (X 2 , B 2 )

157

RI R2 R I D 2 (X 2 , B 2 )

156

151

Dividieren durch GP-Register lang

DDR

RR

Dividieren durch GP-Wort

DE

RX

Dividieren durch GP-Register kurz

DER

RR RR

RI R2 RI R2

156

Halbieren GP-Register lang HDR Halbieren GP-Register kurz

HER

RR

RI R2

_

Multiplizieren mit GP-Doppelwort

MD

RX

R I D 2 (X 2 , B 2 )

155

Multiplizieren mit GP-Register lang

MDR

RR

RI R2

154

Multiplizieren mit GP-Wort

ME

RX

R I D 2 (X 2 , B 2 )

155

157

-

5. Anhang: Programmierhilfen

286

Instruktion

Op.Code symb.

Typ

Operandenformat explizite

Seite

Multiplizieren mit GP-Register kurz

MER

RR

Ri> R2

154

Subtrahieren GP-Doppelwort

SD

RX

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

153

Subtrahieren GP-Register lang

SDR

RR

R

Subtrahieren GP-Wort

SE

RX

Ri, D 2 (X 2 , B 2 )

153

Subtrahieren GP-Register kurz

SER

RR

RI, R 2

152

Subtrahieren GP-Wort unnormalisiert

SU

RX

Ri. D 2 (X 2 , B 2 )

-

Subtrahieren GP-Register kurz, unnormalisiert

SUR

RR

RI. R2

-

Subtrahieren GP-Doppelwort unnormalisiert

SW

RX

R I , D 2 (X 2 , B 2 )

-

Subtrahieren GP-Register lang, unnormalisiert

SWR

RR

RI, R 2

-



R

2

152

Vergleichsoperationen Vergleichen FP-Register mit FP-Wort

C

RX

RL D 2 (X 2 , B 2 )

163

Vergleichen GP-Register mit GP-Doppelwort

CD

RX

R I , D 2 ( X 2 , B2)

166

Vergleichen GP-Register lang

CDR

RR

RI, R 2

166

Vergleichen. GP-Register mit GP-Wort

CE

RX

RI, D 2 ( X 2 , B 2 )

166

Vergleichen GP-Register kurz

CER

RR

R l . R2

166

Vergleichen FP-Register mit FP-Halbwort

CH

RX

Ri, D 2 (X 2 , B 2 )

164

Vergleichen Zeichen logisch

CLC

SSi

Di (LI, Bi), D 2 (B 2 )

158

Vergleichen logisch Direktzeichen

CLI

SI

D,(Bi), I 2

160

Vergleichen gepackte Dezimalzahlen

CP

SS a

Di (Li, Bi), D 2 ( L 2 , B 2 )

161

CR TM

RR

Ri. R2 Di(B,), I2

162

SI

Vergleichen FP-Register Testen Byte mit Maske

167

Verzweigungsoperationen Verzweigen nach Laden der Rücksprungadresse

BAL

RX

R l , D 2 (X 2 , B 2 )

173

5.2 Tabelle der Maschinenbefehle

287

Instruktion

Op.Code symb.

Typ

Operandenformat explizite

Seite

Verzweigen zu Registeradresse nach Laden der Rücksprungadresse

BALR

RR

Rl, R2

174

Verzweigen bedingt

BC

RX

MI, D 2 ( X 2 , B 2 )

169

Verzweigen bedingt zu Registeradresse

BCR

RR

MI, R 2

170

Vermindern Inhalt Register und Verzweigen bei # 0

BCT

RX

Ri, D 2 ( X 2 , B 2 )

175

Vermindern Register und Verzweigen bei 0 (Adresse in R 2 )

BCTR

RR

Ri, R2

176

Verzweigen wenn (Ri> nach Erhöhung größer bzw.

BXH

RS

RI, D 2 (B 2 )

178

Verzweigen wenn (R,> nach Erhöhung kleiner/ gleich bzw. BXLE

RS

Ri, D 2 (B 2 )

178

Modifizieren und Ausfuhren des adressierten Befehls EX

RX

R I , D 2 ( X 2 , B2)

179

Erweiterter mnemotechnischer Befehlscode für BC unbedingte Verzweigungen Sprung

B

RX

RI, D 2 ( X 2 , B 2 )

170

Sprung (Adresse in R 2 )

BR

RR

RI, R 2

171

Keine Operation

N0P

RX

R,, D2(X2,B2)

170

Keine Operation (Adresse in R 2 )

N0PR

RR

RI, R 2

-

Verzweigung nach Vergleichsoperationen Verzweigen bei gleich

BE

RX

RI, D 2 ( X 2 , B 2 )

170

Verzweigen bei größer

BH

RX

Rl, D 2 ( X 2 , B 2 )

170

Verzweigen bei kleiner

BL

RX

Ri, D 2 (X 2 , B 2 )

170

Verzweigen bei ungleich

BNE

RX

RL D 2 (X 2 , B 2 )

170

Verzweigen bei kleiner/ gleich

BNH

RX

RI, D 2 ( X 2 , B2>

170

Verzweigen bei größer/ gleich

BNL

RX

R l , D 2 ( X 2 , B2)

170

Verzweigung nach arithmetischen Operationen Verzweigen bei negativ

BM

RX

Rl, D 2 ( X 2 , B 2 )

-

5. Anhang: Programmierhilfen

288 Op.Code symb.

Typ

Operandenformat explizite

Seite

Verzweigen bei nicht negativ

BNM

RX

R i . D 2 ( X 2 ) B2)

_

Verzweigen bei nicht positiv

BNP

RX

R i . D 2 (X 2 > B 2 )

Verzweigen bei ungleich Null

BNZ

RX

Instruktion

-

_

Verzweigen bei Überlauf

B0

RX

R i . D 2 ( X 2 , B2) Ri, D 2 ( X 2 , B 2 )

Verzweigen bei positiv

BP

RX

R i . D 2 (X 2 > B 2 )

-

Verzweigen bei gleich Null

BZ

RX

Ri. D 2 ( X 2 , B 2 )

-

-

Verzweigung nach TM (Testen Maske) Verzweigen bei Einsen und Nullen

BM

RX

R „ D 2 ( X 2 ) B2)

170

Verzweigen bei Einsen

B0

RX

170

Verzweigen bei Nullen

BZ

RX

Ri. D 2 (X 2 , B 2 ) Ri. D 2 (X 2) B 2 )

170

5.3 Tabelle der 2er-Potenzen

n

2"

n

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

1 2 4 8 16 32 64 128 256 512 1 024 2 048 4 096 8 192 16 384 32 768 65 536 131 072 262 144 524 288 1 048 576

21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

2n 2 097 152 4 194 304 8 388 608 16 777 216 33 554 432 67 108 864 134 217 728 268 435 456 536 870 912 1 073 741 824 2 147 483 648 4 294 967 296 8 589 934 592 17 179 869 184 34 359 738 368 68 719 476 736 137 438 953 472 274 877 906 944 549 755 813 888 1 099 511 627 776 2 199 023 255 552

5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)

289

5.4 Umrechnungstabelle sedezimal - dezimal

Z4 0 1 2 3 4 5 6 7 8 9 A B C D E F z; i -

Z4

65 131 196 262 327 393 458 524 589 655 720 786 851 917 983

• 16 4

Z3

0 536 072 608 144 680 216 752 288 824 360 896 432 968 504 040

0 1 2 3 4 5 6 7 8 9 A B C D E F

Z3-163

4 8 12 16 20 24 28 32 36 40 45 49 53 57 61

Sedezimalziffer

0 096 192 288 384 480 576 672 768 864 960 056 152 248 344 440

z2 0 1 2 3 4 5 6 7 8 9 A B C D E F

z 2 • 16 2

1 1 1 1 2 2 2 2 3 3 3 3

Zl 0 1 2 3 4 5 6 7 8 9 A B C D E F

0 256 512 768 024 280 536 792 048 304 560 816 072 328 584 840

z

r

16 1 0 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240

zo

zo•16°

0 1 2 3 4 5 6 7 8 9 A B C D E F

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

Zj • 16' - Dezimalwert

Sedezimalstelle mit dem Stellenwert 16'

5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)

Halbbytes (sedezimal) 00 Ol 02 03 04 05 06 017 08 09 OA OB OC OD OE OF

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

Maschineninstruktionen (symb. Op.Code)

Druckzeichen, Maskenzeichen

Seite

_ —

_ _ SPM BALR BCTR BCR SSK ISK SVC

-

174 176 170 — -

— — -

-

290

Halbbytes (sedezimal) 10 11 12 13 14 15 16 17 18 19 1A 1B IC 1D IE 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41

5. Anhang: Programmiethilfen

Dezimalwert

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

Maschineninstruktionen (symb. Op.Code) LPR LNR LTR LCR NR CLR (HR XR LR CR AR SR MR DR ALR SLR LPDR LNDR LTDR LCDR HDR

Druckzeichen, Maskenzeichen

Seite

93 92 -

Zifferzeichen Startzeichen für Nullen Endezeichen für Nullen

91 180 180 180 87 162 140 140 143 146 -

_ -

-

_

LDR CDR ADR SDR MDR DDR AWR SWR LPER LNER LTER LCER HER

99 166 149 152 154 156 -

-

_ -

LER CER AER SER MER DER AUR SUR STH LA

98 166 149 152 154 156 -

Leerzeichen (blank)

95 85

291

5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)

Halbbytes (sedezimal) 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74

Dezimalwert 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

Masch ineninstruktionen (symb. Op.Code) STC IC EX BAL BCT BC LH CH AH SH MH CVD CVB ST

Druckzeichen, Maskenzeichen

< (

+

1 &

Seite 96 90 179 173 175 169 89 164 142 142 145 -

116 115 94 -

N CL 0 X L C A S M D AL SL STD

182 -

i

$ *

)

182 182 88 163 141 141 144 148

;

-

i

-

-

/

102 -

-

LD CD AD SD MD DD AW SW STE

t

%

> 7

100 166 151 153 155 157 -

101 -

-

-

5. Anhang: Pogrammierhilfen

292

Halbbytes (sedezimal)

Dezimalwert

75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F AO Al A2 A3 A4 A5 A6 A7

117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167

Maschineninstruktionen (symb. Op.Code)

Druckzeichen, Maskenzeichen

Seite

_ -

LE CE AE SE ME DE AU SU SSM

#

@ = "

99 166 151 153 155 157 -

LPSW

-

WRD RDD BXH BXLE SRL SLL SRA SLA SRDL SLDL SRDA SLDA STM TM MVI TS NI CLI 01 XI LM

-

178 178 130 131 127 127 -

128 129 97 167 81

_

184 160 184 184 93 -

SI0 TI0 HI0 TCH

-

-



5.5 Tabelle der möglichen bit-Muster im Byte (sedezimal)

Halbbytes (sedezimal)

Dezimalwert

A8 A9 AA AB AC AD AE AF BO B1 B2 B3 B4 BS B6 B7 B8 B9 BA BB BC BD BE BF CO C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF DO Dl D2 D3 D4 D5 D6 D7 D8 D9 DA

168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218

Maschineninstruktionen (symb. Op.Code)

Druckzeichen, Maskenzeichen

293

Seite -

-

-

-

A B c D E F G H I

MVN MVC MVZ NC CLC 0C

xc







— —

P

81 79 82 183 158 183 183

R

_

J K L M N

d,

r

B2

5.7 Fehleranzeigen des Übersetzerprogramms (Übersetzungsphase)23 A D E

M 0 S T U Y 23

Unzulässiger Wert einer symbolischen Adresse Formfehler (falscher Längenschlüssel, Operandenausrichtung fehlt, unzulässige Zeichen in Konstantendefinition, unzulässiger Konstantentyp etc.) Syntaxfehler (Ablochformat verletzt, unzulässige Zeichen, falsche Namensbildung, Literal als 1. Operand, Fehler bei der Bildung komplexer Ausdrücke etc.) Mehrfachdefinition von Symbolen Unzulässiger symbolischer Operationscode Unzulässiges Symbol im Namensfeld Fehler bei der Makroumwandlung Symbol nicht definiert Kein Basisregister verfugbar Es werden nur die am häufigsten vorkommenden Anzeigen behandelt. Die Anzeigen erscheinen im Übersetzungsprotokoll in der Spalte „flags"; nähere Einzelheiten vgl. die einschlägigen Handbücher der Hersteller.

296

5. Anhang: Programmierhilfen

5.8 Fehleranzeigen des Betriebssystems (Ablaufphase)24 P088 Nichtdecodierbarer Operationscode (meistens, wenn in Daten- oder Konstantenfelder verzweigt wird) P092 Adressierungsfehler (Ausrichtung verletzt, Adresse zu groß) P096 Unzulässiger Datencode PI00 Exponent zu groß (bei Gleitpunktarithmetik) PI04 Division durch Null P108 Mantisse gleich Null (bei Gleitpunktarithmetik) PI 12 Exponent zu klein (bei Gleitpunktarithmetik) PI 16 Dezimalüberlauf (bei Dezimalarithmetik) PI20 Registerüberlauf (bei dualer FP-Arithmetik)

24

Es werden nur die am häufigsten vorkommenden Anzeigen behandelt. Die Anzeigen erscheinen auf dem Konsolschreiberprotokoll und als „type of termination" im Kernspeicherauszug (dump); nähere Einzelheiten vgl. die einschlägigen Handbücher der Hersteller.

Literaturverzeichnis Alletsee, R. und G. Umhauer: Assembler I, II und III. Berlin - Heidelberg - N e w York 1974. Assabgui, M.: Le langage d'assemblage. Paris 1972. Barron, D. W.: Assembler und Lader. München 1970. Chapin, N.: 360/370 Programming in Assembly Language. 2. Aufl., New York (N. Y.) e. a. 1973. Dworatschek, S.: Einfuhrung in die Datenverarbeitung. 5. Aufl., Berlin 1973. Fersehkurs im Medienverbund: Einfiihrung in die Elektronische Datenverarbeitung, Band I, II, III. Fischbach, F. und J. Breidenbach: Allgemeine Einführung in die Assembler-Sprache. Mainz 1967. Flores, I.: Assemblers and BAL. Englewood Cliffs (N. J.) 1971. Germain, C. B.: Das Programmier-Handbuch der IBM/360. 4. Aufl., München 1972. Huber, W.: Assembler. München 1973. IBM-Handbuch der EDV-Organisation. IBM Schule für Datenverarbeitung: Programmieren in der IBM/360 Assembler-Sprache. ASS-PU, Text 1 - 4 , 2. Aufl., Sindelfingen 1970. IBM System/360: Die Assemblersprache. IBM System/360: Die Basic Assembler Sprache. IBM System/360: Datenorganisation auf Speichereinheiten mit direktem Zugriff. DASD-Handbuch. IBM System/360: Maschinenlogik und Aufbau der Instruktionen. 1966. IBM System/360: Principles of Operation. IDV-Lernprogramm: Elektronische Datenverarbeitung, I, II. Berlin 1971. Kuo, S. S.: Assembler Language for FORTRAN, COBOL, and PL/I Programmers. Reading (Mass.) e. a. 1974. Lohr, K. P.: Assembler-Programmierung. Berlin 1972. Mrachacz, H.-P.: Einführung in das praktische Programmieren. München 1972. Mrachacz, H.-P. und G. Paetz: Taschenbuch für Programmierer. München 1971. Niemeyer, G.: Ein integriertes Datenverarbeitungs- und Informationssystem. Berlin 1972. Opler, A. (Hrsg.): Das IBM-System/360 und seine Programmiertechniken. 2. Aufl., München - Wien 1972. Payne, W. H.: Machine, Assembly and Systems Programming for the IBM/360. New York (N. Y.) 1969. Saxon, J. A., H. S. Englander and W. R. Englander: System 360 Programming. Englewood Cliffs (N. J.) 1968. Schiro, H. und R. Herzog: Wie sag ich's dem Computer?, 2. Aufl. München 1971. Schwarzhuber, M.: Makrosprache. Berlin - München 1971. Siemens Schriftenreihe "data praxis": Methoden zur Adressierung von Speichern mit direktem Zugriff. Siemens Schriftenreihe "data praxis": Technik der Speicherung und Wiedergewinnung von Daten mit direktem Zugriff. Siemens System 4004 BS 1000: Assembler, Beschreibung. Siemens System 4004 BS 1000: Dienstprogramme. Siemens System 4004 BS 1000: Ein-/Ausgabesystem. Siemens System 4004 BS 1000: Organisationsprogramm. Siemens System 4004: Systemkonventionen. Siemens System 4004 Zentraleinheiten 4004/127, 135-2, 45-3. Beschreibung und Befehlsliste. Stabley, D. H.: System 360 Assembler Sprache. Stuttgart 1969. Struble, G.: Assembler Language Programming. Reading (Mass.), 1969.

298

Literaturverzeichnis

[39]Tuggle, S.: Assembler Language Programming: System/360 & 370. Chicago (III.) e. a. 1975. [40] Univac Serie 9000: Programmierungs-Standard, Bibliothek Teil 1 und 2. [41 JUnivac Serie 9000: Technische Beschreibung 9200, 9300. [42] Wolters, M. F. (Hrsg.): Der Schlüssel zum Computer. Reinbek b. Hamburg, 1974.

Stich wortverzeichn is A Addieren (Wort) 141 AD Addieren normalisiert lang 151, 152 ADR Addieren normalisiert lang (Register) 1 4 9 - 1 5 1 Adresse, siehe Arbeitsspeicheradressierung Adreßkonstanten 6 4 - 6 6 AE Addieren normalisiert k u r z 151, 152 AE R Addieren normalisiert k u r z (Register) 1 4 9 , 1 5 0 AH Addieren Halbwort 142, 143 AP Addieren dezimal 1 3 2 - 1 3 4 AR Addieren (Register) 140 Arbeitsspeicher 9 Organisation des - 9 Arbeitsspeicheradressierung 38 f f . absolute 39, 4 0 , 65, 189 f f . einfache 38 f f . explizite 68 f f . implizierte - 69 f f . indizierte - 4 2 f f . relative - 3 9 , 4 0 , 5 2 , 5 3 , 65 relative symbolische - 52, 7 7 - 7 9 symbolische 40, 54, 6 6 f f . Assembler, siehe Umwandlungsprogramm ASSEMBLER 4 6 f f . Elemente des - 47 Assembleranweisungen 47, 180 f f . A u f b e r e i t e n z u m Drucken 108 f f . Aufbereitungsmaske 109 Ausdrücke 4 8 f f . Ausführungsphase 180, 192 f f . B Verzweigen unbedingt 170 BAL Springen und Speichern Rücksprungadresse 173 BALR Springen (zu Registeradresse) und Speichern Rücksprungadresse 174 Basisadresse 39 absolute - 5 2 , 189 f f . relative - 5 2 , 5 3 , 189 f f . Basisregister 31, 38 f f . , 189 f f . BC Springen bedingt 1 6 9 , 1 7 0 — erweiterter Bedingungscode 170 BCR Springen (zu Registeradresse) bedingt 1 7 0 , 1 7 1 BCT Springen nach Zählen 175, 176 BCTR Springen {zu Registeradresse) nach Zählen 176, 177

Befehle, siehe Maschinenbefehle BE Verzweigen bei gleich 170 Befehlszählregister 33, 39 BH Verzweigen bei größer 170 Binärkonstante 59, 60 Bindephase 195 bit 9 - Positionen 9 f f . - Muster 9 ff. BL Verzweigen bei kleiner 170 BM Verzweigen bei gemischtem bit-Muster 170 BNE Verzweigen bei ungleich 170 BNH Verzweigen bei nicht größer 170 BNL Verzweigen bei Einsen-bit-Muster 170 BP Sprung bei positiv 170 Buchstabendarstellung 13, 15 BXH Springen, w e n n Index größer 1 7 8 , 1 7 9 BXLE Springen, w e n n I n d e x kleiner oder gleich 178, 179 Byte 9 BZ

Sprung bei Nullen-bit-Muster 170

C Vergleichen algebraisch (FP-Wort) 163, 164 CD Vergleichen lang 167 CDR Vergleichen lang (Register) 166 CE Vergleichen kurz 167 CER Vergleichen k u r z (Register) 1 6 6 CH Vergleichen Halbwort 165 CLC Vergleichen logisch 1 5 8 - 1 6 0 CLI Vergleichen logisch direkt 160 CLOSE Schließen einer o d e r mehrerer Dateien 212,213 C N T R L Steuerung eines peripheren Geräts 217, 2 1 8 CNVTDEGP U m w a n d l u n g dezimal nach sedezimal G l e i t p u n k t 117 f f . CNVTGPDE Umwandlung sedezimal Gleitpunkt nach dezimal 117 f f . C o d e u m w a n d l u n g 16 f f . , 1 0 3 f f . - EBCDI nach dezimal gepackt 1 0 3 - 1 0 6 - dezimal gepackt nach EBCDI 1 0 6 - 1 1 5 - dezimal gepackt nach dual 115, 116 - dual nach dezimal gepackt 116, 117 - dezimal n a c h sedezimaler G l e i t p u n k t zahl 117, 119 f f . - sedezimal G P nach dezimal 117, 120 f f .

300 CP Vergleichen dezimal 161, 162 CR Vergleichen algebraisch (Register) 162, 163 CSECT Definieren eines Programmabschnitts 193 ff. CV B Umwandeln in Dualzahl 115, 116 CVD Umwandeln in Dezimalzahl 116, 117 D Dividieren (Wort) 148, 149 Dateidefinitionen 207 ff. DC Definieren Konstante 186, 187 DD Dividieren lang 157, 158 DDR Dividieren lang (Register) 156, 157 DE Dividieren kurz 1 5 7 , 1 5 8 DER Dividieren kurz (Register) 156, 157 Dezimalbefehle (arithmetische) 132 ff. Dezimalkonstante 6 2 - 6 4 Dezimal gepackte Zahlendarstellung 16 ff. Direktoperanden 33 Direktwerte 49 ff. binäre - 51 dezimale - 50 sedezimale - 51 Zeichen - 5 1 , 5 2 Distanzadresse 31, 32, 35, 38 ff., 190 f. Doppelwort 10 Doppelwortgrenze 44 Ausrichtung auf - 44, 188 DP Dividieren sedezimal 1 3 8 , 1 3 9 DR Dividieren (Register) 146, 147 DROP Sperren von Basisregistern, die vorher durch USING zugewiesen wurden 192 DS Definieren Speicherplatz 187 ff. DTFDA Dateierklärung für Gerät mit direktem Zugriff 208 f. DTFEN Ende der Dateierklärungen 208 f. DTFSR Dateierklärung für Gerät mit seriellem Zugriff 208 ff. Dualer Stellenwert 14, 18, 19, 23 Duale Zahlendarstellung 17 ff., - im Halbwort 1 9 - 2 3 - im Festpunktregister 1 9 - 2 3 - im Wort 1 9 - 2 3 Duplizierfaktor 56 EBCDI-Code 11 ff. Buchstabendarstellung im - 12, 13, 15 Sonderzeichendarstellung im - 13, 16 Vorzeichendarstellung im - 12, 15 Zahlendarstellung im - 12, 15 Zifferndarstellung im - 11, 15

Stichwortverzeichnis ED Aufbereiten 1 0 8 - 1 1 5 Einfügungszeichen in Druckmaske 109 Endezeichen in Druckmaske 109 END Beenden der Umwandlung 195 ff. Entpacken 17, 1 0 6 - 1 0 8 ENTRY Definieren symbolische Adresse als Einsprungstelle 195 ff. E 0 J Programmende (identisch mit TERM) 219 EQU Wertzuweisung zu einem Symbol 4 9 - 5 1 , 185, 186 Erweiterter Bedingungscode bei Verzweigungsbefehlen 170 EX Ausführen 179, 180 EXTRN Erklären externer Symbole 6 6 , 1 9 4 ff. Festpunktkonstante 60, 61 Festpunktregister 10, 19 GET Lesen seriell 213, 214 Gleitpunktbefehle (arithmetische) 1 4 9 - 1 5 8 Gleitpunktkonstante 62 Gleitpunktregister 10, 29, 30 Gleitpunktzahl 29, 30 Halbbyte 13, 18 Halbwort 10, 18, 1 9 - 2 1 Halbwortgrenze 45 Ausrichtung auf - 44 ff., 60, 189 IC Laden Zeichen 90, 91 Indexregister 32, 42, 43 Instruktionen 47 Instruktionstypen 32 ff. Formate der - 32 ff., 295 Kilobyte 9 Komplementierung 20, 9 1 - 9 3 Konstantentyp 56 ff. L Laden (FP-Wort) 88, 89 LA Laden Adresse 8 5 - 8 7 Ladeadresse 39, 65, 189 Ladebefehle 85 ff. Längenattribut 54 Längenschlüssel 56 expliziter - 56 impliziter - 57 LCR Laden Komplement 9 1 , 9 2 LD Laden lang 100, 101

301

Stichwortverzeichnis LDR Laden lang (Register) 99 LE Laden kurz 99, 100 LER Laden kurz (Register) 98 LH Laden Halbwort 89, 90 Literal 54 ff. - mit Adreßkonstante 64 ff. - mit Binärkonstante 59, 60 - mit Dezimalkonstante 6 2 - 6 4 - mit Festpunktkonstante 6 0 - 6 2 - mit Gleitpunktkonstante 62 - mit Sedezimalkonstante 58, 59 - mit Zeichenkonstante 57, 5 8 Literalbereich 200 LM Laden mehrfach 93, 94 LNR Laden negativ 92 LPR Laden positiv 93 LR Umladen Registerwert 87, 88 L T 0 R G Eröffnen eines Literalbereichs 200 M Multiplizieren Register mit Vollwort 144, 145 Makro 47, 202 ff. - Aufruf 47, 202, 205 - Bibliothek 202, 205, 206 - Definition 202 ff. Mischform - 204 Schlüsselwort - 204 Stellungs - 203, 204 System - 207 ff. - Umwandler 202, 205 Makros 47, 202 ff. - zur Dateidefinierung 207 ff. - zum Öffnen und Schließen von Dateien 212, 213 - zum Schreiben und Lesen 2 1 3 - 2 1 7 - zur Steuerung peripherer Geräte 217-219 Maschinenbefehle 47, 66 ff. Beschreibung der - 79 ff. Syntax der - 6 7 - 7 7 Maschineninstruktionen 31 ff. MD Multiplizieren mit GP-Doppelwort 155,156 MDR Multiplizieren GP-Register lang 154, 155 ME Multiplizieren mit GP-Wort 155, 156 MER Multiplizieren GP-Register kurz 154, 155 MH Multiplizieren Register mit Halbwort 145,146 MP Multiplizieren gepackt 1 3 5 - 1 3 7

MR Multiplizieren Register 1 4 3 , 1 4 4 Musteranweisung 203 ff. MVC Übertragen Zeichen 79, 80 MVI Übertragen Direktzeichen 81 MVN Übertragen rechte Halbbytes (Ziffern) 81, 82 MV© Übertragen Zeichen versetzt 8 3 - 8 5 MVZ Übertragen linke Halbbytes (Zonen) 82, 83 N bitweise UND-Verkniipfung Register mit indiziertem Speicherwort 182 f. NC bitweise UND-Verknüpfung Speicherfeld mit Speicherfeld 183 Nl bitweise UND-Verknüpfung Speicherfeld mit Direktwert 184 NR bitweise UND-Verknüpfung Register mit Register 180 f. Nullenunterdrückung 108 ff. 0 bitweise 0DER-Verknüpfung Register mit indiziertem Speicherwort 182 f. Objektprogramm 31, 46 OC bitweise 0DER-Verknüpfung Speicherfeld mit Speicherfeld 183 01 bitweise 0DER-Verknüpfung Speicherfeld mit Direktwert 184 OPEN Eröffnen von Dateien 212 Operanden 31, 66 ff. - Adressierung 34 ff., 38 ff. Ausrichtung der - 44, 45 Länge der - 44 Operationscode 66 ff. OR bitweise 0DER-Verknüpfung Register mit Register 180 f. ORG Setzen des Zuordnungszählers 199 PACK Packen von gezonten Dezimalzahlen 16, 17, 1 0 3 - 1 0 6 PRINT Modifikation des Protokollumfangs 2 0 1 , 2 0 2 Programmsegment 193 ff. Programm-Modul 193 ff. P R T 0 V Vorschub bei Formularende 211, 218,219 PUT Schreiben seriell 214, 215 Quellenprogramm 46 ff. READ Lesen gestreut 215, 216 Register 10

Stichwortverzeichnis

302

Laden - 85 f f .

SS-Instruktionen, echt 37, 38

- Operanden 33 ff.

-

-

ST

inhalten, Speichern von 94 f f .

symbolisch 7 3 - 7 7 Speichern (FP-Wort) 94, 95

Relative Adressierung 39 f f . , 7 7 - 7 9

START

-

bei R X - und RS-Instruktionen 77

Startzeichen in Druckmaske 108

-

bei Sl-Instruktionen 78

STC

Speichern Zeichen 96, 97

-

bei SS-Instruktionen 78, 79

STD

Speichern lang 102, 103

RR-Instruktionen, echt 34

STE

Speichern kurz 101, 102

-

Stellenwert 12 f f .

symbolisch 67, 68

RS-Instruktionen, echt 35, 36 -

193

dezimaler - 21, 22

symbo lisch 71, 7 2

dualer - 14, 23

Rücksprungadresse 171 f f .

sedezimaler - 23

RX-Instruktionen, echt 34, 35

STH

Speichern Halbwort 95, 96

-

symbolisch 68, 69

STM

Speichern mehrfach 97, 98

-

als Sprungbefehle 70, 71

Symbole 48, 49 Symbolische Maschineninstruktionen 66 f f . Syntax der -

S

Subtrahieren (Wort) 141

Schutzsternschreibung 112, 113 SO

Subtrahieren normal lang 153

SDR

Subtrahieren normal lang (Register)

Systemmakros 207 f f . TERM

Beenden des Programms 219

152, 153

Tetrade 13

SE

TITLE

Subtrahieren normal kurz 153

Sedezimale Schreibweise 13 f f .

67-77

Symboltabelle 49

TM

Drucken Kopfzeile 201 Testen m i t M a s k e l 6 7 - 1 6 9

Buchstabendarstellung in - 15 Sonderzeichendarstellung in - 16

Übertragungsbefehle 7 9 - 8 5

Zahlendarstellung in - 15

Übungsprogramme 220 f f .

Zifferndarstellung in - 15

Umwandlung 41, 43, 5 2 - 5 6

Sedezimalbrüche 26, 27

Umwandlungsprogramm 46

Sedezimalkonstante 58, 59

U N P K Entpacken 1 0 6 - 1 0 8

Sedezimalsystem 14

USING

Sedezimalzahl 23 f f .

189-191

Segment 193 f f .

Unterprogrammsprung 171 f f .

SE R

Deklarieren Basisregister 41,

Subtrahieren normal kurz

(Register) 153

Vergleichsbefehle 1 5 8 - 1 6 9

SH

Verzweigungsbefehle 1 6 9 - 1 8 0

Subtrahieren Halbwort 142, 143

Shift-Befehle 1 2 7 - 1 3 2

V o l l w o r t 10

Sl-Instruktionen, echt 36, 37

Vollwortgrenze 45

-

symbolisch 72, 73

SLA

Verschieben links 128

Ausrichtung auf - 45, 6 0 - 6 2 , 188 Vorzeichendarstellung 12, 15, 20, 29, 30

S L D A Verschieben links doppelt 129, 130 SLL

Verschieben links logisch 131, 132

WAITF

SP

Subtrahieren dezimal 132, 133

eines Großspeichers beendet ist 216, 217

Warten, bis eine E/A-Operation

Sonderzeichendarstellung 13, 16

Wertzuweisung, siehe E Q U

Speicherbefehle 94 f f . , 1 0 1 - 1 0 3

WRITE

Speicheroperanden 31

Wort 18, 19, 20

Schreiben gestreut 216

Sprungbefehle 70, 71, 1 6 0 - 1 8 0 SR

Subtrahieren (Register) 140

X

SRA

Verschieben rechts 127

Register mit indiziertem Speicherwort 182 f.

bitweise exklusive 0DER-Verknüpfung

SR D A Verschieben rechts doppelt 128, 129

XC

SRL

Speicherfeld mit Speicherfeld 183

Verschieben rechts logisch 130, 131

bitweise exklusive 0DER-Verknüpfung

Stichwortverzeichnis XI bitweise exklusive 0DER-Verknüpfung Speicherfeld mit Direktwert 184 XR bitweise exklusive 0DER-Verknüpfung Register mit Register 180 ff.

Zahlendarstellung 12, 15,16 ff. dezimal gepackte - 16, 17 dezimal gezonte — 12, 15 - dual 1 7 - 2 1 - im Festpunktregister 19-21 - im Gleitpunktregister 29, 30 - im Halbwort 1 9 - 2 1 - im Wort 1 9 - 2 1 polynomiale - 2 1 - 2 9 sedezimale - 2 3 - 3 0

303 Zahlensysteme 21 ff. Umrechnung von - 23 ff. ZAR Löschen und Addieren dezimal 134,135 Zeichendirektwert 51, 52 Zeichenkettenverarbeitung 11 Zeichenkonstante 57, 58 Zifferndarstellung 11, 15 Ziffernteil 103 Ziffernzeichen in Druckmaske 108 Zonenteil 103 Zuordnungszähler 52 ff. Stand des - 52 ff. Steuerung des - 199 Vorrücken des - 200 Zweierkomplement 20

w DE

G G. Niemeyer

Walter de Gruyter Berlin-New York Einführung in das Programmieren in PASCAL

Mit Sonderteil UCSD-PASCAL-System 15,5 cm x 23 cm. 167 Seiten. 1980. Plastik flexibel DM 24,- ISBN 3110082802 (de Gruyter Lehrbuch)

E. W. Mägerle

Einführung in das Programmieren in BASIC

2., durchgesehene Auflage. 15,5 cm x 23 cm. 112 Seiten. 1980. Plastik flexibel DM 19,80 ISBN 311008227 6 (de Gruyter Lehrbuch)

K. Hambeck

Einführung in das Programmieren in COBOL

3., verbesserte Auflage. 15,5 cm x 23 cm. X, 163 Seiten. 1981. Kartoniert DM 26,ISBN 311008693 X (de Gruyter Lehrbuch)

S. Dworatschek

Grundlagen der Datenverarbeitung

6., völlig neu bearbeitete und erweiterte Auflage. 15,5 cm x 23 cm. 538 Seiten. Mit über 200 Abbildungen, 211 Übungsaufgaben und einem Anhang mit 59 Fotos. 1977. Kartoniert DM 44,ISBN 3110071908 (de Gruyter Lehrbuch)

Th. Spitta B. Gasch H. Franck

Systematische Einführung in die kommerzielle EDV

Kimm / Koch Simonsmeier / Tontsch

Einführung in Software Engineering

Problemlösen mit COBOL 15,5 cm x 23 cm. XVI, 369 Seiten. 1979. Plastik flexibel DM 36,- ISBN 3 11 007544 X (de Gruyter Lehrbuch)

15,5 cm x 23 cm. 306 Seiten. 1979. Plastik flexibel DM 38,- ISBN 3110078368 (de Gruyter Lehrbuch) Preisänderungen vorbehalten