Mikrocomputertechnik mit 8086-Prozessoren: Maschinenorientierte Programmierung. Grundlagen, Schaltungstechnik und Anwendungen 9783486786323, 9783486229387

294 130 26MB

German Pages 382 [384] Year 1994

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

Mikrocomputertechnik mit 8086-Prozessoren: Maschinenorientierte Programmierung. Grundlagen, Schaltungstechnik und Anwendungen
 9783486786323, 9783486229387

Table of contents :
Inhaltsverzeichnis
Vorwort zur dritten Auflage
1. Grundlagen
2. Bausteine der 80x86-Familie
3. Schaltungen mit 80x86-Prozessoren
4. Einführung in die maschinenorientierte Programmierung
5. Anwendungsbeispiele
6. Lösungen der Übungsaufgaben
7. Befehlslisten
8. Ergänzende und weiterführende Literatur
9. Anhang
10. Register

Citation preview

Mikrocomputertechnik mit 8086-Prozessoren Maschinenorientierte Programmierung Grundlagen, Schaltungstechnik und Anwendungen von Prof. Dipl.-Ing. Günter Schmitt 3., verbesserte und erweiterte Auflage

Mit 280 Bildern und 52 Tabellen

R. Oldenbourg Verlag München Wien 1994

Die Deutsche Bibliothek — CIP-Einheitsaufnahme Schmitt, Günter: M i k r o c o m p u t e r t e c h n i k mit 8086-Prozessoren : m a s c h i n e n o r i e n t i e r t e Programmierung ; G r u n d l a g e n , Schaltungstechnik und A n w e n d u n g e n / von Günter S c h m i t t . 3., v e r b . und e r w . A u f l . - München ; Wien : O l d e n b o u r g , 1994 Bis 2 . A u f l . u.d.T.: S c h m i t t , Günter: M i k r o c o m p u t e r t e c h n i k m i t dem 16-Bit-Prozessor 8 0 8 6 ISBN 3 - 4 8 6 - 2 2 9 3 8 - 9

© 1 9 9 4 R. O l d e n b o u r g Verlag G m b H , München Das Werk außerhalb lässig und filmungen

einschließlich aller Abbildungen ist urheberrechtlich geschützt. Jede Verwertung der Grenzen des Urheberrechtsgesetzes ist o h n e Z u s t i m m u n g des Verlages unzus t r a f b a r . Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverund die Einspeicherung und Bearbeitung in elektronischen Systemen.

G e s a m t h e r s t e l l u n g : R. Oldenbourg Graphische Betriebe G m b H , München

ISBN 3-486-22938-9

Inhaltsverzeichnis Vorwort

6

1 1.1 1.1.1 1.1.2 1.1.3 1.2 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6

Grundlagen Die Darstellung von Daten Die Darstellung von Zeichen Die Darstellung von ganzen Zahlen Die Darstellung von reellen Zahlen Rechenschaltungen Speicherschaltungen Flipflop-Schaltungen : Register und Zähler Festwertspeicher Schreib/Lesespeicher Mikrocomputerschaltungstechnik TTL-Schaltungen Bussysteme und Bustiming Verfahren zur Bausteinauswahl Eine einfache Speicher- und Peripherieschaltung Ein einfacher TTL-Mikroprozessor Ein Mikroprozessormodell (8088)

2 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.3 2.4 2.4.1 2.4.2 2.4.3 2.4.4 2.5

Bausteine der 80x86-Familie Mikroprozessoren Der Prozessor 8088 Der 16-bit-Prozessor 8086 Der 16-bit-Prozessor 80286 Die 32-bit-Prozessoren 80386 und 80486 Steuerbausteine Der Taktgenerator 8284 Der Bussteuerbaustein 8288 Der Interruptsteuerbaustein 8259A Der DMA-Steuerbaustein 8237A Der Arithmetikprozessor 8087 Peripheriebausteine Parallele Schnittstellen S e r i e l l e Schnittstellen Timer- und Zählerbausteine Analoge Peripherie Speicherbausteine

50 50 50 61 65 66 67 67 68 70 71 74 75 75 78 79 80 82

3 3.1 3.2 3.3

Schaltungen mit 80x86-Prozessoren Ein einfaches 8088-System Ein 8088-System mit PC-Bausteinen Der Entwurf eines 8086-Systems

84 84 90 97

4 4.1 4.2 4.3

Einführung in die maschinenorientierte Programmierung . . . 104 Hardwarevoraussetzungen 104 Die Entwicklung von Assemblerprogrammen 105 Registersatz und Speicheradressierung 112

.

7 7 8 8 11 14 20 20 22 26 27 28 28 33 35 40 42 48

4

Inhaltsverzeichnis

4.4 4.4.1 4.4.2 4.4.3 4.4.4 4.4.5 4.5 4.5.1 4.5.2 4.5.3 4.5.4 4.6 4.6.1 4.6.2 4.6.3 4.7 4.7.1 4.7.2 4.7.3 4.7.4 4.7.5 4.8 4.8.1 4.8.2 4.8.3 4.8.4 4.8.5 4.8.6 4.9 4.10

Die Übertragung von Daten Befehle zur Datenübertragung und Adressierungsarten . . . . Die Vereinbarung von Konstanten und Variablen im Speicher . Das P r o z e s s o r s t a t u s r e g i s t e r Peripheriebefehle Übungen zum Abschnitt Datenübertragung Sprungbefehle und Unterprogramme Die Adressierungsarten der Sprungbefehle Der unbedingte Sprung Der bedingte Sprung Der Aufruf von Unterprogrammen Verzweigungen und Schleifen Die V e r g l e i c h s - , Test- und Schiebebefehle Die Zähl- und Schleifenbefehle Übungen zum Abschnitt Verzweigungen und Schleifen Die Adressierung von Speicherbereichen Die Adreßregister der 8086-Prozessoren Die indirekte Adressierung Die Arbeit mit Stringbefehlen und Tabellen Die Stapelbefehle und Parameterübergabe Übungen zum Abschnitt Bereichsadressierung Datenverarbeitung Bitoperationen durch logische Befehle und Schiebebefehle . Die Arbeit mit vorzeichenlosen Dualzahlen Die Arbeit mit vorzeichenbehafteten Dualzahlen Die Arbeit mit BCD-kodierten Dezimalzahlen Dekodierung und Kodierung von A S C I I - Z i f f e r n Übungen zum Abschnitt Datenverarbeitung I n t e r r u p t und Interruptbefehle Die zusätzlichen Befehle der Prozessoren 80186 und 80286 .

119 119 124 127 129 131 132 132 133 135 136 139 140 145 150 151 151 153 156 162 165 165 166 171 174 175 178 182 183 188

5 5.1 5.2 5.3 5.4 5.5 5.5.1 5.5.2 5.6

Anwendungsbeispiele P a r a l l e l e und s e r i e l l e Datenübertragung PC-Hardware in Turbo Pascal Ein einfaches Monitorprogramm Analogperipherie Die Eingabe und Ausgabe von Dezimalzahlen Zahlendarstellungen im Rechner Verfahren zur Zahlenumwandlung Einführung in den Arithmetikprozessor 8087

190 190 211 219 244 250 250 255 266

6

Lösungen der Übungsaufgaben

293

7

Befehlslisten Die Befehle der 8086-Prozessoren Die Befehle des 8087-Arithmetikprozessors Mathematische Formeln zum 8087 Hexadezimale Funktionscodes der 8086-Prozessoren . . . . . Hexadezimale Funktionscodes des 8087-Arithmetikprozessors .

301 301 332 334 335 340

8

Ergänzende und weiterführende L i t e r a t u r

342

5

Inhaltsverzeichnis

9

Anhang Zahlentabellen ASCII-Zeichentabelle S i n n b i l d e r f ü r Ablaufpläne und Struktogramme Terminalprogramm f ü r den PC (C0M1) Schaltpläne zum TTL-Prozessor Mikrocode des TTL-Prozessors Monitorprogramm zum TTL-Prozessor Programmbeispiele zum TTL-Prozessor Anschlußbilder der wichtigsten Bausteine Stiftbelegung des PC/XT-Erweiterungssteckers TTL-Schaltung der P C - D r u c k e r s c h n i t t s t e l l e . . . . Anschlußbelegung der P C - D r u c k e r s c h n i t t s t e l l e Anschlußbelegung der P C - S e r i e n s c h n i t t s t e l l e V.24-Schnittstelle Unterprogramme f ü r die Ein-/Ausgabe von Dezimalzahlen . . .

345 345 346 347 348 350 354 356 360 362 365 366 367 367 368 368

10

Register

377

Vorwort zur dritten Auflage Was muß ein einführendes Buch über Mikrocomputertechnik heute leisten? Dem in einer Hochsprache programmierenden Anwender muß es eine Einführung in den Aufbau und die Arbeitsweise eines Rechners bieten; dabei ist es weder sinnvoll noch möglich, auf technische Einzelheiten a u s g e f ü h r t e r G e r ä t e e i n z u gehen. Dem mit der Digitaltechnik vertrauten Ingenieur muß es den Einstieg sowohl in die Hardware als auch in die Software praxisüblicher Systeme e r möglichen, so daß er im Stande ist, mit der Spezialliteratur und den D a t e n b ü chern der Hersteller umgehen zu können. Dem technisch orientierten P C - A n wender sind Hinweise auf den Umgang mit der Peripherie zu geben. Welche Eigenschaften sollen die als Beispiele verwendeten C o m p u t e r s y s t e m e und ihre Prozessoren haben? Die Forderungen nach übersichtlicher Struktur bei einfachem R e g i s t e r - und Befehlssatz, Nachbausicherheit bzw. Nachvollziehbarkeit der Schaltung, sowie universellem Einsatz in der Praxis lassen sich mit handelsüblichen Systemen nicht erfüllen. Die Mikrocontroller (z.B. 80xxx-Serie) sind didaktisch schwierig, da ihre Struktur auf ganz spezielle Anwendungen zugeschnitten ist; die Hardware ist durch die integrierten Speicher- und Peripherieschaltungen Messungen nicht mehr zugänglich. Die in Personal Computern (PCs) verwendeten Schaltungen und Prozessoren (z.B. 80486) sind so komplex, daß sie sich nur noch auf einer höheren Systemebene beschreiben lassen. Daher wurde die vorliegende dritte Auflage mit dem folgenden didaktischen Ziel neu g e s t a l t e t : Die Grundlagen werden ausgehend von der digitalen R e chentechnik an einem aus TTL-Bausteinen a u f g e b a u t e n und auch a u s g e f ü h r ten Prozessor zusammen mit einfachen Speicher- und Peripheriebausteinen gezeigt. Die Arbeitsweise des Rechenwerks und Mikroprogrammsteuerwerks sowie die Befehlsabläufe sind durch eine vollständige Dokumentation (Anhang) auf der G a t t e r - und Bitebene nachvollziehbar. Durch den Übergang zu e i n f a chen und ausführbaren 8088-Systemen, die die üblichen PC-Peripheriebausteine e n t h a l t e n , gelangt der Leser in die PC-Welt, die er ohne Eingriff in ein Gerät e r f o r s c h e n kann. Ein besonderer Abschnitt ist der Programmierung der PC-Hardware (Speicher- und Peripherie) in Pascal gewidmet, so daß sich technische Anwendungen auch ohne Assembler und Zusatzkarten über die s e riellen und parallelen Schnittstellen des PC verwirklichen lassen.

G r o ß - U m s t a d t , im Februar 1994

Günter Schmitt

1 Grundlagen Dieses Kapitel beschreibt die Grundlagen der Mikrocomputertechnik. Eilige Leser, die bereits mit der Digitaltechnik vertraut sind oder die schon mit anderen Prozessoren gearbeitet haben, können dieses Kapitel überlesen.

1.1 Die Darstellung von Daten Daten sind Zahlen (z.B. ein Kontostand), Zeichen (z.B. Buchstaben), digitalisierte Meßwerte (z.B. eine T e m p e r a t u r ) oder Signale (z.B. Zustand einer Steuerleitung). Sie werden im Rechner binär gespeichert und v e r a r b e i t e t . Binär b e d e u t e t zweiwertig, d.h. es gibt nur die beiden logischen Werte 0 und 1; in der Schaltungstechnik die elektrischen Zustände niedriges Potential (z.B. Low kleiner 0.8 Volt) und hohes Potential (z.B. High größer 2.4 Volt). Ein Bit ist eine Speicherstelle, die einen der beiden binären Zustände 0 oder 1 a n n i m m t . Ein Byte ist die Zusammenfassung von 8 Bits. Ein Wort besteht aus zwei Bytes (16 bit), ein Doppelwort aus vier Bytes (32 bit). Weitere Einheiten sind das Kilobyte (1024 Bytes) und Megabyte (1024 Kilobytes). Die Bezeichnungen bit, byte usw. werden als Einheit für den Informationsgehalt wie z.B. cm für die Länge verwendet und klein geschrieben.

dual dezimal Zeichen Assembler Pascal 0 0 0H $0 1 1 1H $1 2 2 2H $2 3H 3 3 $3 4 4 4H $4 5 5H 5 $5 6 6 6H $6 " " 1 7 7H 7 $7 8 8H 8 $8 9 9H 9 $9 10 A 0AH $A 11 B 0BH $B 12 C OCH $C D 0DH 13 $D 14 E 0EH $E F 0FH 15 $F

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

Bild 1-1: Die 16 Hexadezimalziffern von 0 bis F

C

ASCII

0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 OxA OxB OxC OxD OxE OxF

30H 31H 32H 33H 34H 35H 35H 37H 38H 39H 41H 42H 43H 44H 45H 46H

8

1

Grundlagen

Die Eingabe und Ausgabe von binären Speicherinhalten e r f o l g t

normalerweise

nicht

hexadezimalen

mit

den

Darstellung durch

Symbolen

entsprechend

Zusammenfassen

8086-Assemblersprache

0

und

Bild

von

1,

sondern

in der kürzeren

1-1. Das h e x a d e z i m a l e Zahlensystem

vier

Dualstellen

kennzeichnet

zu

einem

hexadezimale

neuen

Werte

entsteht

Zeichen.

durch e i n

Die

nachge-

s t e l l t e s H; vor den Z i f f e r n A bis F muß eine führende Null stehen. In Pascal setzt

man

das

Zeichen

$

vor

die

hexadezimale

Ziffernfolge;

in

der

Pro-

g r a m m i e r s p r a c h e C die Z e i c h e n Ox. D i e Assemblersprache kennzeichnet re W e r t e

binä-

mit einem n a c h g e s t e l l t e n Z e i c h e n B; zuweilen auch durch ein v o r -

a n g e s t e l l t e s Zeichen %. Beispiel: 01010101B = 55H = %01010101 = $55 = 0x55 = A S C I I - Z e i c h e n

U

1.1.1 Die Darstellung von Zeichen Für die binäre Speicherung von Zeichen v e r w e n d e t man fast ausschließlich ASCII-Code,

einen

auf

8

bit

erweiterten

Fernschreibcode.

ASCII

f r e i ü b e r s e t z t : A m e r i k a n i s c h e r N o r m c o d e für den Austausch von Der

Anhang enthält C o d e t a b e l l e n . Man

den

bedeutet

Nachrichten.

unterscheidet:

S t e u e r z e i c h e n w i e z.B. ODH = 00001101B für W a g e n r ü c k l a u f , Sonderzeichen w i e z.B. 2 A H = 00101010B für das Z e i c h e n

*,

Z i f f e r n w i e z.B. 30H = 00110000B f ü r die Z i f f e r 0, Buchstaben wie z.B. 41H = 01000001B für den Buchstaben

A

sowie

Sondersymbole und Graphikzeichen ( z . B . 0 E A H = 11101010B für ft). Im

Assembler

und in den höheren P r o g r a m m i e r s p r a c h e n

aus Z e i c h e n bestehende T e x t e

werden Z e i c h e n und

( S t r i n g s ) durch Apostrophe b e g r e n z t .

•A'

= 41H = 01000001B

'ja'

= 6 A 6 1 H = 0110101001100001B

Beispiel:

1.1.2 Die Darstellung von ganzen Zahlen

Ziffer: 1 2 3 4 6 0 5 7 8 9 Code: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 Bild 1 - 2 : B C D - C o d e zur Darstellung

Die e i n f a c h s t e fern

durch

Zahlendarstellung

einen

der

dezimalen

ist

außerordentlich

Diese

Art

Befehle

der

4-bit-Code

Eingabe

besteht

nur

in einer Codierung der

in die

Bild

1-2.

interne

da das d e z i m a l e

Zahlendarstellung

für BCD-Zahlen

Dezimalzahlen

entsprechend

(ASCII-Code)

einfach,

von

Die

binäre

Zahlensystem

w i r d j e d o c h nur selten

Dezimalzif-

Umwandlung

von

BCD-Darstellung erhalten

verwendet,

bleibt. da

die

langsam ausgeführt w e r d e n und umständlich zu

1.1 Die Darstellung von Daten

9

programmieren sind. Beispiel einer BCD-Darstellung: 13 dezimal = 00010011B = 13H In den meisten Fällen werden Dezimalzahlen in Dualzahlen umgewandelt und in dieser Form gespeichert und verarbeitet, da duale Rechenwerke schnelle Befehle f ü r alle vier Grundrechnungsarten zur Verfügung stellen. Das duale Zahlensystem verwendet nur die beiden binären Ziffern 0 und 1; die W e r t i g keiten der Dualstellen sind Potenzen zur Basis 2. Beispiel f ü r eine vierstellige Dualzahl: 1101 dual = 1*2 5 + 1*2 2 + 0*2 1 + 1*2° = 1*8 + 1*4 + 0*2 + 1*1 = 13 dezimal Bei der Umrechnung einer Dualzahl in eine Dezimalzahl werden die Dualstellen mit ihrer Stellenwertigkeit multipliziert, und die Teilprodukte w e r den a d d i e r t . Bei einer Dezimal-Dualumwandlung wird die Dezimalzahl in die dualen Stellenwertigkeiten zerlegt. Bei vierstelligen Dualzahlen sind dies wieder die Wertigkeiten 8, 4, 2 und 1. Die Zerlegung geschieht durch ganzzahlige Divisionen. Das folgende Beispiel beginnt mit der höchsten Wertigkeit 8. Der Quotient liefert die höchste Dualstelle; der Rest wird weiter zerlegt: 13 dezimal : 8 = 1 Rest 5 liefert 1*8 5 dezimal : 4 = 1 Rest 1 liefert 1*4 1 dezimal : 2 = 0 Rest 1 liefert 0*2 1 dezimal : 1 = 1 Rest 0 liefert 1*1 13 dezimal = 1*8 + 1*4 + 0*2 + 1*1 = 1101 dual

Divisionsrestverfahren Die Dezimalzahl wird laufend durch die Basis des neuen Zahlensystems d i v i d i e r t , bis der Quotient Null i s t . Die Reste ergeben die Stellen des neuen Zahlensystems. Bei der ersten D i v i s i o n entsteht die wertniedrigste S t e l l e , bei der letzten entsteht die werthöchste S t e l l e . Beispiele: Dezimalzahl dezimal nach dual: 26 2 = 13 Rest 0 13 2 = 6 Rest 1 — 6 2 = 3 Rest 0—i 3 2 = 1 Rest 1 1 2 = 0 Rest 1

26 oder oder oder oder oder

26 13 6 3

dezimal nach hexadezimal: 26 : 16 = 1 Rest 10-, 1 : 16 = 0 Rest 1 Hexadezimalzahl:

1

I

Dualzahl: 11010

Bild 1 - 3 : Das Divisionsrestverfahren mit Beispielen

II

1A

10

1 Grundtagen

Das in Bild 1-3 dargestellte Divisionsrestverfahren beginnt mit der w e r t n i e drigsten Stelle des neuen Zahlensystems. Der bei der e r s t e n Division e n t stehende Rest liefert die letzte Stelle; das Verfahren wird mit dem Q u o t i e n t e n f o r t g e s e t z t . Beim Hexadezimalsystem verwendet man für die R e s t e von 0 bis 9 die Symbole "0" bis "9" und f ü r die R e s t e von 10 bis 15 die Symbole "A" bis "F". Bei der Darstellung von ganzen Zahlen im Rechner unterscheidet man vorzeichenlose und vorzeichenbehaftete Zahlen. Vorzeichenlose Zahlen werden als natürliche Dualzahlen abgelegt; die linkeste Stelle hat dabei die höchste Wertigkeit. Bei achtstelligen Dualzahlen ist dies der Wert 128. Bild 1 - 4 zeigt die üblichen Bezeichnungen für die wichtigsten Datentypen Byte, Wort und Doppelwort. Vorzeichenlose Dualzahlen werden vorzugsweise f ü r Zähler, Schleifen, Adressen, Zeiger und Indizes von Feldern (ARRAYs) verwendet.

Typ Byte Wort Doppelw.

Länge 8 bit 16 b i t 32 b i t

Bereich hexa 0..0FFH 0..0FFFFH 0..0FFFFFFFFH

Bereich dezi Assembler Pascal 0. .255 DB BYTE 0..65535 DW WORD 0..4294967295 DD

C-Datentyp unsigned char unsigned i n t unsigned long

Bild 1 - 4 : Vorzeichenlose ganzzahlige Datentypen

Bei vorzeichenbehafteten Dualzahlen geht eine Binärstelle für das Vorzeichen verloren. Aus rechentechnischen Gründen verwendet man eine Zahlendarstellung, bei der negative Zahlen durch das Komplement dargestellt werden. Dabei wird das negative Vorzeichen durch Addition eines Verschiebewertes beseitigt. Bild 1 - 5 zeigt die Zweierkomplementdarstellung von negativen Dualzahlen und als Vergleich das entsprechende Neunerkomplement bei Dezimalzahlen. Zur Beseitigung eines negativen Vorzeichens addiert man zunächst einen Verschiebewert, der nur aus den größten Z i f f e r n des Zahlensystems (z.B. "11111111" bei 8 - b i t - W e r t e n ) besteht. Es entsteht das Einerkomplement, das sich rechentechnisch durch einen einfachen Negierer realisieren läßt. Wegen der besseren Korrigierbarkeit addiert man dazu noch eine 1, so daß mit dem Verschiebewert "100000000" (bei 8 bit) das Zweierkomplement e n t s t e h t . Die Addition der 1 geschieht über den Carryeingang des Addierers. Bei negativen Zahlen e n t s t e h t in dieser Darstellung immer eine 1 in der linkesten Bitposition. Positive Zahlen werden nicht komplementiert, es bleibt eine führende 0 als positives Vorzeichen erhalten. Die linkeste B i t p o sition ist nun das Vorzeichenbit und nicht mehr die höchste Wertigkeit. Bild 1 - 6 zeigt die wichtigsten vorzeichenbehafteten D a t e n t y p e n . Sie werden wie die reellen Datentypen vorzugsweise in den höheren Programmiersprachen und nicht bei technischen Anwendungen (Assembler) verwendet.

1.1 Die Darstellung von Daten

11

Komplementierungsregel Jede S t e l l e wird von dem höchsten Stellenwert des Zahlensystems abgezogen; dabei entsteht das (b-l)-Komplement. Addiert man zum Ergebnis die Zahl 1, so entsteht das b-Komplement (b = B a s i s ) . Bei Dualzahlen ( B a s i s b = 2) i s t der höchste Stellenwert 1. Die duale Subtraktion ( 1 - 1 = 0 und 1 - 0 = 1) läßt s i c h auf eine bitweise Negation zurückführen: aus 1 mach 0 und aus 0 mach 1. 1er-Komplement: negiere a l l e D u a l z i f f e r n 2er-Komplement: addiere z u s ä t z l i c h eine 1 Bei Dezimalzahlen ( B a s i s b = 10) i s t der höchste Stellenwert 9. 9er-Komplement: bilde die Differenz zur 9 10er-Komplement: addiere z u s ä t z l i c h eine 1 B e i s p i e l e dezimal - 26 Verschiebewert negative Zahl 9er-Komplement 10er-Komplement

99 - 26 73 + 1 74

dual : - 0 0 0 1 1 0 1 0

Verschiebewert: 1 neqative Zahl : - 0 1 1er-Komplement: + 1 2er-Komplement:

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

Rückkomplementierung 74 1 1 1 0 0 1 1 Komplementdarst.: 0 0 0 1 1 0 0 25) 1er-Komplement: + + Ii negative Zahl - 26 negative Zahl : - 0 0 0 1 1 0 1

Kcmplementdarst. 9er-Komplernent

0 1 1 0

Bild 1-5: Komplementdarstellung negativer Zahlen

Typ

Länge

Bereich hexa

Bereich dezi

Assemb.

Pascal

C-Typ

Byte

8 bit

80H..7FH

- 1 2 8 . . + 127

DB

SHORTINT

char

Wort

16 b i t

8000H..7FFFH

-32768..+32767

DW

INTEGER

int

+2147483648

DD

LONGINT

long

Dwort

32 b i t 80000000H..7FFFFFFFH

Bild 1-6: Vorzeichenbehaftete ganzzahlige Datentypen

1.1.3 Die Darstellung von reellen Zahlen Reelle Zahlen können Stellen hinter dem Dezimalpunkt (Komma) enthalten. Diese werden nach dem in Bild 1-7 dargestellten Verfahren in die dualen Stellenwertigkeiten 0.5, 0.25, 0.125, 0.0625 usf. zerlegt. Das Verfahren der laufenden Multiplikation und Abspaltung der vor dem Punkt stehenden 1

12

1

Grundlagen

kann a b g e b r o c h e n w e r d e n , wenn das Produkt Null wird. D a b e i zeigt e s sich, daß e i n endlicher D e z i m a l b r u c h einen unendlichen Dualbruch e r g e b e n kann, so d a ß die Umwandlung n a c h Erreichen einer b e s t i m m t e n Anzahl von Stellen abgebrochen w e r d e n muß. Eine Rückrechnung in das Dezimalsystem e r g i b t dann einen kleineren W e r t . Beispiel f ü r a c h t duale N a c h p u n k t s t e i l e n : 0.4 dezimal = 0.01100110 . . . . dual = 0.3984375 dezimal

Umwandlung

von

W a c h k o m m a s t e 1 1 en

Die Dezimalzahl k l e i n e r 1 (nur Nachkommastellen) wird fortlaufend mit der Basis des neuen Zahlensystems m u l t i p l i z i e r t . Jedes Produkt wird in Vorkoranastellen und Nachkommastellen z e r l e g t . Die Vorkommastellen sind die S t e l l e des neuen Zahlensystems. Mit den Nachkommastellen wird das Verfahren f o r t g e s e t z t , bis das Ergebnis Null i s t . Der I . S c h r i t t e r g i b t die I . S t e l l e h i n t e r dem Komma. B e i s p i e l e : 0,6875 dezimal nach dual

0,4 dezimal nach dual

0,6875-2 0,3750-2 0,7500-2 0,5000-2 0,0000 2 fertig!

1,3750 = 0,3750 + 0,7500 = 0,7500 + 1,5000 = 0,5000 +

0,4 0,8

1,0000 = 0,0000

0,2 0,4

0,6

+

0,0000 = 0,0000 +

Ii

genaue Dualzahl: 0,10110

0,8 0,6 0,2

0,8 = 0,8 1 ,6 = 0,6 1,2 = 0 , 2

0,4 = 0,4

0,8 = 0,8 1,6 = 0 , 6 1,2 = 0 , 2

= 0,4 = 0,4 | Abbruch! ! genäherte Dualzahl: 0 , 0 1 1 0 0 1 1 0 . . .

Bild 1 - 7 : Die U m w a n d l u n g von N a c h k o m m a s t e l l e n

R e e l l e Dezimalzahlen w e r d e n zunächst g e t r e n n t n a c h V o r p u n k t - und N a c h p u n k t s t e l l e n in Dualzahlen u m g e w a n d e l t . In der üblichen G l e i t p u n k t d a r s t e l lung (Floating P o i n t ) findet eine Normalisierung auf e i n e duale V o r p u n k t s t e l l e s t a t t . Die Länge der dualen Mantisse b e s t i m m t die G e n a u i g k e i t ; der duale Exponent b e s t i m m t den Z a h l e n u m f a n g . Die p r o b l e m o r i e n t i e r t e n P r o grammiersprachen stellen Unterprogrammbibliotheken für Zahlenumwandlungen, die vier G r u n d r e c h n u n g s a r t e n und m a t h e m a t i s c h e Funktionen zur V e r f ü gung. Sie a r b e i t e n mit unterschiedlichen reellen D a t e n f o r m a t e n . Das in Bild 1 - 8 d a r g e s t e l l t e Beispiel beschreibt den A u f b a u des reellen D a t e n t y p s float (32 bit) der P r o g r a m m i e r s p r a c h e C. Die linkeste Bitposition n i m m t das Vorzeichen der Zahl a u f , dann folgt im G e g e n s a t z zur ganzzahligen Zahlendarstellung der A b s o l u t w e r t . Die 8 bit lange C h a r a k t e r i s t i k s e t z t sich zusammen aus dem dualen Exponenten und e i n e m V e r s c h i e b e w e r t von 127 dezimal (01111111 dual), der das Vorzeichen des E x p o n e n t e n b e s e i t i g t . Von der n o r m a l i s i e r t e n Mantisse werden nur die e r s t e n 23 N a c h p u n k t s t e i l e n g e s p e i c h e r t , die f ü h r e n d e 1 der Vorpunktsteile wird u n t e r d r ü c k t und muß bei a l len O p e r a t i o n e n b e r ü c k s i c h t i g t werden.

1.1 Die Darstellung von Daten

Gleitpunktdarstellung

13

(Floating Point) [Exponent!

Normalisierung:

Vz

s

eine Vorpunktstelle

Mantisse

*

Basis

gedachte Stellung des Punktes

Charakteristik = Exponent + Verschiebung Speicherung:

Vz

Charakteristik

Beispiele: dezimal: normalisiert: dual: normalisiert:

Mantisse

2 6 . 6 8 7 5 2 . 6 6 8 7 5 * 110

Charakteristik:

1 0 . 1 0 1 1 1 . 1 0 1 0 1 0 1 1 0 0 0 0 0 0

4+127=

131 = 1 0 0 0 0 0

binär: 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 1 Vz hexa:

4

1

!

*

2

1 1.

1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 bit Mantisse

8 bit Charakt. j

10

D

5

8

|

0

'

0

0

Bild 1-8: Die Darstellung reeller Zahlen ( C - D a t e n t y p f l o a t )

Vor einer reellen Addition und Subtraktion müssen die Operanden auf einen gemeinsamen Exponenten angeglichen werden. Das b e d e u t e t , daß bei sehr unterschiedlich großen Zahlen Stellen verlorengehen können. Das folgende d e zimale Beispiel addiert die beiden Zahlen 1.0000 E4 und 1.2000 EO, die mit einer Vorpunktstelle und vier Nachpunktstellen Genauigkeit (Mantisse) g e speichert und verarbeitet werden sollen. Die Anpassung der kleineren Zahl auf den Exponenten der größeren liefert 1.2000 E0 = 0.00012 E4 und enthält fünf Stellen hinter dem Dezimalpunkt. Da aber nur vier Nachpunktstellen berücksichtigt werden können, ergibt die Summe 1.0000 E4 + 0.0001 E4 = 1.0001 E4 und nicht 1.00012 E4. Im Gegensatz zu den ganzzahligen D a t e n typen muß in der reellen Zahlendarstellung immer mit Umwandlungs- und Rundungsfehlern gerechnet werden, die sich besonders bei fortlaufenden Summationen bemerkbar machen. Die arithmetischen Coprozessoren 80x87 benutzen intern ein 8 0 - b i t - F o r m a t (EXTENDED bzw. long double) mit einer 64-bit-Mantisse (Genauigkeit c a . 19 Dezimalstellen) und einer 15-bit-Charakteristik (Zahlenumfang ca. - 1 E-4932 bis +1 E+4932). Die reellen Rechenverfahren werden e t w a 10 bis 100 mal schneller als durch Unterprogramme a u s g e f ü h r t .

14

1.2

1 Grundlagen

Rechenschaltungen

Dieser Abschnitt zeigt einfache Additions- und Subtraktionsschaltungen f ü r Dualzahlen. Für die Multiplikation und die Division sind besondere A b l a u f steuerungen mit Verschiebungen von Teilergebnissen e r f o r d e r l i c h . Die vier Grundrechenarten der reellen Gleitpunktzahlen werden von Systemunterprogrammen ( S o f t w a r e ) oder schneller von a r i t h m e t i s c h e n Coprozessoren (Hardware) a u s g e f ü h r t . Die Rechenregeln für die Addition zweier einstelliger zweistelligen Summe l a u t e n : 0 + 0 = 0 0 (Null plus Null gibt Übertrag Null Summe 0 + 1 = 0 1 (Null plus Eins gibt Übertrag Null Summe 1 + 0 = 0 1 (Eins plus Null gibt Übertrag Null Summe 1 + 1 = 1 0 (Eins plus Eins gibt Übertrag Eins Summe

Dualzahlen zu einer Null) Eins) Eins) Null)

Die Subtraktion von Dualzahlen kann entsprechend der Formel a - (+b) = a + ( - b ) auf die Addition des Zweierkomplementes zurückgeführt werden. Die in Bild 1 - 9 zusammengestellten logischen Grundfunktionen sollen nun auf ihre Brauchbarkeit für arithmetische Operationen untersucht werden.

Funktion

Nicht Not

Und And

Formel

Z= X

Z = X-Y Z = X+Y Z . X©Y

Symbol

=Eh

Tabelle

X 1Y "ÖTT 1 lo

Befehl

NOT

altes Symbol amerik. Symbol

Oder Or

=Eh

X* U 0 0 0 0 1 0 10 0 1 1 1

Eoder Xor

XjY i Z 0 i o; o 0;1 ! 1 1 :0 i 1 1 ¡1 I 0

OR

i

>

Bild 1-9: Die logischen Grundfunktionen

Nor Z=X + Y

=£h X;Y I z

0; 0 1 1 0i1 ! 1 1 ¡0 ; 1 1 11 j 0

X 'Y ! Z o;o M 011 i 0 1 ¡0 i 0 1 ¡1 I 0

XOR

>& =t>

1=7^

=0"

X YI Z 0 0i 0 Olli 1|0| 1 1111 1

AND

Nand

i

>

i >

= I >

1.2 Rechenschaltungen

15

Die Nicht-Schaltung liefert das für die Subtraktion benötigte Einerkomplement. Die Und-Schaltung ergibt die höhere Dualstelle ( Ü b e r t r a g ) der dualen Summe, die Eoder-Schaltung die niedere Stelle der Summe. Die OderSchaltung ist nur dann für eine Addition verwendbar, wenn der Fall 1 + 1 = 1 0 ausgeschlossen werden kann, wie beispielsweise bei der Addition der Teilüberträge im Volladdierer. Bild 1 - 1 0 zeigt eine Additionsschaltung, die als Halbaddierer bezeichnet wird. Schaltung a

Tabelle

b

a b C 0 0 0 0 1 0 1 0 0 1 1 1

Symbol s 0 1 1 0

Bild 1-10: Der Halbaddierer für einstellige Dualzahlen Der Halbaddierer verknüpft zwei einstellige Dualzahlen zu einer zweistelligen Summe. Die höhere Dualstelle wird auch als Übertrag (englisch Carry) b e zeichnet, weil sie bei mehrstelligen Dualzahlen mit der folgenden Dualstelle mitaddiert werden muß. Dies übernimmt der in Bild 1-11 dargestellte Volladdierer. Schaltung a

b

Cv

Tabelle a ! b Cv Cn ;S 0i0 0 OiO OjO 1 CM 0,1 0i1 0 0' 1 1 1 ;o 0 1 1 lo 0 1 0 1 :o 1 1 1 0 1 0 i 1 ¡1 1!11

Cn

S

Cn Bild 1-11: Der Volladdierer mit Übertrageingang

Der e r s t e Halbaddierer verknüpft die beiden Dualstellen, der zweite die Summe des e r s t e n Halbaddierers mit dem Übertrag der Vorgängerstelle. Die

16

1 Grundlagen

Oder-Schaltung addiert die Teilüberträge der beiden Halbaddierer zu einem G e s a m t ü b e r t r a g , der an die nachfolgende Dualstelle w e i t e r g e r e i c h t wird. D a bei ist s i c h e r g e s t e l l t , daß die beiden inneren T e i l ü b e r t r ä g e niemals g l e i c h zeitig 1 sein können, sonst wäre anstelle der einfachen Oder-Schaltung ein w e i t e r e r Halbaddierer erforderlich. Führt man die Ubertragausgänge der V o l l addierer auf die Ubertrageingänge der Nachfolger, so e n t s t e h t ein P a r a l l e l a d dierwerk für mehrstellige Dualzahlen (Bild 1 - 1 2 ) .

Bild 1 - 1 2 : V i e r s t e l l i g e s paralleles Addier/Subtrahierwerk

Der Paralleladdierer b e s t e h t zunächst aus vier Volladdierern mit Verbindungen zur Weitergabe der Stellenüberträge. Das Carrybit, ein Speicher, ü b e r nimmt den Übertrag des werthöchsten Volladdierers. F ü r die wertniedrigste S t e l l e wird anstelle eines Halbaddierers ein Volladdierer verwendet. D a durch kann zu den beiden Operanden A und B noch das Carry (der Ü b e r t r a g ) einer vorangegangenen Operation aus dem Carryspeicher mitberücksichtigt werden. Die Und-Schaltung vor dem Übertrageingang des letzten Volladdierers wirkt als S c h a l t e r . Liegt am Steuereingang SO eine 1, so wird der a l t e Inhalt des Carryspeichers bei der Operation auf den Übertrageingang g e s c h a l t e t . Ist e r 0, so liegt immer eine 0 am Ausgang der Und-Schaltung, und e s wird immer zusätzlich 0 addiert bzw. subtrahiert, also ohne Carry g e r e c h n e t . Die Subtraktion wird auf die Addition des Zweierkomplementes zurückgeführt nach der F o r m e l "A - B = A + ( - B ) " . Dazu können die Stellen des zweiten Operanden B wahlweise negiert werden. Dies geschieht über E o d e r - S c h a l t u n gen mit der Steuerleitung S l . Sind diese Steuereingänge 0, so wird der zweite Eingang (Operand B ) für eine Addition unverändert d u r c h g e s c h a l t e t . Sind die Steuereingänge der Eoder-Schaltungen jedoch 1, so wird das E i n e r komplement des Operanden B gebildet. D a gleichzeitig auch der Ü b e r t r a g e i n gang des letzten Volladdierers negiert wird, e n t s t e h t durch die zusätzliche

1.2 Rechenschaltungen

Addition von 1 das Z w e i e r k o m p l e m e n t ,

17

und die Schaltung s u b t r a h i e r t

durch

Addition des Z w e i e r k o m p l e m e n t e s . Durch Negation des Ü b e r t r a g a u s g a n g s letzten

Volladdierers

wird das neue Carry wieder k o r r i g i e r t

speicher für die n ä c h s t e O p e r a t i o n bzw. für eine F e h l e r k o n t r o l l e

festgehalten.

Durch den Steuereingang SO für das a l t e Carry und den S t e u e r e i n g a n g das Z w e i e r k o m p l e m e n t

des Operanden

folgende a r i t h m e t i s c h e O p e r a t i o n e n S1

SO

0

0

0

1

1

0

1

1

des

und im C a r r y -

S1 für

B kann die Schaltung n a c h Bild 1 - 1 2

ausführen:

Operation Addition F = A + B + 0 A ddit ion F = A + B + Carry Subtraktion F = A -

B - 0 Subtraktion F = A - B - Carry

B e i O p e r a t i o n e n mit vorzeichenlosen vierstelligen Dualzahlen l i e g t der z u l ä s sige

Zahlenbereich

zwischen 0 ( 0 0 0 0 ) und 15 (1

1 1 1). T r i t t

bei

Addition im Carrybit eine 1 a u f , so liegt ein Zahlenüberlauf vor, da ein stelliges

Ergebnis e n t s t a n d e n

Zahlenunterlauf

ist. Bei einer

e b e n f a l l s eine

der fünf-

Subtraktion e r s c h e i n t bei einem

1 im ( k o r r i g i e r t e n ) C a r r y b i t . Durch e i n e

frage des Carrybits nach e i n e r

Operation

Ab-

mit vorzeichenlosen Zahlen ist e s

möglich, Ü b e r l a u f - bzw. U n t e r l a u f f e h l e r zu e r k e n n e n . Carry = 0 : Ergebnis im zulässigen

Bereich

Carry = 1: Überlauf (Addition) bzw. U n t e r l a u f

(Subtraktion)

Die

auch vierstellige

gleiche

behaftete der zeige

Schaltung addiert

Dualzahlen

Komplementdarstellung nicht

und s u b t r a h i e r t

vorzeichen-

im B e r e i c h von - 8 (1 0 0 0) bis +7 (0 1 1 1). Wegen ist das C a r r y b i t als Ü b e r l a u f - bzw.

brauchbar. Stattdessen

verwendet

Unterlaufan-

man zur F e h l e r e r k e n n u n g

ein

" O v e r f l o w " - oder Ü b e r l a u f b i t , das e n t w e d e r aus dem Ü b e r t r a g des vorletzten Volladdierers Vorzeichen

auf

der

den

letzten

Operanden

Volladdierer

mit

dem

oder durch e i n e n

Vorzeichen

des

Vergleich

Ergebnisses

der

gewonnen

wird ( B i l d 1 - 1 5 ) . Overflow = 0: Ergebnis im zulässigen

Bereich

Overflow = 1: Überlauf bzw. U n t e r l a u f Addierer

können nicht

logische

Verknüpfungen

eine

Erweiterung

des

Arithmetisch-Logischen Die

Steuerleitung

Operationen.

S4

nur für a r i t h m e t i s c h e der

Operanden

einfachen Einheit

Volladdierers

werden.

(Bild

Bild 1 - 1 3

1-11)

zu e i n e r

zeigt 1-bit-

(ALU).

unterscheidet

B e i allen logischen

O p e r a t i o n e n , sondern auch für

verwendet

zwischen

Operationen

logischen

und

ist S 4 = 0;

arithmetischen

die Operanden A

und B werden ohne Verbindung mit den Nachbarn V o r g ä n g e r und N a c h f o l g e r logisch verknüpft, da die C a r r y l e i t u n g e n 0 sind. Für S4 = 1 werden die a r i t h metischen

Operationen

mit

dem Carry des V o r g ä n g e r s Cv durchgeführt;

Carryausgang Cn wird auf den N a c h f o l g e r

weitergeschaltet.

der

18

1 Grundlagen

S4 x

S3 x

A x

B x

S2 x

S1 x

x S0

Cv x

Bild 1 - 1 3 : 1 - b i t - A L U für arithmetische und logische Operationen Die Steuerleitung S3 = 1 negiert und korrigiert die Carrybits. Für S3 Mit der Steuerleitung S2 kann der Operationen nur auf den Operanden

den Operanden B für alle Subtraktionen = 1 wird der Operand B nicht verändert. Operand B auf 0 gesetzt werden, wenn A angewendet werden sollen.

Mit den Steuerleitungen S1 und SO kann entweder die Und-Verknüpfung der beiden Operanden oder die Summe (Eoder) des zweiten Halbaddierers auf den Ergebnisausgang F geschaltet werden. Sind beide Steuersignale 0, so ist das Ergebnis immer 0; sind beide 1, so entsteht als Oder-Verknüpfung der beiden Eingänge die logische Oder-Funktion. Bild 1 - 1 4 zeigt die für Befehle verwendeten Funktionen.

S41531S2!S1 1 SO 0 i 0 ! 0 ! 0: 0 0 01 0 0: 1 0 0 11 0 1 0' 0: 1 M 0 0 0 1 1 1 1 0 0 01 1 1 0• 1 0 1 1 1 0 0 1 1I 1: 1 ; 0: 1

Cn 0 0 0 0 0 Übertrag Übertrag Borgen Borgen

Funktion F = 0 F = A F = A X0R B F = A AND B F = A 0R B F = A + Cv F = A + B + Cv F = A - Cv F = A - B - Cv

Befehl CUR LDA X0R AND 0R INR ADD DCR SUB

Bild 1 - 1 4 : ALU-Funktionen und Maschinenbefehle

Wirkung lösche lade l o g i s c h e s Eoder l o g i s c h e s Und l o g i s c h e s Oder i n k r e m e n t i e r e T+1) addiere dekrementiere (-1) subtrahiere

1.2 Rechenschaltungen

19

Bild 1 - 1 5 zeigt eine R e c h e n s c h a l t u n g mit e i n e r in T T L - T e c h n i k a u s g e f ü h r t e n 4 - b i t - A L U 74LS181. Der Baustein v e r k n ü p f t zwei 4 - b i t - O p e r a n d e n A und B zu einem 4 - b i t - E r g e b n i s F . Die Auswahl der auszuführenden Funktion e r f o l g t über S t e u e r e i n g ä n g e . Für die Behandlung der Ü b e r t r ä g e sind wie in Bild 1 - 1 2 zusätzliche Schaltungen e r f o r d e r l i c h . Das C - B i t (Carry = Ü b e r t r a g ) s p e i c h e r t den ( k o r r i g i e r t e n ) Ü b e r t r a g des l e t z t e n Volladdierers. Es dient sowohl zur F e h l e r p r ü f u n g vorzeichenloser Dualzahlen als auch als Z w i s c h e n ü b e r t r a g bei mehrstelligen O p e r a t i o n e n . Das' V - B i t ( o V e r f l o w = Ü b e r l a u f ) e n t s t e h t aus einer V e r k n ü p f u n g der V o r z e i c h e n b i t s der O p e r a n d e n und des Ergebnisses und dient zur F e h l e r p r ü f u n g bei v o r z e i c h e n b e h a f t e t e n Dualzahlen. Das Z - B i t (Zero = Null) ist dann 1 ( j a ) , wenn das Ergebnis in allen vier Bitpositionen 0 ist, und dann 0 (Nein), wenn in m i n d e s t e n s einer Bitposition eine 1 e n t h a l t e n ist. Das S-Bit (Sign = Vorzeichen) speichert das linkeste Bit d e s E r gebnisses, also das Vorzeichen v o r z e i c h e n b e h a f t e t e r (signed) Dualzahlen. Mit diesen vier Anzeigebits ist e s möglich, das Ergebnis auf Null, Vorzeichen und Zahlenüberlauf zu u n t e r s u c h e n .

Operand A

= 1 (1

...

Operand

- b i t - ALU (74 LS 181)

Cn

HM

r=1

1=1

-«»1 Ergebnis F

Bild 1-15: R e c h e n s c h a l t u n g mit einem

=I

=1 S5

& I S6

MS3tS2|SipO F unktion 1 f ö T f o F=B 1 o q il 1 F=0 1 o q oi o F=A 1 1 d ii 1 F=A AND B 1 1 1 1 0 F=A OR B 1 Ol 1| 1| 0 F=A XOR B n ol Ol o| 0 F=A PLUS Cn n 1 a oh F=A PLUS B PLUS Cn Ol Ol 1111 0 F=A MINUS B MINUS Cn 0 11 11 Ol 0F=A PLUS A PLUS Cn 0 i] il il 1 F=A MINUS Tn

ALU-Baustein

S7

20

1.3

1 Grundlagen

Speicherschaltungen

Binäre Zustände (0 oder 1) lassen sich in elektronischen Schaltungen über längere Zeiträume speichern und bei Bedarf wieder auslesen. Man unterscheidet Festwertspeicher Register

(ROM

und R A M ) ,

und EPROM)

die

beim

sowie Schreib/Lesespeicher

Einschalten

der

(Flipflop,

Versorgungsspannung

einen

zufälligen Anfangszustand haben und nach dem Abschalten ihren Speicherinhalt wieder verlieren (vergessen).

1.3.1 Flipflop-Schaltungen

Tabelle SIR 0 0 0 1 1 0

1 1

Schaltung

Symbol

Zustand verboten 1 0 setzen 0 1 rücksetzen Q T QO speichern Q!Q 1 1

_— Q - S

Bild 1-16: Der Aufbau eines N A N D - R S - F l i p f l o p s

Das in Bild 1-16 dargestellte Flipflop kann zwei stabile Zustände annehmen, also eine 0 oder eine

1 speichern. Es wird daher auch als bistabiler

Multi-

vibrator oder als bistabiles Kippglied bezeichnet. Eine logische 0 am Setzeingang ^

bringt

das

Flipflop

in den Zustand Q = 1; eine logische 0 am

Rücksetzeingang R bringt es in den Zustand Q = 0. Sind beide Eingänge 1, so speichert die Schaltung den zuletzt eingeschriebenen logischen Zustand. Der Speicherzustand Q bzw. Q kann an den Ausgängen abgegriffen werden, ohne daß sich der Zustand des Flipflops ändert. Beim Auslesen wird also der Inhalt

Tabelle T D 0 X 1 0 1 1

Schaltung

Zustand speichern Q. 0 rücksetzen 1 setzen Q

Bild 1-17: Das taktzustandsgesteuerte D - F l i p f l o p

Symbo1

1.3 Speicherschaltungen

21

nur kopiert, nicht " t r a n s p o r t i e r t " . Mit Ausnahme des " v e r b o t e n e n " F a l l s (R = S = 0 ) ist der Ausgang Q immer das Komplement (Negation) des Speicherinhalts Q. Dieser F a l l wird bei dem in Bild 1 - 1 7 dargestellten D Flipflop ausgeschlossen. Der einzige Dateneingang D wird sowohl direkt a u f den Setzeingang und als auch negiert auf den Rücksetzeingang gegeben. D bedeutet Delay (Verzögerung), weil der Zeitraum der Übernahme durch einen Taktzustand T bestimmt wird. Für T = 1 ist die Schaltung transparent (durchlässig); der am D-Eingang anliegende logische Zustand e r s c h e i n t a l s Speicherinhalt auch am Ausgang Q. Für T = 0 hält die Schaltung die zuletzt am D-Eingang angelegten Daten; Änderungen am D-Eingang werden während T = 0 nicht wirksam. Ein Flipflop mit einem aktiv-Low-Taktzustand macht dieses für T = 0 durchlässig und bringt es für T = 1 in den Speicherzustand. Das in Bild 1 - 1 8 dargestellte t a k t f l a n k e n g e s t e u e r t e Flipflop übernimmt nur die Daten, die zu einem b e s t i m m t e n Zeitpunkt am Eingang D anliegen.

Tabelle 1 T j D 0 i x 0» 1 j 0 0-e- 1 ! 1 1 X 1-»0 X

Q Q. 0

1 Q. Q.

Schaltung Zustand speichern rücksetzen setzen speichern speichern

"M Symbol

D X X I Oaten konstant

XX

Vorberei- [Halte tungszeit .zeit

Bild 1 - 1 8 : Das t a k t f l a n k e n g e s t e u e r t e

D T —

D-Flipflop

Im Taktzustand T = 0 b e r e i t e t der Dateneingang D die beiden Hilfsflipflops vor, das e i g e n t l i c h e Speicherflipflop bleibt durch logisch 1 an seinen E i n g ä n gen im Ruhezustand. Mit der steigenden T a k t f l a n k e (0 nach l ) wird nun entweder der S e t z - oder der Rücksetzeingang des Speicherflipflops auf 0 g e legt. Für den Taktzustand T = 1 bleiben die beiden Hilfsflipflops für Änderungen am Dateneingang D gesperrt. Nach der fallenden T a k t f l a n k e ( 1 nach 0 ) liegen beide Eingänge des Speicherflipflops auf 1, und die beiden H i l f s f l i p flops werden wieder durch D vorbereitet. Während einer kurzen V o r b e r e i tungszeit (set up t i m e ) vor der steigenden T a k t f l a n k e und einer noch kürzeren Haltezeit (hold t i m e ) nach der Flanke darf sich der am D-Eingang a n liegende Zustand nicht ändern. Durch Negieren des T a k t e s e n t s t e h t ein

22

1 Grundlagen

negativ flankengesteuertes Flipflop, das bei einem High-nach-Low-Übergang mit der fallenden Taktflanke ( l nach 0) übernimmt. Beim Schalten mechanischer Kontakte können Prellungen a u f t r e t e n , die sich besonders bei T a k t - und Steuersignalen störend bemerkbar machen, da a n stelle einer Flanke mehrere entstehen. Die in Bild 1 - 1 9 dargestellten E n t prellschaltungen kippen bereits bei der ersten Kontaktberührung (Flanke) um und halten den Zustand bis zur nächsten Tastenbetätigung.

Taste Prellzeit

Prellzeit

n

«

Flipflop

a. Kontakte ohne und mit Entprellschaltung

b. Entprell-Flipflop

c. Entprell- und Auto-Reset-Schaltung

Bild 1 - 1 9 : Prellungen und Entprellschaltungen

1.3.2 Register und Zähler In der technischen Ausführung faßt man oft mehrere (z.B. acht) Flipflops mit einem gemeinsamen Takteingang zu einem Baustein (Register) zusammen. Taktzustandsgesteuerte Speicherschaltungen bezeichnet man auch als Latch (Auffangspeicher). Im aktiven Taktzustand (z.B. T = 0) sind die Ausgänge Q gleich den Eingängen D; bei nicht aktivem Takt (z.B. T = 1) speichert die Schaltung. Nur bei einer Taktflankensteuerung spricht man allgemein von einem Register. Bild 1 - 2 0 zeigt den Aufbau eines Rechenwerkes mit einem 4 - b i t - R e g i s t e r als Akkumulator. Der Akkumulator (Akku) ist ein taktflankengesteuertes Register. Seine Q Ausgänge liefern den Operanden A der Arithmetisch-Logischen Einheit (ALU); das Ergebnis F der ALU liegt an den D-Eingängen. Der Akku enthält also einen der beiden Operanden und übernimmt mit der Taktflanke das E r gebnis. Das akkumulative Arbeitsprinzip soll nun am Beispiel der R e c h e n a n weisung "Z = X + Y " erläutert werden.

1.3 Speicherschaltungen

23

vom S p e i c h e r

zum Speicher Bild 1-20: 4-bit-Akkumulator mit ALU

l.Schritt: Der Inhalt der Speicherstelle " X " wird aus dem Arbeitsspeicher ausgelesen und liegt am Operandeneingang B der ALU. Nach Auswahl der ALU-Operation " F = B " wird er unverändert mit der steigenden Taktflanke in den Akkumulator übernommen.

2.Schritt: Der Inhalt der Speicherstelle " Y " wird aus dem Arbeitsspeicher ausgelesen und liegt am Operandeneingang B der ALU. Am Operandeneingang A liegt gleichzeitig der alte Inhalt des Akkumulators, also der Operand " X " . Nach Auswahl der ALU-Operation " F = A + B + 0 " liegt die Summe am Ergebnisausgang F und wird mit der steigenden Taktflanke in den Akkumulator übernommen. Mit der gleichen Taktflanke wird das Ergebnis in einem Bedingungsregister " b e w e r t e t " . Es speichert das Vorzeichen (Sign), die Prüfung auf Null (Zero) und die beiden Überlaufanzeigen (Overflow und Carry).

3.Schritt: Der Inhalt des Akkumulators mit der Summe der beiden Operanden wird ausgelesen und im Arbeitsspeicher in der Speicherstelle " Z " gespeichert. Dabei bleibt die Summe im Akkumulator erhalten und steht für weitere B e rechnungen zur Verfügung. Der Akkumulator "sammelt" also die Ergebnisse der Arithmetisch-Logischen Einheit. Da die ALU nur ein Schaltnetz ist und keine Speicher enthält, können nur taktflankengesteuerte Flipflops mit einer Haltezeit 0 oder MasterSlave-Flipflops als Akkumulator verwendet werden.

24

1

Grundlagen

CLK

CLR

D-L

-t

CLK-

Q

— 7 4 7 4 - -

-t PRE

Zustand Flanke keine Flanke Bild 1 - 2 1 : F l i p f l o p als

9

Eingänge PRE CLR CLK 1 X 0 1 0 X 1 1 • 1 1 t 1 1 0 1 1 1

D X X

1 0 X X

Funktion

Ausgänge Q 0 1 0 0 1 1 0 0 1 bleibt bleibt

setzen löschen setzen löschen speichern speichern

Frequenzteiler

n h 1

1

0

1

0

1

0

1

0

1

0

1

0

1

0

1

0

1

0

0

0

1

1

0

0

1

1

0

0

1

1

0

0

1

1

0

0

0

0

0

1

1

1

1

0

0

0

0

1

1

1

1

0

0

9

9

9

9

0

0

0

0

1

1

1

1

1

1

1

1

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

1011

1100

1101

1110

1111

NJN

N^N

•MO"

"11"

"12"

"13"

" H "

"15"

"0"

N-JN

N ^ TI

TI^TI

N^TT

"6"

" 8 "

N^n

J

0

Bewertung a l s Aufwärtszähler (»feESET Takt

U

o

-I

Nulldurchgang

0

CLIÄR-

Bewertung a l s Abwärtszähler h

Takt

h

n

n

A

1

0

1

0

1

0

1

0

1

0

1

0

1

0

1

0

B

1

1

0

0

1

1

0

0

1

1

0

0

1

1

0

0

T

C

1

1

1

1

0

0

0

0

1

1

1

1

0

0

0

0

T

0

T

D

Bild 1 - 2 2 :

1

1

1

1

1

1

1

1

0

0

0

9

0

0

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

)CBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

DCBA

0111

0110

0101

0100

0011

0010

0001

0000

"6"

«5«

NIFTT

NJN

N2«

N-JN

" 0 "

1111

1110

1101

1100

1011

1010

1001

1000

"15"

"1A"

"13"

"12"

"11"

"10"

NGN

"8"

0

4-bit-Aufwärts/Abwärtszähler

nyn

1

25

1.3 Speicherschaltungen

Das in Bild 1-21 dargestellte und Rücksetzeingänge Eingang

D. Führt

Flipflop besitzt sowohl taktunabhängige Setz-

(PRE und C L R ) als auch einen taktflankengesteuerten

man den negierten Ausgang Q des Flipflops auf den Ein-

gang D zurück, so entsteht ein Frequenzteiler, da jede steigende Taktflanke das Flipflop von 0 nach 1 bzw. von 1 nach 0 umschaltet; an den Ausgängen erscheint die halbe Taktfrequenz. Die

in

Bild

1-22 dargestellte

Teilerkette

teilt

den

Eingangstakt

in den

Verhältnissen A = Takt:2, B = Takt:4, C = Takt:8 und D = Takt: 16. B e w e r tet man das an den Ausgängen D, C, B und A anstehende Bitmuster als vorzeichenlose Dualzahl, so erscheint ein Abwärtszähler, der mit jeder steigenden Taktflanke um 1 vermindert

wird. Nach dem Endwert 0 0 0 0 (0) beginnt

der Zähler wieder mit dem Anfangswert 1 1 1 1

(15). An den Komplement-

ausgängen erscheint dagegen ein Aufwärtszähler, der beim Erreichen des Endwertes

1 1 1 1

(15)

wieder

mit

dem

Anfangswert

0 0 0 0 (0)

beginnt.

Rechentechnisch gesehen ist es also auch möglich, mit einem Zähler anstelle eines Addierers Dualzahlen um 1 zu erhöhen bzw. um 1 zu vermindern.

serielles Rechts-Schieberegister Carry

0 -

hO

serielles Links-Schieberegister

Carry

o

C H

Takt-

—i-Takt

"9"

1

1

"4" —0 "2" — 0

X

1

0

0\

1\

"1" — 0 ^

0\

"0" — 0 ^

0\

0 x

0

\ M

0

PI x\

0

0

1

/ 0/ 1 /0— 0 / 1/0 / 0— 0 / 0/ 0 /0 — 1

0

\ ro

/ 0/ 0

\1 0\ * 0 N

/ 0— 0

"1"

"2" "4" "8"

"16"

Bild 1-23: 4-bit-Rechts/Links-Schieberegister

Bei einem Schieberegister Bild 1-23 schaltet der Takt alle Flipflops g l e i c h zeitig;

jedes

Flipflop

reicht

seinen

alten

Inhalt an den Nachfolger

und übernimmt den neuen Inhalt von seinem

weiter

Vorgänger. Bewertet man den

Inhalt eines Rechtsschieberegisters als vorzeichenlose

Dualzahl, so wird von

den höherwertigen zu den niederwertigen Stellen geschoben. Füllt man die freiwerdende höchstwertige Stelle mit einer Null, so entspricht das R e c h t s schieben rechentechnisch einer Division durch 2, der Basis des dualen Zahlensystems. Speichert im

Carrybit,

so

man die herausgeschobene niederwertigste

entsteht

dort

der

Divisionsrest.

Bei

Stelle z.B.

vorzeichenbehafteten

26

1 Grundlagen

Zahlen muß die herausgeschobene Bitposition als Vorzeichen erhalten bleiben (arithmetisches

Rechtsschieben).

Eine entsprechende Bewertung des Links-

schieberegisters mit nachgeführten Nullen entspricht einer Multiplikation mit 2. Die herausgeschobene höchstwertige Stelle

liefert den Übertrag bzw. die

Überlaufbedingung.

1.3.3 Festwertspeicher Festwertspeicher sind nichtflüchtige Speicher, die ihren Inhalt nach dem schalten Only

der Versorgungsspannung

Memory

behalten. In der Ausführung ROM

= Nur-Lese-Speicher)

wird

der

Speicherinhalt

Ab-

(Read

bereits

beim

Herstellprozeß des Bausteins durch Schaltverbindungen f e s t g e l e g t . Bei einem PROM

(Programable

R O M ) kann der Anwender durch elektrisches Program-

mieren von Verbindungen den Speicherinhalt selber bestimmen. In der häufigsten Bauart EPROM (Erasable P R O M ) läßt sich der Inhalt durch Bestrahlen mit U V - L i c h t wieder löschen. Die Auswahl der meist zu einem Byte zusammengefaßten Speicherelemente e r f o l g t nach dem in Bild 1-24 dargestellten direkten Adressierungsverfahren.

Y3 i.

& f— Y3

Y2 j.

Y1 J.

YO a

Y2 Yl Y0 CE 1 0 0 0 0

B X 0 0 1 1

A X 0 1 0 1

Y3 Y2 Y1 YO 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1

Bild 1-24: l - a u s - 4 - D e c o d e r für direkten Speicherzugriff

An den Eingängen A und B des Decoders liegt eine Dualzahl (0 0 bzw. 0 1 bzw. 1 0 bzw. 1 l ) als Adresse eines der vier Ausgänge, die in dem Beispiel in " a k t i v - L o w - T e c h n i k " ausgeführt sind. Eine 0 ( L o w ) bedeutet, daß der Ausgang ausgewählt

(aktiv) ist; eine 1 ( H i g h ) bedeutet, daß er nicht aktiv ist.

Der Eingang CE (Chip Enable = Bausteinfreigabe) des Decoders wirkt e b e n falls

"aktiv-Low".

adressierten

Ein Low

Ausgangs,

ein

( 0 ) bedeutet High

(l)

die Freigabe des durch A und B

legt

alle

Ausgänge

auf

nichtaktives

High-Potential. Bild 1-25 zeigt einen byteorganisierten Festwertspeicher Dioden als Speicherelementen.

mit

1.3 Speicherschaltungen

27

Bild 1-25: Byteorganisierter Festwertspeicher (ROM) aus Dioden

Der Steuereingang CE (Chip Enable = Bausteinfreigabe) gibt den Adreßdecoder bei Low (0) frei. Die Adreßeingänge legen dann eine Zeilenleitung auf Low-Potential. Der Speicherinhalt des adressierten Bytes (Zeile) wird durch Verbindungen zu den Spalten bestimmt. Ist die Verbindung o f f e n , so bleibt die Spaltenleitung High. Ist sie durch eine Diode geschlossen, so wird die Spaltenleitung auf Low gelegt. Für eine Zuordnung "Diode = 1" und "keine Diode = 0" müssen die Spaltenausgänge invertiert werden. Das Auslesen des Speicherinhalts erfolgt durch den Steuereingang OE (Output Enable = F r e i gabe der Ausgänge). Ist der Baustein mit CE = Low freigegeben und ist gleichzeitig OE = Low, so schalten die Ausgangstreiber das ausgewählte Byte auf den Ausgang; anderenfalls sind die Ausgänge hochohmig ( t r i s t a t e ) . Man beachte, daß die logische Und-Verknüpfung der beiden Steuersignale mit einer Oder-Schaltung ausgeführt wird, die nur dann am Ausgang 0 ist, wenn beide Eingänge 0 sind (aktiv-Low-Technik!).

1.3.4 Schreib/Lesespeicher Ein Schreib/Lesespeicher kann wie ein Flipflop und Register während des Betriebes der Schaltung beschrieben und gelesen werden. Beim Einschalten der Versorgungsspannung hat der Speicher einen zufälligen (Undefinierten) Anfangswert; nach dem Abschalten geht sein Speicherinhalt verloren. RAM heißt Random Access Memory = Direktzugriffsspeicher. Das bedeutet, daß durch Angabe einer Adresse direkt auf den Inhalt zugegriffen werden

28

1 Grundlagen

Bild 1-26: Der Aufbau eines byteorganisierten

RAMs

kann. In diesem Sinne sind auch die im vorigen Abschnitt behandelten wertspeicher

ebenfalls

eines byteorganisierten der

zu jeweils einem

sind.

Das

RAMs Byte

(Write

Enable

1-26 zeigt

den

FestAufbau

mit F l i p f l o p s als Speicherelementen, die

( R e g i s t e r ) unter

Auslesen geschieht

( B a u s t e i n f r e i g a b e ) und OE WE

Bild

Direktzugriffsspeicher.

wie bei einem

(Freigabe

= Schreibfreigabe)

einer

Adresse

EPROM

wie-

zusammengefaßt

durch die Signale

CE

der Ausgangstreiber). Das Steuersignal schaltet

in

Verbindung

mit

CE

die

außen anliegenden Daten auf die Eingänge aller Flipflops. Nur das ausgewählte Byte übernimmt die Daten mit der steigenden Flanke des Taktsignals.

1.4

Mikrocomputerschaltungstechnik

1.4.1 TTL-Schaltungen Mikroprozessoren MOS-

und

ihre

Speicher-

und

Peripheriebausteine

werden

in

und in C M O S - T e c h n i k ausgeführt; die Zusatzlogik vorwiegend in T T L -

Technik. Es gelten üblicherweise f o l g e n d e Ausgang: High größer

Logikzuordnungen:

2.4 V o l t

Eingang: High größer 2.0 V o l t

L o w kleiner 0.4 V o l t

L o w kleiner 0.8 V o l t

1.4 Mikrocomputerschaltungstechnik

29

Bei High (logisch 1) liefert ein Ausgang eine Spannung zwischen 2.4 Volt und der Betriebsspannung von 5 Volt; normalerweise ca. 3.5 Volt. Alle Spannungen größer als 2.0 Volt werden von den Eingangsschaltungen als High bewertet. Bei Low (logisch 0) liefert ein Ausgang eine Spannung zwischen 0 Volt (Ground) und 0.4 Volt; normalerweise ca. 0.2 Volt. Alle Spannungen kleiner als 0.8 Volt werden von. den Eingängen als Low bewertet. Bei den Strömen ergeben sich Unterschiede zwischen MOS und TTL (Bild 1-27). Uh = +5V

Imax =+ 10 rpA U > 2.0V : High U < 0,8V: Low

a.MOS-Eingangsschaltung

b.TTL-Eingangsschaltung (LS)

Bild 1-27: MOS- und TTL-Eingänge Totem pole Ausgang

TTL-Eingang

Bild 1-28: Der Gegentaktausgang (totem pole)

Das Gate (Steuerelektrode) des MOS-Eingangstransistors ist hochohmig und nimmt einen Eingangsstrom von maximal 10 uA auf; normalerweise kleiner

30

1 Grundlagen

1 u A . Die E i n g a n g s s t r ö m e einer b i p o l a r e n T T L - S c h a l t u n g sind abhängig von der L o g i k f a m i l i e ( S t a n d a r d , LS, ALS oder HC). Bei den meist v e r w e n d e t e n L S - S c h a l t u n g e n (Low Power Schottky) f l i e ß e n bei Low maximal 400 uA aus dem Eingang h e r a u s und bei High m a x i m a l 20 uA hinein; n o r m a l e r w e i s e e t w a die H ä l f t e . Die folgenden Ausgangsschaltungen w e r d e n unabhängig von der T e c h n o l o g i e ohne die E m i t t e r p f e i l e d a r g e s t e l l t . Der T o t e m - P o l e - A u s g a n g Bild 1-28 b e s t e h t a u s zwei T r a n s i s t o r e n . Der e i n e legt d e n Ausgang auf High; der h e r a u s f l i e ß e n d e Strom wird von d e m a n g e schlossenen Eingang a u f g e n o m m e n . Der a n d e r e Transistor s c h a l t e t den A u s gang auf L o w , und in die Schaltung f l i e ß t e i n Strom hinein. Die a n g e g e b e nen S t r ö m e beziehen sich auf eine S t a n d a r d - L a s t ; t a t s ä c h l i c h f l i e ß t nur e t w a die H ä l f t e . An einen LS-Ausgang können s t a n d a r d m ä ß i g e t w a 20 L S - E i n g ä n g e oder 30 MOS-Eingänge angeschlossen werden; an e i n e n MOS-Ausgang e t w a 10 MOS-Eingänge oder 4 LS-Eingänge. W e i t e r e Angaben müssen den D a t e n b l ä t t e r n der H e r s t e l l e r e n t n o m m e n werden. Ausgang Y

>1 rUT?

CE 1 0 0 0 0 Auswahl

B X

0 0 1 1

A | Y X 0 0 CO 1 C1 0 C2 1 C3

Eingänge

Bild 1-29: Kanalauswahlschaltung

(Multiplexer)

Ein b e s o n d e r e s Problem ist die Parallelschaltung von Ausgängen, wenn b e i spielsweise m e h r e r e Speicherbausteine a n eine g e m e i n s a m e Busleitung a n g e schlossen w e r d e n sollen. T o t e m - P o l e - A u s g ä n g e lassen sich nicht e i n f a c h p a rallel s c h a l t e n , sondern müssen mit e i n e r O d e r - S c h a l t u n g oder mit einem in Bild 1 - 2 9 d a r g e s t e l l t e n Multiplexer (Mux) v e r k n ü p f t w e r d e n . Ein l - a u s - 4 D e c o d e r (Bild 1 - 2 4 ) mit a k t i v - H i g h - A u s g ä n g e n s c h a l t e t einen der vier Kanäle CO bis C3 auf den Ausgang Y. Bei B u s s y s t e m e n bevorzugt man den in Bild 1-30 dargestellten Tristate-Ausgang.

1.4 Mikrocomputerschaltungstechnik

Tristate

Ausgang

31

Busleitung D



^

D,-

G

D

A

1 0 0

X

Z 0

0 1

hochohmig

1

Bild 1-30: Der Tristate-Ausgang

Beide Ausgangstransistoren lassen sich mit einem zusätzlichen Steuereingang ff (Gate = Tor) abschalten, so daß der Ausgang bis auf geringe R e s t s t r ö m e p o t e n t i a l f r e i wird. Für G = 0 wird entweder Low oder High ausgegeben. Für CT = 1 ist der Baustein in einem dritten (elektrischen, nicht logischen!) Ausgangszustand hochohmig, also a b g e s c h a l t e t . Bei einer Parallelschaltung von Tristate-Ausgängen macht üblicherweise eine Auswahlschaltung (Decoder) alle Ausgänge bis auf einen hochohmig. Bei den in Bild 1-31 dargestellten Ausgängen mit o f f e n e m Kollektor wird der gegen High schaltende Ausgangstransistor durch einen externen Arbeitswiderstand ersetzt (Oben-OhneSchaltung). + U.

Bild 1-31: Parallelschaltung O f f e n e r - K o l l e k t o r - A u s g ä n g e

32

1 Grundlagen

Schaltet man den Ausgangstransistor mit High durch, so liegt der Ausgang auf Low; sperrt man ihn durch Low, so legt der Arbeitswiderstand den Ausgang auf High. Bei einer Parallelschaltung mehrerer Ausgänge müssen alle nicht aktiven Schaltungen ihre Ausgänge auf High legen; nur der eine aktive Ausgang darf die gemeinsame Leitung entweder auf Low herunterziehen oder auf High liegen lassen. Die Verknüpfung von Ausgängen mit o f f e n e m Kollektor wird o f t für Steuerleitungen von Mikrocomputern verwendet, die von verschiedenen Schaltungen a n g e s t e u e r t werden sollen. Das Signal ist dann aktiv Low. externer

interner

Bus

Bus

a.Bidirektionaler Bustreiber

b.Offener Kollektor

c.Tristate Ausgang

Bild 1-32: Bidirektionale Schaltungen Bild 1 - 3 2 zeigt häufig verwendete bidirektionale Schaltungen für Leitungen, die in beiden Richtungen Signale ü b e r t r a g e n . Ein bidirektionaler Bustreiber (74LS245) trennt f ü r G = 1 den internen vom externen Bus; die Ausgangstreiber beider Richtungen sind t r i s t a t e . Für G = 0 bestimmt ein Richtungssignal Dir (Direction), welcher der beiden Treiber durchschaltet und legt damit die Übertragungsrichtung fest. Der Offene-Kollektor-Ausgang wird vorzugsweise f ü r bidirektionale Peripherieschaltungen verwendet. Das D a t e n flipflop legt den Ausgang entweder auf High oder auf Low. Beim Betrieb als Eingang muß der Anschluß durch Ausgabe einer logischen 1 auf High g e legt w e r d e n , damit eine äußere Schaltung (z.B. Kippschalter) die Leitung auf High läßt oder auf Low legen kann. Der Tristate-Ausgang wird meist in p r o g r a m m i e r b a r e n Parallelschnittstellen verwendet, bei denen ein Richtungsflipflop den Anschluß zwischen dem Betrieb als Eingang oder als Ausgang u m schaltet.

1.4 Mikrocomputerschaltungstechnik

33

1.4.2 Bussysteme und Bustiming Ein Bus besteht aus parallelen Leitungen, an die mehrere Ausgänge (Sender, Quellen) und Eingänge (Empfänger, Ziele) angeschlossen sind. Man unterscheidet den Adreßbus für die Übertragung von Adressen, den Datenbus für Daten und Befehle sowie den Steuerbus für Steuersignale. Bild 1-33 zeigt als Beispiel den internen Datenbus im Rechenwerk eines Mikroprozessors. externer Datenbus

Steuerwerk

Rechenwerk

Bild 1-33: Registerauswahl in einem Rechenwerk

Die Rechenschaltung des Bildes 1-20 wird nun erweitert durch die vier Hilfsregister R0 bis R3 und einen bidirektionalen Treiber, der den internen Datenbus des Mikroprozessors mit dem externen Datenbus des Computers verbindet. Die Schaltung enthält sechs Quellen (externer Datenbus, vier RRegister und Akkumulator) sowie sechs Ziele (externer Datenbus, vier RRegister und Akkumulator). Das Steuerwerk schaltet immer einen Baustein mit einem aktiv-Low-Signal als Quelle auf den Bus und liefert für den Zielbaustein die steigende Taktflanke, mit der dieser die Daten übernimmt. Die R-Register können Operanden für die ALU-Operationen enthalten bzw. Zwischenergebnisse aufnehmen. Bild 1-34 zeigt den Anschluß von Speicher- und Peripheriebausteinen an den (externen) Datenbus des Computers. Die Schaltung besteht aus einem Festwertspeicher (Bild 1-25), einem Schreib/Lesespeicher (Bild 1-26), einem Ausgaberegister für Peripheriedaten und einem Eingabetristatetreiber. Der Prozessor liefert das Lesesignal RD

34

1 Grundlagen

Steuerwerk

interner Datenbus

Rechenwerk

Bild 1 - 3 4 : Bausteinauswahl in einem Computer ( R e a d = l e s e n ) zum Auslesen der Bausteine und das Schreibsignal WR (Write = schreiben) zum Beschreiben der Bausteine; die Signale b e s t i m m e n gleichzeitig auch die Richtung des Prozessorbustreibers. Für die Auswahl der Bausteine ist nun ein Decoder (Bild 1 - 2 4 ) e r f o r d e r l i c h . Die Adressen l i e f e r t der Prozessor über den Adreßbus. Die höherwertigen Adressen bestimmen den Baustein, die niederwertigen wählen auf dem Speicherbaustein das e n t s p r e chende Byte aus. Die Freigabesignale der Peripheriebausteine werden zusätzlich mit RD und WR verknüpft. Bild 1 - 3 5 zeigt den zeitlichen Ablauf der L e s e - und Schreibvorgänge (Timing).

Lesezyklus I

1

Adreßbus ^

50

Adresse

SStL

50

\l/

vom P r o z e s s o r

X

^ ^ r esse v o m

ns

Y — A - t

P r o z e s ;or

-Xt

Übernahme v o m Prozessor^

Ü b e r n a h m e vom Baustein f

WR schreiben Datenbus (extern)

.. 2 0 0

n

CE Baustei RD lesen

Schreibzyklus

.. 200 n s

1

'Date n vom\j}_ \ 6 a u s tein /

Bild 1 - 3 5 : L e s e - und Schreibzyklen

/",

h.

Daten v o m Prozessor

J V

35

1.4 Mikrocomputerschaltungstechnik

Busleitungen werden in Zeitdiagrammen nicht einzeln, sondern zusammengefaßt

dargestellt.

Eine

Kreuzung

der

oberen

High-

und unteren

Low-Linie

deutet an, daß zu diesem Zeitpunkt eine Änderung des Buszustandes zu e r w a r ten ist. Ein gestrichelte mittlere Linie beim Datenbus zeigt den Tristatezustand. Bei Bedarf

können auch hexadezimale Adressen bzw. Daten eingetra-

gen werden. Von den aktiven Flanken der Steuersignale ausgehende Bezugspfeile zeigen an, wann die Änderungen auf dem Bus wirksam werden. Am Beginn eines Lesezyklus legt Bytes

der Prozessor die Adresse des zu lesenden

auf den Adreßbus und macht seine Datenbusausgangstreiber

tristate.

Aus den höheren Adreßbits decodiert der Bausteinauswahldecoder den entsprechenden Baustein und gibt ihn mit CE frei. Der interne Decoder des Bausteins benötigt eine längere Schaltzeit

zur Auswahl des adressierten Bytes.

Der Prozessor schaltet daher etwa später durch das Lesesignal RD die Ausgangstreiber

(OE)

Uber den auf die

Daten

des

adressierten

Bausteins auf

den externen

Datenbus.

Eingang geschalteten Datenbustreiber des Prozessors gelangen

auf

den

internen

Datenbus des Prozessors und werden dort bei

der steigenden Flanke des RD-Signals

in ein Register übernommen. Danach

wird der Ausgangstreiber des Bausteins durch RD = High tristate

gemacht.

In einem Schreibzyklus legt der Prozessor die Adresse des zu beschreibenden Bytes auf

auf den

den

Adreßbus und die auszugebenden Daten aus einem

Datenbus.

Der

Bausteinauswahldecoder

Baustein mit CE frei; dieser wiederum das adressierte

Byte

wählt

aus. Das Schreibsignal

gibt

den

Register

entsprechenden

mit seinem internen Decoder WR l i e f e r t den Schreibimpuls

WE; die Datenübernahme muß spätestens mit der steigenden Flanke des W R Signals

beendet

sein, da

der

Prozessor

nun die Daten vom Datenbus e n t -

fernt und diesen wieder tristate schaltet. Die Zeit zwischen dem Aussenden der Adresse und der Übernahme der Daten durch den Prozessor bzw. Baustein bezeichnet man als Zugriffszeit. Sie liegt zwischen 50 und 200 ns.

1.4.3 Verfahren zur Bausteinauswahl Bei

der

Programmierung

eines

Mikrocomputers erscheinen in den Befehlen

die Adressen von Speicherstellen und Peripherieregistern. Diese ergeben sich aus dem Eine

Adreßplan, der aus dem Schaltplan des Computers abgeleitet

Adresse

ist

eine

vorzeichenlose

Dualzahl,

die der Prozessor

wird.

mit dem

Beginn eines L e s e - bzw. Schreibzyklus auf dem Adreßbus ausgibt und die von den

Decodierschaltungen

zur

Auswahl

Bild 1-36 zeigt ein teildecodiertes

einer

Speicherstelle

Kleinsystem

mit einem

verwendet

wird.

8-kbyte-EPROM

(2764) und einem 8 - k b y t e - R A M (6264) bei 16 Adreßleitungen. Die Adreßleitungen A0 bis A12 des Prozessors sind mit den Adreßeingängen A0 bis A12 der Bausteine verbunden; die folgende Adreßleitung A13 wählt über

36

1 Grundlagen

B a u s t e i n A d r e s s e A15 A14 A13 A12l A11 A10 A9 A8 A7 Afj A5 A ^ A3 A2 A1 AO RAM X X OOOOH 0 0 0 0 0 0 0 0 0 0 0 0 0 6264 0 8

kbyte EPROM

1FFFH

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

0E000H

X

X

0

0

0

0

0

0

0

0

0

0

0

0

0



-



-

-

OFFFFH

1

1

1

1

1

1

1

1

1

1

1

1

1

2764

8

2764 8

kbyte

1

Y1

YO

PGM

EPROM

CE

OEOOOH

ÖE

A12

WE

RAM

CE

OOOOH

OE

>1

-

kbyte

1

1

D7

OFFFFH

6264

AO

DO

8 kbyte

D7

1FFFH

A12

AO

A12

AO

DO

I I _J

C S A15 A U f r e i

A13

WR RD

Datenbus

Bild 1-36: Adreßplan und Schaltung einer Teil de Codierung eine l-aus-2-Decodierschaltung einen der beiden Bausteine aus. Die restlichen Adreßleitungen A14 und A15 werden nicht verwendet. Die Decoderausgänge YO und Y1 sowie die Freigabeeingänge CE der Bausteine sind aktiv Low. Mit dem Freigabeeingang CS des Decoders können alle Speicherbausteine mit einem Speicher/Peripherie- oder einem Datenbusauswahlsignal g e sperrt werden. Der Adreßplan zeigt den Zusammenhang zwischen den Adreßleitungen des Systems und den hexadezimalen Adressen der Bausteine. Bei den direkt angeschlossenen Adreßbits AO bis A12 gibt man nur die untere (0000000000000) und die obere (1111111111111) Grenze des Speicherbereiches an. A13 = 0 gibt den Baustein 6264 (RAM) frei, A13 = 1 den anderen Baustein 2764 (EPROM). Die beiden freien Adreßleitungen A14 und A15 können beliebige Werte annehmen (X). Für den RAM wurde X = 0 gesetzt; er kann in dem Bereich der hexadezimalen Adressen von OOOOH bis 1FFFH a n gesprochen werden. Setzt man beim EPROM für freie Adreßbits X = 1, so liegt dieser im Adreßbereich von 0E000H bis OFFFFH. Bei den Prozessoren der 80x86-Familie legt man meist in den unteren Adreßbereich ( V e k t o r t a belle) einen Schreib/Lesespeicher (RAM) und in den oberen Bereich ( R e s e t Startadresse) einen Festwertspeicher (EPROM). Wegen der beiden freien Adreßleitungen A15 und A14 kann jeder Baustein in drei weiteren Adreßbereichen angesprochen werden; der RAM also auch ab 4000H (A15 = 0 und A14 = 1), ab 8000H (A15 = 1 und A14 = 0) sowie ab 0C000H (A15 = 1 und A14 = 1).

1.4 Mikrocomputerschaltungstechnik

0 1 0

frei

1 1 0

0 0

o|

EPROM 0E000H 2764 8 kbyte OFFFFH

0 0 0 0 i

|

j

j|

0 0 0 0 0 0 0 0 0 1

1

1 1

WE CE OE Itf CE OE

WR RD

1

1

1

1

1

1

1

'

EPROM 2764 8 kbyte OEOOOH OFFFFH A12 AO I I Serienschnittstelle 8250 2000H 2007H A2 A1 AO I I I RAM 6264 8 kbyte OOOOH 1FFFH AI 2 AO i i

A12

1' 1

1

!

I

PGM CE OE

Steuersignale (A19 . . A16)

1 1 1 1 1 1 i ! 1 1! 1 X X X X X 0 0 j 0

X

II o|

frei

A9 A8 A7 A 0 A5 A4| A3 A2 A1 AO 0 0 0 0 0 0 0 0 0 0

II

Adresse A15A14A13A 1 2 A11 A 1 0 OOOOH 0 0 0 0 0 0 1FFFH 1 1 1 2000H X X 0 0 1 2007H 0 0 |X

Baustein RAM 6264 8 kbyte Serienschnitt. 8250

37

o : o !

0 0

1 ,1

1

07

1



DO — D7 — DO — D7 — DO —

A2 A1 AO

Bild 1-37: Adreßplan und Schaltplan einer Volldecodierung

Bei einer in Bild 1-37 dargestellten Volldecodierung werden alle Adreßleitungen zur Auswahl verwendet. Die Bausteine 2764 (EPROM) bzw. 6264 (RAM) sind nur noch unter einer einzigen Adresse e r r e i c h b a r , da sie alle Adreßbits belegen. Die Serienschnittstelle 8250 besitzt nur acht Register, die durch die Adreßleitungen A0, AI und A2 ausgewählt werden. Der Bereich der 10 Adreßbits von A12 bis A3 wird für die Auswahl dieser Register nicht verwendet; für diesen Baustein bestehen 2 hoch 10 = 1024 Adressen. Um diese Adressierungslücken bei Peripheriebausteinen zu vermeiden, liefern die 80x86 Prozessoren ein Speiche r/Peripherieauswahlsignal M/IO bzw. IO/M. Die in Bild 1 - 3 8 dargestellte lineare Auswahlschaltung adressiert die beiden Peripheriebausteine mit dem Steuersignal M/IO. Bei Low werden Peripheriebefehle (IO = Input Output) a u s g e f ü h r t ; bei High Speicherzugriffe (M =

1 Grundlagen

! i

M/rO

»15..»5 f r e i

A4

A 3 WR

RD

WR CE RD

| X II o|

ME CE 0É

A3 AB A7| A6| A5 A4 A3 A3 A1 X X X X 0 0 0 1 0 0 0 0 1 1 X X X X 0 1 0 . 0 0 0 0 1 | X n o|

X II O

Baustein Adresse A19A14LA 13| p\12IA11Aia Serien0008H X X X X X X schnitt. 8250 000FH 0 0 0 0 0 0 Paral001 OH X X X X X lelsch. 0013H 0 0 0 0 0 8255

jo II X j

38

Serienschnittstelle 8250 OOO8H...OOOFH A2 A1 A0 I I I ParallelSchnittstelle 8255 0010H 0013H A1 A0

A2

A 1 AO

07

A0 0

.

1 0 1

-

DO D7 — DO -

Datenbus

Bild 1-38: Adreßplan und Schaltplan einer linearen Auswahl

Memory). Die Bausteinauswahl erfolgt direkt durch die Adreßleitung A3 = 0 für die Parallelschnittstelle 8255 und durch A4 = 0 für die S e r i e n s c h n i t t s t e l le 8250. Bei dieser linearen Auswahl eines Bausteins durch ein Adreßbit (hier 0) muß sichergestellt sein, daß die anderen Bausteine mit einer e n t sprechenden 1 gesperrt sind. Bild 1-39 zeigt die Auswahlschaltung einer Peripheriekarte am PC-Peripheriebus. Die Signale IORD (Input Output Read = Ein/Ausgabe lesen) und IOWR (Input Output Write = Ein/Ausgabe schreiben) werden auf der Prozessorkarte aus dem Lesesignal RD, dem Schreibsignal WR und dem Speicher/Peripherieauswahlsignal M/IO a b g e l e i t e t . Das Bussteuersignal AEN (Address Enable = Freigabe der Adreßbustreiber) zeigt bei Low an, daß sich gültige Adressen auf dem Bus befinden. Die Peripherieadressierung e r f o l g t beim PC nur durch die Adreßbits AO bis A9; die Bits A10 bis A15 der P e r i pherieadresse werden beim PC nicht verwendet und im Adreßplan X = 0 g e setzt. Eine NAND-Schaltung verknüpft die Adreßleitungen bzw. ihre N e g a t i o nen und liefert die Bedingung für die Freigabe der K a r t e . Das Adreßbit A8 läßt sich zwischen aktiv Low und aktiv High mit einer Steckbrücke (Jumper) u m schalten; dadurch sind die Adressen der Bausteine einstellbar. Der D a t e n bustreiber wird nur bei Adressierung der Karte freigegeben; das Adreßbit A7 unterscheidet zwischen der Serienschnittstelle (A7 = 1) und der Parallelschnittstelle (A7 = 0). Für einen Parallelbetrieb mehrerer Peripheriekarten gleichen Aufbaus verwendet man häufig einstellbare Kartenadressen e n t s p r e chend Bild 1-40.

1.4 Mikrocomputerschaltungstechnik

B a u s t e i n Adresse Drucker 0278H LPT2 027FH Seriel1 02F8H COM2 02FFH Drucker 0378H LPT1 037FH Seriel1 03F8H C0M1 . 03FFH

A15..A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 AO x = 0 1 0 0 1 1 1 1 0 0 0 ! 1 1 1 i x = 0 1 0 1 1 1 1 1 0 0 0 1 1 1 x = 0 1 1 0 1 1 1 1 0 0 0 1 1 1 x = 0 1 1 1 1 1 1 1 0 0 0 1 1 1

UE CE OE UR CE RD

Serienschnittstelle 8250 C0M1 / COM2 A2 A1 AO I I I Druckerschnittstelle 82C11 LPT1 / LPT2 A2 A1 AO

DO D7 DO

B

G 7^LS2 Null) 2+6 Springe bei S = 0 (positiv) 2+6 2+6 Springe bei S = 1 (negativ) 2+6 Springe bei V = 1 (Überlauf)

Bild 1-43: Auszug aus der Befehlsliste des TTL-Prozessors

Man unterscheidet 1 - b y t e - B e f e h l e , die nur aus dem Befehlscode bestehen, 2-byte-Befehle, die hinter dem Befehlscode eine Datenkonstante enthalten sowie 3-byte-Befehle, bei denen auf den Code eine aus zwei Bytes b e s t e hende Adresse folgt. Im Gegensatz zu den Prozessoren der 80xxx-Familie liegt bei diesem TTL-Prozessor der High-Teil der Adresse im zweiten und der Low-Teil im dritten Byte. Das Beispiel zeigt nur 16 von 256 möglichen Befehlscodes. Der Code 00H wird auch als NOP-Befehl (No OPeration = tu nix) bezeichnet. Er besteht nur aus den beiden Schritten "Befehlszähler nach Adreßbusregister" und "Datenbus nach Coderegister". Dieser Code 00H wird am Ende jeder Schrittfolge aus dem Mikrocodespeicher in das Coderegister geladen und leitet damit das Lesen eines neuen Befehls ein. Die Codes und symbolischen Bezeichnungen der Befehle stimmen nicht mit denen der 80xxx-Prozessoren überein! In der Gruppe der Lade- und Speicherbefehle lädt der Befehl MVI (MoVe Immediate = lade unmittelbar) das inmittelbar auf den Code folgende Byte

46

1 Grundlagen

in den Akkumulator. Die Befehle LDA (LoaD Accumulator) und STA (STore Accumulator) enthalten im zweiten und dritten Byte eine Speicheradresse, die bei der Ausführung des Befehls aus dem Adreßregister auf den Adreßbus gegeben wird. Die Zusätze Z (Zero Page = Seite Null) und U (Upper Page = oberste Seite) kennzeichnen eine bei 80xxx-Prozessoren in dieser Form nicht vorhandene speicherindirekte Adressierung. Bei den arithmetischen und logischen Befehlen wählt der Steuercode des Mikrocodespeichers die Funktion der ALU und der Carrysteuerung aus. Der Zusatz I (Immediate = unmittelbar) b e d e u t e t , daß das zweite Byte des B e fehls als Operand mit dem Akkumulator verknüpft wird. Bei den Befehlen ADD, SUB, AND und OR enthalten das zweite und d r i t t e Byte die Adresse des Operanden. In der folgenden Gruppe der 1 - b y t e - B e f e h l e wird nur der Inhalt des Akkumulators als Operand verwendet; der Steuercode des Mikrocodespeichers wählt die Funktion aus. Die Schiebebefehle werden in der ALU durch die Funktion F = A + A + Cv ausgeführt. Dies bedeutet eine Multiplikation des Akkumulators mit dem Faktor 2 oder ein Schieben um eine Bitposition nach links. Man unterscheidet das logische Linksschieben SHL (SHift Left = schiebe links), bei dem die freiwerdende r e c h t e s t e Bitposition mit einer 0 a u f g e f ü l l t wird, und das zyklische Linksschieben RCL ( R o t a t e with Carry Left = schiebe mit Carry links), bei dem der Akkumulator und das Carrybit zu einem 9-bit-Linksschieberegister verbunden sind. Der Befehl RCL4 verschiebt den Akkumulator um 4 bit nach links. Der um 5 bit nach links schiebende Befehl RCL5 wirkt wie ein Verschieben um 4 bit nach rechts, da durch das Carrybit geschoben wird. In der Gruppe der Sprungbefehle unterscheidet man den unbedingten Sprung JMP (JuMp = springe immer) und die bedingten Sprungbefehle, die zusätzlich die Sprungbedingung e n t h a l t e n . Bei ihrer Ausführung wird die im Adreßregister gespeicherte Adresse des Sprungziels nur dann in den Befehlszähler g e laden, wenn die entsprechende Bedingung e r f ü l l t ist; anderenfalls wird der um 1 erhöhte Befehlszähler als neue Befehlsadresse verwendet. Die Befehle unterscheiden sich nur im Steuercode des Mikrocodespeichers, mit dem ein Bit des Bedingungsregisters bzw. die Negation mit dem Multiplexer (Mux) ausgewählt wird. Ist das Bit 0, so wird gesprungen, da der Ladeimpuls für den Befehlszähler über die Oder-Verknüpfung durchgeschaltet wird. Eine 1 blockiert den Ladeimpuls, und der Befehlszähler bleibt unverändert. Das in Bild 1 - 4 4 dargestellte Programmbeispiel zeigt einen 8 - b i t - A u f w ä r t s zähler im Akkumulator, der in einer Schleife laufend auf dem Ausgaberegister 6000H ausgegeben wird. Die Übersetzungsliste enthält r e c h t s das Assemblerprogramm und links den hexadezimalen Code. Die Befehlsbytes sind im Programmspeicher in aufeinanderfolgenden Bytes ab Adresse 2000H a n g e ordnet. Der Blockschaltplan zeigt nur die wichtigsten Bausteine und Register. Der Ablauf des Programms wird in Bild 1-45 dargestellt.

1.4 Mikrocomputerschaltungstechnik

Maschinencode A d r e s s e 1.Byte 2.Byte 3 . B y t e 2000H 2003H 2004H

05H 10H 18H

60H

00H

20 H

00H

Programmspeicher Adresse Inhalt 2000H 05H 2001H 60H 2002H OOH 2003H 10H 2004H 18H 2005H 20 H 2006H 00H 2007H XXX

Assemblerprogramm Name B e f e h l Operand ORG 2000H loop: STA 6000H INR JMP loop END loop

Schaltung

Bemerkung ; Lade- und S t a r t a d r e s s e ; Akku d i g i t a l ausgeben ; Akku = Akku + 1 ; Schleife ; Startadresse

Bild

1-41

D i g i t a l e Ausgabe 6000H Datenbus

Adreßbusreg. I

X PC

Befehlszähler

AR

Ziel

DB

1 Adreßregister

Quelle

AH i

I

Codereg.

ALo MC

Zähler

Mikrocode A L U

Schrittzähler Code

Steuerwerk

L

Daten

Akku

S c h a l t w e r k

CR

Datenbus I

Adressen

HZI

ZT

WR

RÜ AB

Ausgabe

Daten

Befehle

Adreßbus

r~

47

TTL

-

M i k r o p r o z e s s o r

Daten

Rechenwerk 1

Bild 1-44: Programmbeispiel: Zählerausgabe

Der Programmablauf zeigt die Zustände des Schaltwerks (Coderegister, Schrittzähler und Auswahl der Ziele und Quellen), die Register der Bussteuerung (Befehlszähler und Adreßregister) sowie die externen Buszustände ( A d r e ß bus, Datenbus und Steuersignale). Diese sind bei handelsüblichen Prozessoren als einziges meßbar, während die inneren Vorgänge im Prozessor von den H e r stellern der Bausteine nicht bekanntgegeben werden.

48

1 Grundlagen

Mikroprogrammsteuerwerk Adreßsteuerung Externer Bus Codereg. Schritt Ziel Quelle Mikrocode Befehlz. Adreßreg. Adreßbus Datenbus 00H NOP 0 A B « — PC xxH 2ÖÖÖH 2000H xxxxH xxH 1 C R « — DB xxH 2000H 05H 2001H xxxxH 05H STA 0 A B « — PC xxH xxxxH 2001H xxH 2001H 1 AHi«— DB xxH 2001H 60H 2002H xxxxH A B « — PC 2 xxH 2002H xxH 2002H 60xxH ; 3 ALo«- DB xxH 2003H 60xxH 2002H OOH 4 A B « — AR xxH 2003H 6000H 6000H xxH DB«- Akku xxH 5 2003H 60 OOH Akku 6000H •6 C R - — MC OOH NOP 6000H xxH 2003H 6000H A B « — PC OOH NOP 0 xxH 2Ö03H 2003H xxH xxxxH C R « — DB 1 xxH 2003H 10H 2004H xxxxH 10H INR 0 Akku«- Akku 40H (+1) xxH 2004H xxxxH 2003H 1 C R « — MC OOH NOP xxH 2004H xxxxH 2003H OOH NOP A B « — PC 0 xxH xxH 2ÖÖ4H xxxxH 2ÖÖ4H CR«—DB 1 xxH 2004H 2005H xxxxH 18H 18H JMP 0 A B « — PC xxH xxxxH 2005H xxH 2005H 1 AHi«-DB xxH xxxxH 2005H 2006H 20H A B « — PC 2 xxH 20xxH 2006H xxH 2006H ALo«- DB 3 xxH 2006H OOH 2007H 20xxH 4 P C « — AR OOH immer 2000H 2000H 2006H xxH C R « — MC 5 OOH NOP 2006H xxH 2000H xxxxH OOH NOP A B « — PC 0 xxH 20ÖÖH xxxxH 2ÖÖÖH xxH 1 C R « — DB xxH 2001H xxxxH 2000H 05H 05H STA 0

Bild 1 - 4 5 : D e r

Ablauf

des

Programmbeispiels

1.4.6 Ein Mikroprozessormodell

(8088)

Aus

beschriebenen

dem

im

vorigen

kroprozessormodell

Abschnitt

(Bild

1-46) entwickelt,

des P r o z e s s o r s 8088 e n t s p r i c h t . A u c h w a n d in T T L - T e c h n i k Bussteuereinheit

Die zu

der

internen

Segmentregister dabei

um

Offset) einem

Zugriff

auf

zum

diert.

Das

interne

DS,

Adreßaddierer,

ES

oder

wäre

addiert.

physikalische

wurde dem

ein

Mi-

Aufbau

mit e i n i g e m

8-bit-Datenbus

(AX,

lassen.

BX,

Damit

ist

vor

jedem

eines

Da

die

der

Auf-

16-bit-Adressen

d e r Inhalt d e s

mit

IP

Buszugriff

vier

beiden

Speicheradresse

des B e f e h l s z ä h l r e g i s t e r s

16-bit-Bussystem

der

Inhalt

sind, e n t s t e h t aus z w e i

16-bit-

Operanden (Segment

genannt.

+

Bei

Codesegmentregi-

(Instruction

zwei bidirektionalen

Pointer)

ad-

Bustreibern

angeschlossen.

Ausführungseinheit ( R e c h e n w e r k ) verwenden

SS)

den

B e f e h l e w i r d z.B. i m m e r

Inhalt

16-bit-Datenregistern ster

einen

20-bit-Summe,

(CS)

Die

enthält

(CS,

an den e x t e r n e n

d i e s e Schaltung

16-bit-Speicheradresse

sters

TTL-Prozessor

das im w e s e n t l i c h e n

ausführbar.

4 bit versetzt eine

E/A X RD X &D X ED X WR X X ED X X X RD X RD X RD X X X RD

CX sind

besteht und D X ) , sowohl

aus e i n e r

16-bit-ALU

die sich auch als

Wort-

als a u c h

und vier

8-bit-Regi-

Byteoperationen

49

1.4 Mikrocomputerschaltungstechnik

20-bit-Adreßbus

I

RD

WR

IO/M

8-bit-Datenbus

Adreßaddierer Bussteuereinheit Segment

AV

Ausführungseinheit

Offset

CS [PS ES SS

I nterruptSteuerung

Holdste uerung_

A

ip

.A.

Temp

A

SP BP SI DI Status

AX BX CX DX

A

Mikroprogrammspei eher.

Akku

ALU

Vordecoder

Ready! Steuerung i Warteschlange

b

ResetSteuerunq Prozessortakt

S t e u e r w e r k

R e c h e n w e r k

Bild 1 - 4 6 : Der Blockschaltplan des Prozessormodells (8088) möglich. Der bisherige Akkumulator wird nur noch als Zwischenspeicher verwendet. Das Bedingungsregister wurde auf 16 bit erweitert und kann wie jedes andere Register auf den Bus geschaltet und auch vom Bus geladen werden. Neben den Datenregistern enthält die Ausführungseinheit vier Adreßregister (SP, BP, SI und DI) für die Berechnung und Speicherung von Adressen. Das Steuerwerk wurde mit einem Codespeicher (Warteschlange) und einem Vordecoder versehen, der den 16-bit-Befehlscode auf einen kleineren Auswahl- und Steuercode reduziert. Die Interruptsteuerung (Interrupt = U n t e r brechung) dient dazu, ein laufendes Programm durch ein Steuersignal zu unterbrechen und dafür ein anderes Programm zu starten. Mit der Hold-Steuerung (Hold = anhalten) ist es möglich, außerhalb eines Buszugriffs den Prozessor durch ein Steuersignal in einen Wartezustand zu versetzen, in dem er alle Bus- und Steuerausgänge t r i s t a t e macht. In diesem Prozessorzustand können dynamische Speicherbausteine wiederaufgefrischt werden oder es kann eine DMA-Steuerung Daten über den Bus übertragen. DMA bedeutet Direct Memory Access = direkter Speicherzugriff. Die Ready-Steuerung (Ready = bereit) verlängert die Buszugriffe des Prozessors durch das Einfügen von Wartetakten. Damit können auch langsame Speicherbausteine mit einem schnellen Prozessor betrieben werden.

2 Bausteine der 80x86-Familie

Als 80x86-Familie bezeichnet man eine Reihe von Prozessoren und Bausteinen des Herstellers Intel und anderer Zweitlieferanten, die besonders in Personal Computern (PCs) eingesetzt werden. Für den Betrieb der Mikroprozessoren sind besondere Steuerbausteine erforderlich, die auf den Prozessor oder auf die Prozessorfamilie abgestimmt sind. Speicherbausteine und T T L Logikbausteine sind für alle Prozessoren verwendbar.

2.1

Mikroprozessoren

Die Entwicklung der Familie begann mit dem Prozessor 8086, der sowohl intern (Register und Befehlssatz) als auch extern (Datenbus) eine 1 6 - b i t Struktur aufweist. Der 20-bit-Adreßbus kann 1 MByte Speicher adressieren. Ein Teil der S t e u e r - und Peripheriebausteine wurde von den älteren 8 - b i t Prozessoren 8080 und 8085 übernommen. In den ersten PCs wurde daher vorwiegend der Prozessor 8088 eingesetzt, der bei gleichem R e g i s t e r - und B e fehlssatz wie der 8086 einen externen 8 - b i t - Datenbus aufweist. In Personal Computern mit der Bezeichnung AT (Advanced Technology) wurde später der erweiterte 16-bit-Prozessor 80286 mit einem 24-bit-Adreßbus und einem 16bit-Datenbus verwendet. Die Prozessoren 80386 und 80486 sind 3 2 - b i t - P r o zessoren mit 3 2 - b i t - R e g i s t e r n und 3 2 - b i t - B e f e h l e n . Sowohl der Adreßbus als auch der Datenbus sind 32 bit breit. Der 80486 enthält zusätzlich einen i n t e grierten Arithmetikprozessor und einen Schnellzugriffsspeicher (Cache). Dieser Abschnitt beschreibt schwerpunktmäßig den Prozessor 8088, der sich wegen seines 8 - b i t - D a t e n b u s besser als die 1 6 - und 32-bit-Prozessoren für den Aufbau von einfachen Mikrocomputern eignet. Kapitel 3 enthält vollständige Mikrocomputerschaltungen.

2.1.1 Der Prozessor 8 0 8 8 Der Prozessor 8088 hat intern den gleichen Aufbau wie der 16-bit-Prozessor 8086, jedoch wird der interne 16-bit-Bus nur als 8 - b i t - D a t e n b u s nach außen geschaltet (Bild 1 - 4 6 ) . Für die Übertragung von 16-bit-Wörtern sind also immer zwei 8-bit-Buszugriffe erforderlich. Der Prozessor 8088 kann in zwei Betriebsarten eingesetzt werden. Dabei wird ein Teil der Steuersignale umgeschaltet; ein anderer Teil der Signale ist in beiden Betriebsarten gleich. Bild 2 - 1 zeigt den Blockschaltplan der betriebsartunabhängigen Signale.

51

2.1 Mikroprozessoren

Bussteuerbaustein

8288

C^K RES CLK

A19 /S6

A16 /S3

Steuers gnale je nach Betriebsart

-CLK Taktgenerator Teiler 3 : 1 —READY

8284

—RESET TEST RES

Adreßspeicher

Adreßspeicher

A8

A15 |

AD7

Datentreiber

ADO

J _ i

L

B u s - S t e u e r - L o g i k

BefehlsWarteschlange CS IP DS ES SS TEMP

Adreßaddierer

RDY NMI

S t e u e r - E i n h e i t

(BIU)

INTR A u s f f l h r u n g s - E i n h e i t +5V MIN Betriebsart MAX

A

MN/MX l

GND

AX BX CX DX

AH BH CH DH

AL BL CL DL

Datenreg.

SP BP DI

SI

(EU)

ALU |Statusreg|

Adreßreg.

Bild 2 - 1 : Blockschaltplan des Mikroprozessors 8088

Die Anschlüsse ADO bis AD7 (Adreß Daten Bus) bilden im Takt T1 eines Buszyklus den unteren Adreßbus von AO bis A7 und in den folgenden T a k t e n T 2 bis T 4 und in W a r t e t a k t e n Tw den bidirektionalen Datenbus DO bis D7. Dieses als Multiplex bezeichnete Verfahren bedeutet, daß die Adressen in einem e x t e r n e n Adreßspeicher festgehalten werden müssen ( A L E - S i g n a l ) . In Interrupt- und Hold-Zyklen sind die Leitungen t r i s t a t e . Die Ausgänge A8 bis A15 (Adreß Bus) bilden den m i t t l e r e n Teil des Adreßbus. Sie führen in allen Takten Adressen und werden in den Interrupt- und HoldZyklen t r i s t a t e . Die Ausgänge A16/S3 bis A19/S6 (Adressen/Status) bilden bei Speicherzugriffen im Takt T 1 eines Buszyklus den oberen Teil des Adreßbus von A16 bis A19; bei einem Peripheriezugriff sind sie Low. In den folgenden T a k t e n T2 bis T 4 und in W a r t e t a k t e n Tw führen die Ausgänge Statussignale des Prozessors. Die Adressen müssen daher in einem e x t e r n e n Adreßspeicher f e s t g e h a l ten werden. Die Ausgänge werden in Hold-Zyklen t r i s t a t e .

52

2 Bausteine der 80x 86-Familie

Der Ausgang RD (lesen) wird in den Takten T2 und T3 sowie in W a r t e t a k ten Tw aktiv Low und zeigt Lesezyklen an. Er dient zur Freigabe der Ausgangstreiber der Speicher- und Peripheriebausteine. In Hold-Zyklen wird der Ausgang t r i s t a t e . Das Taktsignal f ü r den Eingang CLK (Takt) wird normalerweise von einem Taktsteuerbaustein 8284 geliefert. Die Taktfrequenz liegt zwischen 8 MHz (8088-2) und 2 MHz. Der Eingang RESET (zurücksetzen) wird vom Taktsteuerbaustein 8284 synchronisiert. Wird der RESET-Eingang des Prozessors auf High gelegt, so geht der Prozessor in einen Wartezustand, in dem er alle Tristate-Ausgänge in den nichtaktiven Zustand bringt; ALE und HLDA werden Low. Bei der fallenden Flanke (High nach Low) des RESET-Eingangs wird der Prozessor g e s t a r t e t . Die Segmentregister ES, DS und SS sowie das Statusregister (Flags 1=0 und T=0) und der Befehlszähler IP werden gelöscht (0000H). Da das Codesegment reg ist er CS auf OFFFFH gesetzt wird, liegt der erste Befehl auf der Startadresse 0FFFF0H. Der Eingang READY (bereit) wird vom Taktsteuerbaustein 8284 synchronisiert. Ist der Eingang am Ende des Taktes T2 Low, so schiebt der Prozessor zwischen den Takten T3 und T4 Wartetakte Tw ein, bis der Eingang wieder High ist. In diesem Zustand sind alle Bussignale des Prozessors s t a bil. Der Eingang dient zur Verlängerung der Zugriffszeit. Bild 2-6 zeigt das Ready-Timing. Der Eingang TEST (prüfen) wird nur durch den Befehl WAIT (warten) u n t e r sucht. Ist der Eingang zu diesem Zeitpunkt High, so wartet der Prozessor, bis er auf Low geht. Er dient zur Zusammenarbeit mit dem Arithmetikprozessor 8087. Der Eingang NMI (Nicht maskierbarer Interrupt) löst mit der steigenden Flanke (Low nach High) eine Unterbrechung des Programms aus. Nach Beendigung des laufenden Befehls werden das Statusregister, das Codesegmentregister CS und der Befehlszähler IP auf den Stapel g e r e t t e t . Das Interruptbit (I-Bit) und das Einzelschrittbit (T-Bit) des Statusregisters werden gelöscht (0). Das Codesegmentregister CS und der Befehlszähler IP werden von den Speicherstellen 00008H bis 0000BH neu geladen. Dort befindet sich ein Zeiger (Vektor) auf die Startadresse des nun ablaufenden Interruptprogramms. Der NMI-Interrupt ist prozessorintern nicht sperrbar, wird aber bei PC-Schaltungen durch externe Schaltungen sperrbar gemacht. Er hat gegenüber dem INTR-Interrupt die höhere Priorität (Vorrang). Der Eingang INTR (Interrupt Anforderung) wird am Ende eines Befehls u n tersucht. Hat der Eingang den Zustand Low, so wird der nächste Befehl ausgeführt. Ist der Eingang High und ist das I-Bit des Statusregisters 1=0 (nach Reset oder Befehl CLI), so wird der nächste Befehl ausgeführt. Ist der

2.1 Mikroprozessoren

53

Eingang High und ist die Programmunterbrechung durch 1=1 ( B e f e h l STI) f r e i g e g e b e n , so wird das laufende Programm unterbrochen. In einem I n t e r rupt-Bestätigungszyklus (Bild 2 - 9 ) liest der Prozessor eine Kennzahl über den Datenbus, die mit 4 multipliziert und zum Lesen eines Interruptvektors (CS und IP) aus der V e k t o r t a b e l l e verwendet wird. Wie bei einem NMI-Interrupt werden S t a t u s r e g i s t e r , Codesegmentregister CS und Befehlszähler IP auf den Stapel g e r e t t e t . Das I - B i t und das T - B i t werden gelöscht, um den zustandsg e s t e u e r t e n INTR-Interrupt zunächst zu sperren. Durch das Laden von Codes e g m e n t r e g i s t e r und Befehlszähler mit dem Interruptvektor wird ein I n t e r ruptprogramm g e s t a r t e t . S t e h t am Ende dieses Programms der B e f e h l I R E T (Interrupt Rücksprung), so werden der Befehlszähler IP, das C o d e s e g m e n t r e g i ster CS und das alte S t a t u s r e g i s t e r (1=1!) wieder vom Stapel zurückgeladen. Der INTR-Interrupt kann prozessorintern durch das I - B i t des S t a t u s r e g i s t e r s gesperrt werden. Der Eingang INTR wird zusammen mit dem Ausgang INTA (Interrupt Bestätigung) des Prozessors oder des Bussteuerbausteins 8 2 8 8 an den Interruptsteuerbaustein 8259A angeschlossen. 20 - b i t - Adreßbus

A19

Bild 2 - 2 : Der Prozessor 8 0 8 8 in der

8-bitDatenbus AO

D7

DO

Minimumbetriebsart

L e g t man den Steuereingang MN/MX (Minimum/Maximum) auf +5 V o l t , so a r b e i t e t der Prozessor entsprechend Bild 2 - 2 in der Minimumbetriebsart, die nur in Kleinsystemen und nicht in PCs verwendet wird. Der Ausgang WR (schreiben) des Minimumbetriebes wird in den T a k t e n T 2 und T3 sowie in W a r t e t a k t e n Tw aktiv Low und zeigt Schreibzyklen an. Er l i e f e r t den Schreibimpuls für die S p e i c h e r - und Peripheriebausteine. In HoldZyklen wird der Ausgang t r i s t a t e .

54

2 Bausteine

der

80x86-Familie

Der Ausgang IO/M (Ein/Ausgabe oder Speicher) des Minimumbetriebes ist während des gesamten Buszugriffs stabil und zeigt mit High Peripheriezugriffe durch Peripheriebefehle IN und OUT an; bei Speicherzugriffen ist der Ausgang Low. Er wird in Hold-Zyklen t r i s t a t e . Der Ausgang INTA (Interrupt Bestätigung) des Minimumbetriebes dient in Interruptbestätigungszyklen (Timing Bild 2 - 9 ) zum Lesen einer I n t e r r u p t Kennzahl, aus der die Startadresse des Interruptprogramms abgeleitet wird. Der Ausgang ALE (Adreßspeicher f r e i g e b e n ) des im Takt T1 eines Buszyklus High und zeigt damit multiplexten Ausgängen ADO bis AD7 sowie A16/S3 sen befinden. Das Signal wird zur Steuerung der und geht nie in den Tristate-Zustand.

Minimumbetriebes ist nur an, daß sich auf den g e bis A19/S6 gültige A d r e s Adreßspeicher verwendet

Der Ausgang DT/R (Daten senden/empfangen) des Minimumbetriebes ist während des gesamten Buszyklus, auch bei einer Interruptbestätigung, stabil und zeigt mit High Schreibzyklen und mit Low Lesezyklen an. Es wird zur Steuerung der Richtung der Datenbustreiber verwendet. In Hold-Zyklen ist der Ausgang t r i s t a t e . Der Ausgang DEN (Daten freigeben) des Minimumbetriebes ist aktiv Low und dient zur Freigabe der Datenbustreiber. In L e s e - und Interruptzyklen ist DEN von der Mitte des Taktes T2 bis zur Mitte des Taktes T4 Low, bei Schreibzyklen vom Anfang des Taktes T2 bis zur Mitte des Taktes T4. In Hold-Zyklen ist der Ausgang t r i s t a t e . Der Eingang HOLD (anhalten) des Minimumbetriebes wird meist in V e r b i n dung mit einem DMA-Steuerbaustein verwendet und von diesem mit dem Takt synchronisiert. Ist der Eingang High, so sendet der Prozessor auf dem Ausgang HLDA ein Bestätigungssignal (High) aus und legt nach dem Takt T4 W a r t e t a k t e Th ein. In diesen Hold-Zyklen sind alle Ausgänge bis auf ALE und HLDA t r i s t a t e . Wird der Eingang HOLD wieder auf Low gelegt, so wird auch der Ausgang HLDA wieder Low, und der Prozessor setzt seine Arbeit f o r t . Bild 2 - 7 zeigt das Hold-Timing. Der Ausgang HLDA (Anhalten bestätigen) des Minimumbetriebes b e s t ä t i g t mit High den Hold-Zustand des Prozessors; er wird n a c h Beendigung der HoldZyklen wieder Low. Die Signale HOLD und HLDA dienen zur Busvergabe im DMA-Betrieb. DMA heißt Direct Memory Access (direkter Speicherzugriff) und b e d e u t e t , daß andere Schaltungen auf die angeschlossenen Speicher- und Peripheriebausteine zugreifen können, während der Prozessor sich im inaktiven T r i s t a t e - Z u s t a n d befindet. Der und det sind

Ausgang SSO (Statusleitung 0) zeigt zusammen mit den Ausgängen IO/M DT/R insgesamt acht mögliche Betriebszustände des Prozessors an. B e f i n sich der Prozessor durch einen HLT-Befehl in einem Wartezustand, so alle drei Statusausgänge Low. Der Ausgang ist in Hold-Zyklen t r i s t a t e .

2.1 Mikroprozessoren

Bild 2 - 3 : Der Prozessor 8088 in der

55

Maximumbetriebsart

L e g t man den Steuereingang MN/MX ( M i n i m u m / M a x i m u m ) auf 0 Volt (Gnd), so a r b e i t e t der Prozessor e n t s p r e c h e n d Bild 2 - 3 in der M a x i m u m b e t r i e b s a r t zusammen mit einem B u s s t e u e r b a u s t e i n 8288, der die B u s s t e u e r signale l i e f e r t . Nur in dieser M a x i m u m b e t r i e b s a r t kann ein A r i t h m e t i k p r o zessor 8087 angeschlossen w e r d e n . Die Anschlüsse RQ/GTO und R Q / G T 1 ( a n f o r d e r n und g e w ä h r e n ) des Maxim u m b e t r i e b e s sind sowohl Eingänge als auch Ausgänge (bidirektional mit i n t e r n e n A r b e i t s w i d e r s t ä n d e n n a c h High). Sie dienen wie die Signale HOLD und HLDA des M i n i m u m b e t r i e b e s zur Busvergabe (DMA). Bild 2 - 8 zeigt das Timing. RQ/GTO a r b e i t e t n o r m a l e r w e i s e mit einem D M A - S t e u e r b a u s t e i n z u s a m m e n und hat Vorrang vor R Q / G T 1 , das mit dem A r i t h m e t i k p r o z e s s o r verbunden wird. Der Ausgang LOCK (verriegeln, s p e r r e n ) des M a x i m u m b e t r i e b e s wird INTA-Zyklen bzw. durch den Befehlsvorsatz Lock auf aktiv Low gelegt bleibt während des g e s a m t e n A b l a u f e s des d a r a u f f o l g e n d e n Befehls auf liegen. In H o l d - Z y k l e n wird der Ausgang t r i s t a t e . Er dient dazu, den griff auf S p e i c h e r s t e l l e n , die Zeiger ( S e m a p h o r e ) e n t h a l t e n , f ü r a n d e r e t e i l n e h m e r zu s p e r r e n .

bei und Low ZuBus-

Die Ausgänge QSO und QS1 (Zustand der B e f e h l s w a r t e s c h l a n g e ) des Maxim u m b e t r i e b e s werden n o r m a l e r w e i s e nur von dem A r i t h m e t i k p r o z e s s o r a u s gewertet.

56

2 Bausteine der 80x 86-Familie

Die Ausgänge S 2 , S1 und SO (Status) des Maximumbetriebes werden n o r m a l e r w e i s e von dem Bussteuerbaustein 8 2 8 8 zur Erzeugung der S c h r e i b - , L e s e und Bussteuersignale verwendet. In Hold-Zyklen sind die Ausgänge t r i s t a t e . B e f i n d e t s i c h der Prozessor durch einen H L T - B e f e h l in einem Wartezustand, so wird dies durch S2 = 0 , S1 = 1 und SO = 1 angezeigt. Der Ausgang S t i f t 34, der im Minimumbetrieb einen Prozessorstatus ausgibt, ist in der Maximumbetriebsart immer High. Die folgenden Darstellungen der zeitlichen Abläufe der Signale (Timing) können nur einen Überblick geben, für den Entwurf von Systemen sollten die U n t e r l a g e n des Prozessorherstellers zusammen mit den D a t e n b l ä t t e r n der B a u s t e i n h e r s t e l l e r verwendet werden.

T1

T2

T4

T3

Clk

ALE

t l

AD0-AD7 A16-A19 A8-A15

IO/M SSO DT/R DEN "ED WR

K

l

I

\

Adresse

|f

Y

Status oder Oaten

|

Adressen s t a b i l

Steuersignale

l

|

stabil ;

^

Steuersignale aktiv

I

|

j

Bild 2 - 4 : Z e i t l i c h e r Verlauf von Adressen, Daten und Signalen

Ein Buszyklus (Bild 2 - 4 ) besteht aus vier C L K - T a k t e n T 1 bis T 4 . In W a r t e Zyklen ( R E A D Y Low) werden zwischen den T a k t e n T 3 und T 4 , wenn alle Bussignale stabil sind, W a r t e t a k t e Tw eingeschoben (Bild 2 - 6 ) . In HoldZyklen (HOLD High bzw. R Q / G T - B u s v e r g a b e ) , wenn der Prozessor den Bus f r e i g e g e b e n hat, werden an den Takt T 4 Holdtakte Th angehängt (Bilder 2 - 7 und 2 - 8 ) . Bild 2 - 9 zeigt die besonderen Interrupt-Zyklen. An den gemultiplexten Anschlüssen liegen im T a k t T 1 Adressen. Diese w e r den mit A L E (High-Zustand oder fallende F l a n k e ) in e x t e r n e n Adreßspeic h e r baust einen g e s p e i c h e r t . In den T a k t e n T2 bis T 4 führen die Anschlüsse S t a t u s s i g n a l e ( A 1 9 / S 6 bis A 1 6 / S 3 ) bzw. Daten (AD7 bis ADO).

2.1 Mikroprozessoren

Lesezyklus

JZ

T1

T2 •

CLK ALE

JH

Schreibzyklus T3 •

T4

T1

E I _ Ü Daten übernehmen

A19-A16, Status

Adresse

| Statu

r

-150

165 h

KD

T3 •

n

J Z

T4

n

3&-10 f Adresse*)——(("¡Daten vom Speicher^-

AB/DB

T2 ->—

3

Adresse^ Daten von Prozessor ~][ Adresse

f

I

Status

Minimunbetrieb n o f—

WR

110|-

ü

IO/M

DT/R

l

UER'

ALE DT/R MRDC i IORC HWTC IOMC ÄMWC AI OUC

I r~\ jf I

-

r

35 r

i i j r

35 J-

t

35 r

Bild 2 - 5 : L e s e - und Schreibzyklen in beiden Betriebsarten

y—

35. - | I—

I35 r

I

57

58

2 Bausteine der 80x86-Familie

Die

Adressen

A8

bis

A15

sowie

die

Steuersignale,

die Zustände

Einzeigen

(z.B. IO/M, DT/R und SSÖ), sind in allen vier Takten aktiv und stabil. Die Steuersignale, die Richtung und Zeitpunkt der Datenübertragung steuern (z.B. RD, Mitte

WR,

DEN,

INTA

und 8288-Signale)

sind

in der

R e g e l von der

des Taktes T2 bis zur Mitte des Taktes T4 aktiv L o w , wenn die g e -

multiplexten Leitungen für Daten verwendet werden. Bild 2-5 zeigt die Buszugriffe

auf

Speicher-

und Peripheriebausteine;

IORC und IOWC der maximalen Betriebsart

die Signale MRDC,

werden im Abschnitt

MWTC,

2.2.2 zu-

sammen mit dem Bussteuerbaustein 8288 erklärt. In einem Schreibzyklus werden die Adressen zunächst mit A L E in Adreßspeichern die

festgehalten. Dann

gemultiplexten

(schreiben) bzw. MWTC beschreibkommando) adressierte

legt

der

Prozessor

Datenbusausgänge

DO

die auszugebenden

bis

D7.

Die

(Speicherschreibkommando) oder IOWC

werden

bis zur

Mitte

des Taktes

Speicher- bzw. Peripheriebaustein

Daten auf

Schreibsignale

WR

(Ein/Ausga-

T4 aktiv Low.

Der

muß die Daten spätestens mit

der steigenden Flanke des Schreibsignals übernehmen. In einem Lesezyklus werden die Adressen zunächst mit A L E in Adreßspeichern festgehalten.

Dann

tristate.

Lesesignale

Die

oder IORC aktiv

Low.

adressierten

macht der Prozessor RD

(lesen)

(Ein/Ausgabelesekommando) Der

ausgewählte

Speicherinhalt

Speicher-

auf

den

die Datenbusanschlüsse

bzw.

MRDC

werden in der Mitte oder

des Taktes T2

Peripheriebaustein

Datenbus.

DO bis D7

(Speicherlesekommando)

Der

Zustand

bringt

des

den

Datenbus

wird am Ende des Taktes T3 in den Prozessor übernommen. In der Mitte des Taktes T4 geht das Lesesignal wieder auf High und macht die Ausgänge des Bausteins tristate.

T1

j-

T2

|

T3

I

Tw

|

Tw

-f

T4

t RDY t READY t

AdreßDatenSteuerBus

Bild 2-6: Wartetakte mit

{

READY

I Signale s t a b i l

^

t

2.1 Mikroprozessoren

59

Für den Anschluß langsamer Speicher- und Peripheriebausteine können entsprechend Bild 2 - 6 Wartetakte Tw zwischen T3 und T4 eingeschoben werden, da zu diesem Zeitpunkt alle Adressen, Daten und Steuersignale des Prozessors stabil sind. Der Taktsteuerbaustein 8284 übernimmt die Synchronisation des READY-Signals mit dem Prozessortakt. Der Zustand dieses Eingangs wird vom Prozessor am Ende des Taktes T2 geprüft. Liegt zu diesem Z e i t punkt die Leitung auf Low (Speicher nicht bereit), so schiebt der Prozessor zwischen T3 und T4 so lange Wartetakte Tw ein, bis die Leitung wieder auf High liegt (Speicher bereit).

T2 CLK

T3

[

T4

| Thold } Thold |

Tx

\

ji_rLri_ri-

-wt

HOLD

HLDAT

Bus

Bus

tristate-

£

Bild 2 - 7 : Holdzyklen im Minimumbetrieb

Im Hold-Betriebszustand wird der Steuer-, Adreß- und Datenbus vom Mikroprozessor freigegeben, so daß ein anderer Busmaster (Coprozessor oder Steuerbaustein) direkt auf die Speicher bzw. auf die Peripherie zugreifen kann, um Daten zu übertragen (DMA). Erkennt der Prozessor im Takt T2 des Minimumbetriebes (Bild 2 - 7 ) , daß der HOLD-Eingang auf High liegt, so gibt er nach Beendigung des laufenden Buszyklus, also normalerweise nach dem Takt T4, den Bus frei, indem er seine Adreß-, Daten- und einen Teil der Steuerausgänge tristate macht. Der Hold-Zustand wird im Minimumbetrieb durch einen High-Zustand des Ausgangs HLDA bestätigt. Die in der Warteschlange des Prozessors befindlichen Befehle werden solange noch ausgeführt, bis ein Buszugriff erforderlich wird. Geht der HOLD-Eingang wieder auf Low, so setzt der Prozessor seine Buszugriffe fort und legt dabei den Ausgang HLDA zur Bestätigung wieder auf Low. Im Maximumbetrieb wird wahlweise der Anschluß RQ/GTO (meist DMASteuerbaustein) bzw. der Anschluß RQ/GT1 (meist Arithmetikprozessor) für die Hold-Steuerung verwendet (Bild 2 - 8 ) . Die Anschlüsse (Offener-KollektorAusgang) haben prozessorintern Arbeitswiderstände gegen High und arbeiten sowohl als Eingang (auslösen und freigeben) als auch als Ausgang (bestäti-

60

2 Bausteine der 80x86-Familie

Tx

|

T4

\

TholdJ Thold f l h o l d

j-

Tx

j

CLK J ~ i — r i — r i

j - l

RQ/GTx anfordern

Bus

I

I

I

freigeben gewähren Prozessor macht Bus t r i s t a t e > _fCoprozessor belegt den Bus

Bild 2 - 8 : Holdzyklen im Maximumbetrieb gen). Im Gegensatz zu den zustandsgesteuerten HOLD- und HLDA-Signalen des Minimumbetriebes a r b e i t e t die Busvergabe des Maximumbetriebes mit aktiv-Low-Impulsen, die mit dem Takt synchronisiert werden müssen. Wird bei einer steigenden Taktflanke ein Low erkannt (Impuls 1), so geht der Prozessor am Ende des laufenden Buszyklus, normalerweise nach T4, in den Hold-Zustand und bestätigt dies durch die Ausgabe eines Low-Impulses (Impuls 2). Erkennt der Prozessor einen neuen Low-Impuls (3) am Anschluß, so beendet er seinen Hold-Zustand und setzt seine Buszugriffe f o r t .

Bei der Annahme eines INTR-Interrupts holt sich der Prozessor in einem besonderen Interrupt-Annahme-Zyklus (Bild 2-9) über den Datenbus eine Kennzahl, die in eine Startadresse für das auszuführende Interruptprogramm umgesetzt wird. Anstelle eines Speicherlesesignals dient das Signal INTA zum Auslesen des Kennzahlbytes aus dem normalerweise angeschlossenen Interruptsteuerbaustein 8259A.

2.1 Mikroprozessoren

61

Bei der Ausführung eines H L T - B e f e h l s t r i t t ein weiterer inaktiver H a l t - B u s zustand auf, in dem die A d r e ß - und Datenleitungen jedoch nicht t r i s t a t e werden, sondern Undefinierte Werte annehmen. Da die Steuerleitungen nicht aktiv sind, finden keine S p e i c h e r - und Peripheriezugriffe s t a t t . Im Minimumbetrieb wird dies durch IO/M = DT/R = SSO = 1 angezeigt, im M a x i mumbetrieb durch S2 = 0 und S1 = SO = 1. Der Halt-Buszustand kann nur durch ein R e s e t oder einen Interrupt verlassen werden. Beim Entwurf eines 8 0 8 8 - S y s t e m s ist zu b e a c h t e n , daß bei einem R e s e t des Prozessors der e r s t e Befehl aus dem oberen Adreßbereich von der physikalischen Speicheradresse OFFFFOH gelesen wird. Da an dieser S t e l l e nur noch 16 B y t e s bis zum Ende des adressierbaren Speicherbereiches frei sind, steht dort ein unbedingter Sprungbefehl in das B e t r i e b s s y s t e m , das sich üblicherweise im oberen Adreßbereich in einem F e s t w e r t s p e i c h e r ( E P R O M ) b e findet. Die Startvektoren der Interruptprogramme liegen dagegen im u n t e ren Adreßbereich von 00000H bis 0 0 3 F F H , den man meist als Schreib/Lesespeicher ( R A M ) ausführt, um die Interruptvektoren durch das Programm ä n dern zu können. Normalerweise werden bei 8 0 x 8 6 - S y s t e m e n die an den Bus angeschlossenen Bausteine mit dem IO/M-Signal oder davon a b g e l e i t e t e n L e s e - und Schreibsignalen in einen Speicherbereich ( M e m o r y ) und einen Peripheriebereich (Input/Output) u n t e r t e i l t .

2 . 1 . 2 Der 16-bit-Prozessor 8 0 8 6

Yx AO(BLE)

Yx EHE

Bild 2 - 1 0 : Byteorganisierte Speicher am

16-bit-Datenbus

62

2 Bausteine der 80x86-Familie

Prozessoren mit e i n e m 8 - b i t - D a t e n b u s , zu denen auch der 8088 g e h ö r t , tragen

die

16-bit-Operanden

Buszyklen.

Prozessoren

mit

bei W o r t b e f e h l e n einem

in z w e i

16-bit-Datenbus

über-

aufeinanderfolgenden

unterscheiden

entspre-

chend Bild 2-10 zwischen B y t e - und W o r t z u g r i f f e n . A u c h bei 1 6 - und 32-bit-Prozessoren w e r d e n alle Speichergrößen

in der

Ein-

heit b y t e a n g e g e b e n , a l l e Adressen sind Adressen von B y t e s . W ö r t e r

bestehen

aus z w e i a u f e i n a n d e r f o l g e n d e n Bytes; D o p p e l w ö r t e r

aus vier B y t e s .

Statische

Speicherbausteine

(EPROMs)

überwie-

gend ein

(SRAMs)

byteorganisiert. zweiter

Baustein

sen. B e i d e

liegen

und

Festwertspeicher

Ein

Baustein

liegt

wird

an den

oberen

parallel

am

unteren

Datenbus

sind

Datenbus

D8 bis D15

DO bis

am g e m e i n s a m e n Adreßbus und an den L e s e - und

Schreibsignalen. Der Ausgang A 0 des Prozessors ist keine A d r e ß l e i t u n g sondern

ein

Bausteine.

am

freigeben) mit

Freigabesignal

Das

Bausteine

Signal oberen

Ausgang

für

BHE

die

am

(höheren

unteren

Datenbus

Bus f r e i g e b e n )

des Prozessors gibt

werden.

AI

Der

eigentliche

des Prozessors,

der

Adreßbus

versetzt

die

beginnt

also

AO der

Speicher-

an den Eingang

bausteine angeschlossen wird. A l l e f o l g e n d e n A d r e ß l e i t u n g e n chend

mehr,

angeschlossenen

Datenbus f r e i . A 0 könnte auch als B L E ( n i e d e r e n Bus

bezeichnet

dem

D7,

eingeschlos-

Bild 2 - 1 1

verbunden.

zeigt

die

beiden

werden

erst

entspre-

Freigabesignale

bei

B y t e - und W o r t z u g r i f f e n .

BHE

A0 (BLE)

LOW (0) LOW (0) HI GH(1 ) HI GH(1 )

LOW (0)

Adresse gerade ungerade gerade

HIGHO) LOW (0) HIGHO)

-

Die

beiden bis

T4

und

Bei

BHE und AO ( B L E ) sind in allen Adreßspeichern

auf

bzw. eine beide

werden

gerade

in

Adresse

Bausteine

sind

parallel

mit dem Wort von Adresse

einem

(BLE)

Datenbusfreigabesignale

geben

AX

-

BHE und AO

beide frei;

ein W o r t , über beide Bushälften ü b e r t r a g e n . Lade

D15 - D8 D7 - DO

stabil

Wortzugriff Low

Datenbus D15 - DO

-

Bild 2 - 1 1 : Die D a t e n b u s f r e i g a b e s i g n a l e

T1

Datenbreite Wort Byte Byte

Bytezugriff

Freigabesignal

auf

AO ( B L E )

eine

festgehalten. Signale

es w e r d e n

Bei

Takten einem

gleichzeitig zwei

aktiv

Bytes,

also

Beispiel:

4710H

gerade

L o w , und es

Adresse w i r d ein

(Adreßbit

AO = 0)

ist

B y t e über den unteren

das Da-

tenbus ü b e r t r a g e n . BHE = High sperrt dabei den o b e r e n Datenbus. B e i s p i e l : Lade Bei

AL einem

mit

dem B y t e von Adresse

Bytezugriff

Freigabesignal

AO

4710H

auf eine ungerade A d r e s s e ( A d r e ß b i t

(BLE)

High, und der

untere

Datenbus

AO = 1) ist das ist

gesperrt.

Der

2.1 Mikroprozessoren

63

Prozessor überträgt mit dem Signal BHE = Low ein Byte über den oberen D a tenbus. Beispiel: Lade AH mit dem Byte von Adresse 4711H Bei einem Wortzugriff auf ein Wort, das auf einer ungeraden Adresse b e ginnt, sind zwei Buszyklen erforderlich. Der e r s t e Zyklus ist ein Bytezugriff auf die ungerade Adresse (oberer Datenbus); der zweite Zyklus ein Bytezugriff auf die folgende gerade Adresse (unterer Datenbus). Beispiel: Lade AX mit dem Wort von Adresse 4711H Adressiert werden die Bytes auf den Adressen 4711H und 4712H. Stellt man die letzten Hexaziffern binär dar (1H = 0001 und 2H = 0010), so sieht man, daß sich die beiden Adressen im Adreßbit AI unterscheiden und daher nicht gleichzeitig ausgesendet werden können. Da sich durch den zusätzlichen Buszyklus die Ausführungszeit verlängert, bieten die meisten Assembler die Möglichkeit, Wörter auf geradzahlige Wortadressen auszurichten. Die Prozessoren 8088 und 8086 sind vom Befehls- und Registersatz her gleich, jedoch werden einige Befehle beim 8086 wegen des 1 6 - b i t - D a t e n b u s schneller ausgeführt. Es können die gleichen S t e u e r - und Peripheriebausteine sowie der gleiche Arithmetikprozessor 8087 verwendet werden. Die Belegung und die Funktion der Anschlüsse haben beim 8086 folgende Abweichungen gegenüber dem 8088: Die reinen Adreßausgänge A8 bis A15 des 8088 sind beim 8086 die g e m u l t i plexten Adreß/Datenbusanschlüsse AD8 bis AD 15 mit dem gleichen Timing wie ADO bis AD7. Es ist also für den mittleren Teil des Adreßbus ein zusätzlicher Adreßspeicher e r f o r d e r l i c h . Der Ausgang A0 ist kein Adreßbit, sondern das Freigabesignal für den u n t e ren Datenbus BLE (unteren Datenbus freigeben). Das Signal wird zusammen mit den Adreßbits AI bis A7 in einem Adreßspeicher f e s t g e h a l t e n . Die A d r e ß ausgänge des 8086 von AI a u f w ä r t s werden mit den Adreßeingängen von A0 a u f w ä r t s der Speicherbausteine verbunden. Der Ausgang SSO (Minimumbetrieb) Stift 34 des 8088 ist beim 8086 das betriebsartunabhängige Signal BHE/S7. Im Takt T1 liefert der Anschluß das Freigabesignal BHE (höheren Bus freigeben) für den oberen Datenbus D8 bis D15, in den Takten T2 bis T4 das Statussignal S7, das in den meisten Prozessorversionen mit dem Signal BHE übereinstimmt. BHE ist aktiv Low und wird in Hold-Zyklen t r i s t a t e . Das Speicher/Peripherieauswahlsignal M/IO des 8086 ist bei Speicherzugriffen High und bei Peripheriezugriffen Low. Das IO/M-Signal des 8088 a r b e i tet u m g e k e h r t . Bild 2 - 1 2 zeigt den Anschluß von Speicher- und Peripheriebausteinen im Minimumbetrieb.

64

2 Bausteine

der

80x86-Familie

Speicher

>1

>1

Peripherie

WE

0001

WF

0000

WR

00

0E

0003

0E

0002

RD

01

CE

0005

CE

0004

A10—AO

D 7 — DO

1

A10- - A 0

CE

D7-D0

AI -AO

02 D7--D0

>1 nr

WR M / I O RD Yx BHE

Yx AO

WR M/IO RD

Yx

III D15 D8 D7 1 T A16 A15

ALE A19

A16 AD15

D7 DO A1 AO

A1

I

A 8 A7

Speicher

DO

mJ

Adreßbus

Speicher

AD8 AD7

ADO

M i k r o p r o z e s s o r

8086

Bild 2-12: Speicher- und Peripherieadressierung Die Adreßspeicher trennen mit Hilfe des ALE-Signals die Adressen von den Daten und Statussignalen. Die Speicherbausteine liegen paarweise am oberen und am unteren Datenbus und werden mit BHE und BLE (AO) freigegeben. Der am unteren Datenbus angeschlossene Speicherbaustein enthält alle Bytes, bei denen das Adreßbit AO = 0 ist. Dies sind die geradzahligen Byteadressen. Der am oberen Datenbus angeschlossene Baustein enthält die Bytes mit ungeradzahligen Adressen (Adreßbit AO = 1). Bei der byteweisen Programmierung von einzelnen EPROMs ist darauf zu achten, daß die Adressen in den Bausteinen in Zweierschritten angeordnet sind. Der Low-Bus-Baustein enthält die Bytes auf den Adressen 0, 2, 4, 6 usf; der High-Bus-Baustein die Bytes der Adressen 1, 3, 5, 7 usf.

2.1 Mikroprozessoren

65

Auf die Peripherie wird in den meisten Anwendungen nur byteweise mit Bytebefehlen zugegriffen. Liegen die Peripheriebausteine nur am unteren Datenbus DO bis D7, so kann man auf die Auswertung von BHE verzichten und AO wieder als Adreßbit verwenden. AO des Prozessors wird also mit AO des Peripheriebausteins verbunden. Dabei ergibt sich ein 8 - b i t - P e r i p h e r i e bereich, bei dem die Adressen der Peripherieregister wie bei einem 8 - b i t System in Einerschritten angeordnet sind. Dies ist die normale Betriebsart des PC für den 8-bit-Peripheriebus, selbst wenn ein 1 6 - oder 3 2 - b i t - P r o z e s sor verwendet wird. Die 16-bit-Peripherie muß wie die Speicher mit BHE bzw. BLE (AO) als Auswahlsignal an beide Teile des Datenbus angeschlossen werden und ist dann auch wortadressierbar; die Registeradressen haben dann die Schrittweite 2.

2.1.3 Der 16-bit-Prozessor 80286 Der Mikroprozessor 80286 ist eine Weiterentwicklung des 8086 mit besonderen Eigenschaften für den Einsatz in Personal Computern, also für Anwendungen in der Datenverarbeitung. Der Adreßbus wurde auf 24 bit erweitert und wird getrennt von den D a t e n - und Steuerleitungen herausgeführt. Dies b e deutet einen Übergang auf neue Gehäusebauformen mit 68 Anschlüssen e n t w e der an allen 4 Kanten oder gitterförmig an der Unterseite. Der R e g i s t e r und Befehlssatz für Benutzerprogramme entspricht dem des 8086; er wird durch einige zusätzliche Befehle e r w e i t e r t . Die wichtigsten Unterschiede zu den Vorgängern zeigen sich in der Behandlung der Speicheradressen. Nach "Real beim setzt schen

einem Reset befindet sich der Prozessor 80286 in der Betriebsart Address Mode". Real bedeutet echt oder tatsächlich. Hierbei wird wie 8086 und 8088 der Inhalt eines 16-bit-Segmentregisters um 4 bit verzu einem 16-bit-Abstand addiert. Mit dieser 20 bit langen physikaliSpeicheradresse lassen sich 1 MByte Speicher adressieren.

Nach der softwaremäßigen Umschaltung in die Betriebsart "Protected Virtual Address Mode" stehen eine Reihe von zusätzlichen Registern und Befehlen für die Behandlung der Adressen zur Verfügung. Protected bedeutet geschützt, da diese Adressierung meist unter der Kontrolle eines Betriebssystems abläuft und für den Benutzer nicht mehr zugänglich ist. Virtual bedeutet virtuell oder scheinbar. Der Prozessor 80286 kann mit Hilfe von besonderen Registern und Tabellen "scheinbar" einen 1 Gigabyte = 1024 MByte großen Speicherbereich benutzen; über den 24-bit Adreßbus lassen sich aber nur 16 MByte physikalisch adressieren. Stellt die MMU (Memory Management Unit = Speicherverwaltungseinheit) des Prozessors f e s t , daß sich eine virtuelle Adresse nicht im Arbeitsspeicher befindet, so löst sie einen Interrupt aus. Das Betriebssystem kann nun den benötigten Speicherbereich von Magnetspeichern (Disk) nachladen. Gegebenenfalls müssen dabei selten verwendete Bereiche des Arbeitsspeichers ausgelagert werden.

66

2 Bausteine der

80x86-Familie

Der 80286 kann die Programme mehrerer Benutzer bzw. mehrere Programme eines Benutzers gleichzeitig im Arbeitsspeicher verwalten und sehr schnell zwischen ihnen umschalten, so daß der Eindruck entsteht, sie arbeiteten gleichzeitig. Dieser als Multitasking bezeichnete Betrieb muß von e i nem geeigneten Betriebssystem unterstützt werden. Der Prozessor 80286 wird mit dem Taktgenerator 82284, dem Bussteuerbaustein 82288 sowie den Steuer- und Peripheriebausteinen der 8 0 8 6 / 8 0 8 8 Prozessoren betrieben. Als Arithmetikprozessor dient der 80287. Bei vielen PC-Schaltungen finden sich jedoch anstelle der einzelnen Bausteine Chipsätze, die Taktgenerator, Bussteuerung, Interruptsteuerung und Speichersteuerung bzw. Timer, Parallelschnittstelle, DMA- und Refreshsteuerung sowie Peripheriesteuerung auf einem hochintegrierten Baustein zusammenfassen. Ähnliche Chipsätze werden auch für PC-Schaltungen mit den Prozessoren 80386 und 80486 eingesetzt.

2.1.4 Die 32-bit-Prozessoren 80386 und 80486 Der 80386 ist ein 32-bit-Prozessor mit 32-bit-Registern und 3 2 - b i t - B e f e h len, einem 32-bit-Datenbus und einem 32-bit Adreßbus, der eine physikalische Adressierung von maximal 4 Gigabyte Speicher ermöglicht. Er ist zu seinen 16-bit-Vorgängern softwarekompatibel. Das bedeutet, daß z.B. für den 8086 geschriebene Maschinenprogramme auch auf dem 80836 ablaufen. Der Prozessor 80386 kennt die gleichen Adressierungs-, Schutz- und Taskumschaltungsverfahren wie der 80286. In dem zusätzlichen "Virtual-8086-Mode" unterliegen 8086-Programme ebenfalls dem Speicherschutzverfahren des "Protected Mode". Durch das neu eingeführte Pagingverfahren (Page = S e i t e ) können mehrere 8086-Tasks im Multitasking ablaufen. Der 80486 ist ebenfalls ein 32-bit-Prozessor wie der 80386. Auf einem Baustein mit nunmehr 168 Anschlüssen sind ein 80386-Prozessor, ein 8 0 3 8 7 Arithmetikprozessor und ein 8-kByte-Schnellzugriffsspeicher (Cache) mit entsprechender Steuerung integriert. Ein Cache (versteckter Speicher) ist ein schneller Pufferspeicher, der nicht über normale Adressen angesprochen werden kann, sondern ausschließlich von einer entsprechenden Hardwaresteuerung verwaltet wird. Die meisten Programme arbeiten über längere Zeit nur in einem bestimmten Befehlsbereich (z.B. Schleifen) und bearbeiten bestimmte Datenbereiche (z.B. Tabellen). Bei jedem Speicherzugriff wird zunächst geprüft, ob sich der Befehl bzw. das Datum bereits im Cache befindet. Wenn " j a " , werden sie dem Cache e n t nommen bzw. in ihm abgelegt. Bei "nein" werden sie aus dem eigentlichen Arbeitsspeicher in den Cache nachgeladen bzw. zurückgeschrieben. Hierbei sind natürlich Buszugriffe erforderlich. Wenn der Prozessor jedoch direkt auf den Cache zugreifen kann, entfallen die relativ langsamen Buszyklen auf den Arbeitsspeicher.

2.2 Steuerbausteine

2.2

67

Steuerbausteine

Dieser Abschnitt beschreibt nur die Steuerbausteine der Prozessoren 8086 und 8088, die in den Schaltungen des Kapitels 3 verwendet werden. Für die anderen 80x86-Prozessoren gibt es ähnliche Bausteine bzw. ihre Funktionen sind in den Chipsätzen der PCs integriert.

2.2.1 Der Taktgenerator 8284 Der Taktgenerator 8284 liefert das Taktsignal für den Prozessor und den Peripheriebus des PC. Gleichzeitig werden das Reset- und das Ready-Signal mit dem Prozessortakt synchronisiert. Bild 2-13 zeigt einen vereinfachten Blockschalt plan für die übliche Betriebsart mit einem Quarz, der an die Eingänge XI und X2 angeschlossenen wird. Die Quarzfrequenz muß das dreifache der gewünschten Prozessorfrequenz betragen.

(14.31) OSC

t

Quarz :1

(4.77) CLK

(2.38) PCLK

RESET

Quarz :3

Quarz :6

ResetSynchr.

t

I

READY

I

! Ready-Synchronisation

I

X1 Quarz H . 3 1 MHz

F/C

"I

Oszillator und Steuerung EFI

r

Taktsteuerung

8284

CSYNC

r ~

j-l—l

-r

^1 & t

RDY1 AEN1 RDY2 AEN2!ASYNC

1

T

Bild 2-13: Der Taktgenerator 8284

Der Ausgang OSC (Oszillator) liefert die Quarzfrequenz mit TTL-Pegel und einem Tastverhältnis von 1:1 (1 Zeiteinheit Low und 1 Zeiteinheit High). Der Ausgang CLK (Takt) liefert die durch 3 geteilte Quarzfrequenz für

68

2 Bausteine der

80x86-Familie

MOS-Bausteine (Prozessor und Steuereinheiten) bei einem Tastverhältnis von 2:1 (2 Einheiten Low und 1 Einheit High). Der Ausgang PCLK (Peripheriet a k t ) liefert die durch 6 geteilte Quarzfrequenz mit TTL-Pegel und einem Tastverhältnis von 1:1. Die Eingänge FfC (Frequenz/Quarz), EFI (Externer Frequenz Eingang) und CSYNC (Taktsynchronisation) dienen zum Anschluß eines e x t e r n e n T a k t g e n e r a t o r s bzw. zur Synchronisation mehrerer Bausteine. Der Ausgang RESET wird mit dem RESET-Eingang des Prozessors bzw. der S t e u e r - und Peripheriebausteine verbunden. Er ist aktiv High, wenn der Prozessor g e s t a r t e t oder zurückgesetzt werden soll. Der Neustart des Prozessors beginnt mit der fallenden Flanke des Signals; im Betrieb ist der Ausgang Low. Das am RES-Eingang (Schmitt-Trigger!) angeschlossene RC-Glied mit Taster sorgt beim Einschalten der Versorgungsspannung für die notwendige Zeitverzögerung des RESET-Impulses. Der Ausgang READY wird mit dem READY-Eingang des Prozessors bzw. der Steuerbausteine verbunden. Er ist aktiv High, wenn die Speicher- und Peripheriebausteine bereit sind, Daten über den Bus zu ü b e r t r a g e n . Langsame Bausteine können über die Eingänge RDY und AEN den Ausgang READY auf Low bringen und damit den Prozessor veranlassen, W a r t e t a k t e Tw zwischen T3 und T4 einzuschieben. Arbeitet man mit voller Busgeschwindigkeit, so liegen die RDY-Eingänge (bereit) auf High und die AEN-Eingänge ( A d r e ß f r e i gabe) auf Low. Der Eingang ASYNC stellt die Synchronisation ein und wird normalerweise fest auf High gelegt.

2.2.2 Der Bussteuerbaustein 8288

Der Bussteuerbaustein 8288 erzeugt die Bussteuersignale des Maximumbet r i e b e s und ist notwendig, wenn ein Arithmetikprozessor oder eine DMASteuerung eingesetzt werden sollen. PC-Schaltungen arbeiten immer im Maximumbetrieb. Bild 2 - 1 4 zeigt ein vereinfachtes Blockschaltbild mit den wichtigsten Anschlüssen. Die Eingänge SO bis S2 (Status) werden mit den entsprechenden Ausgängen SO bis S2 des Prozessors verbunden; aus ihnen werden die Steuersignale an den Ausgängen abgeleitet und mit dem Taktsignal CLK (Takt) des T a k t g e n e r a t o r s 8284 synchronisiert. Die folgenden Kommando- und Steuersignale haben die gleiche Bedeutung (Ausnahme DEN) und das gleiche Timing wie die entsprechenden Prozessorsignale des Minimumbetriebes. Die Kommandoausgänge IORC (Ein/Ausgabe Lesekommando) und IOWC ( E i n / Ausgabe Schreibkommando) sind aktiv Low und dienen zur Freigabe der P e ripheriebausteine bei Peripheriebefehlen (IN und OUT). Der Ausgang AIOWC (vorlaufendes Ein/Ausgabe Schreibkommando) liefert ein zeitlich f r ü h e r e s Schreibsignal als IOWC. In Hold-Zyklen werden die Ausgänge t r i s t a t e .

2.2 Steuerbausteine

69

Bild 2 - 1 4 : Der B u s s t e u e r b a u s t e i n 8288

Die K o m m a n d o a u s g ä n g e MRDC (Speicher L e s e k o m m a n d o ) und MWTC ( S p e i cher S c h r e i b k o m m a n d o ) sind aktiv Low und dienen zur F r e i g a b e der Speic h e r b a u s t e i n e . Der Ausgang AMWC (vorlaufendes Speicher S c h r e i b k o m m a n do) l i e f e r t ein zeitlich f r ü h e r e s Schreibsignal als MWTC. In Hold-Zyklen werden die Ausgänge t r i s t a t e . Der Kommandoausgang INTA (Interrupt B e s t ä t i g u n g ) erzeugt in I n t e r r u p t - Z y klen aktiv Low Lesesignale, die eine Kennzahl über den Datenbus in den Prozessor laden. Aus diesen Kennzahlen werden die S t a r t a d r e s s e n der I n t e r ruptprogramme abgeleitet. Der S t e u e r a u s g a n g ALE (Adreßspeicher f r e i g e b e n ) zeigt mit High a n , d a ß g ü l tige Adressen auf den g e m u l t i p l e x t e n L e i t u n g e n liegen. Das ALE-Signal wird zur F r e i g a b e der Adreßbusspeicher v e r w e n d e t . Der Ausgang DT/ST ( D a t e n s e n d e n / e m p f a n g e n ) ist w ä h r e n d des g e s a m t e n Buszyklus stabil und zeigt mit High Schreibzyklen und mit Low L e s e - und Interruptzyklen an. Er wird dazu b e n u t z t , die Richtung der D a t e n b u s t r e i b e r zu s t e u e r n . Der Ausgang DEN ( D a t e n f r e i g e b e n ) ist im G e g e n s a t z zum DEN ( M i n i m u m b e t r i e b ) des Prozessors aktiv High, wenn der Prozessor auf den Datenbus z u g r e i f t . Er dient zur F r e i g a b e ( T r i s t a t e - S t e u e r u n g ) der D a t e n b u s t r e i b e r und der A d r e ß bustreiber (Adreßspeicher).

70

2 Bausteine der 80x 86-Familie

Mit den Eingängen CEN, IOB und AEN werden die Kommando- und S t e u e r ausgänge freigegeben bzw. tristate gesteuert. Legt man CEN (Kommandos freigeben) auf Low, so werden alle Kommandoausgänge sowie DEN und PDEN in den nichtaktiven Zustand versetzt, jedoch nicht t r i s t a t e . Bei CEN High arbeitet der Baustein normal. Der Eingang IOB (Ein/Ausgabe Bus) dient in Verbindung mit AEN (Adressen freigeben) zur Tristatesteuerung der Kommandoausgänge. Legt man den Eingang IOB fest auf Low, so wirkt AEN sowohl auf die Speicher- als auch auf die Peripheriekommandos. Der Ausgang MCE (Master Cascade freigeben) liefert dann ein Lesesignal bei kaskadierten Interruptsteuerbausteinen. Legt man den Eingang IOB fest auf High, so werden die Peripheriesteuersignale von AEN unabhängig. Der Ausgang PDEN liefert dann ein Freigabesignal für den Peripheriebus. Der Eingang AEN (Adressen freigeben) wird in Verbindung mit einer DMAoder Bussteuerung verwendet. Legt diese Schaltung den Eingang AEN auf Low, so steuern die Kommandoausgänge mit L e s e - und Schreibsignalen die Speicher- und Peripheriebausteine; der Prozessor belegt den Bus. Geht AEN jedoch auf High, so werden die Kommandoausgänge t r i s t a t e , und ein anderer Prozessor oder ein DMA-Steuerbaustein liefert eigene L e s e - und Schreibsignale, um auf den Bus zuzugreifen. Legt die Bus- oder DMA-Steuerung AEN wieder auf Low, so arbeitet der Steuerbaustein (Prozessor) weiter.

2.2.3 Der Interruptsteuerbaustein 82S9A

Geräte oder Peripheriebausteine

Bild 2 - 1 5 : Der Interruptsteuerbaustein 8259A PIC

2.2 Steuerbausteine

71

Dieser Abschnitt behandelt nur die Funktion und die Anschlüsse des 8259A (Bild 2-15), die Programmierung wird bei den Anwendungen gezeigt. Der Baustein 8259A PIC (programmierbarer Unterbrechungssteuerbaustein) hat die Aufgabe, Interruptanforderungen von G e r ä t e n und Peripheriebausteinen an den Prozessor kontrolliert weiterzuleiten. Er wird beim Start des Systems wie ein Peripheriebaustein durch Steuerbytes auf eine b e s t i m m t e Betriebsart eingestellt (initialisiert). Dies geschieht über die Eingänge CS (Bausteinauswahl) und WR (schreiben). Da über den Eingang AO nur zwei Adressen ausgewählt werden können, müssen die Register des Bausteins (IRR, ISR und IMR) mit mehreren Initialisierungs- und Kommandowörtern in einer bestimmten Reihenfolge programmiert werden. Der Zustand (Status) läßt sich mit RD (lesen) e r m i t t e l n . Über die bidirektionalen Datenbusanschlüsse DO bis D7 werden Steuerbytes und Statusinformationen ü b e r t r a g e n . Nach der Initialisierung werden im Betrieb nur noch ein F r e i g a b e - und ein Bestätigungsregister (Bild 2-15) angesprochen. Die Eingänge IRO bis IR7 (Interrupt Anforderung) sind je nach Programmierung flankengesteuert (Low nach High) oder zustandsgesteuert (High aktiv). Ist die auslösende Interruptanforderung freigegeben, so legt der S t e u e r b a u stein seinen Ausgang INT (Interrupt) auf High, der an den entsprechenden INTR-Eingang des Prozessors angeschlossen wird. Ist der Interrupt durch das 1—Bit des Statusregisters (l=l) freigegeben, so leitet der Prozessor nach B e endigung des laufenden Befehls einen Interrupt-Bestätigungszyklus ein (Bild 2-9) und sendet über seinen INTA-Ausgang (Interrupt Bestätigung) zwei aktiv Low Impulse an den INTA-Eingang des 8259A. Mit dem zweiten INTA-Impuls wird im 8086-Betrieb eine vorprogrammierte Kennzahl über DO bis D7 an den Prozessor übertragen. Der 8085-Betrieb liefert stattdessen einen drei Byte langen CALL-Befehl ( U n t e r p r o g r a m m a u f r u f ) . Die älteren XT-Schaltungen e n t h a l t e n nur einen PIC-Steuerbaustein mit acht Interruptquellen, bei den neueren AT-Version wird ein zweiter PIC an die Anschlüsse CASO bis CAS2 und SP/EN angeschlossen (Kaskadierung).

2.2.4 Der DMA-Steuerbaustein 8237A Dieser Abschnitt zeigt nur die Funktion und die Anschlüsse des Bausteins mit seinen e x t e r n e n Hilfsregistern (Bild 2-16), die Programmierung wird bei den Anwendungen mit Beispielen behandelt. DMA bedeutet Direct Memory Access gleich direkter Zugriff auf die Speic h e r - und Peripheriebausteine eines Computers durch eine Peripherie- oder Steuereinheit. Ein Beispiel wäre die Aufgabe, einen Block von 512 Bytes von einer Floppysteuerung in den Arbeitsspeicher zu kopieren. Beim Start des Systems wird zunächst der 8237A durch Programmierung seiner Register auf die gewünschte Betriebsart, die Speicheranfangsadresse und die Anzahl der

72

2 Bausteine der

80x86-Familie

A19..A16 1 GR Seitenregister D3 DO I

i

A15 OE

A8

A7..A4

A3..AO

Adreßspeicher

G D7

DO Datenbus

X

J L JL CS IOR IOW MEMR MEMW

AEN ADSTB

DB7 ... DBO

A7..A4

A3..AO

H i g h : OMA

Kommando/Statusreg.

KanalO

Request(Anforderung) Maskenregister

16-bit-Adreßregister 16-bit-Zählregister Maske Mode Request

Kanall

wie KanalO

Kanal2

wie KanalO

Kanal3

wie KanalO

Moderegister Umschaltflipflops temporäre Register RESET

t

READY

« CLK

Taktsteuerung 8284

(5)

DMA-Steuerung 8237A HLDA

t

HRQ

1

Prozessor 8086/8088

Bild 2 - 1 6 : Der D M A - S t e u e r b a u s t e i n

DREQ0..DREQ3

t t t

EOP

Ù

DACKO. .DACK3

1

Anforderungs- und Bestätigungsschaltung

8237A

B y t e s e i n g e s t e l l t ( i n i t i a l i s i e r t ) . Soll n u n w ä h r e n d des B e t r i e b e s d e r D a t e n b l o c k ü b e r t r a g e n w e r d e n , so s e n d e t d i e F l o p p y s t e u e r u n g e i n e A n f o r d e r u n g ü b e r e i n e n D R E Q - E i n g a n g a n den D M A - B a u s t e i n , die d i e s e r a n d e n P r o z e s s o r ü b e r s e i n e n H R Q - A u s g a n g w e i t e r l e i t e t . D e r P r o z e s s o r f ü h r t nun H o l d - Z y k l e n a u s , m a c h t d a b e i s e i n e A u s g ä n g e t r i s t a t e und b e s t ä t i g t d i e s e n Z u s t a n d a m H L D A - E i n g a n g . D e r D M A - S t e u e r b a u s t e i n ü b e r n i m m t die K o n t r o l l e ü b e r d e n A d r e ß - , D a t e n - und S t e u e r b u s u n d l i e f e r t d e r a n f o r d e r n d e n S c h a l t u n g e i n Bestätigungssignal DACK. Während der D a t e n ü b e r t r a g u n g erzeugt der D M A S t e u e r b a u s t e i n a l l e e r f o r d e r l i c h e n S p e i c h e r a d r e s s e n u n d S t e u e r s i g n a l e . Bei e i n e m E i n z e l t r a n s f e r w i r d j e w e i l s n u r e i n D M A - Z y k l u s zur Ü b e r t r a g u n g e i n e s B y t e s in d i e B u s z u g r i f f e d e s P r o z e s s o r s e i n g e s c h o b e n . Bei e i n e m B l o c k t r a n s f e r w i r d d e r g a n z e D a t e n b l o c k h i n t e r e i n a n d e r ü b e r t r a g e n ; d e r P r o z e s s o r ist also l ä n g e r e Zeit inaktiv. Neben diesem P e r i p h e r i e - S p e i c h e r - T r a n s f e r gibt e s a u c h S p e i c h e r - S p e i c h e r - Ü b e r t r a g u n g e n , b e i d e n e n d e r 8 2 3 7 A im e r s t e n H a l b zyklus die D a t e n aus d e m H e r k u n f t s s p e i c h e r a u s l i e s t , z w i s c h e n s p e i c h e r t u n d in e i n e m z w e i t e n H a l b z y k l u s in d a s Z i e l s c h r e i b t . D e r B a u s t e i n v e r w a l t e t vier D M A - K a n ä l e .

2.2 Steuerbausteine

73

G e g e n ü b e r e i n e r s o f t w a r e g e s t e u e r t e n D a t e n ü b e r t r a g u n g mit einzelnen L a d e und S p e i c h e r b e f e h l e n e n t f ä l l t d a s L e s e n der B e f e h l e und D a t e n a d r e s s e n , da bei e i n e r DMA nur D a t e n ü b e r t r a g e n w e r d e n . Die 8 0 x 8 6 - P r o z e s s o r e n h a b e n j e d o c h b e s o n d e r e S t r i n g b e f e h l e mit W i e d e r h o l u n g s v o r s ä t z e n , die e b e n f a l l s nur auf D a t e n z u g r e i f e n , da Code und A d r e s s e n im Prozessor g e s p e i c h e r t sind. Bei s c h n e l l e n Prozessoren können diese B e f e h l e G e s c h w i n d i g k e i t s v o r t e i l e g e g e n ü b e r dem in der T a k t f r e q u e n z b e s c h r ä n k t e n D M A - S t e u e r b a u s t e i n b r i n g e n . Der B a u s t e i n 8237A wurde z u e r s t in 8 - b i t - S y s t e m e n ( 8 0 8 0 / 8 0 8 5 ) mit e i n e m 1 6 - b i t - A d r e ß b u s e i n g e s e t z t . Die A d r e ß a n s c h l ü s s e A0 bis A7 l i e f e r n die u n t e r e n A d r e ß b i t s e i n e r D M A - A d r e s s e , die o b e r e n A d r e ß b i t s A8 bis A15 w e r d e n in e i n e m zusätzlichen A d r e ß s p e i c h e r f e s t g e h a l t e n . Bei e i n e m 2 0 - b i t - bzw. 2 4 b i t - A d r e ß b u s ist f ü r die A d r e s s e n ab A16 ein zusätzliches S e i t e n r e g i s t e r e r f o r d e r l i c h , das n i c h t mehr vom S t e u e r b a u s t e i n , sondern von der S y s t e m s o f t w a r e v e r w a l t e t wird. J e d e r D M A - K a n a l a k t i v i e r t e i n e vorher e i n g e s t e l l t e S p e i c h e r s e i t e , die aus den A d r e ß b i t s ab A16 gebildet w i r d . Bei m o d e r n e n P C - S y s t e m e n w e r d e n Chipsätze mit i n t e g r i e r t e n D M A - S t e u e r u n g e n v e r w e n d e t . Die Eingänge RESET, READY und CLK des 8237A w e r d e n wie die e n t s p r e c h e n d e n Prozessorsignale vom T a k t s t e u e r b a u s t e i n 8284 g e l i e f e r t . Im M i n i m u m b e t r i e b des Prozessors wird der Ausgang H R Q (Hold A n f o r d e r u n g ) mit dem Eingang HOLD des Prozessors verbunden; der Ausgang HLDA des P r o zessors mit dem Eingang HLDA (Hold B e s t ä t i g u n g ) . Im M a x i m u m b e t r i e b des Prozessors müssen HRQ und HLDA mit e i n e r Zusatzlogik an eines der b e i d e n b i d i r e k t i o n a l e n Prozessorsignale RQ/GTO oder R Q / G T 1 a n g e p a ß t w e r d e n (Bild 2 - 8 und Bild 3 - 1 5 ) . Die Eingänge DREQO bis DREQ3 (DMA a n f o r d e r n ) sind n a c h R e s e t aktiv High und können d u r c h S o f t w a r e u m p r o g r a m m i e r t w e r d e n . Die A u s g ä n g e DACKO bis DACK3 (DMA b e s t ä t i g e n ) sind n a c h R e s e t aktiv Low und l a s s e n sich e b e n f a l l s e i n s t e l l e n . Der Anschluß EOP (Ende des P r o zesses) ist b i d i r e k t i o n a l und s o l l t e mit einem W i d e r s t a n d auf High g e l e g t w e r d e n . Als Ausgang l i e f e r t er ein Signal am Ende e i n e r Ü b e r t r a g u n g ; a l s Eingang dient e r zum vorzeitigen A b b r u c h e i n e s D M A - Z u g r i f f s . Beim S t a r t e i n e s S y s t e m s wird der 8237A wie ein P e r i p h e r i e b a u s t e i n durch B e f e h l e p r o g r a m m i e r t , er kann w ä h r e n d des B e t r i e b e s auch g e l e s e n w e r d e n . Dazu dienen die Anschlüsse CS ( B a u s t e i n f r e i g a b e ) , IOR ( E i n / A u s g a b e l e s e n ) , IOW ( E i n / A u s g a b e s c h r e i b e n ) , A0 bis A3 zur Auswahl von 16 R e g i s t e r n und die D a t e n b u s a n s c h l ü s s e DBO bis DB7. Das S e i t e n r e g i s t e r f ü r die A d r e ß b i t s A16 bis A19 muß g e t r e n n t vom 8237A v o r b e r e i t e t w e r d e n . Bei e i n e m D M A - Z u g r i f f sind die A n s c h l ü s s e IOR und IOW sowie MEMR ( S p e i c h e r l e s e n ) , MEMW (Speicher s c h r e i b e n ) und A0 bis A7 A u s g ä n g e . Auf den Anschlüssen DBO bis DB7 e r s c h e i n e n die Bits A8 bis A15 d e r S p e i c h e r a d r e s s e , die mit ADSTB ( A d r e ß i m p u l s ähnlich ALE) im A d r e ß s p e i c h e r f e s t g e h a l t e n w e r d e n . Der Ausgang AEN ( A d r e ß f r e i g a b e ) ist in D M A - Z y k l e n aktiv High und kann dazu v e r w e n d e t w e r d e n , die B u s t r e i b e r und den B u s s t e u e r b a u s t e i n 8288 t r i s t a t e zu m a c h e n , um den Prozessor vom Bus zu t r e n n e n .

74

2 Bausteine der

80x86-Familie

Ist AEN Low, so greift der Prozessor auf den Bus zu. Die Auswahl der a k tiven Seite (Adreßbits ab A16) aus dem Seitenregister erfolgt nicht durch den DMA-Steuerbaustein, sondern von der anfordernden Schaltung (DACK).

2.3

Der Arithmetikprozessor 8087

Der Befehlssatz der Prozessoren 8086 und 8088 enthält Befehle der G l e i t punktarithmetik (Abschnitt 1.1.3) und zur Berechnung von mathematischen Funktionen, die jedoch von einem anderen Baustein, dem Arithmetikprozessor 8087, ausgeführt werden müssen. Bild 2 - 1 7 zeigt den Blockschaltplan des 8087, der sowohl mit dem 8086 als auch mit dem 8088 zusammarbeitet.

Bild 2 - 1 7 : Der Arithmetikprozessor 8087

Der Arithmetikprozessor, auch arithmetischer oder numerischer Coprozessor genannt, wird direkt an die Adreß-, Daten- und Steuerleitungen des Mikro-

2.4 Peripheriebausteine

75

Prozessors 8086/8088 in der Maximumbetriebsart angeschlossen. Die Busverfolgungs- und Steuerlogik der Steuereinheit erkennt die für den Arithmetikprozessor bestimmten Befehle an der Codekennung "Escape" und übernimmt die Operanden und Adressen. Die Numerische Ausführungseinheit enthält acht Arbeitsregister von je 80 bit Länge sowie eine eigene Arithmetisch-Logische Einheit (ALU) und ein Mikrocodesteuerwerk. Die Gleitpunktbefehle und mathematischen Funktionen des Arithmetikprozessors arbeiten etwa 10 bis 100 mal schneller als entsprechende Gleitpunktunterprogramme, die mit den ganzzahligen Befehlen der Mikroprozessoren programmiert werden. Beide Prozessoren haben eine fast identische Stiftbelegung, so daß sie oft direkt nebeneinander angeordnet werden. Die Anschlüsse RESET, READY, CLK, ADO bis AD15, A16/S3 bis A19/S6, BHE/S7, SÖ bis S2~, QSÖ und QS1 haben bei beiden Prozessoren die gleiche Bedeutung und werden parallel geschaltet. Der BUSY-Ausgang (belegt) des 8087 wird an den TEST-Eingang des 8086/8088 angeschlossen, der damit das Ende eines numerischen Befehls feststellen kann. Die Verbindung RQ/GT0 (anfordern und gewähren) des 8087 mit RQ/GT1 des 8086/8088 dient der Busvergabe. An den Anschluß RQ/GT0 des 8087 kann eine weitere Busvergabesteuerung angeschlossen werden. Der Ausgang INT (Programmunterbrechung) des 8087 meldet mit einem High, daß eine Ausnahme wie z.B. ein Zahlenüberlauf a u f g e t r e t e n ist. Er kann mit NMI des Prozessors oder mit dem Interruptsteuerbaustein 8259A zum Auslösen eines INTR-Interrupts verbunden werden.

2.4

Peripheriebausteine

Als Peripherie bezeichnet man Schaltungen, die den Computer mit seiner Außenwelt verbinden. Es können sowohl TTL-Bausteine und die Peripheriebausteine der 80xxx-Familie als auch Schnittstellen anderer Mikroprozessorhersteller verwendet werden. Die Programmierung der hier als Beispiel vorgestellten Bausteine wird in den Anwendungen behandelt.

2.4.1 Parallele Schnittstellen Bild 2-18 zeigt den Aufbau von Ein/Ausgabeschaltungen mit TTL-Bausteinen, die gegenüber den MOS-Peripheriebausteinen höhere Ausgangsströme liefern können, mit denen sich z.B. Leuchtdioden direkt ansteuern lassen. Bei der Ausgabe werden die Daten mit einem Ausgabebefehl in Flipflops oder Register geschrieben und dort bis zum nächsten Befehl festgehalten. Bei der Eingabe liest man normalerweise nur den augenblicklichen Leitungszustand über einen Tristate-Eingabetreiber. Totem-Pole-Ausgänge (Bild 1-28) haben immer ein festes Potential (High oder Low) und lassen sich nicht gleichzeitig als Eingang verwenden. Bei bidirektionalen Anschlüssen kann die Richtung

76

2 Bausteine der

80x86-Familie

8 Ausgänge

8 Eingänge

a. Unidirektionale Eingabe bzw. Ausgabe (totem pole)

Bild 2 - 1 8 : Parallele Ein/Ausgabe mit TTL-Bausteinen

(Eingabe oder Ausgabe) durch eine Programmierung festgelegt oder während des Betriebes geändert werden. Legt man einen Offenen-Kollektor-Ausgang (Bild 1 - 3 1 ) auf High, so kann die Leitung von einem äußeren Sender wahlweise auf High gelassen oder auf Low gelegt werden; der Leitungszustand läßt sich durch einen Eingabetreiber lesen. Bei einem Tristate-Ausgang (Bild 1 - 3 0 ) ist ein zusätzliches Richtungsflipflop erforderlich, um zwischen Ausgabe und Eingabe umzuschalten. Bild 2 - 1 9 zeigt eine Parallelschnittstelle, bei der sich die Richtung der Datenkanäle A, B und C programmieren läßt. Mit dem RESET-Eingang (aktiv High) wird die Schnittstelle in den Grundzustand versetzt, in dem alle Peripherieanschlüsse tristate und damit zunächst als Eingang geschaltet sind. Mit den Adreßeingängen AO und AI lassen sich vier Register auswählen, von denen das Steuerregister zur Programmierung der Betriebsart dient. In PC-Schaltungen wird oft ein 8255A zur Systemsteuerung und für den Lautsprecher verwendet.

2.4 Peripheriebausteine

77

Peripherieanschlüsse

PA7

è

PAO

PC7

A-Port

PCO

PB7

C-Port

+

PBO

B-Port

Parallelschnittstelle 8255A

Steuerregister RESET

CS

1

I

A1

AO

D7

DO

Bild 2 - 1 9 : Der P a r a l l e l s c h n i t t s t e l l e n b a u s t e i n 8255A

Druckeranschlüsse

ü

POE Datenausgabe

Statuseingabe

Steuerausgabe

Daten rückl.

Steuereingabe

Takt Oszillator

Druckersteuerbaustein 82C11 PAI

RST

CS

IOR

IOW

DIR

A1 AO

IRQ

D7

X1 X2 CLK DCLK

DO

Bild 2 - 2 0 : Der D r u c k e r s t e u e r b a u s t e i n 82C11 PAI

In der "Urversion" des PC b e s t a n d die p a r a l l e l e D r u c k e r s c h n i t t s t e l l e aus m e h r e r e n T T L - B a u s t e i n e n , die s p ä t e r durch den in Bild 2 - 2 0 d a r g e s t e l l t e n i n t e g r i e r t e n S t e u e r b a u s t e i n 82C11 PAI ( D r u c k e r a n s c h l u ß s c h a l t u n g ) e r s e t z t wurden. Der Eingang RST (aktiv High) bringt die S t e u e r a u s g ä n g e f ü r den Drucker in einen Anfangszustand. Der Ausgang IRQ (Interrupt a n f o r d e r n ) ist aktiv High und kann zur Auslösung eines I n t e r r u p t s mit dem D r u c k e r s i -

78

2 Bausteine der 80x 86-Familie

gnal ACK (Bestätigung) verwendet werden. Der Ausgang DIR ( R i c h t u n g ) zeigt an, ob der Baustein über den Datenbus mit IOR gelesen oder mit IOW beschrieben wird. Die Adreßbusanschlüsse AO und AI wählen vier R e g i s t e r zur Ausgabe von Daten und Steuersignalen an den Drucker oder zum L e s e n von Druckerstatussignalen aus. Die Anschlüsse X I , X 2 , CLK und DCLK können für die Takterzeugung einer seriellen Datenübertragung verwendet werden. Der Baustein läßt sich nicht nur zum Anschluß eines Druckers, sondern auch als parallele S c h n i t t s t e l l e mit acht Ausgängen, fünf Eingängen und vier b i d i r e k tionalen O f f e n e n - K o l l e k t o r - A u s g ä n g e n für digitale Steuerungen verwenden.

2.4.2 Serielle Schnittstellen

Pegel Umsetzer (Null) - Modem

J

L

SIN

SOUT

Empfänger

Sender I Daten

C

t

t t 1 J I 11

0UT2 OUT 1 RTS DTR

iSteuerung 1 : Status Modemsteuerung

Sende- und Empfangsteil RCLK BAUDOUT XTAL1 XTAL2 Baudratengenerator

Steuerung

DCD RI CTS DCD

Hilfsregister

Freigabe

Status

Status INTRPT

Leitungssteuerung

Interruptsteuerung

S e r i e n s c h n i t t s t e l l e 8250 MR CS2 CS1 CSO

TTT

RESET

ADS DOSTR DISTR

DSSTR

DTSTR

TWRT

A2 AI AO

i

D7

DO

RD

B i l d 2 - 2 1 : Die S e r i e n s c h n i t t s t e l l e 8 2 5 0 ACE

Die s e r i e l l e S c h n i t t s t e l l e 8 2 5 0 ACE (asynchrones D a t e n ü b e r t r a g u n g s e l e m e n t ) dient zur seriellen Datenübertragung nach V . 2 4 ( R S 2 3 2 C ) . Die D a t e n w e r den bitseriell am Ausgang SOUT ausgegeben bzw. am Eingang SIN e m p f a n gen. Acht Anschlüsse sind für die Steuerung eines Modems (Modulator/Demo-

2.4 Peripheriebausteine

79

dulator) vorgesehen. Mit einem High am Eingang MR (Master R e s e t ) wird der Baustein in einen Anfangszustand versetzt. Die Eingänge CSO und CS1 legt man normalerweise auf High, die Eingänge ADS, D1STR und DOSTR auf Low. Der Eingang CS2 (aktiv Low) dient dann in Verbindung mit DISTR (RD) und DOSTR (WR) zum Lesen und Schreiben von acht Registern, die mit AO bis A2 ausgewählt werden. Der Ausgang INTRPT (Interrupt) geht auf aktiv High, wenn ein programmierbares Interruptereignis aufgetreten ist. Das Signal wird erst beim Lesen des Interruptstatusregisters oder bei einem Reset wieder zurückgenommen. Der ähnlich aufgebaute serielle Schnittstellenbaustein 8251A der 80xxx-Familie wird in PC-Schaltungen nicht verwendet.

2.4.3 Timer- und Zählerbausteine

1 I t ClkO GateO OutO

.

I I t C lk 1 Gatel 0ut1

1

I

I I I Clk2 Gate2 0ut2

I

I

Lade/Leseregister

Lade/Leseregister

Lade/Leseregister

Timer 0

Timer 1

Timer 2

Steuerregister

CS

RD

T — r ~ T

WR

|

|

A1 n

AO

I

Timer 8253

D7

DO

1

r

Bild 2 - 2 2 : Der programmierbare Zeitgeberbaustein 8253 (8254)

Der Baustein 8253 (Bild 2 - 2 2 ) enthält drei 16-bit-Aufwärtszähler, die sich als Ereigniszähler für Flanken und als Timer für Zeitverzögerungen sowie für periodische Interrupts (Uhr) verwenden lassen. An die CLK-Anschlüsse wird eine Taktquelle angeschlossen, die sich mit GATE steuern läßt. Die OUTAusgänge zeigen Zählernulldurchgänge an. Der Baustein wird mit dem Steuerregister programmiert. Der Eingang CS dient in Verbindung mit RD und WR zum" Lesen und Schreiben der vier Register, die mit AO und AI ausgewählt werden. Im PC löst der Timer 0 periodisch alle 55 ms einen Uhreninterrupt aus, Timer 1 dient dem Wiederauffrischen dynamischer Speicher über die DMA-Steuerung und Timer 2 steuert den Lautsprecher. Der Baustein 8254 hat bei gleicher Anschlußbelegung erweiterte Funktionen.

80

2 Bausteine der 80x86-Familie

2.4.4 Analoge Peripherie Die Digital/Analogwandler ler

(Analog

Devices,

und Analog/Digitalwandler verschiedener

Maxim,

Bus von Mikrocomputern

Intersil,

Ferranti)

Herstel-

lassen sich leicht

an den

anschließen; die 80xxx-Bausteinfamilie stellt keine

eigenen analogen Peripheriebausteine zur Verfügung. Da die Schwierigkeiten meist auf der analogen Seite liegen, sollte man für genaue Messungen besser auf

fertige

PC-Bus-Karten

zurückgreifen

und auf

die Entwicklung

eigener

Schaltungen verzichten.

Yx WR Bild 2-23: 8-bit-Digital/Analogwandler

Der

in Bild 2-23 dargestellte

ster

an den

( Z N 428)

D/A-Wandler wird wie ein T T L - A u s g a b e r e g i -

Datenbus angeschlossen.

Der

Eingang

E ( f r e i g e b e n ) ist

aktiv

Low und dient zur Übernahme der Daten in ein Eingangsregister. Der Inhalt bleibt

bis zum nächsten Schreibvorgang

werk bewertet

erhalten; er wird mit einem

Netz-

und analog ausgegeben. Für die Freigabe wird normalerweise

ein Auswahlsignal mit dem Peripherieschreibsignal verknüpft. Die Umsetzzeit vom ca.

Einschreiben

eines

digitalen Wertes bis zur analogen Ausgabe

beträgt

1 us. Bei Analog/Digitalwandlern hängt die Umsetzzeit im wesentlichen

vom Umwandlungsverfahren ab. Rampenumsetzer

(Dual

slope)

vergleichen

den analogen Eingang

Sägezahnspannung. Wegen ihrer relativ langen Umsetzzeit im reich

mit

einer

Millisekundenbe-

werden sie vorwiegend zur hochgenauen Erfassung langsamer

Vorgänge

verwendet. Umsetzer

nach

dem Verfahren der schrittweisen Näherung (sukzessive

Ap-

proximation oder Wägeverfahren) vergleichen den analogen Eingang mit dem

81

2.4 Peripheriebausteine

Ausgang eines D/A-Wandlers, bei dem beginnend mit dem werthöchsten Bit jeweils

eine

neue Bitposition bewertet

wird. Ist die Vergleichsspannung

zu

groß, so wird das Bit 0 gesetzt, sonst auf 1 g e l e g t . Bei einem

8-bit-Wandler

sind damit

liegt

8 Vergleichsschritte erforderlich. Die Umsetzzeit

zwischen

2 und 20 us; nach dem Wägeverfahren arbeitende A/D-Wandler eignen sich daher gut für einen direkten Anschluß an den Peripheriebus. Parallelumsetzer ein

erzeugen

8-bit-Umsetzer

für

besteht

Bewertungsschaltung.

Die

jede

also

Stufe

eine

eigene

Vergleichsspannung;

aus 256 Vergleichern

Wandlungszeit

liegt

unter

und einer

1 us; die

digitalen

Schaltungen

können daher auch im DMA betrieben werden. Nachlaufumsetzer stellen f e s t , ob sich die umzusetzende Spannung gegenüber der vorhergehenden Wandlung erhöht oder vermindert hat und liefern die kürzeste

Umsetzzeit.

Darf sich das analoge Eingangssignal während der Wandlungszeit nicht ändern, so

wird

es

in einem

Abtast-Halteglied

(Sample & Hold) festgehalten.

Mit

einem Analogschalter (Multiplexer) lassen sich mehrere analoge Eingänge auf einen Wandlereingang

schalten.

Analogeingang (0 .. 2.55 V)

Analogeingang

DH

i-bit-D/A-Wandler Vrefin

Näherungssteuerung

Näherungssteuerung

ZN 447

AD'~67OL -bit-D/A-Wandler

Vrefout

ir

Tri state-Ausgänge BUSY (EOC)

Start 0 lesen 1

WR(SC) RD(E)

>1 WR

DO

D7

rr

RD

0 1 0 0

unipolar binar bipolar binär unipolar 2er K bipolar 2er K

STATUS

CE CS R/W FORMAT BPO/ÜPÖ D7

Clk Rext

>1 Yx

0 0 1 1

RD WR Yx

AO

DO

DO

D1

Bild 2-24: 8-bit-Analog/Digitalwandler ( Z N 447 und AD 670)

Die in Bild 2-24 dargestellten register

an

den

der

schrittweisen

Näherung

447

beginnt

Wandlung

(WR).

Auf

die eine

A/D-Wandler

werden wie ein

TTL-Eingabe-

Datenbus angeschlossen. Sie arbeiten nach dem mit

Auswertung wird

mit einer Umsetzzeit einem

des Signals

normalerweise

Low-Startimpuls BUSY

Wandlung

angezeigt,

wandelten

Daten nach einer kurzen Wartezeit

Verfahren

von ca. 10 us. Beim (EOC),

am

das

Eingang

das

Ende

verzichtet, und man liest mit

RD

die

ZN SC der ge-

(aktiv Low Z N 447)

bzw. E (aktiv High Z N 427). Die Start- und Lesesignale werden aus einem

82

2 Bausteine der 80x 86-Familie

Freigabesignal und den Peripheriesignalen abgeleitet. Der Wandler AD 670 kann beim Start mit R/W = Low auf verschiedene Betriebsarten eingestellt w e r d e n , die von den Datenbits DO und D l übernommen werden. Das Auslesen erfolgt mit R/W = High.

2.5

Speicherbausteine

Anstelle von Bausteinen der 80xxx-Familie verwendet man meist die a n d e rer H e r s t e l l e r . EPROM- und statische RAM-Bausteine (SRAM) sind vorwiegend byteorganisiert. Festwertspeicher für das Basisbetriebssystem (BIOS) werden zuweilen wortorganisiert und ohne Löschfenster ausgeführt.

+ HPGM

2764

CE —i 0E-

auswählen

Decoder >1 A12 . . . AO

T Adresse CE

t a c c > 250 ns

lesen

•07 . . .

DO

i

i

Adressen ^tce>250

FestwertSpeicherMatrix

stabil I

ns •

/

toe

OE Daten

tzi

JL

Daten

gültig tdf
200 ns

Adressen s t a b i l

Adressen s t a b i l

-

>

tu

1

-

4

Adressen s t a b i l >180 ns

180 ns

i

|

¡/Xt 180 ns

n

WE

> H O ns

1

Daten -

a

»or OE

Daten g ü l t i g ]

Daten g ü l t i g

) f - C

t

ÏZ

> H O ns



•80 ns -



-

• > 200 ns

>100 ns

OE

Funktion schreiben schreiben lesen

Schreibzyklus 0E=High^ Schreibzyklus 0E=Low

> 2 0 0 ns

200 ns

Ausgangstreiber

CS1 WE 0E Û Ô 0 0 0 1 0 1 0 1 1 0 1 X X

lesen

A12

Adresse

6264 FlipflopSpeicherMatrix

auswählen

>1

SE

aus und gibt die

frei.

T" 0

80 ns }Daten g ü l t i g

> -

T

o h

Bild 2-26: L e s e - und Schreibzyklen eines S R A M s (200 ns)

Der

in Bild 2-26 dargestellte

Eingänge

zur

statische

Bausteinfreigabe.

Er

Schreib/Lesespeicher

wird

mit

CS1

Low

6264 hat

von einem

zwei

Decoder

ausgewählt; CS2 liegt meist konstant auf High. Ein Lesezyklus läuft mit CS1 aktiv

L o w und OE

aktiv L o w

wie

bei einem

EPROM

ab; das

Schreibsignal

WE muß beim Lesen konstant inaktiv High sein. Der

Schreibzylus, in dem OE konstant inaktiv High ist, wird vorzugsweise in

80xxx-Systemen

und Schreibsignale

haben.

Die Länge des Schreibimpulses b e t r ä g t mindestens 140 ns, die Daten

verwendet,

müssen

mindestens 80 ns vor klus, in dem

einem

getrennte

Ende der

OE gleichzeitig

die den Bus mit gnal STROBE

dem

die

Lese-

stabil sein. Der

Schreibzy-

mit WE L o w ist, wird in Systemen

Schreibzeit

verwendet,

Richtungssignal

R/W (an W E ) und einem

(CS1 mit ÖE verbunden) steuern.

Timingsi-

3 Schaltungen mit 80x86-Prozessoren Dieses Kapitel zeigt ausgeführte e i n f a c h e Schaltungen mit den Prozessoren 8086 und 8088 unter Verwendung der im Kapitel 2 beschriebenen Bausteine. Die Anschlußbelegungen befinden sich im Anhang. Die beiden 8088-Schaltungen wurden auf Steckplatinen in l ö t f r e i e r Anschlußtechnik a u f g e b a u t , das 8086-System wurde auf einer Doppeleuropakarte gefädelt. Als " B e t r i e b s s y s t e m " diente der im Kapitel 5 beschriebene Monitor. Die Bedienung e r f o l g te mit einem PC, der über eine serielle Schnittstelle mit dem System v e r bunden wurde. Das in Pascal geschriebene Terminalprogramm des PC b e f i n det sich im Anhang.

3.1

Ein einfaches 8088-System

Speicherbereich

Peri pheriebere i ch

2 kbyte EPROM (Monitor)

8250 Serienschnittstelle

8 kbyte RAM (Programme)

74LS244

74LS374

AD 670

ZN 428

Steuerbus

! Adreßbus

Bild 3-1: 8088-Minisystem Blockschaltplan

PC Terminal

digitale Ein/Ausgabe analoge Ein/Ausgabe Datenbus

3.1 Ein einfaches

8088-System

85

Das System dient der Untersuchung von parallelen und analogen S c h n i t t s t e l len, die in dieser Form nicht auf dem PC zu finden sind. Es deckt den B e reich der Mikrocomputertechnik ab, der heute in der Steuerungstechnik von den Mikrocontrollern übernommen wird. Digitale Eingangssignale lassen sich mit Kippschaltern simulieren, digitale Ausgänge werden mit Leuchtdioden angezeigt. Die analogen Schnittstellen sind wegen der Stecktechnik nur b e dingt f ü r orientierende Messungen brauchbar. Mit einem Funktionsgenerator als Signalquelle und einem Oszilloskop lassen sich Probleme der Abtastung analoger Signale untersuchen. Die in Bild 3-1 dargestellte Schaltung verwendet den 8-bit-Prozessor 8088 in der Minimumbetriebsart. Die Speicher- und Peripheriesteuersignale w e r den nicht von einem Bussteuerbaustein, sondern von TTL-Logik erzeugt. Der Prozessortakt von 4 MHz g e s t a t t e t die Verwendung von langsamen und billigen Speicher- und Peripheriebausteinen. Der für den Betrieb erforderliche Monitor befindet sich in einem F e s t w e r t s p e i c h e r . In der Testphase wurde anstelle des EPROMs ein b a t t e r i e g e p u f f e r t e s RAM verwendet. Die serielle Schnittstelle 8250 verbindet die Schaltung mit einem PC als Terminal.

Bild 3-2: 8088-Minisystem

Prozessorsteuerung

Durch den Anschluß von MN/MX an +5V arbeitet der Prozessor in der Minimumbetriebsart. Der Taktsteuerbaustein 8284 liefert bei einem Quarz von 12 MHz den Prozessortakt von 4 MHz, der Bustakt (Takte T1 bis T4) b e t r ä g t

86

S Schaltungen mit 80x86-Prozessoren

1 MHz, die Zugriffszeit auf die Bausteine ca. 500 ns. W a r t e t a k t e mit READY und Hold-Takte mit HOLD sind nicht vorgesehen, die e n t s p r e c h e n den Steuereingänge liegen auf festem inaktivem Potential. Mit einem e n t prellten T a s t e r kann ein NMI-Interrupt ausgelöst werden. Der INTR-Eingang liegt f e s t auf inaktivem Low, da das System keinen Interruptsteuerbaustein e n t h ä l t . Die Speicher- und Peripheriesteuersignale werden von einer T T L Logik erzeugt. Ein Adreßspeicher hält, von ALE g e s t e u e r t , die Adressen A0 bis A7 während des ganzen Buszyklus stabil. Die Adressen A16 bis A19 w e r den in dem System zur Speicheradressierung nicht verwendet; ein Adreßspeicher f ü r diese mit Statussignalen gemultiplexten Leitungen e n t f ä l l t .

B a u s t e i n A d r e s s e A19 A18 M 7 AieKi5lA14 A12 IA12 ft 11A10 RAM 6264 OOOOOH x=0 |x=0 x=0 x=0 x=0 x=0 0 0 0 0 8 kbyte 01FFFH 1 1 1 EPROM 2716 OFF8OOH x=1 K=1 K=1 x=1 x= 1 1 x= 1x=1 0 2 kbyte OFFFFFH 1

X &

T

AS 0 1 0 1

AE 0 1 0 1

A7 A6 A5 A4 A3 A2 A1 AO 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

vpp CE OE

EPROM 2716 OFF8OOH . . . A10

2 kbyte OFFFFFH AO

D7

WE CE OE

RAM 6264 OOOOOH A12

8 kbyte 01FFFH m

D7

DO

DO

frei A19

A14

AI3

MWR MRD

Bild 3-3: 8088-Minisystem

A12 A10

AO

Datenbus

Speicherbereich

Der in Bild 3 - 3 dargestellte Speicherbereich ist teildecodiert; die A d r e ß leitungen A14 bis A19 werden nicht zur Bausteinauswahl verwendet und mit X bezeichnet. Die Speicherauswahlschaltung besteht aus einem einfachen Inverter. Mit A13 = 0 wird ein 8 - k b y t e - R A M ausgewählt. Setzt man die freien Adreßbits X = 0, so liegt der Schreib/Lesespeicher im unteren Adreßbereich von 00000H bis 01FFFH. Die Interruptvektortabelle kann also durch das Betriebssystem bzw. durch Benutzerprogramme geändert werden. Mit A13 = 1 wird ein 2-kbyte-EPROM mit dem Monitorprogramm, einem einfachen Betriebssystem, ausgewählt. Setzt man die freien Adreßbits X = 1, so liegt der F e s t w e r t s p e i c h e r im oberen Adreßbereich von 0FF800H bis OFFFFFH. Auf der R e s e t - S t a r t a d r e s s e 0FFFF0H steht ein unbedingter Sprungbefehl in das eigentliche Monitorprogramm, das ab Adresse 0FF800H beginnt.

3.1 Ein einfaches 8088-System

Ausw. Baustein YÛ Serienschn. 8250 Y1 lesen: 244 Y1 s e h r . : 374 Y2 s e h r . : 428 Y3 AD670 S t a r t Y3 AD670 lesen

c i

RCLK BAUDOUT X1 1.81.32 MHi X2

Adresse 00H 07 H 10H 10H 20H 30H 31H

A19...A8 A7 A61A5 ¡A4 ! A3 A2 A1 iA0 x = 0 0 0 0 Oi x 0 0 | 0 I ! 1 1: 1 x = 0 0 i 0 J 0 ! 11 x X X i X x = 0 0 i 0 0 i 1 i x X Xj X x = 0 0 0 1 ! 0; x X X I X x = 0 0 0 1 1 x X x 0 x = 0 0 0 1 1 x X x 1

SIN SOUT RTS CTS INTRPT

S e r i e n s c h n i t t s t e l l e 8250

MR CS2 CS1 CSO ADS DOSTR DISTR DOSTR DISTR A2 A1 AO

YO

87

IORD

D7

DO

IOWR A2 AI AO

Kippschaltern

Leuchtdioden

—W-CZ3—I

i i i L M _i__i I 74LS374 ÖC

74LS244 DO

D7

D7

DO

ZN 428

>1

>1

>1

I

o »1.28V D +1.28V o9

Y2 IOWR

IORD VI IOWR

RESET IO/M

A7

B

DO

AD 670

A

X

A6 A5 A4

A3

Bild 3 - 4 : 8088-Minisystem

D7

X. J T l •VirVm -ViL-ViH

Y3 Y2 Y1 YO 74LS138 C

F

CÊ CS R/W FOR B/ÏÏ D7

D1 DO,

Y3 DEN AO

Peripheriebereich

Der Peripheriebereich (Bild 3 - 4 ) e n t h ä l t einen seriellen S c h n i t t s t e l l e n b a u stein 8 2 5 0 für den B e t r i e b des Monitors mit einem PC als Terminal sowie zwei digitale und zwei analoge S c h n i t t s t e l l e n . Ein 1 - a u s - 8 - D e c o d e r dient zur Bausteinauswahl. Die S e r i e n s c h n i t t s t e l l e 8 2 5 0 benötigt die Adreßbits AO bis A2 zur Registerauswahl; Adreßbit A3 bleibt mit Rücksicht auf mögliche Erweiterungen f r e i . Der Decoder wählt mit A4, A5 und A6 acht Bausteine aus; vier Ausgänge sind noch frei und können zur Erweiterung des Peripherieb e r e i c h e s verwendet werden. Der Decoder selbst wird mit A7 = 0 und IO/M = 1 (Peripheriezugriffe) f r e i g e g e b e n . Die beiden digitalen Bausteine, ein 8 b i t - A u s g a b e r e g i s t e r und ein 8 - b i t - T r i s t a t e t r e i b e r , liegen auf der gleichen

88

3 Schaltungen mit 80x86-Prozessoren

Adresse und werden durch die Signale IORD (lesen) bzw. IOWR (schreiben) unterschieden. Ein Ausgabebefehl zur Portadresse 10H schreibt Daten in die Ausgabeflipflops, die mit Leuchtdioden angezeigt werden. Ein Eingabebefehl von der Portadresse 10H liest nicht die eingeschriebenen Daten zurück, s o n dern liefert das an den Kippschaltern eingestellte Leitungspotential. Diese beiden Bausteine verhalten sich nicht wie ein RAM, bei dem die auf eine Adresse geschriebenen Daten auch wieder zurückgelesen werden! Die beiden analogen Bausteine werden getrennt adressiert. Der D/A -Wandler liegt auf der Adresse 20H, der A/D-Wandler auf den Adressen 30H und 31H. Die Unterscheidung zwischen "Start der Umwandlung" durch einen Schreibzugriff ( R / W = 0) und "Auslesen der gewandelten Werte" mit einem Lesezugriff (R/W = 1) t r i f f t die Adreßleitung A0. Beim "Start der Umwandlung" können über die Datenleitungen DO und Dl Einstellparameter übergeben werden.

0000 0000 0002 0004 0006 0008 000A OOOC 000E 0010 0012 0014 0016 0018 001A 001C 001E 0020 0022 0024 0026 0028 07F0 07F0 07F1 07F2 07F4 07F6

B0 E6 B0 E6 B0 E6 B0 E6 E4 B0 8A E4 24 74 8A E6 E4 24 74 E4 EB

80 03 18 00 00 01 07 03 00 3E E0 05 20 FA C4 00 05 01 FA 00 EA

90 EA 0000 FF80 38 30 4E 49

; B i l d 3 - 5 : Systemtest nach Reset org OH Anfang des EPROMs s t a r t : mov DLAB = 1 al,80h out Steuerreg i ster 03h,al mov al,18h T e i l e r 4800 Bd out 00h,al Tei1er High mov Tei1er Low al,00h out 01h,al mov al,07h DLAB = 0 2 Stop 8 Daten Steuerregister out 03h,al in al,00h Empfänger leeren mov al,3eh Prompt > loop: mov ah,al Zeichen retten loopl: in al ,05h Status lesen and al,20h 0010 0000 Sender f r e i ? loopl nein: warten jz mov al ,ah Zeichen nach AL out und senden OOh.al loop2: in al ,05h Status lesen and al ,01h 0000 0001 Empf. v o l l ? nein: warten loop2 jz in al ,00h j a : Zeichen abholen loop Schleife jmp ; Ende des 2-kbyte-EPROMs 2716 (0000 .. 07FFH) ORG 07FOH Reset-Einsprung DB 90H NOP-Befehl DB 0EAH Code JMP FAR PTR DW OOOOH I P - R e g i s t e r laden tauscher 80 FT DW 0FF80H ,CS-Register laden 1 38 38 4D 49 DB 8088MINIV0 Kennung 56 30

Bild 3-5: 8088-Minisystem Systemtest mit der Serienschnittstelle

3.1 Ein einfaches

8088-System

89

Bei der Inbetriebnahme einer Schaltung ist es zweckmäßig, zunächst ein e i n faches und erprobtes Testprogramm aus dem EPROM zu starten. Damit l a s sen sich Softwarefehler weitgehend ausschalten. Das in Bild 3-5 dargestellte Testprogramm enthält auf der Reset-Startadresse (OFFFFOH) einen NOPBefehl und dann einen unbedingten Sprungbefehl JMP, der das Codesegmentreg ister (CS) und den Befehlszähler (IP) mit Adressen lädt, die an den Anfang des Testprogramms führen. Der JMP-Befehl springt zum Ziel " s t a r t " auf der physikalischen Speicheradresse 0FF80H:0000H = 0FF800H. Man b e achte, daß bei den als Wortkonstanten abgelegten Adressen 0000H und 0FF80H das High- und das Low-Byte noch vertauscht werden müssen. Im Maschinencode der BIN-Datei erscheint das Wort 0FF80H richtig in der Reihenfolge 80H und OFFH. Das Testprogramm programmiert die Serienschnittstelle 8250 für 4800 Baud, acht Datenbits und zwei Stopbits ohne P a rität. Auf dem angeschlossenen Terminal, das auf die gleichen Übertragungsparameter eingestellt sein muß, erscheint dann als Meldung (Prompt) das Zeichen , I : > ". Alle auf dem Terminal eingegebenen Zeichen werden nun wieder im Echo zurückgeschickt. Bild 3-6 zeigt ein ähnliches Testprogramm für die digitale und analoge Peripherie, das jedoch mit Hilfe des in Kapitel 5 beschriebenen Monitors ab Adresse 0100H geladen und gestartet wurde. Alle an den Kippschaltern eingestellten Bitmuster werden auf den L e u c h t dioden angezeigt; das analoge Eingangssignal wird analog ausgegeben.

= 0010 = 0010 = 0020 = 0030 = 0031 0100 0100 B0 0102 E6 0104 E4 0106 F6 0108 E6 010A E4 010C E6 010E EB

01 30 10 DO 10 31 20 F0

; Bild 3-6: Peripherietest bein equ 10h binäre Eingabe baus equ 10h binäre Ausgabe aaus equ 20h analoge Ausgabe asta equ 30h A/D-Wandler starten ales equ 31h A/D-Wandler lesen org 100H Lade- und Startadresse start: mov al ,01h Format bipolar binär asta,al out A/D-Wandler starten in al,bein Kippschalter lesen not komplementieren al out baus,al Leuchtdioden aus in al ,ales A/D-Wandler lesen out aaus,al D/A-Wandler ausgeben start unendliche Schleife jmp

Bild 3-6: 8088-Minisystem

Peripherietestprogramm

90

3.2

3 Schaltungen mit

80x86-Prozessoren

Ein 8088-System mit PC-Bausteinen

Das vorliegende 8088-System wurde nur für eine Untersuchung von Bausteinen und Betriebsarten des PC entwickelt und stellt keine PC-Schaltung dar. Es enthält jedoch die wichtigsten PC-Peripheriebausteine mit Ausnahme der Floppy-, T a s t a t u r - und Bildschirmsteuerung. Eine serielle Schnittstelle s o wie eine parallele Druckerschnittstelle müssen über den Peripheriebusanschluß hinzugefügt werden. Als "Betriebssystem" wurde wieder der in Kapitel 5 b e schriebene Monitor verwendet; der Einsatz eines BIOS-EPROMs ist in der Schaltung nicht vorgesehen.

Speicherbereich

Peripheriebereich

8 kbyte EPROM (Monitor)

8253 PIT Timer

32 kbyte RAM (Programme)

8259A PIC Interrupt

Peripheriebus für Drucker und 8250 8255A PPI Parallelschn. Adreßbus

Bild 3-7: 8088-System

Blockschaltplan

Der in Bild 3 - 7 dargestellte Blockschaltplan zeigt den Prozessor 8088 in der Maximumbetriebsart mit Arithmetikprozessor 8087 und DMA-Steuerbaustein

3.2 Ein 8088-System

mit

PC-Bausteinen

91

8237A. Der Bussteuerbaustein 8288 erzeugt die Speicher- und Peripherieübertragungssignale und übernimmt die Steuerung der Adreßbusspeicher und des Datenbustreibers. Der Speicherbereich besteht nur aus zwei Bausteinen, e i nem 8-kbyte-EPROM und einem 32-kbyte statischen RAM. Die Peripheriebausteine 8253 (Timer), 8259A (Interruptsteuerung) und 8255A (Parallelschnittstelle) können durch Peripheriekarten ergänzt werden, die sich an einen Peripheriebus anschließen lassen. Bild 3 - 8 zeigt den Prozessor 8088 und seine Verbindung mit dem Arithmetikprozessor 8087 sowie die Bussteuerung.

ose PCLK CLK MRDC MWTC I0RC IOWC

t

!

U 1- I0B CEN — AEN CLK +-

8237A DMA Bild 3-14

8284 Bild 2-13

r

8259A PIC Bild 3-12 52 S1 SO

Adreßbus

TT

NMI INTR SSO A19 /S6

A16 A15 /S3

RQ/GTO CLK READY RESET

8088

Maximumbetrieb

Reset

ä

AO

Jj — 0 ti 0C J r - « J 373 373

DT/R DEN ALE INTA

8288

Bild 3-15

14.3182 MHz

A19

I- IN/MX

RD

1

Bild 3 - 8 : 8088-System

LOCK

T"

D7 Datenbus DO

0C

G

373

B Dir A

245

G

A8 AD7

ADO _TEST RQ/GT1 QSO QS1

1

verbunden mit 8088

I

BHE/S7 S2 S1 SO A19 ADO INT /S6 BUSY R5/GT0 QSO QS1 8087 Arithmetikprozessor CLK READY RESET RQ/GT1

Prozessorsteuerung

Der Taktbaustein 8284 liefert mit einem 14.31818-MHz-Quarz einen Prozessortakt CLK von 4.7227 MHz und einen Peripherietakt PCLK. von 2.28636 MHz. Alle Adressen werden, von ALE gesteuert, in Adreßspeichern f e s t g e halten. Die Beschaltung des Richtungssignals Dir des bidirektionalen D a t e n bustreibers 74LS245 ist von der Einbaulage des Bausteins abhängig. Liegt die A-Anschlußseite am Prozessor und die B-Anschlußseite am Bus, so steuert der 8288-Ausgang DT/R mit Low L e s e - und Interruptzyklen und mit High Schreibzyklen des Prozessors. Die DMA-Steuerung (Bild 3 - 1 4 ) liefert im DMA-Betrieb ein High am AEN-Eingang des Bussteuerbausteins 8288, der daraufhin den gesamten Adreß-, D a t e n - und Steuerbus des Prozessors in den Tristate-Zustand versetzt. Die Interruptsteuerung an den Eingängen NMI und INTR ist in Bild 3 - 1 2 besonders dargestellt. Der Arithmetikprozessor 8087 ist mit Ausnahme der eingezeichneten Verbindungen parallel mit den e n t sprechenden Prozessoranschlüssen verbunden.

92

3 Schaltungen mit 80x86-Prozessoren

Baustein RAM 62256 32 kbyte EPROM 2764 8 kbyte

n

1

Adresse AIS A18 M7l A16 M5 A14 A13 A12!A11Aid OOOOOH 0 0 0 0 0 0 0 0 0 0 07FFFH 1 1 1 1 1 OFEOOOH 1 1 1 1 1 1 1 0 0 0 OFFFFFH 1 1 1

1—I—T^

A 1 9 A 1 8 A17 A16 A15

Bild 3 - 9 : 8 0 8 8 - S y s t e m

A9 0 1 0 1

A£ 0 1 0 1

A7 0 1 0 1

A6 0 1 0 1

1

MWTC MRDC

A14 A 1 2

AO

A5 0 1 0 1

A4 0 1 0 1

A3 0 1 0 1

A2 0 1 0 1

A1 0 1 0 1

AO 0 1 0 1

1

Datenbus

Speicheradressierung

Mit Rücksicht auf die V e r s u c h s - und Übungsaufgaben des Systems wurde der S p e i c h e r b e r e i c h (Bild 3 - 9 ) nur minimal ausgebaut, jedoch volldecodiert, um später über den Busanschluß weitere Speicherbausteine hinzufügen zu können. Da der Schreib/Lesespeicher ( V e k t o r t a b e l l e ) im unteren und der F e s t w e r t s p e i cher ( M o n i t o r - S t a r t a d r e s s e ) im oberen Adreßbereich liegen müssen, verwendet die Schaltung keinen Decoder, sondern gibt jeden Baustein mit einer l o g i schen Verknüpfung der nicht an den Baustein angeschlossenen Adreßleitungen frei. Das Timing übernehmen die Steuersignale MRDC (lesen) und MWTC (schreiben), die beim Prozessorzugriff vom Bussteuerbaustein 8 2 8 8 , im D M A - B e t r i e b vom DMA-Steuerbaustein 8 2 3 7 A g e l i e f e r t werden. Die in Bild 3 - 1 0 dargestellten internen Systemperipheriebausteine befinden sich auch beim PC auf der Hauptplatine (Motherboard), ihre Adressen e n t sprechen den im PC üblichen. Die Bausteinauswahl übernimmt ein l - a u s - 8 Decoder. Der Adreßbereich der Peripheriebefehle reicht von AO bis A15 und wird ohne Segmentierung durchgeführt; A16 bis A19 sind immer 0 . Wie auch beim PC üblich, werden sowohl der innere (Bild 3 - 1 0 ) als auch der äußere P e ripheriebereich (Bild 3 - 1 1 ) nur t e i l d e c o d i e r t . Das Timing der S y s t e m b a u steine ( 8 2 3 7 A , 8 2 5 9 A , 8253 und 8 2 5 5 A ) übernehmen die Steuersignale IORC (lesen) und IOWC ( s c h r e i b e n ) direkt an den B a u s t e i n e n . Für die T T L - S c h a l tungen 7 4 L S 6 7 0 ( D M A - S e i t e n r e g i s t e r ) und 7 4 L S 7 4 (NMI-Flipflop) ist eine zusätzliche Verknüpfung des Auswahlsignals mit dem Timingsignal IOWC e r forderlich. Bei einem DMA-Zugriff ist die g e s a m t e innere Peripherie von

3.2 Ein 8088-System mit PC-Bausteinen

Baustein Adresse 8237A 000H DMA OOFH 8259A 020H PIC 021H 8253 040H Timer 043H 8255A 060H PPI 063H 74670 080H Seitenr. 083H NMI-FF OAOH frei OCOH frei ÖEÖH intern 100H frei 1FFH

A11|M0 A9 A8 A7 A6 A5 A4 A3 A2 X X 0 0 0 0 0 X 0 0 1 1 X X 0 0 0 0 1 X X X I X x ! Oi 0 Ol 1 0 xi xj X | j i X x !i oii 0 0! 1 1 x; xi x ! ! i X x Oi 0 1! 0 0 X! X X I X X | Ol 0 1! 0 1 X X X X X 0! 0 1: 1 0 Xl X Xl X : X Ol 0 1 1 1 X! x l XI X X 0 1 0 0 0 0 Oj 0 X X 0 1 1 1 1 1 1| 1

Bild 3 - 1 0 : 8 0 8 8 - S y s t e m interne

93

A1 AO 0 0 1 1 X 0 1 0 0 1 1 0! 0 11 1 oi 0 1! 1 xi

X

X

X

X

0 1

X

n i

Systemperipherie

000H bis OFFH durch DEN = Low g e s p e r r t . D e r A d r e ß b e r e i c h von 0 1 0 0 H bis 0 1 F F H wird bei einigen S y s t e m e n dem inneren, bei anderen dem äußeren r i p h e r i e b e r e i c h z u g e r e c h n e t ; er bleibt in der vorliegenden Schaltung

Pe-

frei.

Bild 3 - 1 1 zeigt zunächst die bei P C - S y s t e m e n üblichen Adressen der äußeren P e r i p h e r i e s c h a l t u n g e n , die sich auf zusätzlichen S t e c k k a r t e n befinden und die über S t e c k l e i s t e n ( S l o t s ) an den Peripheriebus angeschlossen werden. B e i den Karten

lassen sich die

Adressen

Das vorliegende

meisten

Versuchssystem

ist auf

mit eine

Brücken ( J u m p e r n )

einstellen.

serielle Verbindung

mit einem

PC als T e r m i n a l angewiesen. D a s Bild 3 - 1 1 zeigt ähnlich wie Bild 1 - 3 9

eine

94

3 Schaltungen mit 80x86-Prozessoren

Bild 3-11: 8088-System externe Systemperipherie

Schaltung, die eine Serienschnittstelle 8250 und eine Paralleldruckerschnittstelle 82C11 e n t h ä l t . Mit einer Brücke wird die Kartenadresse zwischen C O M l / L P T l und COM2/LPT2 umgeschaltet. Dies gilt auch für die I n t e r r u p t ausgänge, die über den Bus auf den Interruptsteuerbaustein 8259A führen.

95

3.2 Ein 8088-System mit PC-Bausteinen

Bild 3-12: 8088-System

Interruptsteuerung

Tei 1er 2:1

IRO 8259A

i 7474 -

8237A DREQO

1 . 1 9 3 1 8 MHz

~~TT

o-

t

2 . 3 8 6 3 6 MHz

l PCLK Takt 8284 Quarz 1 4 . 3 1 8 2 MHz

C 1k|Gate|Out Timer 0

Olk Gate|0ut Timer 1 Timer 8253

C lk|Gate|0ut

PC5

Timer 2

PBO PB1

PB7 NMI-FF

8255A C-Port .;: Schalter

A-Port Tastatur

Bild 3-13: 8088-System T i m e r - und Lautsprechersteuerung

Die in Bild 3-12 dargestellte Interruptsteuerung besteht aus dem I n t e r r u p t steuerbaustein 8259A für den prozessorintern maskierbaren INTR-Eingang und aus einem Freigabeflipflop für den nicht maskierbaren NMI-Interrupt, der

96

3 Schaltungen mit 80x86-Prozessoren

damit ebenfalls sperrbar gemacht wird. In dem vorliegenden System kann ein NMI-Interrupt e n t w e d e r durch eine entprellte Taste oder durch den Arithmetikprozessor 8087 bei einer Fehlerbedingung (z.B. Uberlauf) ausgelöst werden. Der PC verwendet den NMI-Interrupt bei Systemfehlern wie z.B. Paritätsfehler der Speicherbausteine oder bei einer zeitlichen Blockierung der Steuerung. Der IRQO-Eingang des 8259A hat die höchste Priorität und wird wie beim PC zur Auslösung eines Timerinterrupts verwendet, der einen i n t e r nen Uhrenzähler erhöht. Bild 3-13 zeigt den Timer 8253 zusammen mit der Parallelschnittstelle 8255A. Der Takt für alle drei Timer wird über einen 2:1-Teiler aus dem Bustakt PCLK gewonnen. Timer 0 kann wie beim PC so programmiert w e r den, daß er periodisch alle 55 ms einen Interrupt auslöst. Timer 1 wird im PC f ü r das Wiederauffrischen der dynamischen Speicher über die D M A - S t e u erung verwendet, Timer 2 steuert zusammen mit der Parallelschnittstelle 8255A den Lautsprecher. Die restlichen Anschlüsse der 8255A dienen im PC zur Einstellung von Konfigurationsdaten an Schaltern (Mäuseklavier) und b e dienen die T a s t a t u r ; sie werden in diesem System nicht verwendet. Prozessor

-

Zugriff

Bild 3-14: 8088-System

DMA

-

Zugriff

DMA-Steuerung

Die in Bild 3 - 1 4 dargestellte DMA-Steuerung besteht aus einem DMASteuerbaustein 8237A, einem Adreßspeicher und einem zusätzlichen S e i t e n r e gister 74ALS670, da der 8237A auf die 8-bit-Mikroprozessoren 8080 und

3.3 Der Entwurf eines

8086-Systems

97

8085 abgestimmt ist, die nur einen 16-bit-Adreßbus haben. Bei einer DMAAnforderung durch eine Schaltung (z.B. Timer 1) über einen DREQ-Eingang legt der Steuerbaustein den Ausgang AEN auf aktiv High und sperrt damit über den Bussteuerbaustein 8288 den Adreß-, Daten- und Steuerbus des Prozessors. Dann werden die Adreß- und Steuerausgänge des 8237A aktiv und g e ben die vorher programmierte Adresse für den direkten Speicherzugriff aus. Die bei Peripheriezugriffen erforderlichen Peripherieadressen muß die a n f o r dernde Schaltung selber bereitstellen. Ein besonderes Problem ist die Anpassung der Signale HRQ (anfordern) und HLDA (bestätigen) an den Maximumbetrieb des 8088. Sie werden im Minimumbetrieb direkt mit den Anschlüssen HOLD und HLDA des Prozessors verbunden und müssen in der Maximumbetriebsart auf den RQ/GTx-Ablauf (Bild 2 - 8 ) umgesetzt werden. Bild 3-15 zeigt einen Schaltungsvorschlag; der Hersteller INTEL v e r ö f f e n t licht in dem Datenbuch "Microprocessor and Peripheral Handbook Volume I Microprocessor" eine ähnliche Schaltung.

Bild 3-15: 8088-System Anpassung 8237A - 8088 (Maximumbetrieb)

3.3

Der Entwurf eines 8086-Systems

Die in Bild 3-16 dargestellte Schaltung mit dem 16-bit-Prozessor 8086 zeigt die besonderen Probleme, die bei 16-bit- und auch 32-bit-Systemen entstehen. Sie wurde in Fädeltechnik auf einer Doppeleuropakarte aufgebaut und kann wahlweise im Minimum- oder im Maximumbetrieb arbeiten. In der Grundversion enthält die Schaltung zwei parallele Festwertspeicher 2716 mit einem Monitor als Betriebssystem und zwei parallele Schreib/Lesespeicher 6116. Man beachte, daß bei einem 16-bit-Datenbus immer zwei 8 - b i t - S p e i -

98

3 Schaltungen mit 80x86-Prozessoren

Speicherbausteine ungerade Adressen

Peripheriebausteine

gerade Adressen

gerade Adressen

[ ! i Y ~ ~ r

r

RAM 6264 (6116)

SpeicherAdreßDekoder

i

Analogperipherie 12-B it-D/A-Wand1er 12-Bit-A/D-Wandler

EPROM 2764 (2716)

RAM 6264 (6116)

SerienSchnittstelle 8251A

EPROM 2764 (2716)

ParallelSchnittstelle 8255

PeripherieAdreßDekoder

D8 D7

Mikroprozessor

8086

Arithmetikprozessor 8087

Bild 3 - 1 6 : 8 0 8 6 - S y s t e m

Blockschaltplan

cherbausteine parallel geschaltet werden müssen, um Wortzugriffe ausführen zu können. B e i Verwendung von 8 - k b y t e - S p e i c h e r b a u s t e i n e n und durch vier f r e i e , aber b e r e i t s decodierte Sockel läßt sich das System auf insgesamt 64 kbyte Speicher ausbauen. Eine S e r i e n s c h n i t t s t e l l e 8251A dient zum Anschluß eines PC als Bedienungsterminal. Mit einer P a r a l l e l s c h n i t t s t e l l e 8 2 5 5 lassen sich Daten über die Druckerschnittstelle des PC in das System laden. Dies könnte auch über die Serienschnittstelle e r f o l g e n . Diese 8 - b i t - P e r i p h e r i e wurde später durch zwei 12-bit-Analogperipheriebausteine ergänzt, die wortweise adressiert werden. Bild 3 - 1 7 zeigt die Speicherauswahlschaltung und den Speicheradreßplan.

3.3 Der Entwurf eines 8086-Systems

Baust. 6116 2x2K RAM 6116 2x2K RAM 6116 2x2K RAM 2716 2x2K EPROM

Adresse A19 A18 A I 7 A16 A15 A14 A1 ^A1 0 0000 X=GX=C x = o x = o X=0 X=0 0 0 0 OFFF 0 1000 X=C X = x0= o x = o X = X 0 = 00 1 0 1 FFF 0 2000 X =X 0 = x0= o x = o * = 0X=0 1 0 0 2FFF F FOOO 1 K = 1X = 11 1 X =X 1 =X 1 = X=1 F FFFF

6264 2x8K RAM 6264 2x8K RAM 6264 2x8K RAM 2764 2x8K EPROM

0 0000 0 3FFF 0 4000 0 7FFF 0 6000 0 BFFF F COOO F FFFF

A1 1

0

X = x0= o x = o x = o 0

1

X=0 x = o x = o x = o 1 0 X =X1 = X 1 =X1 = 11

Vpp OE CE A1 0.

WE OE CE A1 0

X=0 x = o x = o x = o 0

1

A1 1A1 0 A9 A8 A7 A6 A5 A4 A3 A2 A1 AO/BHE 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 Q 0 Ö 0 0 0 0 0 0 0 0

1 0

1 1 1 0 0 0

1 0

1 1 0 0

1 0

1

1

1

1

1

1

1

i

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

1 1 0 0

1 0

1 1 0 0

1 1 1 1 1 1 0 ö ö 0 0 0

1 1 0 0

1 0

1 1 1 0 0 0

1 1 0 0

1 1 0 0

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

1 0

1 1 0 0

1 0

1 1 ö 0

1 0

1 0

1 0

1 0

1 0

1 0

1 1 0 0

1 0

1

1

1

1

1

1

1

1

1

1

1

1

0

1

WE OE CE A1 0

6116 DO

D15

08

AI

A1 1

1 _ Y3 Y2 Y1 YO ! Y3 Y2 Y1 YO 74LS155 2 x 1 -aus-4-Dekoder B A 8 BHE

Bild 3 - 1 7 : 8 0 8 6 - S y s t e m

1

Vpp OE EPROM 2716 CE A1 0. AO D7 . . . .DO

AO D7. . .DO

AO D7

1 1 1 1 1 1 1 1 0 0 0 Ö 0 0 0 0

1 1 1 1 1 1 1 1. i 0 0 0 0 0 0 0 0 0

EPROM 2716

RAH

99

e 2

NA

AI 5 A13

A14 A12

Speicheradressierung

RAM 6 1 1 6 AO D7

DO

D7

DO

A1

AI 1/WE 8

4 AO A12

Kl WE

(23)

100

3 Schaltungen mit 80x86-Prozessoren

Die Auswahl der Speicherbausteine übernehmen zwei l - a u s - 4 - D e c o d e r mit gemeinsamen Auswahleingängen A und B. Der eine wird mit AO (BLE) f r e i gegeben und adressiert die am unteren Datenbus DO bis D7 liegenden Baus t e i n e . Der andere Decoder wird mit BHE freigegeben und wählt die am oberen Datenbus D8 bis D15 liegenden Speicherbausteine aus. Die U m s c h a l tung zwischen den 2 - k b y t e - und den 8 - k b y t e - B a u s t e i n e n geschieht über drei Brücken (Jumper). Beide Schaltungsvarianten sind teildecodiert. Man b e a c h t e , daß AO keine Adreßleitung, sondern ein Freigabesignal BLE für den u n t e r e n Datenbus ist. Im oberen Adreßbereich auf den Byteadressen von 0FF000H bis OFFFFFH liegen die beiden Festwertspeicher (EPROMs 2716) mit dem Monitor für den B e t r i e b des Systems. Dort ist auch die R e s e t - S t a r t a d r e s s e OFFFFOH mit dem Code des ersten Befehls. In dem unteren Adreßbereich von 00000H bis OOFFFH liegen die beiden Schreib/Lesespeicher (RAMs 6116) mit der I n t e r ruptvektortabelle. Die RAM-Bausteine nehmen auch die T e s t p r o g r a m m e des Kapitels 4 "Maschinenorientiere Programmierung" auf, die mit Hilfe des Monitors geladen, g e s t a r t e t und g e t e s t e t werden. Bild 3-18 zeigt die P e r i pherieadressierung, die jedoch nicht in PC-Schaltungen verwendet wird! Die vier Analogbausteine sind 12-bit-Wandler und werden an die D a t e n b u s anschlüsse DO bis D i l angeschlossen; D12 bis D15 bleiben frei und werden beim Lesen nicht a u s g e w e r t e t . Bei Wortzugriffen auf eine gerade Adresse sind AO (BLE) und BHE beide Low (Tabelle Bild 2-11); dies ist die Auswahlbedingung f ü r die linke D e c o d e r h ä l f t e zur Freigabe der 1 6 - b i t - A n a l o g p e ripherie. Ein Beispiel ist der Befehl IN AX,64H, der das 1 6 - b i t - R e g i s t e r AX mit dem gewandelten 12-bit-Wert des A/D-Wandlers 2 lädt. Die r e c h t e Decoderhälte gibt die digitale Byteperipherie frei, die nur an den u n t e r e n Datenbus DO bis D7 angeschlossen ist. Bei einem Bytezugriff auf eine gerade Byteadesse sind AO (BLE) Low und BHE High; dies ist die Auswahlbedingung für den rechten Decoder zur Freigabe der 8 - b i t - D i g i t a l peripherie. Ein Beispiel ist der Befehl IN AL,20H, der den A-Port der Parallelschnittstelle in das 8 - b i t - R e g i s t e r AL lädt. Durch die Decoderfreigabe mit AO (BHE) sind die Adressen der 8 - b i t - R e gister in Zweierschritten angeordnet. In PC-Schaltungen verwendet man j e doch auch bei den 16-bit- und 32-bit-Prozessoren die in den Bilder 3-10 und 3 - 1 1 dargestellten Schaltungen, bei denen AO (und AI) als normale Adreßleitungen direkt an die Bausteine gelegt werden und nicht zur D e c o d e r f r e i g a b e dienen. Bei diesen Schaltungen sind die Adressen der Register in Einerschritten angeordnet. Die in Bild 3-19 dargestellte Schaltung ermöglicht eine einfache U m s c h a l tung der Betriebsart (Minimum/Maximum) über Brücken. Im Maximumbetrieb l i e f e r t der Bussteuerbaustein 8288 die L e s e - und Schreibsignale f ü r Speicher und Peripherie. Im Minimumbetrieb werden die Signale mit Logikbausteinen

3.3 Der Entwurf

Baust. Adr. BHE A0 825IA 8255

00

A15 A14

A13 A12 All A10 A9

A8

0

02 20

A6

X=0 0

0

26

A7

eines 8086-Systems

A5 A4

A3

A2 A1 AO

0 X=0 x=o X=0

X=0 0

X=0 X=0

101

0 1

0

0

1

1

0 0

frei

1

0

frei

1

t

X=0 0

0

X=0

X=0 X=0 x=o

0

0

1

X=0

x=o x=o x=o

0

D/A t

00

0

D/A 2

20

0 0

X=0

Start A/D 1 Lesen Start A/D 2 Lesen

40

0

X=0

0 x=o x=o

X=0

x=o x=o

44 60 64

0

0

Hortperipherie (Analogbausteine)

Bild 3-18: 8086-System

Peripherieadressierung

Byteperipherie (Digitalbausteine)

0

0

1

0

0

0

1

0

0 0

102

3 Schaltungen mit 80x86-Prozessoren

Speicher

Peripherie

MOE

"PRD

MWE

^

"PWD

Adreßspeicher

ALE

AA A A A

MIN

6 +5 V GND

MRDC MWTC IORD IOWC ALE AEN IOB 8288 CEN Bussteuerbaustein

SO

S1

S2_ (M/IO)

LOCK (WR)

>/1

QSO (ALE)

>1

MN/MX

RD 4

i

Takt _8284 RES RDY| I !

CLK RESET READY

¿RQ/GTO (HOLD)'

Mikroprozessor 8086

NMI

Bild 3-19: 8086-System Umschaltung der

Steuersignale

aus den Prozessorsignalen a b g e l e i t e t . Der Prozessoranschluß Stift 31 muß bei einem

Wechsel

mumbetrieb trotz

des

der

liegt

internen

Betriebsart hier

ebenfalls

umgeschaltet

bidirektionale

das

Widerstandes

auf

werden.

Busvergabesignal

inaktives

High

gelegt

Im

Maxi-

RQ/GTO, wird. Im

das Mini-

mumbetrieb hat der Anschluß die Funktion eines HOLD-Eingangs und muß auf inaktives L o w umgeschaltet Hold-Zustand übergehen Das

werden, da der Prozessor sonst in dem

inaktiven

würde.

in Bild 3 - 2 0 dargestellte

Testprogramm

Befehlslisten des Anhangs übersetzt

und dient

wurde

mit

den

dazu, bei der

hexadezimalen Inbetriebnahme

der Schaltung die Funktion der seriellen Schnittstelle zu überprüfen.

Anstel-

le des Bausteins 8250 des 8088-Systems (Programm Bild 3 - 5 ) wird die ähnlich

aufgebaute

Serienschnittstelle

8251A

verwendet.

Durch ein

Reset

des

Prozessors wird der Befehlszähler IP mit 0000H und das C o d e s e g m e n t r e g i s t e r CS

mit

OFFFFOH

OFFFFH +

0000H

geladen.

Dies

= OFFFFOH,

ergibt von

der

die

physikalische

sich der

Prozessor

Speicheradresse den Code

des

3.3 Der Entwurf eines 8086-Systems

103

e r s t e n Befehls holt. Auf den NOP-Befehl (tu nix) folgt ein unbedingter Intersegmentsprung, der das Codesegmentregister auf 0F000H und den Befehlszähler ebenfalls auf 0F000H setzt. Damit liegt die Startadresse des Schnittstellenprogramms bei 0F0000H + 0F000H = 0FF000H, dem Anfang des EPROM-Bereiches (2x2716). Das Programm stellt die Betriebsart der Serienschnittstelle ein und schickt das Zeichen * an das Bedienungsterminal (PC). Anschließend werden in einer Schleife alle ankommenden Zeichen im Echo wieder zurückgeschickt. Bei der Programmierung der beiden EPROMs ist darauf zu achten, daß der am unteren Datenbus liegende Baustein alle Bytes mit gerader Adresse und der am oberen Datenbus liegende Baustein alle Bytes ungerader Adresse a u f n i m m t . Ze i U Ad resse

Name

Inhalt

0

Befeh 1 Operand ORG,

1

F FOOO BO

Ct

2

F F001 e t

02

OUT

1

F FOO* 13.0

/S

NOV

4

F F008 E t

ox

5

F FDOF)

6

F FOOC. F. 4

ox

7

F FOOe

0^

3

F RHO

3

9 0 1

^ LOOP

MOV

FOOoH

01H ft L i

000 -f o-to-f 05 H ftL

HOV

ftH aflH

IN

2151

Al;OCtW /I-IOO -WO

OUT

Mb

-t

ftL OJH M,0-IW

te

LOOP

* S+OIjjlä 1 000 0 OOOH

F FO-tl lb

cu

MOV

RL.ftH

F FD-IH e t

oo

OUT

00 H fV L OLwiUrf»

F FD -(t 54-

01

2

F RH& J2M

3 4

F RH A T 4 F-F(HC t 4

00

5

F fO'le 8 R

eo

6

STRRT

OF

Berne rkung

LOOM

Ol FR

S+oJüj-b 1

ftU.OiM

0000 oo-to

ift

LooM

Xiui^i

IN

M,OOW

JlxxAm

Kov

A W.AL

tUm

^MP

LOOP

Mob -t

-Ji

F fO^O Eh

RL.O^H

IN)

ScSkU^e

7 8 9 F F FF 0 0 F FFF-I ER 1 F" FF F 4 0 0 2

OR(y

OP p f f o h

MOP 00

FO

>3ttP

f OOO: FOOO VTftRT

FO E Mi

Bild 3-20: 8086-System Testprogramm nach Reset

4 Einführung in die maschinenorientierte Programmierung Dieses Kapitel behandelt die Befehle der Prozessoren 8086/8088, die Grundbefehlssatz auch bei den Nachfolgern vorhanden sind.

4.1

als

Hardwarevoraussetzungen

Personal Computer

Bild 4 - 1 : Der Aufbau der Hardware

Als Hardware der T e s t - und Übungsprogramme kann eine der in Kapitel 3 vorgestellten Schaltungen (Bild 4-1) dienen. Die Programmbeispiele sind j e doch weitgehend hardwareunabhängig gehalten und sollen nur die wesentlichen Grundzüge der maschinenorientierten Programmierung zeigen, sowie den R e g i s t e r - und Befehlssatz der 80x86-Prozessoren vorstellen.

4.2 Die Entwicklung

4.2

von

Assemblerprogrammen

105

Die Entwicklung von Assemblerprogrammen B>EDLIN TEST.ASM Neue Datei *I Ii * PAGE 255,132 2s *; EINFUEHRENDES BEISPIEL 3: * !6:

*E

*

27:

B>MASM TEST,,,) The Microsof TTTacro Assembler Version 1.07, Copyright (C) Microsoft Inc. 1981,82 Warning Severe Errors Errors 0 0 B>LINK TEST,,; Microsoft Object Linker VI.10 (C) Copyright 1981 by Microsoft Inc. Warning: No STACK segment There was 1 error detected. B>EXE2BIN TEST B>DEBUG SEND.BIN -N TEST.BIN -L 1000 -5=104 tttt***tt**t*»******t*t**tt******tt*t Programm normal beendet

Bild 4-2:

Eingeben und Übersetzen mit Hilfe d e s Betriebssystems

Bild 4 - 2 zeigt die Arbeit mit dem Betriebssystem MS-DOS (Micro Soft Disk Operating System) an dem als Entwicklungsrechner verwendeten Personal Computer. MS-DOS wird vorzugsweise f ü r Personal Computer mit Prozessoren der 8086-Familie verwendet. Das Kommando EDLIN ruft den Editor zur Eingabe d e s symbolischen Assemblerprogramms a u f . Es wird unter dem Namen TEST.ASM auf einer Diskette des Systems a b g e l e g t . Bild 4 - 5 zeigt d a s vollständige Programm. Das Kommando MASM ruft den Assembler zur Übersetzung des symbolischen Programms a u f . Es enstehen eine Übersetzungsliste (Bild 4 - 6 ) und ein binäres Maschinenprogramm, das jedoch noch nicht ablauffähig ist.

1 06

4 Einführung in die maschinenorientierte Programmierung

Das Kommando

LINK

ruft ein Bindeprogramm auf, das bei einigen Befehlen

eine Umadressierung vornimmt und gegebenenfalls die Verbindung zu externen Unterprogrammen und zum Betriebssystem h e r s t e l l t . Das Kommando

EXE2BIN

wandelt das umadressierte Maschinenprogramm zu

einem ladbaren binären Programm um. Das Kommando deprogramm

DEBUG

lädt ein T e s t h i l f e p r o g r a m m und g l e i c h z e i t i g das Sen-

SEND.BIN, das zur Übertragung des binären Maschinenprogramms

an den Übungsrechner dient. Die Unterkommandos - N und - L laden das zu übert r a g e n e Programm TEST.BIN ab Adresse 1000H. Das Unterkommando - G s t a r t e t das Sendeprogramm, das nach der Übertragung eines Bytes j e w e i l s einen Stern zur K o n t r o l l e ausgibt.

*>L0 NMI vor Adresse FC00:01FB *>DU DUMP:

Anfangsadresse: ' 0ffset>100 Endadresse: 0ffset>12F 0 B0 02 E6

0080:0100 0080:0110 0080:0120

1 2A A8 00

*>GQ Startadresse:

2 3| 4 E8 13 00 02 7VTI C3 CD 10

5 6| E8 07 00 E4 13ÜT3 90 90 90

7 8 9 A B C D E 3C 2A 75 F6 EB 15 90 50 E4 02 A8 01 74 FA 90 90 90 90 90 90 90

F E4 58 90

0123456789ABCDEF .* 100

* DAS IST EIN TEST DES EINFÜHRENDEN BEISPIELS "•Programm in Adresse 0080:0123 normal beendet!*** *>

Bild 4-3:

Laden und Testen mit H i l f e des Monitors

Bild 4-3 z e i g t die A r b e i t am Bedienungsterminal des Übungssystems. Das K o m mando

LO

Adresse

0100H

startet das Empfangsprogramm, das die empfangenen Bytes ab im

Arbeitsspeicher

ablegt

und zur K o n t r o l l e binär auf

den

Leuchtdioden ausgibt. Das Programm wurde mit der S T O P - T a s t e abgebrochen. Das Kommando

DU

gibt das empfangene Programm zur K o n t r o l l e auf dem

Bildschirm des Bedienungsterminals aus. Auf einer Z e i l e erscheinen 16 Bytes hexadezimal und dann nochmals als ASCII-Zeichen. Das Kommando

GO

s t a r t e t das Testprogramm ab Adresse 0100H. Es liest

Zeichen von der Tastatur und gibt sie auf dem Bildschirm aus. Nach Eingabe eines Sterns kehrt das Programm in den Monitor zurück.

4.2 Die Entwicklung

Zeichen

*

ausgeben

von

Assemblerprogrammen

107

Q START ^ * laden

Zeichen lesen

h — AUSZ

Zeichen ausgeben bis Endeniarke *

EINZ

Rücksprung nach Monitor /

*X

nein

I ja Q

Bild 4-4:

Struktur und Ablauf des einführendes Beispiels Ii 2s 3: 4: 5f 6: 7: 8: 9i 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22 s 23: 24: 25: 26: 27: 28: 29: 30:

Bild 4-5:

MONITOR^)

PÄSE : EINFÜHRENDES PRD6 SEGMENT ASSUME ORG START: MOV CALL LOOP: CALL CMP JNZ J MP

;

255,132 BEISPIEL CS:PROG, 100H AL,'*' AUSZ EINZ AL,'*' LOOP MONI

; PROGRAMMSEGMENT DS:PROG,ES:PROG,SS:PROS ; ADRESSZAEHLER ; EINGABEMARKE ; ZEICHEN AUS AL AUSGEBEN ; ZEICHEN NACH AL LESEN ; ENDEZEICHEN ? ; NEIN: AUSGEBEN ; JA: R U E C K K E H R M O N I T O R

: S Y S T E M U N T E R P R O G R A M M E ( F E H L E N IN B E I S P I E L E N EINZ: AL,02H ; STATUS SCHNITTSTELLE IN TEST AL, 2 ; ZEICHEN EMPFANGEN ? ; NEIN: WARTEN JZ EINZ IN AL,OOH ; JA: L E S E N RET ; RUECKSPRUNG AX ; AX M I T Z E I C H E N R E T T E N AUSZ: PUSH AUSZ1: IN AL,02H ; STATUS SCHNITTSTELLE TEST AL, 1 ; SENDER FREI ? ; NEIN: WARTEN JZ AUSZ 1 POP AX ; JA: Z E I C H E N Z U R U E C K ; ZEICHEN SENDEN OUT 00H,AL RET ; RUECKSPRUNG MONI: ; M S - D O S : INT 2 0 H INT 10H i : ABSCHLUSS DES PROGRAMMRAHMENS ; ENDE DES SEGMENTES PROG ENDS Ï ENDE DES PROGRAMMS END START

Assemblerprogramm des einführenden Beispiels

Bild 4 - 4 zeigt die Struktur und den Ablauf des Testprogramms. Es meldet sich mit einem Stern als Eingabemarke und liest dann bis zu einer Endemarke, die ebenfalls als Stern vereinbart wurde, Zeichen von der Tastatur und gibt sie auf dem Bildschirm aus. Bild 4 - 5 zeigt das Assemblerprogramm, so wie es mit dem Editor eingegeben wurde.

108

4 Einßhrung in die maschinenorientierte

Programmierung

Die Zeilen 1 bis 5 und 27 bis 30 sind Anweisungen an den Übersetzer (Assembler) und bilden den " R a h m e n " des Programms, der im Bild 4 - 8 noch ausführlich erklärt wird. Alle mit einem Semikolon ";" beginnenden Zeilen sind K o m m e n tarzeilen und werden bei der Übersetzung nicht b e a c h t e t . Die Zeilen 6 bis 11 zeigen die Verarbeitungsschleife. Die Unterprogramme AUSZ und EINZ dienen zur Ausgabe und Eingabe von Zeichen über das Bedienungsterminal. Wird kein Endezeichen "*" eingegeben, so f ä h r t das Programm in der Schleife f o r t , anderenfalls springt es zurück in den Monitor, mit dem es auch g e s t a r t e t wurde. Das vorliegende Beispielprogramm kann in jedem Rechner a r b e i t e n , das entsprechende Systemunterprogramme für die Zeichenübertragung zur Verfügung stellt. Die Zeilen 13 bis 26 zeigen die h a r d w a r e - und systemabhängigen U n t e r p r o g r a m me f ü r die Zeichenübertragung und den Rücksprung in den Monitor bzw. in das Betriebssystem. Sie werden in allen folgenden Programmbeispielen durch vere i n f a c h t e Aufrufe von Systemunterprogrammen ersetzt. Das Unterprogramm EINZ f r a g t in einer Schleife das Statusregister der Serienschnittstelle ab, ob ein Zeichen empfangen wurde, liest es vom D a t e n e m p f a n g s register und übergibt es dem Hauptprogramm im AL-Register des Prozessors. Das Unterprogramm AUSZ übernimmt das auszugebende Zeichen im A L - R e g i ster des Prozessors und r e t t e t es zunächst in den Stapel, da das A L - R e g i s t e r für die Kontrolle des Statusregisters der Serienschnittstelle benötigt wird. Ist der Sender b e r e i t , so wird das Zeichen vom Stapel zurückgeholt und in das Sendedatenregister übertragen. Beim Rücksprung bleibt das übertragene Zeichen im AL-Register erhalten. Der Rücksprung in den Monitor erfolgt mit dem Befehl INT 10H, der eine besondere Form eines U n t e r p r o g r a m m a u f r u f s d a r s t e l l t . Die in Bild 4 - 6 dargestellte Übersetzungsliste enthält von links nach rechts die vom Editor herrührenden Zeilennummern, eine Durchnumerierung der Bytes durch den Adreßzähler, das hexadezimal dargestellte Maschinenprogramm und das eingegebene symbolische Assemblerprogramm. In den Zeilen 1 bis 5 und 27 bis 30 des "Rahmens" sowie in den Kommentarzeilen 12 und 13 wird kein Maschinencode erzeugt. In den Zeilen 7 und 8 t r i t t bei den beiden C A L L - B e f e h len eine wichtige Eigenheit des verwendeten Assemblers zu Tage, die besonders zu b e a c h t e n ist, wenn man Programme von Übersetzungslisten ablesen und h e x a dezimal mit Hilfe eines Monitors eingeben will. Der symbolische Befehl CALL wird in den Funktionscode E8 übersetzt. Die s y m bolischen Adressen AUSZ und EINZ erscheinen in der Liste als hexadezimale Adressen 0118 bzw. 010F. Der Zusatz " R " für relocatable gleich verschieblich weist darauf hin, daß diese Adressen später vom Linker (Binder) noch verändert werden können. Bild 4 - 7 zeigt das umadressierte a u s f ü h r b a r e Maschinenprogramm im Arbeitsspeicher.

4.2 Die Entwicklung von

a 4 5 B 7 8 3 10 11

0100 0100 010E 0105 010B 010A 010C

B0 E6 EB 3C 75 EB

EA 0118 R - » — 010F R-" EA FE 15 SO

13 14 IS 1B 17 1B 19 50 El SS E3 E4 25 PB

010F Olli 0113 0115 0117 011B 0119 011B 0110 olir 0150 0125 01E3

E4 AB 74 E4 C3 50 E4 AB 74 SB EG C3 CD

OB OE FA 00

SB sa 30

0000

OIES

OE Ol FA 00 10

PAGE EINFLIEßENDES PROG SEGMENT ASSUME ORG START: nou LOOP: CALL CALL CUP JNZ ' JMP

Assemblerprogrammen

109

255,13E BEISPIEL

PROGRAMMSEGMENT CS: PROG, DS: PROG, ES: PROG. SS: PROB 100H ADRESSZAEHLER AL, EINGABEMARKE AUSZ ZEICHEN AUS AL AUSGEBEN ZEICHEN NACH AL LESEN EINZ AL, ENDEZEICHEN 7 LOOP NEIN: AUSGEBEN JA: RUECKKEHR MONITOR MONI

! SYSTEMUNTERPROGRAMME: FEHLEN IN BEISPIELEN EIN2: IN STATUS SCHNITTSTELLE AL,02H TEST AL,a ZEICHEN EMPFANGEN T J2 NEIN: IdARTEN EINZ IN AL,OOH JA: LESEN RET RUECKSPRUNG AX MIT ZEICHEN RETTEN AUSZ: PUSH AX IN AUSZ1: AL.02H STATUS SCHNITTSTELLE TEST AL, 1 SENDER FREI 7 JZ AUSZ1 NEIN: UARTEN POP AX JA: ZEICHEN ZURUECK OUT OOH,AL ZEICHEN SENDEN RET RUECKSPRUNG MONI: INT 10H MS-DOS: INT EOH I ABSCHLUSS OES PROGRAMMRAHMENS PROG ENDS ENDE DES SEGMENTES END START ENDE DES PROGRAMMS

Bild 4-6: Übersetzungsliste des einführenden Beispiels

OBBS:0100 BOSA 0BB9: 0102 EB1300 — — OBBS:: 0105 EB0700 0B89 : 010B 3C2A 0BB9 : 010« 75F6 OBBS: 010C EB15 OBBS:: 010E SO 0BB9:: 010F E402 0BB9 : O l l i AB02 0BB9:: 0113 74FA OBBS:: Ol 15 E400 0B89: 0117 C3 0BB9:: 011B 50 OBBS: 0119 E402 OBBS:: 011B ABOI OBBS: 011D 74FA OBBS:: Ol 1F SB OBBS: 0120 E600 OBBS::Oies C3 0BB9: 0123 CD10 Bild 4-7:

nou CALL CALL CMP JNZ JMP NOP IN TE5T JZ IN RET PUSH IN * TEST JZ POP OUT RET INT

AL, SA oiia 010F AL.EA 010S 0123 AL, 03 AL, 02 010F AL, 00 AX AL, 02 AL, Ol 011S AX 00, AL 10

Ausführbares Maschinenprogramm im Arbeitsspeicher

Das Bild zeigt links die Speicheradresse in der Anordnung "Segment : Abstand", das Maschinenprogramm in hexadezimaler Darstellung und eine Rückübersetzung durch einen Disassembler, in der alle symbolischen Adressen durch Hexadezimalzahlen ersetzt wurden. Der Linker hat die "absoluten" Adressen 0118 und 010F der CALL-Befehle in "relative" Adressen 0013 und 0007 umgewandelt und dabei das HIGH-Byte und das LOW-Byte vertauscht. Diese Adressen stimmen mit denen des Bildes 4-3 überein, das das in das Übungssystem übertragene Maschinenprogramm zeigt.

110

4 Einßhrung in die maschinenorientierte Programmierung

B e i der Auswertung der in diesem Buch d a r g e s t e l l t e n Ubersetzungslisten ist zu b e a c h t e n , daß alle durch den Buchstaben " R " gekennzeichneten Adreßangaben noch nicht endgültig sind und normalerweise durch den Linker bzw. den Lader des B e t r i e b s s y s t e m s umgewandelt werden: Adressen von Unterprogrammen und " l a n g e n " Sprüngen werden in eine relative Adresse zum Sprungziel umgewandelt. Der vorzeichenbehaftete Abstand zum Sprungziel erscheint in der Reihenfolge L O W - B y t e - H I G H - B y t e . Durch den Buchstaben " R " gekennzeichnete Datenadressen erscheinen in der Übersetzungsliste in der " n a t ü r l i c h e n " Reihenfolge H I G H - B y t e - L O W - B y t e und sind in ausführbaren Maschinenprogrammen zu vertauschen. 1 6 - B i t - K o n s t a n t e n erscheinen in der Übersetzungsliste in der " n a t ü r l i c h e n " Reihenfolge und sind in ausführbaren Maschinenprogrammen in der Reihenfolge L O W - B y t e - H I G H - B y t e anzuordnen. An den durch "

R " gekennzeichneten Stellen ist noch eine 16 Bit lange

Adresse eines S e g m e n t e s einzusetzen, die bei der Arbeit unter der Kontrolle des B e t r i e b s s y s t e m s e r s t beim Laden des Programms b e s t i m m t wird. F ü r a l l e Programmbeispiele gelten die in Bild 4 - 8 d a r g e s t e l l t e n Eingabevors c h r i f t e n und Assembleranweisungen. Sie stellen das Minimum an Aufwand dar, um unter dem B e t r i e b s s y s t e m MS-DOS einfache Assemblerprogramme erstellen zu können. Für die Arbeit mit E n t w i c k l u n g s s y s t e m e n g e l t e n ähnliche V o r s c h r i f ten. Name name

Befehl

Operand

Bemerkung

SEGMENT ASSUME ORG

CS : name, 100H

; ; ; ;

start:

Segmentanfang Assembleranweisung Adreßzähler Startadresse

Befehle Datenvereinbarungen Assembleranweisungen name

Bild 4 - 8 :

ENDS END

start

; Segmentende ; Programmende

Eingabevorschriften und " R a h m e n " eines Assemblerprogramms

Eingabezeilen können aus maximal 132 Zeichen b e s t e h e n . Sie umfassen vier F e l d e r (Name, B e f e h l , Operand und Bemerkung), die durch mindestens ein L e e r z e i c h e n zu trennen sind. Für die Eingabe können mit Ausnahme bei T e x t konstanten wahlweise kleine oder große Buchstaben verwendet werden. Namen bezeichnen S e g m e n t e , Sprungziele, Unterprogramme und D a t e n . Sie dürfen nicht mit f e s t g e l e g t e n Bezeichnungen wie z.B. Namen von A s s e m b l e r a n weisungen oder von Prozessorregistern übereinstimmen. Sie dürfen aus maximal

4.2 Die Entwicklung von Assemblerprogrammen

111

31 Buchstaben, Ziffern oder Sonderzeichen (? . @ _ $) bestehen. Alle Sprungziele und Unterprogramme werden durch einen Doppelpunkt ":" am Ende gekennzeichnet, der jedoch nicht Bestandteil des Namens ist und beim Aufruf im Operandenteil entfällt. Befehle bestehen aus festgelegten Kennwörten. Man unterscheidet Assembleranweisungen und symbolische Maschinenbefehle. Assembleranweisungen wie z.B. SEGMENT, ASSUME, ORG oder END sind Anweisungen an den Assembler (Übersetzer) und werden nicht in Maschinencode übersetzt. Symbolische Befehle wie z.B. MOV oder CALL oder JMP übersetzt der Assembler in binären Code. Operanden bezeichnen Register, Datenspeicherstellen, Konstanten oder Sprungziele. Die festgelegten Registerbezeichnungen dürfen nicht als freiwählbare Namen verwendet werden. Es gibt folgende Arten von Konstanten: Binäre Konstanten bestehen nur aus den Zeichen "0" und "1" und werden durch den Buchstaben "B" am Ende gekennzeichnet. Beispiel: 000011 IIB. Dezimale Konstanten bestehen aus den Ziffern "0" bis "9" und können wahlweise mit einem "D" am Ende versehen werden. Beispiel: 4711D oder nur 4711. Hexadezimale Konstanten bestehen aus den Ziffern "0" bis "9" und den Buchstaben "A" bis "F" und müssen durch ein "H" am Ende gekennzeichnet werden. Das erste Zeichen muß eine Ziffer sein. Beginnt eine Hexadezimalzahl mit einem Buchstaben (A-F), so muß eine führende "0" vorangestellt werden. Beispiel: 0FFH. Textkonstanten (Strings) werden zwischen Hochkommas " " ' gesetzt. Sie werden im ASCII-Code gespeichert. Kleine und große Buchstaben haben dabei verschiedene Codierungen. Beispiel:'Eingabe:'. Bemerkungen beginnen mit einem Semikolon ";". Sie dienen nur zur Erläuterung des Programms und sind für seinen Ablauf ohne Bedeutung. Assembleranweisungen sind nur Hilfen für den Übersetzer. Die Anweisung SEGMENT kenzeichnet den Anfang eines maximal 64 KByte umfassenden Speichersegmentes, das mit der Anweisung ENDS abgeschlossen wird. Der Segmentname ist frei wählbar. Die Anweisung ASSUME teilt dem Assembler die Segmentadresse als Bezugsadresse für die Adreßrechnung mit. Bei Assemblerprogrammen, die insgesamt nicht mehr als 64 KByte Speicher benötigen, lädt man alle vier Segmentregister CS, DS, ES und SS mit der gleichen Segmentadresse. Mit der Anweisung ORG wird der Adreßzähler des Assemblers auf einen Anfangswert gesetzt. Die Startadresse aller Beispielprogramme liegt einheitlich bei 0100H. Die END-Anweisung schließt die Programmzeilen ab. Im Operandenteil steht die Startadresse des Programms. Diese Festlegungen wurden in Übereinstimmung mit den Forderungen des MS-DOS-Betriebssystems getroffen und gelten nur für die Beispielprogramme des Übungssystems.

112

4 Einfihrung in die maschinenorientierte Programmierung

Name EINZ AUSZ MONI

Bild 4 - 9 :

Aufqabe Zeichen nach AL lesen Zeichen aus AL ausgeben Zeichen aus DL ausgeben Rückkehr nach B e t r i e b s s .

D i e V e r b i n d u n g zum

Monitor INT 11H INT 17H

HS-DOS AH=8 INT 21H AH=2

INT 21H INT 20H

INT 10H

Betriebssystem

Für d e n T e s t von P r o g r a m m e n ist es e r f o r d e r l i c h , D a t e n e i n z u g e b e n und E r g e b nisse a u s z u g e b e n . Bild 4 - 9 z e i g t d i e in d e n B e i s p i e l e n b e n u t z t e n

Monitorfunk-

t i o n e n , d i e a n s t e l l e d e r in Bild 4 - 5 v o r g e s t e l l t e n U n t e r p r o g r a m m e

verwendet

w e r d e n . S o l l e n d i e B e i s p i e l e auf a n d e r e n R e c h n e r n l a u f e n , so sind d i e nur b e i den U n t e r p r o g r a m m e E I N Z und A U S Z s o w i e der Einsprungpunkt M O N I d e m v e r wendeten die

auf

Betriebssystem der

Portadresse

anzupassen. 300H

Einige

liegenden

Beispiele

Kippschalter

verwenden und

zusätzlich

Leuchtdioden

zur

S i m u l a t i o n von S t e u e r s i g n a l e n .

4.3

Der

Registersatz und Speicheradressierung

in Bild 4 - 1 0 d a r g e s t e l l t e

Registersatz

ist in a l l e n P r o z e s s o r e n d e r

F a m i l i e enthalten. Die R e g i s t e r , die A r i t h m e t i s c h - L o g i s c h e

8086-

Einheit s o w i e d e r

A d r e ß t e i l d e r B e f e h l e sind 16 Bit l a n g . D i e v i e r D a t e n r e g i s t e r

A X , B X , C X und

D X k ö n n e n auch als 8 - B i t - R e g i s t e r v e r w e n d e t w e r d e n . D i e b e i d e n I n d e x r e g i s t e r SI und DI s o w i e das B a s i s r e g i s t e r BP d i e n e n zur A d r e s s i e r u n g von S p e i c h e r b e r e i chen.

Mit

dem

Stapelzeiger

wird der

im

Arbeitsspeicher

befindliche

Stapel

a d r e s s i e r t . D e r B e f e h l s z ä h l e r PC ( P r o g r a m C o u n t e r ) w i r d a u c h I n s t r u c t i o n P o i n ter

(IP)

genannt

und

e n t h ä l t die A d r e s s e

des n ä c h s t e n aus d e m

Speicher

zu

h o l e n d e n B e f e h l s , d e r zunächst in der B e f e h l s w a r t e s c h l a n g e z w i s c h e n g e s p e i c h e r t w i r d . Im S t a t u s r e g i s t e r b e f i n d e n sich d i e Z u s t a n d s b i t s d e s P r o z e s s o r s und d i e Sprungbedingungen zugängliches

f ü r b e d i n g t e S p r u n g b e f e h l e . Ein d e m

Register

Programmierer

T E M P dient zur Z w i s c h e n s p e i c h e r u n g

nicht

von A d r e s s e n

und

Daten. A l l e in den B e f e h l e n e n t h a l t e n e n und durch A d r e ß r e c h n u n g g e w o n n e n e n A d r e s sen sind 16 Bit lang und w e r d e n mit H i l f e d e r v i e r S e g m e n t r e g i s t e r CS, SS, ES und DS in e i n e p h y s i k a l i s c h e S p e i c h e r a d r e s s e u m g e s e t z t , d i e als 2 0 - B i t - D u a l z a h l auf

den A d r e ß b u s g e s c h a l t e t

wird. Bild 4 - 1 1 z e i g t

schen Speicheradresse mit H i l f e eines Die

physikalische

Speicheradresse,

die

d i e Bildung d e r p h y s i k a l i -

Segmentregisters. auf

dem

Adreßbus

erscheint,

ist

die

S u m m e aus e i n e m 1 6 - B i t - S e g m e n t r e g i s t e r und e i n e r s o g e n a n n t e n l o g i s c h e n 1 6 B i t - A d r e s s e , d i e sich aus d e m

Befehl ergibt. Dabei

w i r d d e r Inhalt des S e g -

4.3 Registersatz und

A19/S6

A16/S3

113

Speicheradressierung

AD15

Multiplexer für Adressen / Steuersignale und Daten

physikalische Speicheradresse Adrefirechemerk

Befehlsadresse

Interner Datenbus

Stapeladresse

CS

SS

Code-Segmentreg i ster

ES

Stapel-Segmentreg»ster

PC

SP

Befehlszähler

OS

Extra-Segmentregister

DI

Stapelzeiger

SI

Destination-Index

BH

BL

ex - Register

Base - Pointer Befehls Ablauf -

CH

Steuerung

cx - Register TEMP

Befehlsdecoder

I Zwischenspeicher Code

Daten-Segmentregister

AX - Register

CL

DH

Statusregister

DL

A L U

DX - Register

16 / 8 bit

j-

Befehlswarteschlange

Bild 4 - 1 0 :

D i e R e g i s t e r des P r o z e s s o r s 8 0 8 6

A d r e ß b u s 1 A19

T T AI AO

physikalische Speicheradresse 0

0

0

0

16-Bit- Segmentregister 0

0

0

0 16-Bit-Speicheradresse

Bild 4 - 1 1 :

Bildung der p h y s i k a l i s c h e n

Speicheradresse

m e n t r e g i s t e r s durch A n h ä n g e n von vier Nullen m i t 16 m u l t i p l i z i e r t . E i n e

be-

s t i m m t e p h y s i k a l i s c h e S p e i c h e r a d r e s s e k a n n d u r c h e i n e V i e l z a h l von K o m b i n a t i o nen z w i s c h e n dem Inhalt e i n e s S e g m e n t r e g i s t e r s und e i n e r l o g i s c h e n

Adresse

114

4 Einßhrung in die maschinenorientierte

Programmierung

gebildet werden. Beispiele f ü r die Bestimmung der willkürlich gewählten physikalischen Speicheradresse 12345H: Segmentadresse 1000H + Adresse 2345H = phys. Speicheradresse 1 2345H Segmentadresse 1001H + Adresse 2335H = phys. Speicheradresse 1 2345H Segmentadresse 1234H + Adresse 0005H = phys. Speicheradresse 1 2345H Die im Adreßteil der Befehle erscheinenden logischen Adressen werden auch als O f f s e t (Abstand) oder Displacement (Verschiebung) bezeichnet, weil sie keine absoluten Speicheradressen darstellen, sondern noch zu einem S e g m e n t register addiert werden, das die Anfangsadresse des Speicherbereiches e n t h ä l t . Durch die Segmentierung werden die im Programm verwendeten Adressen u n a b hängig von Lage des Programms im Arbeitsspeicher. Bild 4 - 1 2 zeigt, wie man durch entsprechendes Laden des Segment registers die Lage eines Programms im Speicher verändern kann.

Bild 4-12:

Lageunabhängige Programmierung

Betrachten wir als Beispiel ein Programm, das mit der logischen Adresse 0000 beginnt. Auf der logischen Adresse 1000H liege ein Befehl, der in seinem Adreßteil die logische Adresse 1234H enthält. Wird das Programm ab der physikalischen Speicheradresse 0 0000H geladen, so ist das Segmentregister mit der Segmentadresse 0000 zu laden. Der Befehl liegt auf der physikalischen Speicheradresse 0 1000H. Die adressierte Speicherstelle liegt auf der Adresse 0 1234H. Sie ist um 234H Bytes e n t f e r n t . Lädt man das Programm z.B. ab der physikalischen Speicheradresse F 0000H und das Segmentregister mit der S e g m e n t a d r e s se F000H, so liegen der BefehL und die durch ihn a d r e s s i e r t e Speicherstelle wieder um 234H Bytes voneinander e n t f e r n t . Da das Segmentregister bei der Bildung der physikalischen Speicheradresse mit 16 multipliziert wird, können die Programme in Schritten von 16 Bytes verschoben werden. Mit einer 16 Bit

4.3 Registersatz und Speicheradressierung

115

langen logischen Speicheradresse kann ohne Änderung des Segmentregisters nur ein Segment von maximal 64 KByte adressiert werden. Die Prozessoren der 8 0 8 6 - F a m i l i e haben entsprechend Bild 4 - 1 3 mit vier Segmentregister, die für unterschiedliche Aufgaben verwendet werden.

Physikalische Speicheradresse s, Befehlszähler

F FFFF

Codesegmentregister>

F 0000



+

x 0000

+ x 0000

Stapelsegmentregister

Datensegmentreg i ster

Bild 4 - 1 3 :

ExtraSegment Daten

x FFFF

s Stapelzeiger

s Datenadresse

CodeSegment Befehle

x FFFF

\

DI-Register Extrasegmentregister

Inhalt

StapelSegment Stapel

0 FFFF + 0 0000

DatenSegment Daten

Die vier Segmentregister der 8086-Prozessoren

Befehlsadressen werden ausschließlich aus dem Codesegmentregister und dem Befehlszähler gebildet. Die Zuordnung eines anderen Segmentregisters für die Befehlsadressierung ist nicht möglich. Stapeladressen werden bei allen Befehlen, die automatisch den Stapel verwenden, aus dem Stapelsegmentregister und dem Stapelzèiger gebildet. Dazu gehören die Befehle CALL, R E T , PUSH und POP sowie alle S o f t w a r e - und HardwareInterrupts. Die Zuordnung eines anderen Segmentregisters ist in diesen Fällen nicht möglich. Wird bei der indizierten Adressierung der Basepointer als B a s i s register verwendet, so ist zunächst das Stapelsegmentregister zugeordnet. Durch einen Befehlsvorsatz (Prefix) ist es jedoch in diesem Fall möglich, eines der drei anderen Segmentregister für die Adressierung zu verwenden. Bei allen Stringbefehlen, die Zeichenketten oder Speicherbereiche adressieren, wird die Zieladresse aus dem Extrasegmentregister und dem DI-Register ( D e stination Index) gebildet; die Zuordnung eines anderen Segmentregisters ist in diesem Fall nicht möglich.

116

4 Einführung in die maschinenorientierte Programmierung

Alle anderen Datenadressen werden ohne besondere Angaben aus dem Datensegmentregister und dem Adreßteil des Befehls bzw. dem Ergebnis einer Adreßrechnung gebildet. Durch entsprechende Befehlsvorsätze ist es jedoch möglich, auch eines der drei anderen Segmentregister für die Bildung der physikalischen Speicheradresse zu verwenden. Allgemein besteht eine Adresse also aus den drei Angaben: Segmentregister, Inhalt des Segmentregisters und Abstand zum Segmentregister. Die bei allen Befehlen festgelegte Zuordnung eines Segmentregisters zur Datenadresse kann in einigen Fällen durch Befehlsvorsätze geändert werden. Die Segmentierung macht die Programme lageunabhängig. Sie hat den Nachteil, daß man ohne Änderung des Segmentregisters nur einen Speicherbereich von 64 KByte f o r t laufend adressieren kann. Bei einfachen Programmen, die insgesamt nicht mehr als 64 KByte Speicher benötigen, arbeitet man nur mit einem einzigen Segment und lädt alle vier Segmentregister mit der gleichen Segmentadresse. Bild 4-14 zeigt die Vorbelegung der Segmentregister, des Befehlszählers und des Statusregisters nach einem Reset des Prozessors.

Physikalische Speicheradresse

Inhalt

F FFFF

D CS I FFFFl

F FFF0

1. Befehl

0 03FF

InterruptVektorTabelle

0 0000

SS 10000 H

ES I 0000 H

DS 1-0000 [

Statusregister (1=0 T=0)

100001

PC I0000

Mikroprozessor 8086

Bild 4-14:

Prozessorregister nach einem Reset

4.3 Registersatz und

Speicheradressierung

117

Nach einem Reset sind das Stapelsegmentregister, das E x t r a s e g m e n t r e g i s t e r , das D a t e n s e g m e n t r e g i s t e r , das Statusregister und der Befehlszähler gelöscht. Das Codesegmentregister hat den Inhalt F F F F H . Der Inhalt aller anderen P r o zessorregister ist unbestimmt. Durch das Codesegmentregister und den B e f e h l s zähler wird das Byte auf der physikalischen Speicheradresse F FFFOH a d r e s siert, das den e r s t e n Befehl des nun zu s t a r t e n d e n Programms e n t h ä l t . Dies ist in der Regel ein Sprungbefehl in das S t a r t p r o g r a m m , da bis zum Ende des Speicherbereiches nur noch 16 Bytes zur Verfügung stehen. Dieser Sprungbefehl enthält eine Segmentadresse, die in das Codesegmentregister geladen wird, und einen Abstand, der in den Befehlszähler übernommen wird. Damit kann von dieser vom Hersteller des Prozessors f e s t g e l e g t e n Adresse aus jede Stelle des Arbeitsspeichers angesprungen werden. Das Startprogramm liegt normalerweise in Festwertspeichern (EPROMs) im obersten Adreßbereich. Die im u n t e r s t e n Adreßbereich von 0 0000 bis 0 03FF (1 KByte) liegende Vektortabelle e n t h ä l t die Startadressen der Interruptprogramme. Dieser ebenfalls vom Hersteller des Prozessors f e s t g e l e g t e Speicherbereich kann auch als Schreib/Lesespeicher (RAM) a u s g e f ü h r t werden. Bei Anwendungsrechnern, die nicht u n t e r der Kontrolle eines fertigen B e t r i e b s systems laufen, müssen nach einem Reset die anderen Segmentregister und der Stapelzeiger entsprechend den vorhandenen physikalischen Speicherbereichen mit Adressen geladen werden. Für den Fall, daß die Interruptvektoren in einem Schreib/Lesespeicher liegen, muß auch die Vektortabelle geladen werden, d a mit bei einem Interrrupt die Adressen der zu s t a r t e n d e n Programme festliegen. Dann erfolgt die Programmierung der Schnittstellen f ü r die Datenübertragung. Bei der Arbeit an einem Personal Computer werden die in der Startphase e r f o r derlichen Arbeiten bereits vom Betriebssystem vorgenommen, das auch die P r o gramme und Datenbereiche des Benutzers lädt und die Segmentregister sowie den Stapelzeiger entsprechend vorbesetzt. Das Betriebssystem entscheidet, auf welche physikalische Speicheradressen das Programm geladen wird, der Benutzer hat darauf keinen Einfluß. Dabei kann es bei Systemen, die mehrere Tasks (Benutzer, Prozesse) zu verwalten haben, vorkommen, daß die Ladeadresse bei jedem neuen Programmstart geändert wird oder daß das Programm während seiner Verarbeitung unterbrochen oder verschoben wird. Bei der Arbeit mit einem modernen Betriebssystem ist auch der Assemblerprogrammierer vielen systembedingten Einschränkungen u n t e r w o r f e n . Dies gilt leider auch f ü r die folgenden Beispielprogramme, die mit einem f ü r einen Personal Computer b e s t i m m t e n Assembler übersetzt wurden, aber auf einem Übungsrechner u n t e r einem einfachen Monitor abliefen. Die bei Hardware-Entwicklungssystemen eingesetzen Assembler arbeiten in großen Teilen ähnlich wie der verwendete MASM-Assembler. Bei der Arbeit mit einem einfachen Testhilfeprogramm (Monitor) muß der Benutzer das Programm selbst laden oder eingeben. Aber auch hier werden m i n destens die Segmentregister, der Befehlszähler, der Stapelzeiger und das S t a tusregister vom System vorbesetzt. Bild 4 - 1 5 zeigt die Speicheraufteilung und

118

4 Einführung in die maschinenorientierte Programmierung

Physikalische Speicheradresse 0 3FFF

Adresse im Benutzerprogramm 37FF

Daten t Befehle frei (Daten) MonitorBereich VektorTabelle



0 0 0 0 0 0 0

CS looaol

PC |0000|

0100 00 FF 0000

0900 08FF 0800 07FF 0400 03FF 0000

SS |0080|

ES |0080|

Inhalt Stapel

DS |0080|

SP |37FF| Mikroprozessor 8086

Bild 4 - 1 5 :

Speicheraufteilung des Übungssystems

REGISTER: AX=0000 CX=0000 SI=0000 CS=0080 BX=0000 DX=0000 DI=0000 IP=0000 0080:0000 Befehl: 90 90 90 90

Bild 4 - 1 6 :

DS=0080 ES=0080

SS=0080 SP=37FF

BP=0000 ST=F002

ODITSZ-A-P-C 1111000000000010

Inhalt der dem Benutzer übergebenen Register

die beim Start eines Benutzerprogramms vorgegebenen Register des Übungssystems. Das Übungssystem enthält im untersten Adreßbereich 16 KByte S c h r e i b / L e s e s p e i c h e r . Die untersten 2 KByte werden vom Betriebssystem für die V e k t o r tabelle und als Arbeitsbereich des Systems belegt. Die restlichen 14 KByte ab der physikalischen Speicheradresse 0 0800H stehen dem Benutzer als A r b e i t s speicher f ü r Programme und Daten zur Verfügung. Damit der Benutzer mit der logischen Adresse 0000 beginnen kann, werden alle vier Segmentregister mit der Segmentadresse 0080 vorbesetzt. Der Stapel wird auf die oberste zur V e r fügung stehende Adresse g e l e g t . Die Startadresse der Beispielprogramme liegt in Übereinstimmung mit den Vorschriften des MS-DOS-Betriebssystems, mit dem sie übersetzt wurden, bei 0100H. Die Segmentregister werden n o r m a l e r weise nicht verändert. Bild 4 - 1 6 zeigt abschließend den Inhalt der dem Benutzer vom Monitor übergebenen Register.

4.4 Die Übertragung von Daten

4.4

119

Die Übertragung von Daten

Ubertragen bedeutet im allgemeinen Sprachgebrauch, ein Ding von einem Ort wegzunehmen und an einen anderen Ort zu bringen. In der Datenverarbeitung und Mikrocomputertechnik ist "übertragen" gleich "kopieren". Beim Laden eines Prozessor reg isters mit dem Inhalt eines anderen Registers oder einer D a t e n speicherstelle bleibt der Inhalt der Quelle (Herkunft oder Source) erhalten. Der a l t e Inhalt des aufnehmenden Speichers (Ziel oder Destination) wird mit dem neuen Wert überschrieben.

4.4.1

Befehle zur Datenübertragung und Adressierungsarten

Dieser Abschnitt zeigt ausführlich einfache Anwendungen des MOV-Befehls zur Übertragung von Daten. Die hier vorgestellten Adressierungsarten gelten w e i t gehend auch für die anderen Befehle, die Daten verarbeiten. Der Abschnitt 4.7 zeigt die Möglichkeiten der Berechnung von Datenadressen.

CS SS ES DS Segmentreg i s t e r

SP AX BP BX DI CX SI DX Indexregister Wortregister

AH AL BH BL CH CL DH DL Byteregister

Bild 4-17: Die Bezeichnung der Prozessorregister

Fast alle Datenübertragungen laufen über die in Bild 4-17 dargestellten Register der Prozessors. Die meisten Befehle können sowohl auf Bytes (8 Bit) als auch auf Wörter (16 Bit) angewendet werden; dies wird durch ein besonderes Wortbit (w) im Funktionscode unterschieden. 3 Bit dienen zur Codierung von acht Registern. Die vier Datenregister A, B, C und D sind byteweise oder w o r t weise verwendbar. Die acht Byteregister AH, AL, BH, BL, CH, CL, DH und DL dienen zur Übertragung und Speicherung von Datenbytes. Die acht Wortregister AX, BX, CX, DX, SP, BP, DI und SI dienen sowohl zur Übertragung von Datenwörtem als auch zur Behandlung von Adressen. Sie w e r den im Abschnitt 4.7 Speicheradressierung teilweise auch als Basisregister und Indexregister verwendet.

120

4 Einführung in die maschinenorientierte Programmierung

Befehl MOV MOV MOV MOV MOV MOV MÖV MOV MÖV MOV

Operand OSZAPC Wirkung ziel ,her Lade den Ziel-Operanden mit dem Her-üperanden register,register Lade Register mit einem anderen Register register,konstan. Lade Register mit einer Konstanten register,Speicher Lade Register mit einer Speicherstelle Speicher,register Lade Speicherstelle mit einem Register Speicher,konstan. Lade Speicherstelle mit einer Konstanten segmentr,wortreg. Lade Segmentregister mit einem Wortregister segmentr,speiwor. Lade Segmentreg ister mit einem Speicherwort wortreg.,segmentr Lade Wortregister mit einem Segmentreg ister speiwor..segmentr Lade Speicherwort mit einem Segmentreg ister

Byteregister: AH, AL, BH, BL, CH, CL, DH, DL Wortregister: AX, BX, CX, DX, SP. BP, SI, DI Segmentregister: CS, DS, ES, SS

Bild 4-18:

M O V - B e f e h l e zur Datenübertragung

Auf die vier Segmentregister können nur besondere L a d e - und S p e i c h e r b e f e h l e angewendet werden. Die in Bild 4-18 zusammengestellten

M O V - B e f e h l e enthalten im Operanden-

teil zwei durch ein Komma getrennte Angaben: " L a d e das links stehende Ziel mit dem rechts stehenden Herkunftsoperanden " . Ziel und Herkunft müssen die gleiche

Größe haben: Lade

Byteregister

mit Datenbyte oder Datenwort

mit

W o r t r e g i s t e r . Eine Mischung von Datentypen ist nicht zulässig und wird vom Assembler als Fehler g e m e l d e t . M O V bedeutet M O V e oder b e w e g e oder besser lade. Ist das Z i e l ein R e g i s t e r , so sind als Herkunftsoperanden ein anderes R e g i s t e r oder eine Konstante oder eine Datenspeicherstelle zulässig. Beispiele:

MOV MOV MOV

AL,AH AL,12H AX,DAT

Lade das AL-Register mit Inhalt von AH Lade das AL-Register mit der Konstanten 12H Lade AX mit dem Inhalt der Datenspeicherstelle DAT

Ist das Ziel eine Datenspeicherstelle, so sind als Herkunftsoperanden ein R e g i ster oder eine Konstante, aber keine andere Datenspeicherstelle zulässig. Beispiele:

MOV MOV

BEL,AH VAR,1234H

Lade die Speicherstelle BEL mit dem Inhalt von AH Lade die Speicherstelle VAR mit der Konstanten 1234H

Die auf die Segmentregister anwendbaren M O V - B e f e h l e dürfen nur W o r t r e g i s t e r oder Speicherwörter als Operanden enthalten; die Verwendung von Konstanten und Operationen direkt zwischen den S e g m e n t r e g i s t e m sind nicht im Befehlssatz vorgesehen. In diesen Fällen ist ein W o r t r e g i s t e r zu H i l f e zu nehmen. Beispiele:

4.4 Die Übertragung von Daten

MOV MOV MOV MOV

AX,0080H DS,AX AX,CS ES,AX

Lade Lade Lade Lade

Das Codesegmentregister

das das das das

121

AX-Register m i t der Konstanten 0 0 8 0 H Datensegmentregister m i t d e m Inhalt v o n AX AX-Register m i t dem Inhalt v o n CS Extrasegmentregister m i t dem Inhalt v o n AX

kann nicht durch einen M O V - B e f e h l , sondern nur

durch einen Sprungbefehl oder Unterprogrammaufruf geladen werden.

Bild 4-19:

Wirkung der M O V - B e f e h l e

Bild 4-19 zeigt die Wirkung der M O V - B e f e h l e . Ein Prozessorregister kann aus einem

anderen

Register oder aus einer Datenspeicherstelle oder

mit

einer

Konstanten geladen werden. Eine Datenspeicherstelle kann mit dem Inhalt eines Prozessorregisters oder mit einer Konstanten geladen werden. Die Adresse eines Operanden wird durch verschiedene Adressierungsarten bestimmt, die auch für die datenverarbeitenden Befehle gelten. In allen Beispielen ist das A X - R e g i s t e r das Ziel. Bei der Registeradiessienmg befinden sich die zu übertragenden Daten in einem Register. Die Registeradresse (3 Bit) ist Bestandteil des Funktionscodes. Beispiel: MOV

AX,EX

Der Quelloperand befindet s i c h im BX-Register

Bei der unmittelbaren (immediate) Adressierung befindet sich die zu ladende Konstante im Befehl unmittelbar hinter dem Funktionscode. Beispiel:

4 Einführung in die maschinenorientierte

MOV

AX,1234H

Programmierung

Der Quelloperand ist die Konstante 1234H

Bei der direkten (direct) Adressierung befindet sich die Adresse des Quelloperanden hinter dem Funktionscode im Befehl. Der Quelloperand liegt im Arbeitsspeicher. Beispiel: MOV

AX,DAT

Der Quelloperand hat die symbolische Adresse DAT

Bei der indirekten (indirect) Adressierung befindet sich die Adresse des Quelloperanden in einem Wortregister des Prozessors und bzw. oder wird durch eine Adreßrechnung bestimmt. Der Quelloperand liegt im Arbeitsspeicher. Beispiel: MOV

AX,[BX]

Die Adresse des Quelloperanden liegt im BX-Register

Bei der code-eigenen (inherent) Adressierung werden bestimmte Register oder Speicherstellen ohne besondere Angaben zur Adressierung verwendet. Ein Beispiel sind die Stapelbefehle (PUSH und POP), die immer mit dem Stapelzeiger als Adreßregister arbeiten. Beispiel: POP

AX

Lade AX aus dem Stapel, Adresse im Stapelzeiger SP ; BILD 4 — 2 0 L A D E N UON K O N S T A N T E N PROGRAMMSEGMENT PROG SEGMENT A S S U M E CS: PROG,DS:PROG,ES :PROG,SS:PROG OOBOH S Y M B O L BAS - WERT OOBOH BAS EQU ADRESSZAEHLER ORB 100H ; LADEN DER SEGMENTREGISTER UND DES S T A P E L Z E I G E R S BASIS - OOBOH START: MOU AX,BAS DATENSEGMENTREGISTER MOU DS, AX MOU ES, AX EXTRASEGMENTREGISTER MOU SS, AX STAPELSEGMENTREGISTER MOU SP,37FFH ; S T A P E L Z E I G E R ; L A D E N UON KONSTANTEN MOU AL,12H BYTE HEXADEZIMAL MOU BX,12348 ; WORT H E X A D E Z I M A L BYTE D E Z I M A L MOU CL,100 MOU DX,1000 WORT DEZIMAL MOU AL, AUSGABEMARKE CALL AUSZ ZEICHEN AUSGEBEN ZEICHEN LESEN LOOP: CALL EINZ AUSZ ZEICHEN AUSGEBEN CALL JMP LOOP SCHLEIFE OHNE AUSGANG : SYSTEMAUFRUFE EINZ: INT UH Z E I C H E N NACH A L L E S E N RET RUECKSPRUNG AUSZ: 17H ZEICHEN AUS AL AUSGEBEN INT RET RUECKSPRUNG PROG ENDS ENDE DES SEGMENTES END START EMDE DES PROGRAMMS

Bild 4-20: Programmbeispiel: Laden von Konstanten

4.4 Die Übertragfing von Daten

123

Das in Bild 4 - 2 0 dargestellte Programm zeigt Beispiele für das Laden von Registern mit Konstanten. Bei betriebssystemunabhängigen Programmen müssen zunächst die Segmentregister DS, ES und SS sowie der Stapelzeiger SP dem zur Verfügung stehenden Arbeitsspeicher angepaßt werden. Alle drei datenadressierenden Segmentregister werden mit dem Wert 0080H vorbesetzt; dies entspricht der Basisadresse 0800H. Die Wertzuweisung geschieht mit Hilfe des frei gewählten Symbols BAS, dem mit einer EQU-Anweisung der hexadezimale Wert 0080H zugewiesen wurde. Die Befehle zeigen die Verwendung von hexadezimalen und dezimalen Byteund Wortkonstanten sowie eines Literais oder Zeichens, das mit Hilfe eines Systemunterprogramms ausgegeben wird. Die Verarbeitungsschleife gibt die über die Konsole eingegebenen Zeichen wieder auf dem Bildschirm aus. Im G e gensatz zum einführenden Beispiel Bild 4 - 5 und Bild 4 - 6 werden Systemunterprogramme für die Eingabe und Ausgabe verwendet, die dem verwendeten Betriebsystem angepaßt werden müssen.

Befehl Operand XCHG operand.operand XCHG XCHG XCHG

NOP LES LDS

register.register register,speicher speicher,register

wortreg..doppelw. wortreg.,doppelw.

Bild 4 - 2 1 :

OSZAPC Wirkung

Vertausche die beiden uperanden Vertausche den Inhalt der beiden Reqister Vertausche Register mit Speicher Vertausche Speicher mit Register XCHG AX,AX = No Operation (tu nix) Lade ES-Register und Wortregister Doppelwort Lade DS-Register und Wortregister Doppelwort

Weitere Befehle zur Datenübertragung

Die in Bild 4 - 2 1 zusammengestellten Befehle werden für besondere Datenübertragungen verwendet. XCHG bedeutet eXCHange oder vertausche die beiden adressierten Operanden. Aufgrund des Register- und Befehlssatzes ergeben sich auch sinnlose Befehle, die z.B. das AX-Register mit sich selbst vertauschen. Dieser Befehl mit dem Funktionscode 90H wird auch als NOP für No Operation oder "Tu Nix" bezeichnet. Er wird zuweilen vom Assembler zum Ausfüllen von Lücken in den Maschinencode eingebaut. Die Befehle LES und LDS laden eines der beiden Segmentregister ES bzw. DS und ein Wortregister mit einem Doppelwort aus dem Speicher, das sowohl einen Abstand (Offset) als auch eine Segmentadresse enthält. Beide Befehle können zur Vorbereitung von Stringbefehlen dienen. Beispiele: LES LDS

DI,ADDA SI,ADDB

Lade das DI- und das ES-Register aus Doppelwort ADDA Lade das SI- und das DS-Register aus Doppelwort ADDB

Die Doppelwörter ADDA und ADDB werden mit der Datenvereinbarung DD angelegt, die die Adresse (Offset) und das Segment des Operanden im Speicher ablegt. ATAB und BTAB sind Anfangsadressen von Speicherbereichen. Adressen

124

4 Einfiihrung in die maschinenorientierte Programmierung

bestehen allgemein aus einer Segmentangabe und einem Abstand (Offset) zum Segmentanfang. Beispiele: ADDA ADDB

4.4.2

DD DD

ATAB BT AB

Lege Abstand und Segment der Speicherstelle ATAB ab Lege Abstand und Segment der Speicherstelle BT AB ab

Die Vereinbarung von Konstanten und Variablen im Speicher

Anweisung DB DU DD

[»-

Operand konstante konstantenliste n DUP (konst.) 7 n DUP (?)

DM DD EQU

Bild 4 - 2 2 :

adresse adresse konstante

Wirkung Lege eine Konstante im Speicher ab Leqe mehrere Konstanten im Speicher ab Lege n gleiche Konstanten im Speicher ab Reserviere 1 Speicherstelle ohne Vorbesetzung Reserviere n Speicherstellen ohne Vorbes. Lege Adresse (Offset) als Wort im Speicher ab Lege Adresse (Offset) und Segment ab Vereinbare einen Namen für eine Konstante

Anweisungen für die Vereinbarung von Speicherstellen

Bei der Vereinbarung von Speicherstellen entsprechend Bild 4 - 2 2 können im Namensfeld ab Spalte 1 symbolische Namen vergeben werden, mit denen die Speicherstellen in den Befehlen adressiert werden. Beispiel: OTTO

DB

12H

Die Konstante 12H wird unter dem Namen OTTO abgelegt

MOV

AL,OTTO

Das AL-Register wird mit dem Inhalt von OTTO geladen

Eine Konstante ist ein Byte (8 Bit) oder Wort (16 Bit) oder Doppelwort (32 Bit), dessen Wert bereits zum Zeitpunkt der Programmerstellung bekannt sein muß. Einzelne Konstanten werden meist in der unmittelbaren Adressierung im Befehl abgelegt. Beispiel: MOV

AL,12H

Lade das AL-Register mit der Konstanten 12H

Größere Bereiche von Konstanten legt man mit Hilfe von Assembleranweisungen im Speicher ab. DB bedeutet Define Byte gleich definiere ein Byte. DW b e deutet Define Word gleich definiere ein Wort. DD bedeutet Define Doubleword gleich definiere ein Doppelwort. Konstanten können einzeln, in einer Liste oder mit einem Wiederholungsfaktor DUP angegeben werden. Der Assembler bereitet die Abspeicherung der Konstanten im Speicher vor. Sie werden wie das Programm vom Betriebssystem oder durch den Benutzer in den Arbeitsspeicher geladen. Beispiele:

4.4 Die Übertragung von Daten DB DB DB DB DB DB DB

00010010B 12H 100 '*' 'TEST' 1,2,3 10 DUP (0)

Lege Lege Lege Lege Lege Lege Lege

125

das Bitmuster als Byte 12H im Speicher ab ein Byte mit dem Inhalt 12H im Speicher ab die Dezimalzahl 100 als Byte im Speicher ab das Zeichen "*" im ASCII-Code im Speicher ab vier Zeichen im ASCII-Code im Speicher ab 3 verschiedene Bytes im Speicher ab 10 gleiche Bytes im Speicher ab

Eine Adreßkonstante ist ein Wort oder Doppelwort, das eine Adresse enthält. Abstände (Offsets) werden vom Assembler angelegt; Segmentadressen werden vom Assembler vorbereitet, aber erst vom Lader bestimmt und eingesetzt. Beispiele: DW DD

OTTO OTTO

Lege die Adresse von OTTO (Offset) im Speicher ab Lege den Offset und die Segmentadresse im Speicher ab

Eine Variable ist ein Byte, Wort oder Doppelwort, dessen Wert bei der Programmerstellung noch nicht bekannt ist. Sie wird durch ein " ? " im Operandenfeld der DB-, DW- bzw. DD-Anweisung gekennzeichnet. Bei der Vereinbarung einer Variablen wird lediglich Speicherplatz reserviert, eine Speicherung von Werten wie bei der Vereinbarung von Konstanten findet nicht s t a t t . Beispiele: DB DB

? 10 DUP (?)

Reserviere Speicherplatz fuer 1 Byte Reserviere Speicherplatz fuer 10 Bytes

Die Vereinbarung EQU bedeutet EQUal oder gleich und dient dazu, einem im Namensfeld stehenden Symbol einen Wert zuzuweisen. Bei der Übersetzung ersetzt der Assembler das Symbol durch den vereinbarten Zahlenwert. Beispiel: BAS

EQU

0080H

Das Symbol BAS erhaelt den Wert 0080H

MOV

AX,BAS

Lade AX mit der Konstanten BAS ( = 0080H)

Ohne die EQU-Anweisung hätte die Konstante 0080H direkt im Befehl erscheinen müssen. MOV

AX,0080H Lade AX mit der Konstanten 0080H

Das in Bild 4 - 2 3 dargestellte Programmbeispiel zeigt die Speicherung von Bytekonstanten, Wortkonstanten und Adreßkonstanten sowie die Reservierung von Bytes, Wörtern und Doppelwörtern für Variablen. Im Operandenteil der Befehle erscheinen die bei den Datenvereinbarungen vergebenen symbolischen Namen. Sie werden vom Assembler durch Zahlenwerte ersetzt. Dabei dienen die ORGAnweisungen als Ausgangswerte für Adreßrechnungen. Beispiele:

BVAR

ORG DB

2000H 32 DUP (?)

Adresszaehler fuer Variablen Reserviere 32 Bytes unter dem Namen BVAR

MOV

BVAR,AL

Lade das Byte BVAR mit dem Inhalt von AL

126

4 Einführung in die maschinenorientierte Programmierung

; BILD 4-23 KONSTANTEN UND VARIABLEN PROG SEGMENT ; PROGRAMMSEGMENT ASSUME CS : PROG,DS: PROG,ES: PROG,SS: PROG ORG ÌOOOH : KONSTANTENBEREICH ; BYTEKONSTANTEN BKON1 DB 12H ; BYTE HEXADEZIMAL BK0N2 DB 100 ; BYTE DEZIMAL BK0N3 DB ; BYTE ZEICHEN DB BKON4 'BEISPIEL : $' ZEICHENKETTE BKONS DB 12,100,'#' BYTELISTE BKONB DB 16 DUP C•-') WIEDERHOLUNGEN i WORTKONSTANTEN UKON1 DUI 1234H ; UIORT HEXADEZIMAL WKONS DU 1000 ; WORT DEZIMAL DUI E DUP C1234H) ; WIEDERHOLUNGEN UIKON3 ; ADRESSKONSTANTEN AKONI DUI BK0N1 ADRESSE COFFSET5 2000H ORG UARIABLENBEREICH 32 DUP C?) BUAR DB 32 BYTES UUAR DU IB DUP C?) 16 UOERTER - 32 BYTES ORG 100H BEFEHLSBEREICH START: MOU AL,BK0N1 BYTE LADEN MOU BUAR,AL BYTE SPEICHERN MOU AH,BK0N2 BYTE LADEN MOU BUAR+1,AH BYTE SPEICHERN MOU UORT LADEN BX, UK0N1 MOU UUAR.BX UORT SPEICHERN XCHG BX, AX AX UND BX UERTAUSCHEN NOP TU NIX ; SEGMENTUORSAETZE MOU DL,BK0N1 DS AUTOMATISCH ZUGEORDNET MOU •L,CS :BK0N1 CS NEU ZUGEORDNET MOU •L,ES:BK0N1 ES NEU ZUGEORDNET MOU DL,SS:BK0N1 SS NEU ZUGEORDNET JMP EXIT RUECKSPRUNG MONITOR ; SYSTEMAUFRUFE INT RUECKSPRUNG MONITOR EXIT: 10H ENDS PROG ENDE DES SEGMENTES END START ENDE DES PROGRAMMS

Bild 4 - 2 3 :

P r o g r a m m b e i s p i e l : Datenvereinbarungen

Durch die O R G - A n w e i s u n g h a t die s y m b o l i s c h e A d r e s s e B V A R den Wert 2 0 0 0 H , der in den A d r e ß t e i l d e s M O V - B e f e h l s e i n g e t r a g e n wird. Der A s s e m b l e r kann zur Ü b e r s e t z u n g s z e i t zu s y m b o l i s c h e n A d r e s s e n K o n s t a n t e n addieren und s u b trahieren und die Ergebnisse in den Adreßteil der B e f e h l e e i n s e t z e n . Beispiel: MOV Der des der die MOV MOV

BVAR+1,AH

Lade das auf die Adresse BVAR folgende Byte mit AH

A s s e m b l e r s e t z t nun den Zahlenwert 2000H + 1 = 2001H in den A d r e ß t e i l M O V - B e f e h l s e i n . Das Programmbeispiel z e i g t w e i t e r h i n die Verwendung S e g m e n t v o r s ä t z e , u m d i e v o r g e g e b e n e Zuordnung der S e g m e n t r e g i s t e r für D a t e n a d r e s s i e r u n g zu ändern. Beispiele: DL,BK0N1 DL,CS:BK0N1

Vorgegebene Datenadressierung mit dem DS-Register Nimm anstelle von DS das Codesegmentregister CS

4.4 Die Übertragung von Daten

127

In der Praxis unterscheidet man oft drei Speicherbereiche: den Programmbereich bestehend aus den Befehlen (Code) und den Konstanten sowie den Variablenbereich mit den veränderlichen Daten, zu denen auch der Stapel zählt. Bei der Arbeit mit einem Personal Computer werden alle drei Bereiche von der Diskette in einen Schreib/Lesespeicher (Arbeitsspeicher) geladen. Bei einem Anwendungsrechner liegt der Programmbereich (Code und Konstanten) normalerweise in einem Festwertspeicher (EPROM), die Variablen und der Stapel müssen in einem Schreib/Lesespeicher (RAM) angeordnet werden. Liegen alle drei Bereiche in einem Segment, so können sie durch ORG-Anweisungen unterteilt werden, die die Lage (Offset) innerhalb des Segmentes festlegen. Sie lassen sich aber auch mit SEGMENT-Anweisungen auf verschiedene Segmente verteilen. Bei den modernen Betriebssystemen für Personal Computer ist es nicht möglich, eine bestimmte Ladeadresse (physikalische Speicheradresse) festzulegen. Adresse OOOC OOOß 000A adresse 0009 0008 adresse ^ 0007 0006 0005 0004 12345678H 0003 0002 1234H 0001 12H 0000

Anweisung

DD DW

DD DW DB

Inhalt HIGH-Byte LOW-Byte HIGH-Byte LOW-Byte HIGH-Byte LOW-Byte 12 34 55 78 12 34 12

Bemerkung Segment Offset Off set HIGH-Wort LOW-Wort HIGH-Byte LOW-Byte Byte

Bild 4-24: Anordnung der Daten im Arbeitsspeicher Daten und Adressen werden entsprechend Bild 4-24 mit dem niederwertigsten Byte zuerst im Arbeitsspeicher abgelegt. Bei einer in einem Doppelwort gespeicherten Adresse wird zuerst der Abstand (Offset) und dann das Segment abgelegt. In den Befehlen und Assembleranweisungen erscheinen Konstanten in der "natürlichen" Reihenfolge so, wie sie später auch in den Registern verarbeitet werden sollen. Bei Wort- und Doppel wo «konstanten vertauscht der Lader später die in der Ubersetzungsliste ausgegebene Reihenfolge. Bei der Ausführung der Befehle lädt der Prozessor zuerst den LOW-Teil der Register mit dem adressierten Byte und dann den HIGH-Teil der Register mit dem folgenden Byte.

4.4.3 Das Prozessoistatusreg ister Das Prozessorstatusregister besteht entsprechend Bild 4-25 aus 16 Anzeigebits (Flags), von denen nur neun verwendet werden; nur der Prozessor 80286 benutzt drei weitere Bits. Der niederwertige Teil des Registers enthält wie beim Prozessor 8085 die Sprungbedingungen für bedingte Sprünge:

128

4 Einßhrung in die maschinenorientierte Programmierung

j--Flagregister wie 8085-r -

Befehl CLC CMC STC CLD STD CLI STI LAHF SAHF PUSHF P0PF Bild 4-25:

-

-

Operand

O

D

I

-

T

0DITSZAPC 0 C 1 D 1

x ?

= -

13

dezimal

Wirkung operi = operi + oper2 operi = operi + oper2 + Carrybit operi = operi - oper2 operi = operi - oper2 - Carrybit Bilde die Differenz operi - oper2 Negiere den Operanden (Zweierkomplement) Lade AH mit dem Vorzeichenbit von AL Lade DX mit dem Vorzeichenbit von AX AX = AL * Byteregister oder Speicherbyte (DX+AX) = AX * Wortregister oder Speicherwort AL = AX / Bytereg. o. Speicherbyte AH = Rest AX = (DX+AX) / Wortreg. o. Sp.-wort DX = Rest

Arithmetische Befehle für Dualzahlen mit Vorzeichen

4.8 Datenverarbeitung

175

Für die Addition und Subtraktion gelten die gleichen B e f e h l e wie für vorzeichenlose Dualzahlen. Hinzu kommt der B e f e h l NEG ( N e g i e r e ) , der das Z w e i e r komplement bildet. Der in einem B y t e speicherbare Zahlenbereich liegt zwischen - 1 2 8 und +127 dezimal. In einem Wort läßt sich der Zahlenbereich von - 3 2 7 6 8 bis +32 767 dezimal ablegen. Der zulässige Zahlenbereich wird durch das O - B i t (Overflow) des S t a t u s r e g i s t e r s angezeigt, das Carrybit hat b e i vorz e i c h e n b e h a f t e t e n Zahlen keine Bedeutung. B e i O = 1 ist ein Zahlenüberlauf oder Zahlenunterlauf a u f g e t r e t e n ; bei 0 = 0 liegt das Ergebnis im zulässigen Bereich. Die mit I für I N T E G E R gekennzeichneten Multiplikations - und Divisionsbefehle für Dualzahlen mit Vorzeichen berücksichtigen die Vorzeichen der Operanden. Bei der. Ausdehnung von Byteoperanden zu Wortoperanden muß das A H - R e g i s t e r durch den B e f e h l CBW (Convert Byte to Word) mit dem Vorzeichenbit des A L R e g i s t e r s geladen werden. Der B e f e h l CWD (Convert Word to Doubleword) lädt das D X - R e g i s t e r mit dem Vorzeichenbit des A X - R e g i s t e r s .

4 . 8 . 4 Die Arbeit mit BCD-kodierten Dezimalzahlen Der Mikrocomputer a r b e i t e t durch den Aufbau der ALU intern im dualen Zahlensystem, der Benutzer verlangt jedoch eine dezimale Eingabe und Ausgabe der Zahlen auf der Konsole bzw. Drucker. Die Zeichendekodierung und Zahlenumwandlung werden durch Unterprogramme vorgenommen. Eine wesentliche Vereinfachung ergibt sich, wenn man das dezimale Zahlensystem beibehält und jede Dezimalziffer in 4 Bit kodiert. Wählt man dazu den BCD-Kode (Binär Codierte Dezimalziffer), bei dem bekanntlich j e d e Dezimalziffer durch die e n t sprechende vierstellige Dualzahl dargestellt wird, so kann man mit einem dualen Rechenwerk auch dezimal rechnen; jedoch sind zusätzliche Korrekturbefehle erforderlich. Bild 4 - 6 7 zeigt die beiden Möglichkeiten, BCD-Zahlen in einem Byte zu speichern und zu verarbeiten.

—|BCD-Ziffer

- Zehner

0

0

0

0

0

0

0

0

"0"

"0"

0

0

0

0

0

0

0

0

0

0

0

0

1 0

0

1

"9"

"9"

1

0

0

1

1 0

0

1

a. ungepackte Darstellung Bild 4 - 6 7 :

| — Einer



b. gepackte Darstellung

Darstellung von BCD-Zahlen in einem Byte

Die ungepackte Darstellung speichert eine Dezimalziffer in einem B y t e . Bei der üblichen Eingabe von Zahlen im ASCII-Code ergibt sich die B C D - Z i f f e r

176

4 Einßhrung in die maschinenorientierte

Programmierung

durch Subtraktion von 30H aus dem ASCII-Zeichen. Soll umgekehrt eine BCDZiffer als ASCII-Zeichen ausgegeben werden, so ist einfach 30H zu addieren. In der gepackten Darstellung befinden sich immer zwei Dezimalziffern in einem Byte. Bei der Eingabe müssen zwei ASCII-Zeichen dekodiert und zusammengeschoben werden. Für die Ausgabe sind die beiden Ziffern zu trennen und wieder als ASCII-Zeichen zu kodieren. Bild 4 - 6 8 zeigt die arithmetischen Befehle und die Korrekturbefehle für BCD-kodierte Dezimalzahlen.

Befehl ADD ADC DAA AAA SUB SBB DAS AAS HUL AAM AAD DIV

Bild 4-68:

Operand AL.byte AL.byte

OSZAPC xX X X X X xX X X X X •>X X >X X

AL.byte AL.byte

X X X )X X

?

X

X X X XX X 7 XXXX X

X "tX

?

byte

byte

X

•jl 1 X

?X X ?X X

X?

9 ??

* 7

X •J

Wirkung AL = AL + byte (Register.Konstante.SpeicherJ AL = AL + byte + Carryöit Dezimalkorrektur in AL gepackte Darstellung Dezimalkorrektur in AL ungepackte Darstellung AL = AL - byte (Register,Konstante,Speicher) AL = AI - byte - Carrybit Dezimalkorrektur in AL gepackte Darstellung Dezimalkorrektur in AL ungepackte Darstellung AX = AL * Byte Dezimalkorrektur in AL ungepackte Darstellung Dezimalkorrektur in AL ungepackte Darstellung AL = AX / byte nach Befehl AAD ungepackte D.

Arithmetische Befehle und Korrekturbefehle für BCD-Zahlen

Der Befehl DAA (Decimal Adjust for Addition) korrigiert zwei gepackte Dezimalziffern im AL-Register nach einer dualen Addition (ADD oder ADC). Ist die Summe größer als 99, so wird das Carrybit C = 1 gesetzt. Beispiel: MOV ADD DAA

AL,12H AL,19H

Lade AL mit der gepackten Dezimalzahl 12 Addiere zu AL die gepackte Dezimalzahl 19 Korrigiere die duale Summe zur dezimalen Summe 31

Der Befehl AAA (ASCII Adjust for Addition) korrigiert das AL-Register nach einer dualen Addition (ADD oder ADC) ungepackter Dezimalstellen, so daß eine ungepackte Dezimalziffer entsteht. Da das höherwertige Halbbyte von AL immer gelöscht wird, können die Operanden auch als ASCII-Zeichen vorliegen. Bei einem Übertrag (Ergebnis größer 9) wird das AH-Register um 1 erhöht, aber nicht korrigiert. Beispiel: MOV ADD AAA

AX.0039H AL,39H

Lade AL mit der Ziffer 9 im ASCII-Kode Addiere zu AL die Ziffer 9 im ASCII-Kode Korrigiere AL zur dezimalen Summe AH = 01

AL = 08

4.8 Datenverarbeitung

177

Der Befehl DAS (Decimal Adjust for Subtraction) korrigiert zwei gepackte Dezimalziffern im AL-Register nach einer dualen Subtraktion (SUB oder SBB). Ist die Differenz kleiner Null, so wird das Carrybit C = 1 gesetzt. Beispiel: MOV SUB DAS

AL,31H AL,19H

Lade AL mit der gepackten Dezimalzahl 31 Subtrahiere von AL die gepackte Dezimalzahl 19 Korrigiere die duale zur dezimalen Differenz 12

Der Befehl AAS (ASCII Adjust for Subtraction) korrigiert das AL-Register nach einer dualen Subtraktion (SUB oder SBB) ungepackter Dezimalstellen, so daß eine ungepackte Dezimalziffer e n t s t e h t . Da das höherwertige Halbbyte von AL immer gelöscht wird, können die Operanden auch als ASCII-Zeichen vorliegen. Bei einer negativen Differenz wird das AH-Register um 1 vermindert, aber nicht korrigiert. Beispiel: MOV SUB AAS

AX,0039H AL,34H

Lade AL mit der Ziffer 9 im ASCII-Kode Subtrahiere von AL die Ziffer 4 im ASCII-Kode Korrigiere AL zur dezimalen Differenz AH = 00

AL = 05

Für die Multiplikation und Division von BCD-kodierten Dezimalzahlen dürfen die Operanden nur in der ungepackten und bereits dekodierten (Nicht ASCII) Darstellung vorliegen. Der Befehl AAM (ASCII Adjust for Multiply) korrigiert das AX-Register nach einer dualen Byte-Multiplikation (MUL), so daß eine zweistellige ungepackte Dezimalzahl im AX-Register e n t s t e h t . Dabei wird das Ergebnis der dualen Multiplikation durch 10 dezimal dividiert. Die Zehnerstelle (Quotient) e r scheint im AH-Register; die Einerstelle (Rest) erscheint im AL-Register. Beide Stellen sind wieder ungepackte Dezimalziffern. Beispiel: MOV MOV MUL AAM

AL,09H BL,08H BL

Faktor 9 als ungepackte Dezimalstelle Faktor 8 als ungepackte Dezimalstelle Duale Multiplikation mit Ergebnis in AX Korrigiere AX dezimal; AH = 07 AL = 02

Der Befehl AAD (ASCII Adjust for Division) dient zur Vorbereitung einer dezimalen Byte-Division. Er wird vor dem Befehl DIV angewendet, der das AXRegister durch ein Byte dividiert. Der Befehl AAD multipliziert den Inhalt des AH-Registers mit 10 dezimal, addiert dazu den Inhalt des AL-Registers, bringt die Summe in das AL-Register und löscht das AH-Register. Der folgende Divisionsbefehl DIV dividiert dual das AX-Register durch ein Byte. Der Quotient erscheint im AL-Register. Der Rest wird im AH-Register gespeichert. Beides sind ungepackte Dezimalziffern. Beispiel:

178

4 Einfihrung in die maschinenorientierte Programmierung

MOV MOV AAD DIV

AX,0304H BL,05H

Dividend 34 in zwei ungepackten Dezimalstellen Divisor ist die ungepackte Dezimalstelle 5 Im AX erscheint 3 x 10 + 4 = 34 als Dualzahl Quotient im AL = 06 Rest im AH = 04 ungepackt dezimal

BL

Die

Korrekturbefehle

lassen

sich nur auf

ungepackte

Dezimalstellen oder

d e r g e p a c k t e n D a r s t e l l u n g auf z w e i s t e l l i g e D e z i m a l z a h l e n von 0 bis 9 9 im Register

anwenden.

Schleifen beginnend

Mehrstellige

BCD-kodierte

mit der wertniedrigsten

Dezimalzahlen

Stelle verarbeitet.

in

AL-

werden

durch

Mit H i l f e

des

C a r r y b i t s w e r d e n U b e r t r a g und B o r g e n z w i s c h e n den S t e l l e n ü b e r t r a g e n .

4.8.S

Dekodierung und Kodierung von A S C I I - Z i f f e r n

Zeichen 0 1 2 3 4 5 6 7 8 9

Bild 4 - 6 9 :

hexa 30 31 32 33 34 35 36 37 38 39

Bitmuster 0011 0000 0011 0001 0011 0010 0011 0011 0011 0100 0011 0101 0011 0110 0011 0111 0011 1000 0011 1001

dual 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

Zeichen A B C D E F a b c d e f

hexa 41 42 43 44 45 46 61 62 63 64 65 66

Bitmuster 0100 0001 0100 0010 0100 0011 0100 0100 0100 0101 0100 0110 0110 0001 0110 0010 0110 0011 0110 0100 0110 0101 0110 0110

dual 1010 1011 1100 1101 1110 1111 1Ö1Ö 1011 1100 1101 1110 1111

A S C I I - C o d e d e r D e z i m a l - und H e x a d e z i m a l z i f f e r n

D i e Ü b e r t r a g u n g von Z e i c h e n z w i s c h e n d e m M i k r o c o m p u t e r und d e m B e d i e n u n g s terminal

geschieht

f a s t ausschließlich im A S C I I - C o d e . Bild 4 - 6 9 z e i g t d i e

Ko-

d i e r u n g e n d e r D e z i m a l z i f f e r n und d e r z u s ä t z l i c h b e i H e x a d e z i m a l z a h l e n v e r w e n deten

Buchstaben

A bis F ; a n s t e l l e der

Großbuchstaben

werden o f t

auch

die

K l e i n b u c h s t a b e n von a bis f z u g e l a s s e n . D i e s e r A b s c h n i t t z e i g t die A u s g a b e und E i n g a b e von H e x a d e z i m a l z a h l e n , w i e sie b e i M o n i t o r p r o g r a m m e n v e r w e n d e t

wer-

d e n , b e i d e n e n o f t mit S p e i c h e r a d r e s s e n und S p e i c h e r i n h a l t e n g e a r b e i t e t den

muß. Eine b i n ä r e Ein/Ausgabe w ä r e zu lang und zu u n ü b e r s i c h t l i c h .

faßt

man j e w e i l s v i e r

B i n ä r s t e l l e n zu e i n e r

werDaher

H e x a d e z i m a l z i f f e r zusammen. Der

d e z i m a l e Z a h l e n w e r t ist d a b e i in d e n m e i s t e n F ä l l e n ohne B e d e u t u n g . Bild 4 - 7 0 z e i g t ein System bytes

von U n t e r p r o g r a m m e n

(4 B i t ) , B y t e s

zur h e x a d e z i m a l e n A u s g a b e von

(8 B i t ) und W ö r t e r n

(16 B i t ) als A S C I I - Z e i c h e n

Halb-

auf

der

K o n s o l e . W e r d e n nur d i e K o d i e r u n g e n d e r D e z i m a l z i f f e r n von 0000 bis 1001 v e r w e n d e t , so können d i e P r o g r a m m e auch zur A u s g a b e von D e z i m a l z i f f e r n d i e n e n .

179

4.8 Datenverarbeitung

; BILD 4-70 A U S G A B E - U N T E R P R O G R A M M E MIT ZEICHENKODIERUNG PROG SEGMENT PROGRAMMSEGMENT ASSUME CS : PROG,DS:PROG,ES :PROG,SS:PROG TEST-HAUPTPROGRAMM ORG 100H START : XOR AX, AX AX L O E S C H E N LOOP : AUSNZ CALL NEUE Z E I L E CR UND LF CALL AUSWD AX H E X A D E Z I M A L AUSGEBEN ADD AX, 1 ADDIERE 1 JNC LOOP S C H L E I F E SOLANGE KEIN UEBERTRAG JMP EXIT BEI U E B E R T R A G ENDE DES P R O G R A M M S ORG 200H UNTERPROGRAMME ; A U S N R - R E C H T E S HALBBYTE UON A L UMWANDELN UND AUSGEBEN AUSNR: PUSH AX AX R E T T E N AND AL.OFH MASKE OOOO 1111 LINKES HALBBYTE 0 ADD AL.30H NACH ASCII CODIEREN CMP AL,'3' ZIFFERNBEREICH UON 0 BIS 9 ? JBE AUSN1 JA: FERTIG ADD AL,07H NEIN: BUCHSTABENBEREICH ZEICHEN AUSGEBEN AUSN1: CALL AUSZ POP AX AX ZURUECK RUECKSPRUNG RET ; A U S N L - LINKES HALBBYTE UON AL UMWANDELN UND A U S G E B E N AUSNL: PUSH AX AX RETTEN LINKES H A L B B Y T E NACH RECHTEM H A L B B Y T E SHR AL, 1 SHR AL, 1 SHR AL, 1 SHR AL, 1 RECHTES H A L B B Y T E AUSGEBEN CALL AUSNR POP AX AX ZURUECK RUECKSPRUNG RET ; AUSBY - B Y T E AUS AL UMWANDELN U N D MIT 5 ZEICHEN AUSGEBEN AUSBY: CALL AUSNL LINKES H A L B B Y T E UMWANDELN UND A U S G E B E N CALL AUSNR RECHTES H A L B B Y T E UMWANDELN UND A U S G E B E N RUECKSPRUNG RET ; A U S W D - DORT AUS AX UMWANDELN U N D MIT 4 ZEICHEN AUSGEBEN HIGH-BYTE U N D LOW-BYTE UERTAUSCHEN AUSWD: XCHG AH, AL H I G H - B Y T E A U S AL AUSGEBEN CALL AUSBY XCHG AH, AL LOW-BYTE UND HIGH-BYTE VERTAUSCHEN CALL AUSBY L O W - B Y T E AUS AL AUSGEBEN RET RUECKSPRUNG ; AUSNZ - N E U E Z E I L E MIT W A G E N R U E C K L A U F UND ZEILENUORSCHUB AX R E T T E N AUSNZ: PUSH AX MOU WAGENRUECKLAUF AL.ODH AUSZ AUSGEBEN CALL MOU AL,OAH ZEILENUORSCHUB CALL AUSZ AUSGEBEN POP AX AX ZURUECK RET RUECKSPRUNG : SYSTEMPROGRAMME 17H ZEICHEN AUS A L AUSGEBEN AUSZ: INT RET RUECKSPRUNG 10H RUECKKEHR MONITOR EXIT: INT ENDS ENDE DES SEGMENTES PROG END ENDE D E S P R O G R A M M S START Bild 4-70:

Das

Unterprogramme zur Ausgabe von H e x a d e z i m a l z i f f e r n

Test-Hauptprogramm

gibt

in einer

S c h l e i f e die

Hexadezimalzahlen

von

0000 bis F F F F aus. Der Kern der Ausgabeprogramme ist das Unterprogramm A U S N R , das das rechte Halbbyte von A L in ein ASCII-Zeichen umwandelt und mit H i l f e des Systemprogramms A U S Z auf der Konsole ausgibt. Das U n t e r p r o gramm A U S N L gibt das linke Halbbyte von A L aus, das dazu um vier Bit nach

180

4 Einßhrung

in die maschinenorientierte

Programmierung

rechts geschoben und dann durch den Aufruf von AUSNR ausgegeben wird. Für die Ausgabe eines Bytes aus AL werden nun die beiden Unterprogramm AUSNL (Linkes Halbbyte) und AUSNR (Rechtes Halbbyte) verwendet. Das Unterprogramm AUSWD zur Ausgabe eines Wortes aus dem AX-Register ruft zweimal das Unterprogramm zur Ausgabe eines Bytes aus AL auf. Dazu kommt das Unterprogramm AUSNZ, das einen Wagenrücklauf und einen Zeilenvorschub ausgibt. Bild 4 - 7 1 zeigt die Struktur der Ausgabeunterprogramme.

Bild 4 - 7 1 :

Die Struktur der Ausgabeunterprogramme

; BILD 4 - 7 2 EINGABE-UNTERPROGRAMME MIT ZEICHENDEKODIERLING PROG SEGMENT ; PROGRAMMSEGMENT ASSUME CS: PRQG, DS: PROG , ES: PROG, S S : PRDG SPEICHER FUER TESTDATEN ORG 300H • U 1 5 8 DUP C ? ) TAB 12B UIOERTER RESERUIERT ORG 100H TEST-HAUPTPROGRAMM START: LEA BX,TAB ANFANGSADRESSE TESTSPEICHER LOOP: CALL AUSNZ NEUE Z E I L E MOU AL, EINGABEMARKE • CALL AUSZ AUSGEBEN CALL EINUD WORT LESEN UND DEKODIEREN NACH AX JC ERROR FEHLER: KEINE HEXAEINGABE MOU CBXD,AX WORT NACH TESTSPEICHER ADD BX,S NAECHSTE WORTADRESSE JMP LOOP EINGABESCHLEIFE CMP ERROR: AL,'•' ENDEMARKE • ? JNE NEXT N E I N : lilEITER JMP JA: FERTIG EXIT NEXT: MOU AL,07H A S C I I - C O D E FUER HUPE AUSZ CALL AUSGEBEN JMP LOOP EINGABESCHLEIFE

4.8 Datenverarbeitung

ORG EOOH ; EINGABE-UNTERPROGRAMME E I N Z I _ - ZIFFER L E S E N UND NACH AL U M W A N D E L N C - l : F E H L E R EINZIH - EINSPRUNG H E X A D E Z I M A L E E I N G A B E EINZIH: CALL EINZ Z E I C H E N NACH A L L E S E N AU5Z IM ECHO AUSGEBEN CALL AL,"A' B U C H S T A B E N B E R E I C H PRUEFEN CMP EINZID KLEINER: Z I F F E R N B E R E I C H PRUEFEN JB AL,'F' GROSSBUCHSTABE ? CMP EINZI1 NEIN: K L E I N B U C H S T A B E P R U E F E N JA AL,37H GROSSBUCHSTABE DEKODIEREN SUB EINZI2 FERTIG JMP AL,'a' EINZI1: C M P KLEINBUCHSTABE ? EINZIF JB NEIN: EINGABEFEHLER AL, ' f CMP KLEINBUCHSTABE ? EINZIF JA NEIN: EINGABEFEHLER AL,57H JA: K L E I N B U C H S T A B E D E K O D I E R E N SUB EINZIB FERTIG JMP EINZID - EINSPRUNG D E Z I M A L E EINGABE AL , ' 0 " ZIFFERNBEREICH ? EINZID: C M P EINZIF NEIN: E I N G A B E F E H L E R JB CMP ZIFFERNBEREICH ? AL,'S' JA EINZIF NEIN: E I N G A B E F E H L E R SUB JA: ZIFFER D E K O D I E R E N AL,30H ; AUSGANG MIT GUELTIGEM WERT IN A L CARRY - 0 CARRY - 0 EINZIE: C L C : RET RUECKSPRUNG ; FEHLERAUSGANG AL - Z E I C H E N CARRY - 1 CARRY - 1 EINZIF: S T C RET RUECKSPRUNG ; EINBY - E HEXAZIFFERN L E S E N UND NACH A L D E K O D I E R E N EINBY: CALL EINZIH HIGH-TEIL LESEN JC EINGABEFEHLER EINBY2 PUSH CX CX RETTEN CH, AL MOU HIGH-TEIL RETTEN CALL EINZIH LDUI-TEIL L E S E N JC EINBY1 EINGABEFEHLER MOU CL,4 UERSCHIEBEZAEHLER SHL CH.CL HIGH-BYTE NACH LINKS SCHIEBEN B E I D E TEILE M I S C H E N OR AL, CH CX ZURUECK L A D E N EINBY1: P D P CX RUECKSPRUNG EINBY2: RET ; EINWQ - 4 ZIFFERN LESEN UND NACH AX D E K O D I E R E N EINUJD: C A L L EINBY H I G H - B Y T E NACH AL LESEN JC EINkIDl EINGABEFEHLER MOU AH, AL H I G H - B Y T E N A C H AH EINBY CALL LOUI-BYTE NACH AL LESEN RUECKSPRUNG EINIÜD1 : R E T ; AUSNZ - NEUE ZEILE MIT U A G E N R U E C K L A U F UND Z E I L E N U O R S C H U B AX RETTEN AUSNZ: P U S H AX MOU UAGENRUECKLAUF AL,ODH CALL AUSZ AUSGEBEN MOU AL,OAH ZEILENUORSCHUB CALL AUSZ AUSGEBEN POP AX AX ZURUECK RET RUECKSPRUNG ; SYSTEMPROGRAMME EINZ: INT 11H Z E I C H E N NACH A L LESEN RET RUECKSPRUNG AUSZ : INT 17H Z E I C H E N AUS AL AUSGEBEN RET RUECKSPRUNG EXIT: INT 10H RUECKKEHR MONITOR PROG ENDS E N D E D E S SEGMENTES END START ENDE DES PROGRAMMS

Bild 4 - 7 2 :

Unterprogramme zur Eingabe von Hexadezimalzahlen

181

182

4 Einßhrung in die maschinenorientierte

Programmierung

Bei der Eingabe von Hexadezimalzahlen muß damit gerechnet werden, daß der Benutzer einen Eingabefehler macht, d.h. ein Zeichen eingibt, das keine Hexadezimalziffer darstellt. Das in Bild 4-72 dargestellte System von EingabeUnterprogrammen benutzt des Carrybit als Fehlermarke. Ist beim Rücksprung C = 0, so war die Eingabe gültig, und es wird der dekodierte Zahlenwert in dem vereinbarten Register übergeben. Ist jedoch C = 1, so wurde eine Nicht - H e x a dezimalziffer erkannt. Sie wird im AL-Register zur weiteren Auswertung übergeben. Das Test-Hauptprogramm läßt in diesem Fall die Hupe ertönen.

4.8.6 Übungen zum Abschnitt Datenverarbeitung 1. Aufgabe: Bei der Zusammenarbeit mit einem Terminal ist es wichtig, die Kodierungen der Tasten zu kennen. Man entwickle ein Programm, das auf einer neuen Zeile das auf der Tastatur angeschlagene Zeichen im Echo und dazu den hexdezimalen und binären Tastencode ausgibt. Bei allen Steuerzeichen kleiner 20H soll das Echo unterdrückt werden, 2. Aufgabe: Man gebe auf jeweils einer neuen Zeile nacheinander die Dezimalzahlen von 1 bis 24 auf der Konsole aus. 3. Aufgabe: Man lese Dezimalzahlen von 1 bis 9 ein und gebe entsprechend viele Sterne auf einer neuen Zeile aus. Man beachte, daß bei der Eingabe der Zahl 0 keine Sterne auszugeben sind.

4.9 Interrupt und Interruptbefehle

4.9

183

Interrupt und Interruptbefehle

Dieser Abschnitt kann nur einen Uberblick über die Möglichkeiten der I n t e r ruptsteuerung geben. Einzelheiten müssen den D a t e n b l ä t t e r n der Prozessoren entnommen werden, da die Prozessoren der 8086-Familie sich gerade in diesem Betriebszustand z.T. unterschiedlich verhalten können. Ein Interrupt bedeutet eine Unterbrechung des laufenden Programms durch ein Steuersignal oder durch einen Interruptbefehl mit der Möglichkeit, das Programm später fortzusetzen. Eine Sonderstellung nimmt das in Bild 4 - 7 3 dargestellte Reset-Signal ein.

Start-EPROM Adresse Inhalt F FFFF F F F F F F

RESET

ES

|0000 |

FFF5 FFF4 FFF3 FFF2 FFF1 FFFO

| FFFF0I

DS |0000 | CSj FFFF | SS

loooo |

Status |0000 |

Bild 4-73:

CS-HIGH CS-LOW PC-HI GH PC-LOW JMP

physikalische Speicheradresse

PC 10000 | Mikroprozessor 8086

Neustart des Prozessors durch ein Reset-Signal

Reset bedeutet zurücksetzen in einen Grundzustand. Bei einem Reset wird das gerade laufende Programm sofort abgebrochen, ohne daß die Möglichkeit einer Fortsetzung b e s t e h t . Das Datensegmentregister DS, das Extrasegmentregister ES, das Stapelsegmentregister SS und das Statusregister werden gelöscht. Ihr Inhalt ist 0000H. Dabei werden durch Löschen des Interruptbits (I = 0) der INTR-Interrupt und durch Löschen des Einzelschrittbits (T = 0) die Einzelschrittsteuerung gesperrt. Das Codesegmentregister CS wird mit Einerbits g e füllt ( F F F F H ) , der Befehlszähler wird gelöscht (OOOOH). Die sich daraus e r g e bende physikalische Speicheradresse F FFFOH wird auf den Adreßbus gelegt und adressiert den e r s t e n auszuführenden Befehl. Dies ist in der Regel ein unbedingter Intersegmentsprungbefehl, der zur eigentlichen Startadresse des Pro-

184

4 Einführung in die maschinenorientierte Programmierung

gramms führt. Da beim Einschalten der Versorgungsspannung der erste B e f e h l von der Adresse F FFFOH geholt wird, muß an dieser Stelle ein F e s t w e r t s p e i cherbaustein ( E P R O M ) vorgesehen werden. Der Inhalt der anderen Register des Prozessors ist nicht b e s t i m m t . A m Eingang des Taktgeberbausteins liegt meist ein E n t p r e l l f l i p f l o p bzw. eine Autoresetschaltung, die den RES-Eingang beim Einschalten der spannung

Versorgungs-

für einige Z e i t auf LOW hält. Das RES-Signal wird mit dem T a k t

synchronisiert und erscheint invertiert als RESET-Signal am Eingang des P r o z e s sors. Wird R E S = L O W (RESET = H I G H ) , so geht der Prozessor in einen inaktiven Zustand, in dem die Busleitungen t r i s t a t e und die Steuerleitungen inaktiv geschaltet werden. Der Start des Programms ab Adresse F FFFOH beginnt mit der steigenden Flanke von RES, also der fallenden Flanke von RESET. D i e beiden in Bild 4 - 7 4 dargestellten Interrupteingänge NMI und I N T R dienen zur Unterbrechung des laufenden Programms durch Steuersignale. Der NMI-Interrupt ist positiv Potential

flankengesteuert und muß mindestens zwei T a k t e lang auf gehalten

werden. Der I N T R - I n t e r r u p t

ist positiv

und muß bis zu seiner Ausführung auf HIGH gehalten werden.

Bild 4-74:

Hardware-Interrupt durch NMI und I N T R

HIGH-

zustandsgesteuert

4.9 Interrupt und Interruptbefehle

185

Der nicht maskierbare Interrupt NMI ist nicht sperrbar und hat gegenüber dem durch das I - B i t des Statusregisters sperrbaren Interrupt I N T R die höhere P r i o rität. In beiden Fällen werden nach Beendigung des laufenden Befehls Interruptp r o g r a m m e g e s t a r t e t , deren Startadressen in einer V e k t o r t a b e l l e abzulegen sind. Diese l i e g t im unteren Adreßbereich von 0 0000H bis 0 0 3 F F H , der bei Personal Computern und Entwicklungssystemen meist als Schreib/Lesespeicher ausgeführt wird, um die Startadressen der Interruptprogramme für Änderungen zugänglich zu machen. Es sei nochmals besonders hervorgehoben, daß in dieser V e k t o r t a b e l l e nur die Startadressen bestehend aus Segmentadresse ( C S ) und O f f s e t ( P C ) angeordnet sind. Sie stellen Z e i g e r ( V e k t o r e n ) auf die eigentlichen Interruptp r o g r a m m e dar, die sich auf beliebigen Adressen des gesamten S p e i c h e r b e r e i ches befinden können. Die Startadresse des durch den nicht sperrbaren Interrupt NMI zu startenden Programms l i e g t in der V e k t o r t a b e l l e auf den Adressen 0 0008H bis 0 000BH. Die Startadressen der I N T R - I n t e r r u p t p r o g r a m m e

werden durch eine Kennzahl

b e s t i m m t , die über den unteren Datenbus (DO bis D7) eingelesen wird. Sie wird bei vielen Anwendungen g e l i e f e r t von einem Interrupt-Steuerbaustein, an den mehrere

Interruptquellen

angeschlossen sind. Der

Steuerbaustein

liefert

zu-

nächst das I N T R - S i g n a l an den Prozessor. Nach Beendigung des laufenden B e fehls wird das I - B i t

des Statusregisters untersucht. Ist der

Interrupt durch

I = 0 gesperrt, so wird der nächste B e f e h l ausgeführt. Ist der Interrupt durch I = 1 f r e i g e g e b e n , so werden f o l g e n d e Schritte durchgeführt: 1. Schritt: Im

Minimumbetrieb

besonderen

wird die Steuerleitung I N T A

aktiv und f o r d e r t von einer

Schaltung (Steuerbaustein) eine 8 - B i t - K e n n z a h l über den unteren

Datenbus an. Im Maximumbetrieb l i e f e r n die Statusleitungen SO, S1 und S2 e i nen entsprechenden multiplizierte sich die

INTA-Code.

Die durch Anhängen von zwei Nullen mit 4

Kennzahl ist gleich der Adresse in der V e k t o r t a b e l l e , auf der

Startadresse

des Interruptprogramms

b e f i n d e t . Dieser e r s t e Schritt

e n t f ä l l t bei allen Interruptvorgängen ( N M I , Interruptbefehle,

Fehlerzustände),

bei denen die Vektoradresse bereits f e s t l i e g t . 2. Schritt: In zwei Lesezyklen werden der O f f s e t ( P C ) und das Segment ( C S ) aus der V e k t o r t a b e l l e geholt und im Prozessor zwischengespeichert. 3. Schritt: Das Statusregister Interruptbit

wird auf den Stapel g e r e t t e t

( I - B i t ) und das Einzelschrittbit

( k o p i e r t ) . Dann werden das

(T-Bit)

gelöscht. Damit ist der

Prozessor für w e i t e r e I N T R - I n t e r r u p t s und für den Einzelschrittbetrieb zunächst gesperrt. 4. Schritt: In z w e i Schreibzyklen werden das alte Codesegmentregister ( C S ) und der a l t e Befehlszähler ( P C ) auf den Stapel g e r e t t e t .

186

4 Einfiihrung in die maschinenorientierte

Programmierung

5. Schritt: Das Codesegmentregister und der Befehlszähler werden mit den aus der Vektortabelle geholten Adressen geladen, und die Arbeit wird mit dem dadurch adressierten Befehl fortgesetzt. Alle anderen Register des Prozessor - bis auf das I- Bit und das T-Bit - bleiben unverändert erhalten und müssen vom Interruptprogramm in den Stapel gerettet werden, wenn das unterbrochene Programm später ungestört fortgesetzt werden soll. Die Zeit zwischen dem Auftreten des Interruptsignals bis zum Start des Interruptprogramms hängt im wesentlichen von dem Befehl ab, der zu diesem Zeitpunkt gerade abläuft. Dabei können sich bei den Befehlsvorsätzen SEG, REP und LOCK Schwierigkeiten ergeben. Nach Beendigung des laufenden Befehls vergehen noch etwa 60 Taktzyklen bis zum Start des Interruptprogramms. Durch eine 8-Bit-Kennzahl ergeben sich 256 Vektoradressen und damit 256 verschiedene INTR-Interruptprogramme. Die gleiche Vektortabelle wird entsprechend Bild 4-75 für den Start von Interruptprogrammen verwendet, die durch einen Interruptbefehl bzw. durch besondere Prozessorzustände ausgelöst werden. In diesen Fällen liegt die Vektoradresse bereits fest und wird nicht mehr als Kennzahl über den Datenbus eingelesen; der 1. Schritt der Interruptfolge e n t fällt. Ein Interrupt TYPO wird ausgelöst durch einen Überlauf bei einem Divisionsbefehl. Dies können sein eine Division durch Null oder bei einem DIV-Befehl ein Quotient größer OFFH (OFFFFH) oder bei einem IDIV-Befehl ein Quotient grösser 7FH (7FFFH). Ein Interrupt TYP1 wird ausgelöst, wenn das T-Bit des Statusregisters 1 ist. Nach Ablauf des folgenden Befehls führt der TYP1-Interrupt meist zurück in den Monitor. Mit dieser Einrichtung kann ein Programm im Einzelschritt getestet werden. Einzelheiten dieser Einzelschrittsteuerung müssen den Datenblättern entnommen werden. Der Interrupt TYP2 ist identisch mit dem NMI-Interrupt. Ein Interrupt TYP3 wird ausgelöst durch den Befehl INT 3 mit dem Kode OCCH. Dieser 1-Byte-Befehl wird meist vom Monitor als Haltepunkt in Benutzerprogramme eingebaut und bricht das Programm an dieser Stelle ab und führt in den Monitor zurück. Ein Interrupt TYP4 wird ausgelöst durch den Befehl INTO, wenn gleichzeitig das Uberlaufbit (Overflow) des Statusregisters einen Überlauf in der vorzeichenbehafteten Arithmetik anzeigt. Ist das O-Bit gelöscht, so wird das laufende Programm ungestört fortgesetzt. Nach einer Empfehlung des Herstellers sollen die Interrupts TYP5 bis TYP31 bei den Prozessoren 8086 und 8088 nicht verwendet werden, da sie für spätere Erweiterungen reserviert sind. Die in diesem Bereich liegenden Interruptvekto-

4.9 Interrupt und Interruptbefehle

187

Bild 4-75: Vektortabelle für S o f t w a r e - I n t e r r u p t s

ren der Prozessoren 80186 und 80286 (z.B. ungültiger Funktionskode, Speicherschutzverletzung) können den Datenblättern der Prozessoren entnommen werden, Die Interrupts TYP32 bis TYP255 werden normalerweise durch den INT-Befehl ausgelöst, der mit anderen Sonderbefehlen in Bild 4 - 7 6 zusammengestellt ist. Der Befehl INT (INTerrupt) enthält im Operandenteil eine Bytekonstante, die als Kennzahl mit 4 multipliziert die Adresse des Startvektors e r g i b t , aus dem die Startadresse des Interruptprogramms zu holen ist. Dabei werden wie bei e i nem Hardware-Interrupt das Statusregister, das Codesegmentregister und der Befehlszähler auf den Stapel g e r e t t e t . Der Interruptbefehl ist also als e r w e i t e r t e r CALL-Befehl für den Aufruf eines I n t e r s e g m e n t - U n t e r p r o g r a m m s anzusehen mit dem Unterschied, daß der Operandenteil nicht die Sprungadresse, sondern eine Kennzahl e n t h ä l t , mit der der Vektor b e s t i m m t wird, der die

188

4 Einfährung in die maschinenorientierte

Befehl ÏNTÔ INT INT IRET STI CLI HAIT HLT ESC LOCK

Operand 3 zahl

code

0SZAPC

Programmierung

Wirkung Interrupt wenn U-Bit = 1: Vektor in ü UU1UH Interrupt OCCH Haltepunkt: Vektor in 0 000CH Software-Interrupt: Vektor in 4 * zahl Rücksprung vom Interrupt: POP PC ,CS, Status 1 = 1 : INTR-Interrupt freigegeben I = 0: INTR-Interrupt gesperrt Warten bis TEST-Eingang Low (vom 8087) Warten bis RESET oder NMI oder INTR Escape-Befehlsvorsatz für 8087-Befehle Befehlsvorsatz für LOCK-Ausgang

Bild 4-76: Interruptbefehle und Sonderbefehle

Sprungadresse enthält. Die Interruptbefehle werden oft zur Verbindung von Benutzerprogrammen mit dem Betriebssystem (z.B. MS-DOS) verwendet. Der Befehl IRET (Interrupt RETum) steht am Ende eines Interruptprogramms und lädt den Befehlszähler, das Codesegmentregister und das Statusregister aus dem Stapel zurück und setzt damit das unterbrochene bzw. aufrufende Programm fort. Der Befehl WAIT (Warte) untersucht den TEST-Eingang des Prozessors, der mit dem arithmetischen Coprozessor 8087 verbunden werden kann. Ist der TESTEingang HIGH, so wartet der Prozessor, bis der Eingang auf LOW geht. Der Befehl HLT (HaLT) bringt den Prozessor in einen Wartezustand, der nur durch ein Reset, einen NMI- oder einen freigegebenen INTR-Interrupt wieder verlassen werden kann. Der Befehl ESC (ESCape gleich umschalten) dient zur Zusammenarbeit mit Coprozessoren wie z.B. dem arithmetischen Coprozessor 8087. Der Befehl enthält einen Code und eine Speicheradresse, die nur von den Coprozessoren ausgewertet werden. Einzelheiten siehe Abschnitt 5.6. Der Vorsatz LOCK (Sperren) kann vor jeden Befehl gesetzt werden und bewirkt, daß der Ausgang LOCK des Prozessors während des folgenden Befehls auf LOWPotential gelegt wird. Damit ist es z.B. möglich, den Zugriff auf Speichersteilen, die bestimmte Zeiger (Semaphore) enthalten, für andere Zugriffe zu sperren.

4.10

Die zusätzlichen Befehle der Prozessoren 80186 und 80286

Die in Bild 4-77 zusammengestellten Befehle gelten für beide Prozessoren. Die beiden Stringbefehle INS und OUTS ermöglichen die Eingabe und Ausgabe von

189

4.10 Die zusätzlichen Befehle der Prozessoren 80186 und 80286

Strings (Zeichenketten) über einen Peripherieport, dessen Adresse im D X - R e g i ster abzulegen ist. Bei Verwendung der REP-Vorsätze sind die Ubertragungsgeschwindigkeiten der Schnittstellen zu berücksichtigen. Mit den PUSH-Befehlen lassen sich auch Konstanten auf den Stapel legen. Der Befehl PUSHA

rettet

alle Register in den Stapel und kann am Anfang eines Unterprogramms oder Interruptprogramm stehen. Mit dem Befehl POPA werden alle Register bis auf den Stapelzeiger wieder zurückgeladen. Der Befehl IMUL kann zusätzliche F a k toren im Operandenteil enthalten. Bei allen Schiebebefehlen kann die Zahl der Verschiebungen als Bytekonstante im Operandenteil des Befehls angegeben w e r den. Der Befehl BOUND prüft, ob der Inhalt eines Wortregisters innerhalb eines definierten Bereiches liegt. Die Befehle ENTER und L E A VE legen Speicherbereiche im Stapel an bzw. geben sie wieder f r e i , die für die Übergabe von Parametern und für lokalen Arbeitsspeicher von Unterprogrammen verwendet w e r den. Weitere Einzelheiten dieser zusätzlichen Befehle sind den Unterlagen des Herstellers zu entnehmen. Der Prozessor 80286 kennt die beiden Betriebszustände " R e a l Address Mode" und "Protected

Mode". Im " R e a l Address Mode" verhält sich der Prozessor

wie die anderen Prozessoren der 8086-Familie. Durch softwaremäßiges

Um-

schalten eines zusätzlichen Bits im Statusregister gelangt man in den " P r o t e c ted Virtual Address Mode" mit folgenden zusätzlichen Eigenschaften, die für das Betriebssystem vorgesehen und dem Benutzer normalerweise nicht zugänglich sind. - erweiterter Adreßbereich, - Verwaltung eines virtuellen Speicherbereiches, - Schutz von Speicherbereichen gegen unberechtigten Z u g r i f f , - Verwaltung mehrerer Prozesse (Tasks), - zusätzliche geschützte Kontrollregister und - zusätzliche geschützte Befehle für Kontrollaufgaben.

Befehl INS OUTS PUSH PUSHA POPA IMUL 1HUL schieben

BOUND

ENTER LEAVE

Bild 4-77:

Operand

OSZAPC

Wirkung

X

X

X

X

Lade (ES.-DI) mit Bytes oder Wörtern Port (DX) Speichere Bytes/Wörter (DS:SI) nach Port (DX) Lege Konstante (Byte/Wort) auf Stapel SP=SP-2 Lege alle 8 Register auf Stapel SP=SP-16 Hole alle 8 Register vom Stapel SP=SP+16 Wortregister = Wortregister * Bytekonstante Wortregister = Speicherwort * Konstante Bytekonstante ist Schiebezähler: alle Befehle Vergleiche Wortregister mit Speicheradressen Lege Speicherbereich im Stapel an Gib Speicherbereich im Stapel frei

(adresse.DX) (DX.adresse) konstante

wortreg,byte wreg,wort,kon oper,konstante Operand Operand

Zusätzliche Befehle der Prozessoren 80186 und 80286

5

Aiiwendungsbeispiele

Dieses Kapitel zeigt einige Schaltungen und P r o g r a m m e mit Prozessoren der 8 0 8 6 - F a m i l i e . Dabei wurde mehr Wert auf eine a u s f ü h r l i c h e Beschreibung als auf eine möglicht große Anzahl von Beispielen g e l e g t . Das K a p i t e l " E r g ä n z e n d e und w e i t e r f ü h r e n d e L i t e r a t u r " e n t h ä l t w e i t e r e Anregungen.

5.1

Parallele und serielle Datenübertragung

Widerstand

Datenbus

Bild 5 . 1 - 1 :

P r o g r a m m i e r m o d e l l der P a r a l l e l s c h n i t t s t e l l e 8255

Bei der Ü b e r t r a g u n g von D a t e n zwischen einem Mikrorechner und einem G e r ä t ist dieses in vielen F ä l l e n e b e n f a l l s mit einem M i k r o c o m p u t e r a u s g e r ü s t e t . Für die dabei a u f t r e t e n d e n Probleme der Z e i t - und F o r m a t a n p a s s u n g werden o f t p r o g r a m m i e r b a r e S c h n i t t s t e l l e n b a u s t e i n e v e r w e n d e t . Dieser Abschnitt zeigt die A r b e i t mit der P a r a l l e l s c h n i t t s t e l l e 8255 und der S e r i e n s c h n i t t s t e l l e 8251A, die beide zur B a u s t e i n f a m i l i e der 8086-Prozessoren gehören und ursprünglich für

5.1 Parallele und serielle

Datenübertragung

191

die 8-Bit-Prozessoren 8080 und 8085 entwickelt wurden. Normalerweise werden die Peripheriebausteine mit dem Auswahlsignal M/IO = LOW freigegeben und können dann nur durch die Peripheriebefehle IN und OUT angesprochen werden. Liegen sie jedoch im Adreßbereich der Speicherbausteine, so sind alle für Speicherstellen verfügbaren Befehle auch auf Peripheriebausteine anwendbar. Die Parallelschnittstelle 8255 enthält entsprechend Bild 5.1-1 insgesamt 24 Peripherieleitungen, die auf drei Kanäle - auch Ports oder Seiten genannt verteilt sind. Die Register der Schnittstelle sowie die zum Datenbus führenden Datenleitungen sind 8 Bit lang. Der Baustein kann bei 16-Bit-Systemen wahlweise an den oberen oder an den unteren Datenbus angeschlossen werden. Mit je einem Baustein am unteren und am oberen Datenbus ist die Übertragung von 16-Bit-Wörtern von und zur Peripherie möglich. Die Schnittstelle 8255 e n t hält vier 8 - B i t - R e g i s t e r , die durch zwei Adreßleitungen ausgewählt werden. Die restlichen oberen Adreßleitungen bestimmen entsprechend der Adreßdekodierung die Adresse des Bausteins. Bild 5.1.-2 zeigt die Adressen der Register.

Adresse xxxxxxOO xxxxxxO1 x x x x x x 10 xxxxxx 1 1 xxxxxx11

Register Datenregister Datenregister Datenregister schreiben:

A-Port B-Port C-Port

Kommandoregister

Bild 5.1-2: Die Registeradressen der Parallelschnittstelle 8255

Bei einem 8-Bit-System (8085, 8088) werden die Anschlüsse A0 und AI der Schnittstelle an die Adreßleitungen A0 und AI angeschlossen. Die Register b e finden sich auf fortlaufenden Adreßplätzen, also z.B. 40H, 41H, 42H und 43H. Bei 16-Bit-Systemen (8086) werden die Anschlüsse A0 und AI der Schnittstelle an die Adreßleitungen AI und A2 des Prozessors angeschlossen, da A0 für die Freigabe des unteren Datenbus verwendet wird. Liegt dann die Schnittstelle am unteren Datenbus (DO bis D7), so haben die Register der Schnittstelle nur g e radzahlige Adressen, also z.B. 40H, 42H, 44H und 46H. Nach dem Einschalten der Versorgungsspannung bzw. nach einem Reset sind alle drei Datenkanäle als Eingang geschaltet und befinden sich im Tristatezustand. Wird ein Kanal später als Ausgang programmiert, so nimmt er LOWPotential an, da bei jeder Programmierung der Schnittstelle über das Kommandoregister die Datenausgaberegister gelöscht werden. Legt man das Potential einer Ausgangsleitung durch einen Widerstand auf HIGH-Potential (Pull-up), so geht ihr Potential nach einen Reset zunächst auf HIGH und nach der Programmierung als Ausgang auf LOW. Ist dieser Potentialwechsel unerwünscht, so sollte ein Widerstand gegen LOW-Potential (Pull-down) verwendet werden, der den Ausgang nach einem Reset und nach einer Programmierung als Ausgang

192

5

Anwendungsbeispiele

auf LOW hält. Man beachte, daß bei jeder Neuprogrammierung der Betriebsart alle Ausgabedatenregister gelöscht werden, selbst wenn die Richtung eines der Kanäle erhalten bleibt. Die Betriebsart und die Richtung der Datenübertragung werden durch Einschreiben eines Steuerbytes in das Kommandoregister (Steuerregister) f e s t g e legt. In der Betriebsart 0 werden alle drei Datenkanäle A, B und C wahlweise als Eingang oder Ausgang verwendet. Bild 5.1-3 zeigt die Steuerbytes des Betriebsart 0.

A-Kanal AUS AUS AUS AUS AUS AUS AUS AUS EIN EIN EIN EIN EIN EIN EIN EIN

B-K-anal AUS AUS AUS AUS EIN EIN EIN EIN AUS AUS AUS AUS EIN EIN EIN EIN

C-HIGH AUS AUS EIN EIN AUS AUS EIN EIN AUS AUS EIN EIN AUS AUS EIN EIN

C-LOW AUS EIN AUS EIN AUS EIN AUS EIN AUS EIN AUS EIN AUS EIN AUS EIN

Steuerbyte 80 81 88 89 82 83 8A 8B 90 91 98 99 92 93 9A 9B

Bild 5.1-3: Die Steuerbytes der Betriebsart 0

In der Betriebsart 0 können die Kanäle A und B nur mit allen 8 Anschlüssen gleichzeitig als Eingang oder Ausgang programmiert werden; die Programmierung einzelner Leitungen wie bei anderen Schnittstellen ist nicht möglich. Der C-Kanal wird in der Betriebsart 0 in zwei unabhängigen 4-Bit-Gruppen ebenfalls zur Datenübertragung verwendet. Als Beispiel sollen der A-Kanal, der BKanal und der untere C-Kanal als Eingang und der obere C-Kanal als Ausgang programmiert werden. Das Steuerbyte lautet 93H. Das Kommandoregister liege auf der Adresse 46H. MOV OÜT

AL,93H 46H,AL

Steuerbyte Betriebsart 0: A=EIN B=EIN CH=AUS CL=EIN Lade das Kommandoregister 46H mit dem Steuerbyte

In den Betriebsarten 1 und 2 wird die Datenübertragung der Kanäle A und B durch Leitungen des Kanals C g e s t e u e r t . Dabei zeigt das Statusregister oder Zustandsregister, das auf der gleichen Adresse wie das Kommandoregister liegt, Zustandsinformationen der Ein/Ausgabe an. Das folgende Anwendungsbeispiel Bild 5.1-4 arbeitet in der Betriebsart 0 und kontrolliert die D a t e n ü b e r t r a gung mit den Leitungen PCI und PC6 des C-Kanals softwaremäßig, also ohne von den Möglichkeiten der Betriebsarten 1 und 2 Gebrauch zu machen.

5.1 Parallele und serielle

Parallele Druckerschnittstelle

Datenübertragung

Übungssystem

Adresse 3BCH B7 B6 B5 B4 B3 B2 R1 BO

Adr ssse 42H B-Port Eingang PB7 PB6 PB5 PB4 PB3 PB2 PB1 PBO

Adresse 3BDH

Ad n;sse 44H C-Port CH = Ausgang PC6

m S tu

BUSY ACK X L = Eingang

Adresse 3BEH 1

60



PC1 DS By te 93H

Steuerregister Adresse 46H

Bild 5.1-4: Parallele Datenübertragung mit Steuersignalen

Bild 5.1-5: Zeitlicher Verlauf der Datenübertragung

193

194

5

Anwendungsbeispiele

Die Programmbeispiele dieses Buches wurden auf einem Personal Computer u n ter dem Betriebssystem MS-DOS übersetzt, als Maschinenprogramme in den Arbeitsspeicher des PC geladen und über die parallele Druckerschnittstelle in das 8086-Übungssystem übertragen, das im Abschnitt 3 beschrieben wurde. Dort wurden sie mit Hilfe des in Abschnitt 5.3 beschriebenen Monitors g e t e s t e t . Die Druckerschnittstelle des PC ist aus TTL-Bausteinen aufgebaut und wird auch noch für andere Zwecke verwendet. Man beachte, daß die beiden Steuerleitungen zusätzlich invertiert werden. Auf dem 8086-Ubungssystem stand eine Parallelschnittstelle 8255 auf den Adressen 40H bis 46H zur Verfügung. Die Daten werden 8 Bit parallel über den B-Port empfangen. Uber den Eingang PCI meldet der PC (Sender), daß gültige Daten anliegen. Dieses Signal heißt DS (Data Strohe). Über den Ausgang PC6 meldet das 8086-System (Empfänger), wenn es nicht zur Datenübernahme bereit ist (BUSY = beschäftigt) und daß es die D a ten übernommen hat (ACK. = ACKnowledge = Bestätigung). Bild 5.1-5 zeigt den zeitlichen Verlauf der Datenübertragung. Erkennt der Sender (Personal Computer) an einer fallenden Flanke des BUSYSignals, daß der Empfänger zu Datenübernahme bereit ist, so legt er zuerst die Daten auf den Parallelausgang und anschließend das DS-Signal auf LOW, das a n zeigt, daß gültige Daten bereit liegen. Bestätigt der Empfänger mit einer s t e i ,• B I L D

cx

PROG

START:

MARK:

LOOP1:

LOOPS:

PROG

5.1-S SENDEPROGRAMM P C ZAHL DER B Y T E S AB A D R E S S E 1 0 0 0 H SEGMENT J PROGRAMMSEGMENT ASSUME CS : P R O G , D S : P R O G , E S : P R O G , S S :PROG ORG STARTADRESSE ÎOOH MOU AH, 1 PROGRAMMIERUNG P A R A L L E L E AUSG INT 17H BIOS-AUFRUF MOU BX,1000H ; ADRESSE AUSGABEBEREICH MOU ADRESSE STEUERPORT DX.3BEH MOU AL,OCH OOOO 1 1 0 0 BO-LOUJ OUT D X , AL K E I N E DATEN MOU DX,3BDH ADRESSE STATUSPORT IN STATUSLEITUNG LESEN A L , DX TEST MASKE 1 0 0 0 0 0 0 0 A L , BOH J2 LOOP1 EMPFAENGER BELEGT MOU AL.CBXD D A T E N B Y T E LADEN NAECHSTE DATENADRESSE INC BX ADRESSE DATENPORT MDU DX,3BCH OUT D X , AL DATENBYTE AUSGEBEN MOU DX.3BEH ADRESSE STEUERPORT 0000 1101 BO - H I G H MOU AL,ODH ' D X , AL DATEN G U E L T I G OUT MOU DX.3BDH ADRESSE STATUSPORT STATUSLEITUNG LESEN IN A L , DX TEST AL,BOH MASKE 1 0 0 0 0 0 0 0 NOCH K E I N E B E S T A E T I G U N G JN2 LOOPS AUSGABEMARKE MOU DL,'»' F U N K T I O N AUSGABE MOU AH, S S1H MS-DOS AUFRUF INT C X - C X - 1 B I S CX-O MARK LOOP MOU DX,3BEH ADRESSE STEUERPORT 0000 1100 BO - LOW MOU AL,OCH DX, AL K E I N E DATEN MEHR OUT F E R T I G : M S - D O S RUECKSPRUNG SOH INT ENDE D E S SEGMENTES ENDS E N D E D E S PROGRAMMS END START

Bild 5.1-6: Sendeprogramm des Personal Computers

5.1 Parallele und serielle Datenübertragung

195

genden Flanke des ACK-Signals die Übernahme, so wird DS wieder auf HIGH g e l e g t , die Daten liegen aber noch w e i t e r an. Der D a t e n w e c h s e l e r f o l g t e r s t bei der nächsten fallenden F l a n k e des B U S Y - S i g n a l s . Bild 5 . 1 - 6 zeigt das S e n deprogramm. Die zu sendenden Daten liegen ab Adresse 1000H. Das C X - R e g i ster enthält die Anzahl der zu sendenden B y t e s . Für j e d e s gesendete B y t e wird ein Zeichen " * " auf der Konsole des Personal Computers ausgegeben. Der Empfänger (Übungssystem) meldet sich mit B U S Y = LOW, daß er b e r e i t ist und übernimmt mit der fallenden F l a n k e des DS-Signals die D a t e n . Als B e stätigung wird ACK auf HIGH g e l e g t . Dies bedeutet gleichzeitig, daß der E m p fänger noch b e s c h ä f t i g t ist. Erst n a c h der steigenden Flanke des D S - S i g n a l s meldet sich der Empfänger wieder b e r e i t . Bild 5 . 1 - 7 zeigt das Empfangsprogramm, das vor dem Sendeprogramm g e s t a r t e t wird. Das Programm liegt ab Adresse 0 0 0 0 H . Die Daten werden ab Adresse 0100H im Speicher a b g e l e g t und auf dem Ausgabeport 300H zusätzlich angezeigt. Um eine Zerstörung des E m p fangsprogramms zu vermeiden, was bei der Entwicklung der Programme anfangs vorkam, wird die Segmentgrenze im Indexregister BX k o n t r o l l i e r t . Bei der Entwicklung der Programme ergaben sich anfangs Schwierigkeiten mit dem Personal Computer, weil das Sendeprogramm asynchron zum P r o g r a m m a b lauf mit Interruptsignalen unterbrochen wird. Dies g e s c h i e h t , um die dynamischen Speicher wiederaufzufrischen ( R e f r e s h ) . Das Übungssystem dagegen a r b e i t e t mit statischen Schreib/Lesespeichern. Dies g a r a n t i e r t einen u n t e r b r e chungsfreien und zeitlich definierten Ablauf des Empfangsprogramms. BILD S.l-7 EMPFANGSPROGRAMM B0B6-SYSTEM SPEICHERUNG AB ADRESSE 0100H PROG ; PROGRAMMSEGMENT SEGMENT ASSUME CS:PROG,DS ORG 100H ; NUR FUER UEBERSETZUNG START: MOU AL,33H ; A-EIN B-EIN CH-AUS CL-EIN OUT 46H.AL ; 0255 STEUERREGISTER MOU BX,100H ; ADRESSE EINGABEBEREICH MOU AL.OOH ; OOOO 0000 BUSY-LDUI LOOP: OUT 44H.AL ; EMPFAENGER BEREIT L00P1: IN AL.44H ; DS TESTEN TEST AL,05H ; MASKE 0000 0010 JN2 L00P1 ; KEINE DATEN IN AL.42H ; DATEN LESEN MOU AH,AL ; DATEN RETTEN MOU AL,OFFH ; 1111 1111 ACK-BUSY-HIGH 44H.AL ; DATEN UEBERNOMtlEN OUT MOU AL,AH ; GELESENE DATEN MOU CBXD.AL ; DATEN SPEICHERN INC BX ; NAECHSTE DATENADRESSE MOU DX.300H ; ADRESSE AUSGABEPDRT ; KONTROLLAUSGABE OUT DX,AL IN AL.44H ; DS TESTEN LD0P2: AL,02H ; MASKE 0000 0010 TEST LOOPS ; ALTE DATEN STEHEN NOCH AN JZ ENDE DES SEGMENTES? BX,OFFFFH CMP LOOP ; NEIN: WEITER LESEN JNE JA: RUECKKEHR MONITOR INT 10H ENDE DES SEGMENTES ENDS PROG START j ENDE DES PROGRAMMS END Bild 5 . 1 - 7 :

Empfangsprogramm des 8 0 8 6 - S y s t e m s

196

5

Anwendungsbeispiele

Sende- und Empfangstakt Ruhezustand

V7Z\

iStart

|

|

|

I

1

1

1

1

B0

B1

B2

B3

B4

B5

B6

B7

1

1

1

Ruhezustand

P a r . STOP STOP

Bild 5.1-8: Serielle asynchrone Datenübertragung

Die serielle Datenübertragung entsprechend Bild 5.1-8 überträgt die Bits eines Zeichens seriell (nacheinander) auf einer Leitung. Bei der vorwiegend verwendeten asynchronen Übertragung zwischen einen Mikrocomputer und einem T e r minal werden mindestens drei Leitungen benötigt: eine Datenleitung vom T e r minal zum Rechner, eine Datenleitung vom Rechner zum Terminal und die Erdleitung (Ground). Sender und Empfänger müssen mit der gleichen Sende- bzw. Empfangstaktfrequenz arbeiten, die jedoch getrennt erzeugt werden. Daher ist eine Synchronisation von Sender und Empfänger erforderlich. Sie wird bei der Übertragung jedes Zeichens durch die fallende Flanke des Startbits vorgenommen, das immer LOW ist. Dann folgen je nach verwendetem Kode fünf bis acht Datenbits, die entweder LOW oder HIGH sind. Zur Datensicherung kann ein Paritätsbit zugefügt werden. Die Übertragung eines Zeichens wird beendet durch ein oder zwei Stopbits, die immer HIGH sind. Die Datenbits und der sie umgebende Rahmen aus Startbit sowie Paritätsbit und Stopbits können softwaremäßig durch Programme erzeugt bzw. abgetastet werden. Dann ist es möglich, die Daten über zwei Portleitungen einer Parallelschnittstelle zu senden bzw. zu empfangen. In der Praxis verwendet man jedoch Serienschnittstellen wie z.B. den in Bild 5.1-9 dargestellten Baustein 8251A, der zur Familie der 8085/8086-Mikroprozessoren gehört. Der Baustein kann gleichzeitig als Sender und als Empfänger betrieben werden. Der Prozessor schreibt die zu sendenden Daten als Byte, also parallel, in das Sendedatenregister. Die Schnittstellensteuerung bringt die Datenbits in das Sendeschieberegister, fügt die Rahmenbits hinzu und schiebt sie mit dem Sendetakt auf der Sendedatenleitung zur Gegenstation. Das zu empfangene Zeichen erscheint seriell am Eingang der Schnittstelle und wird von der Schnittstellensteuerung mit dem Empfangstakt abgetastet, von den Rahmenbits befreit und in das Empfangsdatenregister gebracht, aus dem es durch einen Lesebefehl vom Prozessor parallel übernommen wird. Vor der Übertragung von Zeichen werden mit dem Betriebsartregister und dem Kommandoregister die Funktionen der Schnittstelle programmiert. Das Statusregister zeigt an, ob ein neues Zeichen gesendet oder abgeholt werden kann. Der Schnittstellenbaustein 8251A arbeitet mit TTL-Pegel, der jedoch für eine Übertragung über mehr als 1 m nicht geeignet ist. Für Übertragungswege bis zu einigen 100 m arbeitet man nach dem V.24-Verfahren, das etwa dem Ver-

5.1 Parallele und serielle

Datenübertragung

TxRDY

197

RxRDY

Bild 5.1-9: Programm'iermodell der Serienschnittstelle 8251A

fahren RS-232-C entspricht. Dabei wird eine Eins (Mark) als Spannung zwischen -3V und negativer Betriebsspannung (z.B. - 1 2 V ) ü b e r t r a g e n . Eine Null (Space) ist eine Spannung zwischen +3V und positiver Betriebsspannung (z.B. +12V). Die selten verwendete Stromschnittstelle a r b e i t e t mit einem Steuerstrom von 20 mA für eine Eins (Mark) und einem unterbrochenen Strom für die Null (Space). Bei größeren Entfernungen wird ein Modem (Modulator/Demodulator) zwischen Sender und Empfänger geschaltet; Null und Eins werden dabei als zwei verschiedene Tonfrequenzen d a r s t e l l t . Das Bild 5.1-9 zeigt V.24-Pegelumsetzer sowie die Anschlußbezeichnungen der D a t e n - , T a k t - und Steuerleitungen für ein Modem. Dabei ist besonders zu b e a c h t e n , daß der Sender nur dann a r b e i t e t , wenn er mit dem Signal CTS (Clear To Send) eingeschaltet ist. Alle anderen S t e u e r s i gnale werden softwaremäßig erzeugt und a u s g e w e r t e t . Bild 5.1-10 zeigt die Register adressen.

198

5

Anwendungsbeispiele

XXXXXXX1

RD/WR lesen schreiben lesen schreiben

xxxxxxxl

schreiben

Adresse xxxxxxxO xxxxxxxO xxxxxxxl

Bild 5.1-10:

Register Empfangsdaten Sendedaten Status nach RESET: Betriebsart nach Betriebsart: Kommando

Die Registeradressen der Serienschnittstelle 8251A

Für die Auswahl von insgesamt fünf Registern steht nur ein Adreßanschluß AO zur Verfügung. Bei einem 8-Bit-System wird er mit der Adreßleitung AO des Prozessors verbunden. Die Adressen der Register sind dann f o r t l a u f e n d a n g e o r d n e t , also z.B. 00H für die beiden Datenregister und 01H für die drei S t e u e r register. Wird der Anschluß AO in einem 16-Bit-System mit der Adreßleitung AI des Prozessors verbunden und liegen die Datenanschlüsse am unteren D a t e n bus DO bis D7, so liegen die Register auf geraden Adressen, also z.B. 00H ( D a t e n ) und 02H (Steuerung). Das Sendedatenregister kann nur beschrieben werden; das auf der gleichen Adresse liegende Empfangsdatenregister kann nur gelesen werden. Ein Rücklesen der eingeschriebenen D a t e n ist nicht möglich. Das Statusregister kann nur gelesen werden. Die beiden anderen S t e u e r r e g i s t e r (Betriebsart und Kommando) liegen auf einer einzigen Adresse und müssen in einer b e s t i m m t e n Reihenfolge beschrieben werden. Nach einem Reset ist zunächst das B e t r i e b s a r t r e g i s t e r eingeschaltet. Der e r s t e Schreibbefehl p r o g r a m miert die B e t r i e b s a r t . Dabei wird auf das Kommandoregister u m g e s c h a l t e t , so daß der folgende Schreibbefehl ein Kommando in das Kommandoregister bringt. Das Kommandoregister e n t h ä l t in der Bitposition B6 ein U m s c h a l t b i t , das f e s t legt, ob der nächste Schreibbefehl wieder das Kommandoregister oder das B e t r i e b s a r t r e g i s t e r adressiert. Bild 5.1-11 zeigt die Programmierung der B e triebsart f ü r den Asynchronbetrieb. Die Bitpositionen BO und B1 legen einen Teilungsfaktor f e s t , mit dem der Übertragungstakt an den Anschlüssen TxC und RxC h e r u n t e r g e t e i l t wird. Die meisten T a k g e n e r a t o r e n liefern einen löfachen T a k t , der von der Schnittstelle durch den Faktor 16 heruntergeteilt werden muß. Die Bitpositionen B2 und B3 legen die Zahl der Datenbits f e s t . Der ASCII-Kode a r b e i t e t standardmäßig mit 7 Bit; bei einer 8 - B i t - U b e r t r a g u n g wird das a c h t e Bit meist gelöscht. Mit den Bitpositionen B4 und B5 wird die Parität f e s t g e l e g t , die zur Sicherung der Datenübertragung verwendet wird. Gerade Parität b e d e u t e t , daß die Anzahl der Einerbits geradzahlig ist (0, 2, 4, 6 oder 8).

5.1 Parallele und serielle

B7

B6

Stopbits 0 1: 1 0: 11:

Í Bit 1 1/2 2 Bit

B5

B3

B4

B2

Datenübertragung

B1

B0

Parität Parität

Zeichenlänge

Betriebsart

0: ung. 0:ohne 1: ger. 1 :mit

0 0 1 1

0 1: Clock * 1 1 0: Clock * 16 1 1: Clock * 64

0:5 1: 6 0: 7 1: 8

Bit Bit Bit Bit

199

Beispiel:

Clock * 16 : Länge: 8 Bit: Ohne Parität: 2 Stopbit: Steuerbyte

Bild 5.1-11:

1 |

j 110

0 1 1 1 0

=

CEH

Die Programmierung des Betriebsartregisters

B7

B6 es folgt neues 0: Komm. 1: Betr.

B4

B5

Ausgang FehlerRTS Bits löschen 0:HIGH 0:nein 1 :L0W 1:ja

B3

B2

BREAK Ausqabe 0:nein 1:ja

B1

B0

Empfän- Ausgang ger DTR

Sender

0:gesp. 0:HIGH 1 :frei 1 :L0W

0:gesp. 1 :frei

Beispiel:

Sender frei: DTR = HIGH: Empfänger frei: kein BREAK: Fehlerbits löschen: RTS = HIGH: es folgt Kommando: ohne Bedeutung: j Steuerbyte

Bild 5.1-12:

0 0 0 10

10

1

= 15H

Die Programmierung des Kommandoregisters

Die Bitpositionen B6 und B7 legen die Anzahl der Stopbits f e s t , die das Ende der Übertragung bilden. Da es keine "halben" Bits gibt, b e d e u t e t die Angabe "1 1/2 Bits", daß der abschließende HIGH-Zustand 1.5 Bitzeiten andauert. Die in Bild 5.1-12 gezeigte Programmierung des Kommandoregisters gilt nur für den Asynchronbetrieb, der vorher mit dem Betriebsartregister festgelegt wird. Mit den Bitpositionen BO und B2 werden der Sender bzw. der Empfänger e i n - und ausgeschaltet. Man b e a c h t e , daß der Sender nur a r b e i t e t , wenn er

200

5

Anwendungsbeispiele

hardwaremäßig durch das Signal CTS (Clear To Send = Senderfreigabe) eingeschaltet wurde. Mit den Bitpositionen B1 und B5 werden die Steuerausgänge DTR (Data Terminal Ready) und RTS (Request To Send) auf HIGH oder LOW gelegt. Durch die Bitposition B3 kann der Datenausgang TxD dauernd auf LOW gelegt werden; dieser Zustand heißt BREAK (Unterbrechung). Der Ruhezustand der Leitung, wenn keine Daten übertragen werden, ist dagegen HIGH. Mit der Bitposition B4 ist es möglich, die zur Fehleranzeige dienenden Bitpositionen des Statusregisters wieder zurückzusetzen. Die Bitposition B6 legt fest, ob der folgende Schreibbefehl das Betriebsartregister oder das Kommandoregister adressiert, wenn die Schnittstelle während des Betriebes neu programmiert werden soll. Bild 5.1-13 zeigt den Aufbau des Statusregisters, das nur gelesen werden kann und das den Zustand der Serienschnittstelle anzeigt.

B7 Eingang DSR 0:HIGH 1 :L0W

B6

B5

B4

B3

B2

BREAK Empf.

Fehler STOPBits 0:nein 1: ja

Fehler Empf. überl. 0:nein 1:ja

Fehler Parit. Bit 0:nein 1:ja

Sendedaten Sender 0: voll 1: leer

0:nein 1:ja

B1

BO

Empfangs Sendedaten daten 0: leer 1 :voll

0:voll 1: leer

Bild 5.1-13: Der Aufbau des Statusregisters

Die Bitpositionen B0, B1 und B2 des Statusregisters zeigen an, ob neue gesendet werden können bzw. ob ein empfangenes Zeichen zur Abholung liegt. Eine 0 bedeutet in beiden Fällen, daß der Prozessor keine neuen übertragen kann; eine 1 bedeutet, daß der Prozessor ein neues Zeichen Schnittstelle schreiben bzw. aus der Schnittstelle lesen kann.

Daten bereit Daten in die

Die Bitpositionen B3, B4 und B5 enthalten Fehlermeldungen für den Fall eines Paritätsfehlers oder eines Überlaufs des Empfangsregisters oder eines Stopbitfehlers. Die Bitposition B6 zeigt den Ruhezustand des Dateneingangs RxD. BREAK (Unterbrechung) bedeutet, daß der Eingang dauernd auf LOW liegt und daß die Verbindung unterbrochen ist. Mit der Bitposition B7 wird der Zustand der Steuerleitung DSR (Data Set Ready) angezeigt. Die Zusammenarbeit zwischen dem Prozessor und der Serienschnittstelle vollzieht sich entweder im Interruptbetrieb oder im Abfragebetrieb (Polling). Im Interruptbetrieb verbindet man die Ausgänge TxRDY und RxRDY'der Schnitt-

5.1 Parallele und serielle Datenübertragung

201

s t e l l e (Bild 5 . 1 - 9 ) direkt oder über einen Interruptsteuerbaustein mit den Interrupteingängen des Prozessors. Die S c h n i t t s t e l l e löst dann einen Interrupt aus, wenn ein Zeichen empfangen wurde oder wenn der Sender frei ist für die Übertragung eines neuen Zeichens. Der Prozessor muß, angestoßen von der S e r i e n s c h n i t t s t e l l e , lediglich Daten von und zur S c h n i t t s t e l l e übertragen und kann während übrigen Zeit andere Programme b e a r b e i t e n . Im A b f r a g e b e t r i e b muß der Prozessor in einer S c h l e i f e (Sendedatenregister) und B1 ( E m p f a n g s d a t e n r e g i s t e r ) des trollieren. Bild 5 . 1 - 1 4 zeigt ein e i n f a c h e s Testprogramm das fortlaufend S t e r n e auf dem angeschlossenen Terminal

die Bitpositionen B0 S t a t u s r e g i s t e r s konfür die S c h n i t t s t e l l e , ausgibt.

; BILD PR06

5.1-14 TESTPROGRAMM S T E R N E AUSGEBEN SEGMENT PROGRAMMSEGMENT ASSUME C S : PROG, D S : PROG , E S : PROG , S S : PROG STEU EQU 02H ; STEUERREGISTER DAT EQU OOH : DATENREGISTER ; S T A R T D E S PROGRAMMS NUR NACH RESET ! ! ! ! ! ! ! ! ! ! • RG 100H ; BEFEHLSBEREICH START: MOU AL.OCEH ; STEUERBYTE B E T R I E B S A R T OUT S T E U , A L ; NACH B E T R I E B S A R T R E G I S T E R MOÜ AL.1SH ; S T E U E R B Y T E KOMMANDO OUT S T E U , A L ; NACH KOMMANDOREGISTER ; PROGRAMM H I E R S T A R T E N , WENN S C H N I T T S T E L L E PROGRAMMIERT LOOP: IN A L , S T E U ; STATUSREGISTER LESEN TEST AL.01H ; MASKE OOOO 0 0 0 1 SENDER F R E I ? JZ LOOP ; NEIN: WEITER TESTEN MOU A L , ' ; J A : S T E R N LADEN OUT DAT,AL ; UND ZUM SENDER AUSGEBEN JMP LOOP ; S C H L E I F E OHNE ENDE PROG ENDS ENDE D E S SEGMENTES END START ! ENDE D E S PROGRAMMS

Bild 5 . 1 - 1 4 :

Testprogramm S t e r n e ausgeben

Für den T e s t des Programms muß man zwischen dem S t a r t nach einem R e s e t und einem S t a r t bei b e r e i t s programmierter S c h n i t t s t e l l e unterscheiden. Nach einem R e s e t muß die S c h n i t t s t e l l e durch Beschreiben des B e t r i e b s a r t r e g i s t e r s und des Kommandoregisters erst programmiert werden. Ist die S c h n i t t s t e l l e b e r e i t s , z.B. durch den Monitor des R e c h n e r s , programmiert, so kann man s o fort mit der Ausgabeschleife beginnen. Sie l i e f e r t leicht zu verfolgende Signale auf den Busleitungen des R e c h n e r s und eignet sich besonders für die Inbetriebnahme einer neu e n t w i c k e l t e n Schaltung. Das in Bild 5 . 1 - 1 5 d a r g e s t e l l t e Testprogramm prüft die Datenübertragung zwischen dem R e c h n e r und einem Bedienungsterminal in beiden Richtungen. Nach der Ausgabe einer Marke " * " werden die auf dem T e r m i n a l eingegebenen Zeichen wieder zurückgesendet ( E c h o ) . Beide Programme a r b e i t e n im A b f r a g e b e t r i e b und werten die S t a t u s bits B0 und B1 des S t a t u s r e g i s t e r s in Warteschleifen aus.

202

5 Anwendungsbeispiele

; BILD 5.1-15 TESTPROGRAMM ZEICHEN EIN/AUSGABE PRGG SEGMENT PROGRAMMSEGMENT ASSUME CS : PROG,DS:PROG,ES:PRGG,SS :PROG STEU EQU OBH STEUERREGISTER EDU DAT DATENREGISTER OOH ; START DES PROGRAMMS NUR NACH RESET !!!!!!!!!! ORG 100H BEFEHLSBEREICH START : MOU AL.OCEH STEUERBYTE BETRIEBSART QUT STEU,AL NACH BETRIEBSARTREGISTER MOU AL,15H STEUERBYTE KOMMANDO OUT STEU,AL NACH KOMMANDOREGISTER ; PROGRAMM HIER STARTEN, WENN SCHNITTSTELLE PROGRAMMIERT MOU AH, AUSGABEMARKE • LQOP : IN AL,STEU STATUSREGISTER LESEN TEST AL.OIH MASKE OOOO 0001 SENDER FREI ? JZ LOOP NEIN: WEITER TESTEN MDU AL, AH JA: ZEICHEN LADEN OUT UND ZUM SENDER AUSGEBEN DAT,AL LOOP1: IN AL,STEU STATUSREGISTER LESEN TEST AL,OHH MASKE 0000 0010 ZEICHEN DA ? JZ NEIN: WEITER TESTEN LOOP1 JA: ZEICHEN ABHOLEN IN AL, DAT MOU AH, AL NACH AH RETTEN JMP LOOP SCHLEIFE OHNE ENDE PROG ENDS ENDE DES SEGMENTES END START ENDE DES PROGRAMMS

Bild 5 . 1 - 1 5 :

Testprogramm für Zeicheneingabe mit Echo

TxD

Seniler

RxO

KTS

Empfänger

X+0 Daten schreiben X+0 Daten lesen Sender- und Empfängerteil ighj Teiler High X+l

J^Teiiler l.ow

X+0 Baudratengenerator (DI.AB=1 )

Steuerbits

Statusbits

X+3 schreiben X+5 lesen Sender- und Empfängersteuerung

DTR

DCD

RI

DSR

Steuerbits j X+'< schreiben X+6 lesen Modemsteuerung Hilfsregist. X+7 lesen und schreiben

Anzeigebits

Freigabebits

X+l schreiben X+2 lesen Interruptsteuerung

Bild 5 . 1 - 1 6 : Der Aufbau der seriellen S c h n i t t s t e l l e

8250

CTS

5.1 Parallele und serielle

Datenübertragung

203

Personal Computer (PCs) verwenden anstelle des Bausteins 8251A meist den seriellen Schnittstellenbaustein 8250 ACE (Bild 2-21). Dieser Baustein wird auch in den Schaltungen Abschnitt 1.4.4 Computer zum TTL-Prozessor, Abschnitt 3.1 8088-Minisystem und Abschnitt 3.2 8088-System als Verbindung zum Bedienungsterminal eingesetzt. Bild 5.1-16 gibt einen Überblick über die Register und ihre Adressen. X ist die Basisadresse des Bausteins, die sich aus dem Adreßplan bzw. aus der Einstellung von Brücken auf der Peripheriekarte ergibt. Die folgenden Beispiele verwenden entsprechend der Schaltung des 8088-Minisystems Bild 3-4 die Basisadresse X = 00H; die Register der Schnittstelle haben die Portadressen von 00H bis 07H. Das Datenregister des Senders und das Datenregister des Empfängers liegen beide auf der Adresse X+0 = 00H. Bei der Eingabe mit einem IN-Befehl werden die empfangenen Daten gelesen, bei der Ausgabe mit einem OUTBefehl werden Daten in den Sender geschrieben. Auf der Adresse 00H liegt ein weiteres Register, das niederwertige Byte des Teilers für den Baudratengenerator. Ein Umschaltbit DLAB (Bitposition B7 des Steuerregisters) unterscheidet zwischen den Daten und dem Teiler. Bei der Einstellung der Übertragungsparameter (Initialisierung) setzt man zunächst DLAB = 1 und legt den Teilerfaktor f e s t . Bei der Programmierung des Steuerregisters wird DLAB = 0 gesetzt, so daß alle folgenden Zugriffe auf die Portadresse 00H die Datenregister ansprechen. Gleiches gilt für die Portadresse X+l = 01H. DLAB = 1 adressiert das höhere Byte des Teilers bei der Initialisierung der Schnittstelle; für DLAB = 0 wird im Betrieb das Interruptfreigaberegister beschrieben. Das Register auf der Portadresse X+7 = 07H hat keine Steueroder Anzeigefunktionen und kann wie ein Speicherbyte als Hilfsspeicherstelle beschrieben und gelesen werden. Die in Bild 5.1-17 dargestellte Sender- und Empfängersteuerung besteht n e ben den Datenregistern aus einem Baudratengenerator und einer Leitungssteuerung. Vor der seriellen Datenübertragung, gleich ob im A b f r a g e - oder im Interruptbetrieb, muß die Schnittstelle initialisiert werden. Die Ü b e r t r a gungsparameter (Baudrate, Datenbits, Stopbits und Parität) sind mit der G e genstation zu vereinbaren. Ein programmierbarer Teiler liefert aus dem Eingangstakt (Quarz oder Taktgenerator) den löfachen Übertragungstakt, aus dem durch einen festen Teiler (durch 16) der Schiebetakt des Senders g e wonnen wird. Verbindet man den Ausgang BAUDOUT mit dem Eingang RCLK (Empfängertakt), so arbeiten Sende- und Empfangsteil mit der gleichen Baudrate. Der Schiebetakt des Empfängers wird wieder aus einem f e s t en Teiler (durch 16) gewonnen; die Abtastungen der Eingangsleitung e r f o l gen mit dem l ö f a c h e n Schiebetakt. Das Leitungssteuerregister auf der Adresse X+3 = 03H dient zur Festlegung der Übertragungskennwerte, die für den Sende- und den Empfangsteil gleich sind. Das Leitungsstatusregister auf der Adresse X+5 = 05H wird im Abfragebetrieb dazu verwendet, den Zustand des Senders und des Empfängers zu kontrollieren. Dabei ist zwischen den Schieberegistern und den Datenregistern zu unterscheiden. Ist ein Zeichen im Schieberegister des Empfängers vollständig angekommen, so wird es

204

J

Anwendungsbeispiele

RxD

TxD Schieberegister X X X X X X

-

1

X X

Sch i ebereg i ster ^ : 16 1 1 1 1 1 T Abtastungen: Schiebetal« t * l 6

Sendedaten x-fO schreiben DLAB=0 1.8432 MHz

BAUDOUT

Empfangsdaten x+0 lesen DLAB=0

16 - Teiler für Baudratengenerator (Takt*16)

Teiler High x+1 DLAB=1 Baudrate 110 Teiler 1Ö47 Takt*16

Tetler Low x+0 DLAB=1 150 300 304

m

Leitungssteuerreg i ster x+3 B7 B6 B5

Teiler =

Baudrate*l6

600 1200 2400 4800 9600 19200 192 96 48 24 12 6 Leitungsstatusregister x+5

8

B3B2 B1 B0 B7 |B6 B5 B4 B3 B2 B1 B0 i i— 0: leer 0 0: 5 bit 1: voll 0 1: 6 bit Empfangsdatenr. 1 0: 7 bit kein Überlauf 1 1: 8 bit Empfängerüberl. Datenbits 0: 1 Stopbit 0: kein Paritätsf. 1: 2 Stopbits 1: Paritätsfehler 1: 1 1/2 (5 bit) 0: kein Stopbitfehler 0: kein Paritätsbit 1: Stopbitfehler 1: mit Paritätsbit 0: kein Empfängerbreak 0: ungerade Parität 1: Empfängereingang Low 1: gerade Parität 0: Sendedatenregister voll 0: ohne Ausgleichsparität 1: Sendedatenregister leer 1 : mit Ausgleichsparität 0: Sendeschieberegister voll 0: Senderfreigabe 1: Sendeschieberegister leer 1: TxD = 0 (Break) 0: B7 i s t immer 0 0: (DLAB) Sendedatenregister Interruptfreigaberegister 1: (DLAB) Teilerregister

Bild 5.1-17: 8250 Sender- und Empfängersteuerung

5.1 Parallele und serielle Datenübertragung

in das Datenregister beginnt.

Das

der Leitung

übernommen,

Programm

hat

genügend Z e i t ,

10 Bits/Zeichen

205

und der Empfang des nächsten Zeichens

also während der L a u f z e i t eines Zeichens

auf

das Datenregister zu l e e r e n . Bei 4800 Baud und

( 1 Start, 8 Daten und 1 Stop) b e t r ä g t

die L a u f z e i t

ms. Entsprechend kann während des Sendens eines Zeichens aus dem

ca. 2 Sende-

schieberegister bereits das nächste Zeichen in das Datenregister

des Senders

geschrieben werden. Das auf

Leitungssta-

tusregister

wird

im

der

Adresse

Abfragebetrieb

X+5

laufend

= 05H liegende

auf

den

Zustand

des

Senders

bzw. Empfängers kontrolliert. Bild 5.1-18 zeigt ein Programm, daß alle am Empfänger ankommenden Zeichen im Echo wieder

zurücksendet.

; BILD 5.1-18: 8250 initialisieren und Abfragebetrieb PR0G SEGMENT » Programnsegment CS : PROG,DS: :PROG,ES:PROG,SS:PROG ASSUME DAT 00H ; Datenregister EQU TEIL EQU 00H ; Teilerregister STEU EQU 03H ; Steuerregister STAT EQU 05H ; Statusregister ORG 100H ; Lade- und Startadresse START: CALL INIT ; initialisieren MOV AL, ' « ' ; Ausgabezeichen LOOP: CALL AUS ; Zeichen aus AL ausgeben C.ALL EIN ; Zeichen nach AL lesen LOOP ; Testschleife: Echoausgabe JMP ; Unterprogramm INIT Parameter: 4800 Baud 8 Daten 2 Stop INIT: MOV AL,80H ; DLAB = l: Teiler MOV ,AX,24 ; 4808 Baud: Teiler = 24 dezimal OUT TEIL,AX ; AL nach TEIL; AH nach TEIL+1 MOV AL,07H ; DLAB = 0:- Daten, Sender frei STEU,AL ; 8 Daten, 2 Stop, ohne Parität OUT IN AL,DAT ; Empfänger vorsorglich leeren ; Rücksprung RET ; Unterprogramm AUS Zeicheil aus AL seriell ausgeben AUS: PUSH AX ; Zeichen retten AUSI: IN AL,STAT ; Status lesen TEST AL,20H ; Maske 0010 0000 Sendedaten leer ? JZ AUSl ; nein: warten POP AX ; ja: Zeichen zurück DAT,AL ; und senden OUT ; Rücksprung RET ; Unterprogramm EIN Zeichen nach AL seriell lesen EIN: IN AL,STAT ; Status lesen TEST AL.01H ; Maske 0000 0001 Empfangsdaten voll? JZ EIN ; nein: warten IN AL.DAT ; ja: Zeichen abholen RET » Rücksprung ; Ende des Segmentes PROG ENDS END START ; Ende des Programms

Bild 5.1-18: 8250 Senden und Empfangen im

Abfragebetrieb

Das Beispiel besteht aus einer als Hauptprogramm mit

Unterprogrammen

zum

Initialisieren

der

ausgeführten T e s t s c h l e i f e

Übertragungsparameter

sowie

206

-5

einem

Anwendungsbeispiele

Sende-

und einem

Statusregisters eine mit

Auswertung einer

Empfangsunterprogramm,

der F e h l e r a n z e i g e n wird v e r z i c h t e t . Das Programm

Drei-Draht-Verbindung,

fangsleitung

die durch A b f r a g e n

die

aus einer

arbeitet

Sendeleitung, einer

Emp-

und der Groundleitung zur G e g e n s t a t i o n b e s t e h t . Dabei muß s i -

c h e r g e s t e l l t sein, daß beide Stationen genügend Zeit h a b e n , die an dem f ä n g e r ankommenden D a t e n rechtzeitig abzuholen. Kann dies nicht stet

des

das S e n d e - und das E m p f a n g s d a t e n r e g i s t e r k o n t r o l l i e r e n . Auf

werden, so ist

ein Anforderungs- und B e s t ä t i g u n g s b e t r i e b

Emp-

gewährlei(Handshake)

erforderlich: - Der Empfänger f o r d e r t vom Sender ein Zeichen

an.

- Der Sender sendet das Zeichen. - Der Empfänger b e s t ä t i g t die Übernahme des Z e i c h e n s . Dazu sind j e d o c h zusätzliche S t e u e r l e i t u n g e n zwischen Sender und E m p f ä n g e r erforderlich,

die

mit

den

in Bild 5 . 1 - 1 9

dargestellten

Modemregistern

er-

zeugt und kontrolliert werden können.

Wr

V.24-Treiber'

m

Loop 0UT2 0UT1 RTS DTR interne Schleife

DCD RI

= = = = = = = =

DSR CTS DCD RI

0: HL-High V.24 +3V

DSR CTS

0: lesen Register 1: Änderung (Flanke) der Leitung

Modemstatusreg i ster x+6

Modemsteuerregi ster x+4 0UT2 0UT1 RTS DTR DCD RI DSR CTS

V.24-Empfänger

Ausgang für Interruptsteuerung nicht verwendet Request To Send = Schnittstelle schaltet Sendeteil des Modems ein Data Terminal Ready = Sendeteil der Schnittstelle i s t bereit Data Channel Detected = Modem meldet, daß Empfangspegel anliegt Ring Indicator = Mödem meldet ankommenden Ruf Data Set Ready = Modem meldet sich betriebsbereit Clear To Send = Modem meldet sich sendebereit

Bild 5 . 1 - 1 9 : 8 2 5 0

Ein Modem

Modemsteuerung

(Modulator/Demodulator)

Schnittstelle

an das T e l e f o n n e t z .

einander,

spricht

so

Verbindungskabel

mit

man

von e i n e r

gekreuzten

ist

ein Z u s a t z g e r ä t

Verbindet

zum Anschluß

man zwei S t a t i o n e n direkt

Null-Modem-Schaltung,

Leitungen

besteht.

Das

der mit-

die aus

einem

einfachste

RTS-

5.1 Parallele und serielle Datenübertragung

207

CTS-Handshakeverfahren verbindet den Ausgang R T S der empfangenden S c h n i t t s t e l l e mit dem Eingang CTS der sendenden S c h n i t t s t e l l e . Ist der Empfänger zur Aufnahme von Zeichen b e r e i t , so legt er seinen Ausgang R T S (anfordern) auf aktives P o t e n t i a l . Der Sender kontrolliert seinen Eingang CTS (Sender f r e i g e b e n ) und sendet nur dann ein Z e i c h e n , wenn dort ein aktives Potential anliegt. Für eine Bestätigung der Übernahme wäre eine w e i t e r e Leitung e r f o r d e r l i c h , auf die in vielen Anwendungen verzichtet wird. Die Modemsteuerung stellt vier Ausgänge und vier Eingänge zur Verfügung, die nicht nur für eine Kontrolle der seriellen Übertragung, sondern auch als digitale Signalleitungen verwendet werden können.

Bild 5.1-20: 82r;8 Modems gnale lesen und ausgeben Programmsegmerit SEGMENT PROG CS:PROG, DS :PROG,ES:PROG,SS:PROG ASSUME Modernsteuerregister 0411 MSTEU EQU Modemstatusregister 06H EQU MSTAT Lade- und Startadresse 100H ORG Modemstatus lesen AL,MSTAT START: IN 1 bit logisch rechts AL, 1 SHR 1 bit logisch rechts AL, 1 S HR 1 bit logisch rechts AL, 1 SHR 1 bit logisch rechts AL, 1 SHR Moderristeuersignale ausgeben OUT MSTEU,AL Testsclileif e START JMP Ende des Segmentes PROG ENDS Ende des Programms END START

Bild 5 . 1 - 2 0 : 8 2 8 0 Testprogramm der Modemsteuerung

Das in Bild 5 . 1 - 2 0 d a r g e s t e l l t e Testprogramm zeigt kein Handshakeverfahren, sondern ist lediglich ein Beispiel für die Adressierung der Modemregister auf den Adressen X + 4 = 04H (Ausgänge) und X+6 = 06H (Eingänge). Die vier linken Bitpositionen des Modemstatusregisters zeigen dabei die Zustände der Leitungen an; sie werden um vier Bitpositionen nach rechts verschoben an den vier Ausgängen wieder ausgegeben. Die Ausgänge OUT1 und OUT2 sind keine Modemsignale; bei den C O M - S c h n i t t s t e l l e n der PCs wird OUT2 zur Interruptsteuerung verwendet! Die vier rechten Bitpositionen des Modemstatusregisters werden bei Änderungen ( F l a n k e n ) der Modemsignale auf 1 gesetzt und beim Lesen des Modemstatusregisters wieder gelöscht. Sie k ö n nen zur Auslösung eines Interrupts verwendet werden. Für die besonders beim seriellen Empfang entstehenden Zeitprobleme wird häufig ein Empfängerinterrupt verwendet; j e d e s ankommende Zeichen löst einen Interrupt aus und s t a r t e t ein Interruptprogramm, mit dem es abgeholt wird. Bild 5 . 1 - 2 1 zeigt die Interruptsteuerung der S c h n i t t s t e l l e in Verbindung mit einem Interruptsteuerbaustein 8259A PIC, wie er in den üblichen P C - S c h a l tungen, auch in der 8 0 8 8 - S c h a l t u n g Abschnitt 3.2, verwendet wird.

208

5 A nwendungsbeispiele

X X

1

0UT2

X X

1 t t t Modemstatussignale X X X

X X X X

0 : gesperrt 1: f r e i Modemsteuerregister x+4

DCD RI

— J

H *

DSR CTS

I

Modemstatusreg i s t e r x+6

Priorität B7 B6 B5 B4 B3 B2 B1 B0 INIRPT

> 1

SendeDatenRegister leer

-0=

V

- 0 ;

Fehler: BreakRahmenParitätüberlauf

EmpfangsDatenRegister voll

Leitungsstatusregister x+5 0

0

0

0

Interrupt 0 : gesperrt 1: f r e i

ErapfDaten SendeDaten EmpfängerFehler Modemstatus

Interruptfreigaberegister x+1

0

0

0

0

X

X

kein Interrupt 0 Empfänger-fehler 1 Empfangsdaten 1 Sendedaten 0 Modemstatus 0

0 1

0 1

0

X 1

0 0 0 0

Interruptanzeigeregister x+2

COM2 IRQ7 IRQ6 IRQ5 IRQ4 IRQ3 IRQ2 IRQ1 IRQ0 |jI7 116115114 |I3 1121 II |101 $21:

|0 I 1 I 1 | 0 l 0 | x| x I x l

Interruptfreigabe IRQ4: Maske $EF f r e i Maske $10 gesperrt IRQ3: Maske $F7 f r e i Maske $08 gesperrt IRQ4: Vektor $0C IRQ3: Vektor $0B

$20:

Interruptbestätigung IRQ4: $64 b e s t ä t i g t IRQ3: $63 b e s t ä t i g t IRQ4: C0M1

IRQ3: COM2

I n t e r r u p t c o n t r o l l e r PIC 1

T Bild 5 . 1 - 2 1 : 8 2 5 0 I n t e r r u p t s t e u e r u n g

Ein

Interrupt

der

Schnittstelle

folgenden Prioritäten ausgelöst

8250

mit

8259A

kann durch v e r s c h i e d e n e E r e i g n i s s e

werden:

mit

5.1 Parallele und serielle

-

Datenübertragung

209

Übertragungsfehler (Leitungsstatus), neues Zeichen im Empfangsdatenregister, Zeichen aus Sendedatenregister ü b e r t r a g e n , Änderung eines der vier Modemstatuseingänge.

Das auf der Adresse X+l = 01H liegende Interruptfreigaberegister dient zur Freigabe der vier Interruptquellen, die auf dem Ausgang INTRPT zu einem Signal zusammengefaßt werden. Sind mehrere Interruptquellen f r e i g e g e b e n , so muß das Interruptprogramm das auf der Adresse X+2 = 02H liegende I n t e r ruptanzeigeregister untersuchen, welcher Interrupt a u f g e t r e t e n ist. Im Falle eines Empfangsfehlers muß das Leitungsstatusregister, im Falle eines Modeminterrupts muß das Modemstatusregister weiter g e t e s t e t werden.

; BILD 5.1-22: 8250 Empfängerinterrupt (NMI) PROG SEGMENT Programmsegment CS :PROG,DS:PROG,ES :PROG,SS :PROG ASSUME DAT EQU 00H Datenregister TEIL EQU 00H Teilerregister EQU 03H Steuerregister STEU STAT 05H EQU Statusregister MSTEU EQU 04H Modemsteuerregister IFREI EQU 01H Interruptfreigaberegister ISTAT EQU 02H InterruptStatusregister DAUS EQU 10H digitales Ausgaberegister NMIVE EQU 008H Adresse NMI-Vektor in Tabelle ORG 100H Lade- und Startadresse START: CALL PARA Übertragungsparameter initialisieren IVOR Empfänger-Interrupt und NMI vorbereiten CALL MOV AL,'«' Ausgabezeichen auf dem Terminal Zeichen aus AL ausgeben AUS CALL MOV AL.00H AL löschen für Modemsignalausgabe LOOP: OUT MSTEU,AL Modemsteuersignale ausgeben 0000 1111: Signale komplementieren XOR AL,0FH LOOP JMP Testschleife Rechteckausgabe ; Unterprogramm PARA: Parameter 4800 Baud 8 Daten 2 Stop PAHA: MOV AL.80H DLAB = 1: Teiler MOV AX,24 4800 Baud: Teiler = 24 dezimal OUT TEIL,AX AL nach TEIL; AH nach TEIL+1 MOV AL.07H DLAB = 0: Daten, Sender frei OUT STEU,AL 8 Daten, 2 Stop, ohne Parität AL,DAT Empfänger vorsorglich leeren IN Rucksprung RET ; Unterprogramm IVOR: 8250- und NMI-Interrupt vorbereiten IVOR: AL.01H 0000 0001 Empfängerinterrupt frei MOV OUT IFREI,AL nach Interruptfreigaberegister AL,ISTAT Interruptstatus löschen IN altes Datensegmentregister MOV AX,DS AX nach Stapel retten PUSH MOV AX,0000H Vektortabelle in Segment 0000H nach Datensegmentregister MOV DS,AX NMI-Vektoradresse in Tabelle MOV BX,NMIVE ; EIN - Segment-Adresse MOV AX,CS MOV [BX+2],AX ; nach Vektortabelle AX,OFFSET EIN ; EIN - Offset-Adresse MOV [BX] , AX ; nach Vektortabelle MOV AX altes Datensegmentregister POP DS, AX wieder zurückladen MOV Rücksprung RET

210

S Anwendungsbeispiele

; Unterprogramm AUS Zeichen aus AL seriell ausgeben AUS: PUSH AX Zeichen retten Status lesen AUSI: IN AL,STAT Maske 0010 0000 Sendedaten leer ? TEST AL.20H nein: warten JZ AUSI ja: Zeichen zurück POP AX DAT,AL und senden OUT Riicksprung RET ; NMI -Interruptprogramm: Zeichen nach AL seriell lesen EIN: AX retten, weil zerstört PUSH AX IN AL,ISTAT Interruptstatus nicht ausgewertet Leitungsstatus nicht ausgewertet IN AL,STAT IN AL, DAT Zeichen abholen und im Echo ausgeben CALL AUS NOT AL Zeichen komplementieren und DAUS,AL digital auf LED ausgeben OUT AX zurückladen vom Stapel POP AX IRET Rücksprung vom Interrupt PROG ENDS Ende des Segmentes END Ende des Programms START

Bild 5.1-22: 8250 E m p f ä n g e r i n t e r r u p t (NMI)

Das in Bild 5 . 1 - 2 2 d a r g e s t e l l t e Programm wurde mit dem 8088-Minisystem (Abschnitt 3.1) g e t e s t e t . Der INTRPT-Ausgang der S c h n i t t s t e l l e 8250 wurde mit dem NMI-Eingang des Prozessors 8088 verbunden, die E n t p r e l l s c h a l t u n g wurde wegen der T o t e m - p o l e - A u s g ä n g e e n t f e r n t . Das U n t e r p r o g r a m m PARA ( O b e r t r a g u n g s p a r a m e t e r ) e n t s p r i c h t INIT des Bildes 5.1-18, das U n t e r p r o g r a m m AUS (serielle Ausgabe) wurde ü b e r n o m m e n . Das U n t e r p r o g r a m m IVOR ü b e r n i m m t die Vorbereitung des E m p f ä n g e r i n t e r r u p t s im I n t e r r u p t f r e i g a b e r e g i s t e r und t r ä g t die Adresse des I n t e r r u p t p r o g r a m m s EIN in die V e k t o r t a b e l l e ein. Im H a u p t p r o g r a m m wird nun auf den M o d e m s t e u e r a u s g ä n g e n f ü r T e s t z w e c k e ein R e c h t e c k s i g n a l ausgegeben; g e m e s s e n wurde eine F r e quenz von 50 kHz. Diese Schleife wird durch die Eingabe e i n e s Z e i c h e n s vom Bedienungsterminal kurzzeitig u n t e r b r o c h e n . Das I n t e r r u p t p r o g r a m m liest das Zeichen aus dem D a t e n r e g i s t e r und sendet es im Echo wieder zurück. Auf den L e u c h t d i o d e n des Ports 10H e r f o l g t eine Kontrollausgabe des e m p f a n g e n e n Zeichens.

5.2 PC-Hardware in Turbo-Pascal

5.2

211

PC-Hardware in Turbo Pascal

Die höhere Programmiersprache Turbo Pascal gestattet mit besonderen Sprachelementen den Zugriff auf die Speicher- und Peripheriebausteine des PC sowie den Einbau von Programmteilen, die im Maschinencode oder im Assembler geschrieben sind. Dieser Abschnitt setzt Pascalkenntnisse voraus; die Beispiele wurden mit der Turbo Pascal Version 7.0 getestet. Pascal kennzeichnet ganze Hexadezimalzahlen sowohl als Zahlenkonstanten im Programm als auch bei der Tastatureingabe durch ein vorangestelltes $ anstelle des nachgestellten H der Assemblerschreibweise. Beispiel: CONST coml = $03F8; (* entspricht 03F8H * ) In Pascal wird der Datenbereich ausschließlich mit symbolischen Bezeichnern adressiert, nur in besonderen Fällen ist es erforderlich, absolute Speicheradressen in der Form

segment : offset

zu verwenden. Beide Angaben sind Ausdrücke vom Datentyp WORD. Der Zugriff (Lesen und Schreiben) erfolgt über die Pseudofelder

Mem [segment : offset} MemW [segment : offset} MemL [segment : offset}

für Bytes (8 bit) für Wörter (16 bit) für Langwörter (32 bit)

Erscheint hinter einer Variablendeklaration des Kennwort ABSOLUTE mit der Angabe einer absoluten Speicheradresse in der Form segment:offset, so legt der Compiler die Variable auf dieser festen Adresse und nicht im normalen Datensegment an. Das in Bild 5.2-1 dargestellte Programmbeispiel liest die Portadressen der seriellen und parallelen Schnittstellen, die sich in acht Speicherwörtern ab Adresse $0040:$0000 befinden. Die Marke $0000 bedeutet, daß das Betriebssystem auf dem vorgesehenen Adreßplatz keine Schnittstelle erkannt hat. Die Adressen der Serienschnittstellen COM werden in dem Beispiel mit dem Pseudofeld MemW gelesen; für die Adressen der Druckerschnittstellen LPT wird ein Feld aus vier Wörtern auf der absoluten Adresse $0040:$0008 angelegt. Die benutzerdefinierte Prozedur ausbhex sorgt für die Ausgabe in der

212

5 Anwendungsbeispiele

PROGRAM B5p2_l; (" Bild 5.2-1: Pascal-Speicheradressienmg ") VAE adr, a : WORD; lpt : ARRAY[0. .3] OF WORD ABSOLUTE $0040:$0008; PROCEDURE ausbhex(x : BYTE); (" Byte hexadezimal ausgeben ") CONST zif : ARRAY[0..15] OF CHAR = ( '0', '1', '2', '3', '4', '5', '6', '7\ '«', '9', 'A', 'B'C', 'D', 'E', 'F'); BEGIN Write(zif[(x SHR AND $0F],zif[x AND $0F]) END; BEGIN Write( 'Installierte Serieascbnittstellen: '); FOR a := 0 TO 3 DO BEGIN adr := MenW[$00'i0 : a«2]; IF adr 0 THEN BEGIN Write( ' CUIi'.a+l, ': $'); ausbhex(Hi(adr)); ausbhex(Lo(adr)) END; END; Write(#1«,«13, 'Installierte Druckerscbnittstellen:'); FOR a := 0 TO 3 DO BEGIN adr : = lpt[a]; IF adr 0 THEN BEGIN Write( ' LPT',a+1,':$'); ausbhex(Hi(adr)); ausbhex(Lo(adr)) END END; Write («10, «10, «13, 'Weiter mit er -> '); ReadLn END. Installierte Serienschnittstellen: Installierte Druckerschnittstellen:

C0M1: $03F8 LPT1: $0378

COM2: $02F8 LPT2: $0278

Weiter mit er -> Bild 5.2-1: Die Adressierung des Arbeitsspeichers

gewohnten

hexadezimalen

Ausgabemöglichkeit Die

Adressierung

Form,

für

die

es

in Pascal

keine

vordefinierte

gibt.

des Peripheriebereiches

e r f o l g t in Pascal über die Pseudo-

feider

Port f portadresse] PortW [portadresse]

Portadressen sind vom

für Bytes für Wörter

Datentyp W O R D

in Bild 5.2-2 d a r g e s t e l l t e

ohne

Programmbeispiel

gister der seriellen Schnittstelle COM1.

Angabe eines Segmentes. Das

untersucht

das

Modemstatusre-

213

5.2 PC-Hardware in Turbo-Pascal PROGRAM b5p2 2; (' Bild 5.2-2: Pascal-Peripherieadressierxmg USES Crt; (* Für ClrScr und KeyPressed Serienschnittstelle COM1 CONST coml = $03F8; (* Basisadresse VAR status : BYTE; (* Binäre Ausgabe eines Bytes PROCEDURE baus(x : BYTE); VAR m, i : BYTE; BEGIN (' Maske 1000 0000 B7 testen m := $80; FOR i := 1 TO 8 DO (* Für alle 8 Bitpositionen BEGIN IF (x AND m) = 0 THEN Write( '0') ELSE Write( '1'); m : = m SHR 1 (* Maskenbit rechts schieben END END; BEGIN ClrScr; WriteLn( fl0, //13, ' Modemstatus Abbrach mit Taste.") ; REPEAT status := Port[coml+6]; (" Modemstatusregister lesen Write( #13, '%'); bans (status) (* und binär ausgeben UNTIL KeyPressed; (" Abbruch mit belieb. Taste END. Bild 5 . 2 - 2 : Ausgabe des

*) ")

") *)

')

Modemstatusregisters

Das Programm

verwendet

adresse

Das M o d e m s t a t u s r e g i s t e r

$03F8.

-)

die s e r i e l l e

S c h n i t t s t e l l e COM1 hat

auf der

Anfangs-

den Abstand 6 von der B a s i s -

a d r e s s e . E s wird in einer S c h l e i f e g e l e s e n und mit Hilfe e i n e r b e n u t z e r d e f i nierten liefert

Prozedur

binär

ausgegeben.

Die

vordefinierte

Funktion

KeyPressed

beim B e t ä t i g e n e i n e r b e l i e b i g e n T a s t e den Wert T R U E als

bedingung der S c h l e i f e .

PROGRAM b5p2_3; (' Bild 5.2-3: Interrupt durch DWCK-Taste USES Dos, Crt; (' für SetlntVec und ClrScr VAR ende : BOOLEAN; PROCEDURE abbruch; INTERRUPT; (" aufgerufen bei Interrupt BEGIN ende := TRUE (* Abbruchaarke wahr Hachen END; BEGIN (* Hauptprogramm *) ClrScr; ende := FALSE; SetIntVec($05,Addr(abbruch)); (* Interrupt 5 umlenken REPEAT Write(«3,MemLt$00^0:$006C]) (' Tiiter-Zählervariable UNTIL ende; Write (/10, fl3, 'Abbruch: Heiter mit er -> '); ReadLn END. Bild 5 . 2 - 3 : Interrupt durch

DRUCK-Taste

') ') *) *)

') ')

Abbruch-

214

5 Anwendungsbeispiele

Pascalprozeduren, die durch einen Interrupt aufgerufen werden sollen, müssen durch das Kennwort INTERRUPT besonders gekennzeichnet werden; ein normaler Aufruf aus dem Hauptprogramm ist nicht möglich. Parameter (Daten) können mit einer Registerliste oder besser über globale Variablen übergeben werden. Die vordefinierte Prozedur SetlntVec der Unit Dos trägt die Adresse der Interruptprozedur in die Vektortabelle ein; bei Beendigung des Pascalprogramms wird der alte Vektor durch das Pascalsystem wiederhergestellt. In dem Beispiel Bild 5.2-3 wird mit dem Aufruf der Prozedur SetintVec($05, Addr(abbruch)) der Interrupt der DRUCK-Taste (Hardcopy), der auf den Vektor Nr. 5 führt, auf die Interruptprozedur abbrach umgelenkt. Diese setzt dann bei Betätigung der DRUCK-Taste die globale Abbruchmarke ende auf TRUE. Das Hauptprogramm gibt bis zu seinem Abbruch durch ende = TRUE laufend den Inhalt eines DOS-Zählers aus, der durch einen Timerinterrupt alle 55 ms um 1 erhöht wird. Ein häufige Anwendung findet die Interrupttechnik bei der seriellen Schnittstelle. Bei 4800 Baud und 10 Bits/Zeichen kann im ungünstigsten Fall alle 2 ms ein neues Zeichen am Empfänger erscheinen. Diese Zeit reicht normalerweise für eine Speicherung und Auswertung völlig aus; bei der Ausgabe auf dem Bildschirm kann es jedoch vorkommen, daß der Bildumlaufspeicher beim "Rollen" des Bildschirms neu aufgebaut werden muß. Während dieser Zeit (ca. 10 bis 15 ms) können Zeichen am Empfänger verloren gehen. Das in Bild 5.2-4 dargestellte Terminalprogramm verwendet daher eine interruptgesteuerte Empfangsprozedur, die das empfangene Zeichen in einen 1 kbyte großen Pufferspeicher (ARRAY) bringt. Die Bildschirmausgabe der Zeichen übernimmt die Schleife des Hauptprogramms. Das Programm wurde für den Betrieb der im Abschnitt 1.4.4 und im Kapitel 3 beschriebenen Computerschaltungen verwendet. PROGRAM b5p2_4; USES Crt, Dos; CONST t = 2V,

VAK

p = $07; x = $03F8; irqena = $EF; irqdis = $10; irqack = $64; irqvec = $0C; np = 1024;

(* Bild 5.2-4 (* 4800 Baud

(* (* (" (* (' (' (*

PC als Terminal *)

Ohne Par. 8 Daten 2 Stop Schnittstelle COttl Maske PIC IBQ4 freigeben Maske PIC IXQ4 sperren PIC ISQ4 bestätigen Vektor für IRQ4 Pufferlänge 1 kbyte

")

*) *) ') ') ') ') ')

zpuf : AKRAY[l..np] OF BYTE; (' Empfangspuffer ') ezeig, azeig : WORD; (" Pufferzeiger *) eride : BOOLEAN; (" Abbruchmarke *) PROCEDURE init; C Schnittstelle initialisieren BEGIN Port[x+3]

:= $80;

C 1000 0000 BLAB := l *)

Port[x+1] := Hi(t); Port[x+0] := Lo(t);(« Baudrate ')

Port[x+3]

zpuf[l]

Port[x+1] Port[x+4]

:= p;

:= Port[x+0]; := $01; := $08;

(' 0xxx xxxx DLAB := 0 ' )

(* Empfangsdaten leeren *)

(* 0000 0001 Empf.-Int. *) (* 0000 1000 OUT2 Int. frei ' )

zpuffl] := Port[x+2]; (" Interruptanzeige löschen *) Port[$21] Port[$21] AND irqena; (* PIC IRQ frei •) END;

")

5.2 PC-Hardware in Turbo-Pascal

215

PROCEDURE send(z : BYTE); (' Byte senden Statustest *) BEGIN IF z = $1B THEN ende := TRUE ELSE BEGIN WHILE Port [x+5] AND $60 = $00 DO; (* 0110 0000 *) Port[x+0] := z; (* Zeichen n. Sendedatenregister *) END; END; PROCEDURE empf; INTERRUPT; (" Byte empfangen Interr. *) BEGIN zpuf[ezeig] := Port[x+0]; IF ezeig = np THEN ezeig := 1 ELSE Inc(ezeig); Port[$20] := irqack; (* PIC Interrupt bestätigen *) END; PROCEDURE bild; (* Bildschirmausgabe *) VAR y,z : BYTE; BEGIN z := zpuf[azeig]; IF azeig = np THEN azeig := 1 ELSE Inc(azeig); CASE z OF (" Steuerzeichen *) $08 : GotoXY(WhereX-l.WhereY); (' Cursor links ') $0C : GotoXY(WhereX+l.VlhereY); (' Cursor rechts *) $0D : GotoXY(1,WhereY); (' CS Wagenrückl. ') $00 : ; (* Füllzeichen ') ELSE Write(CHAR(z)); (" Bildschirmausg.") END; END; BEGIN (* Hauptprogramm*) init; ende := FALSE; (* Initialisieren kein Ende ') ClrScr; GotoXY(20,25); Write( 'Abbruch mit Esc-Taste'); Window(l,1,80,23); ezeig := 1; azeig := 1; (* Index Pufferspeicher*) SetIntVec(irqvec,Addr(erapf)); (* Interruptvektor uml.*) REPEAT IF KeyPressed THEN send(BYTE(UpCase(ReadKey))); IF (ezeig azeig) THEN bild; (* Puffer ausgeben *) UNTIL ende; (* Esc-Taste: Ende *) Port[$21] := Port[$21] OR irqdis; (* PIC Int. sperren*) END. Bild 5 . 2 - 4 : Terminalprogramm

mit

Empfängerinterrupt

Der Ausgang INTRPT der S e r i e n s c h n i t t s t e l l e ist entsprechend Bild 5 . 1 - 2 1 an den Eingang IRQ4 des Interruptsteuerbausteins 8 2 5 9 A angeschlossen. Die B e t r i e b s a r t der Interruptsteuerung wird beim S y s t e m s t a r t bzw. bei jedem R e s e t vom B e t r i e b s s y s t e m ( D O S ) eingestellt und s o l l t e vom Benutzer nicht verändert werden. Die Prozedur init des Terminalprogramms gibt lediglich den IRQ4 durch eine Maskierung des entsprechenden B i t s im F r e i g a b e r e g i ster (Port $ 2 1 ) frei, ohne die anderen Bitpositionen zu verändern ( A N D - O p e ration). Die Interruptprozedur empf b e s t ä t i g t die Annahme eines Interrupts im Bestätigungsregister (Port $ 2 0 ) . Am Ende des Terminalprogramms wird der Interrupt wieder im F r e i g a b e r e g i s t e r (Port $ 2 1 ) gesperrt. Bild 5 . 2 - 5 zeigt die e x t e r n e Beschaltung des Druckerports mit Kippschaltern und Leuchtdioden sowie ein Programm, das die P o t e n t i a l e der Kippschalter am S t a t u s - und am Steuereingang l i e s t , zusammensetzt und über

216

5

Anwendungsbeispiele

Externe Beschattung des Druckerports

X+0 Daten ausgeben i

m

n u ,

X+0 Daten rücklesen

X X X X X

Ack

0 0 0 1 0 1 0 0 X+2 Steuersignale schreiben 1=0:Interrupt gesp. 1=1¡Interrupt frei

X+2 Steuersignale zurücklesen 1 0 0 0 0 0 1 1 = S83 XOR-Maske Teilkompleroerit

PROGRAM b5p2_5; (' Bild 5.2-5: digitale Ein/Ausgabe an Druckerport ') USES Crt; CONST lpt1 = $0378; (" Druckerschnittstelle LPT1 lpt2 = $0278; (• Druckerschnittstelle LPT2 VA» x : WORD; (* Adresse Druckerport bl, b2, b : BYTE; ant : CHAR; PROCEDURE baus(x : BYTE); (" Byte binär ausgeben VA» n, i : BYTE; BEGIN n : = $60; TOR i := 1 TO 8 DO BEGIN IF (x AND •) = 0 THEN Write( '»') ELSE Write( '1'); m := m SHR 1 END END; BEGIN ('Hauptprogramm") ClrScr; REPEAT Write(*10,tl3, 'LPT1 oder LPT2? 1 oder 2 -> '); ReadLn(ant); IF ant= '1' THEN x: = lptl ELSE IF ant= '2' THEN x:=lpt2 ELSE Write(#7) UNTIL (ant = '1') OR (ant = '2'); (* Kontrolle der Antwort •) WriteLn( 'Abbruch mit beliebiger Taste'); Port [x+2] := $04; (* 0000 0100 = O.e. - Ausgänge High legen REPEAT C Kippschalter ein und nach LED ausgeben bl Port[x+2] AND $07; (* 0000 0111 = Kipp Steuerleitungen lesen b2 := Port[x+l] AND $F8; (' 1111 1000 = Kipp Statuseingänge lesen b := (bl OR b2) XOR $83; (" montieren und Teilkomplementieren Port [x+0] := b; (* Druckerportausgabe auf Leuchtdioden Write(#13, '%'); baus(b) (* binäre Bildschirmausgabe UNTIL KeyPressed; END.

Bild 5.2-5: Digitale Ein/Ausgabe am Druckerport

5.2 PC-Hardware in Turbo-Pascal

217

den Datenausgang auf den Leuchtdioden wieder ausgibt. Mit der D r u c k e r schnittstelle, die praktisch an jedem PC zur Verfügung s t e h t , läßt sich bei einer Beschaltung mit Analog/Digital- und Digital/Analogwandlern auch eine analoge Signalverarbeitung durchführen. Die Druckerschnittstelle kann über den Statuseingang ACIC (bestätigen) einen Interrupt auslösen; standardmäßig ist für den Drucker LPT2 der Interrupt IRQ5 vorgesehen. Bild 5.2-6 zeigt ein Testprogramm, das in einer unendlichen Schleife einen Dualzähler auf dem Druckerport ausgibt. Im Gegensatz zum Interruptbeispiel der seriellen Schnittstelle wird der alte Interruptvektor mit der vordefinierten Prozedur GetlntVec g e r e t t e t und vor dem Abbruch (halt-Prozedur) wieder zurückgeschrieben. Zur Interruptauslösung wurde ein entprellter Taster verwendet.

Bild 5.2-6: Rechtecksignal Pascal PROGRAM b5p2_6; USES Dos, Crt; Abbruch durch Druckerinterrupt ACK CONST lpt = $0278; ifrei = $21; ibest = $20; VAR retter : POINTER; (" für alten Vektor (* Ausgabezähler x : BYTE; PROCEDURE stopp; INTERRUPT; BEGIN Port[lpt+2] := 0; ('ACK gesperrt Port [ifrei] := Portofrei] OR $20; (' ISQ5 gesperrt SetIntVec($0D,retter); (' alten Veictor Port[ibest] := $65; (' IRQ5 bestätigt halt; (" Prograomende END; BEGIN WriteLn(«10, »13, 'Abbruch mit ACK-Taster am Eingabeport B6!!!'); (' alten Vetor retten GetIntVec($0D,retter); (" Vektor IRQ5 auf stopp SetIntVec($0D,addr(stopp)) ; Port [ifrei] Port[ifrei] AND $DF; IRQ5 frei Port[lpt+2] = $14; ACK frei x := 0; REPEAT (* gemessen T0=6us f=167kHz") Port[lpt] (" Zähler ausgeben *) Inc(x); (* Zähler erhöhen ") UNTIL FALSE (' Abbruch mit Interrupt *) END.

C:\TP\DAV>debug b5p2_6.exe -u d9 e*i 2487:00D9 A05600 MOV 2487:00DC BA7802 MOV 2487:00DF EE OUT 2487:00E0 FE065600 INC 2487:00E4 EBF3 JMP

AL,[0056] DX.0278 DX, AL BYTE PTR [0056] 00D9

Bild 5.2-6: Rechteckausgabe mit ACK-Interrupt

Das Programm gibt auf dem Druckerausgang einen Dualzähler mit möglichst hoher Geschwindigkeit aus. Bei der Messung der auf der wertniedrigsten Leitung ausgegebenen Rechteckfrequenz (TO) zeigten sich Unregelmäßigkeiten,

218

5 Anwendungsbeispiele

die 10

auf us

alle

das ein

55

Wiederauffrischen

Refreshzyklus

ms e i n e

von

der

dynamischen

ca.

0.5

us)

und

vom

Typ

.EXE

wurde

mit

t r i e b s s y s t e m s u n t e r s u c h t . E i n e A n a l y s e der der

Ausgabeschleife Code

mer

wieder

Bild

5.2-7

den

zeigt,

erzeugt,

in d e r zeigt

daß

DX-Register

neu g e l a d e n

schnellere

wird,

an mit

dieser der

c

(* (* (' (" (* (' '(*

Bild

5.2-7:

der

keinen im-

ändert.

Maschinencode in das

wurde Pascal-

Einbau von M a s c h i n e n c o d e

Ab

6.0

Version

und E N D

des T u r b o auch

den. Bild 5.2-8 zeigt

Rechtecksignal

Pascal

mit

entsprechen,

und

ist e s

Assemblerbefehle

m ö g l i c h , z w i s c h e n den

in e i n e m

das g l e i c h e o p t i m i e r t e

auf

der e i n s c h l ä g i g e n

MsDos,

die

BIOS-

und

Literatur

dem

Kennwörtern

Pascalprogramm

Zählerprogramm

zu v e r w e n -

in der

Assemb-

mit den v o r d e f i n i e r t e n

Maschinenbefehl

INT

DOS-Interrupts zuzugreifen. Einzelheiten

entnommen

werden.

Assemblerbefehlen

Proze-

(Software-Interrupt)

PROGRAM b5p2_8; (' Bild 5.2-8: Rechtecksignal mit ASM ' ) CONST lpt = $0278; BEGIN WriteLn( //10, //13, 'Abbruch mit STRG + BREAK '); ASM mov dx,Lpt (' lade dx mit Portodresse mov al ,0 (* lösche Ausgabezählei gloop: out dx,a1 (* Zähler ausgeben inc al (" Zähler erhöhen @loop (' Schleife bis STRG + BREAK jnp END (* gemessen T0=4 us F=250 kHz END.

B i l d 5 . 2 - 8 : Einbau von

')

INLINE

l e r s c h r e i b w e i s e . In P a s c a l ist es auch m ö g l i c h , Intr

mit INLINE

Abbruch nur mit Strg + Break ') mov dx, lpt *) mov AL,0 ') out. DX, AL ') inc AL ") jmp -5 *) gemessen T0 = 4 us F = 250 kHz *)

Bild 5 . 2 - 7 :

duren

Stelle

Portadresse

o b w o h l e s sich n i c h t

Ausgabeschleife;

Be-

Maschinenbefehle

eingebaut.

PROGRAM b5p2_7; CONST lpt = $0278; BEGIN INLINE (( $BA/lpt/ SB0/S00/ SEE/ SFE/SC0/ SEB/SFB ) END.

ASM

alle (ca.

debug des

Testhilfe

Pascalcompiler

da z.B. das

Schleife

eine

der

der

rückübersetzten

mit H i l f e d e r T a b e l l e n des Anhangs ü b e r s e t z t und mit I N L I N E programm

(ca.

Timerinterrupt

Pause von c a . 100 u s ) z u r ü c k z u f ü h r e n sind. Das a u s f ü h r b a r e

Maschinenprogramm

optimalen

Speicherbausteine auf

sollten

5.3 Ein einfaches

5.3

Monitorprogramm

219

Ein einfaches Monitorprogramm

Ein Monitor ist ein Überwachungsprogramm für die Bedienung eines Rechners. Es ermöglicht dem Benutzer, Programme zu laden und zu s t a r t e n . Bei einem einfachen Monitor auf hexadezimaler Ebene sind alle Eingaben und Ausgaben Hexadezimalzahlen. Betriebssysteme (MS-DOS) enthalten meist einen auf h e x a dezimaler Ebene arbeitenden Monitor als Testhilfe (DEBUG). Dieser Abschnitt zeigt einen einfachen hexadezimalen Monitor, der z.B. für die in Kapitel 3 vorgestellten Schaltungen zur Eingabe von Testprogrammen verwendet werden kann. Die Entwicklung des Programms beginnt mit der in Bild 5.3-1 d a r g e s t e l lten Bedienungsanleitung.

Kommandozeile: *> Buchstabe = Segment¡Abstand *> Buchstabe = Abstand er

er

Unterkonmando Wirkung alt - neu (2 Hexaz.) Byte ändern, Adresse + 1 leerzeichen Byte anzeigen, Adresse + 1 + Byte anzeigen, Adresse + 1 Byte anzeigen, Adresse - 1 er Ende des Kommandos startadresse kein Start ohne Registerverwaltung portadresse alt - neu (2 Hexaz.) Port ändern, Adresse bleibt leerzeichen Port anzeigen, Adresse bleibt + Port anzeigen, Adresse + 1 Port anzeigen, Adresse - 1 er Ende des Kommandos byteadresse *- leerzeichen 16 x 16 = 256 Bytes anzeigen + nächsten Block ausgeben *_ vorhergehenden Block ausgeben * er Ende des Kommandos kein Benutzerregister anzeigen haltadresse kein Haltepunkt setzen startadresse kein ein Einzelschritt startadresse kein Programmstart mit Registeranzeige ladeadresse B-Port> portadresse Speicher laden von Port

Konmando S = byteadresse

A = P =

D =

R H T G E

= = = =

Progranmabbruch Einzelschritt Haltepunkt NMI-STOP Divisionsfehler Overflow

Unterkommando »TR- T *HP- G *ST- er *D0*0V-

Wirkung neuer Einzelschritt Programm fortsetzen Ende des Benutzerproqramms

Bild 5.3-1: Bedienungsanleitung des Monitors

Auf einer Kommandozeile erscheinen am linken Rand die Zeichen " * > " als Meldung des Monitors (Prompt). Dahinter r u f t der Benutzer mit einem Kennbuchstaben ein Kommando auf. Als Bestätigung erscheint das Zeichen "=", das den Benutzer zur Eingabe von Steuergrößen, meist einer Adresse, a u f f o r d e r t .

220

5

Anwendungsbeispiele

Diese werden als Hexadezimalzahlen ohne den in der Assemblerschreibweise üblichen Kennbuchstaben "H" eingegeben. Adressen bestehen in der Langform aus einem Segment und einem Abstand (Offset), die durch das Zeichen ":" zu trennen sind. Fehlt der Doppelpunkt, so wird nur der Abstand eingegeben, das Segment wird von der vorhergehenden Eingabe übernommen. Führende Nullen können entfallen, es werden nur die letzten vier Hexadezimalziffern berücksichtigt. Ein Wagenrücklauf (er) schließt die Eingabe ab. Bei der Ausgabe von Adressen erscheinen immer das Segment und durch einen Doppelpunkt getrennt der Abstand (Offset). Die einzelnen Kommandos können hinter dem Zeichen " - " weitere Eingaben (Unterkommandos) anfordern. Das S-Kommando (S = Substitute = ersetzen oder ändern) dient zum Anzeigen und Ändern von Bytes. Es erscheinen die Adresse (Segment:Offset) und der Inhalt des gewünschten Bytes, das nun durch Eingabe eines neuen Wertes überschrieben werden kann. Ist keine Änderung möglich, wenn z.B. ein EPROMBereich vorliegt, so erscheinen zwei Punkte als Fehlermeldung. Die laufende Adresse kann erhöht und vermindert werden. Mit dem D-Kommando (D = Dump = Speicherauszug) wird ein Bereich von 256 Bytes hexadezimal und als ASCII-Text ausgegeben. Mit dem P-Kommando (P = Peripherie) können Peripherieregister gelesen und beschrieben werden. Mit dem E-Kommando (E = Eingabe) kann ein Programm über eine Parallelschnittstelle 8255 wie in Abschnitt 5.1 gezeigt geladen werden. Das A-Kommando (A = Ausführen) startet ein Programm ohne die Testhilfen der T - und G-Kommandos. Diese laden beim Start des Benutzerprogramms die Register mit Werten aus einem vom Monitor verwalteten RAM-Bereich. Dieser Bereich kann auch mit dem R-Kommando (R = Register) angezeigt werden. Das G-Kommando (G = Go = gehe) setzt einen Haltepunkt, wenn dieser mit dem H-Kommando (H = Haltepunkt) auf eine bestimmte Adresse gesetzt wurde. Das T-Kommando (T = Trace = Programmverfolgung) führt nur einen Befehl aus und zeigt dann die in den RAM-Bereich geretteten Register an. Bei einem Programmabbruch durch die Einzelschrittsteuerung, beim Erreichen eines Haltepunktes, bei einem NMI-Interrupt (STOP-Taste), einem Divisionsfehler oder einem Zahlenüberlauf (Overflow bei INTO-Befehl) werden die Registerinhalte des Benutzers vom Monitor in einen RAM-Bereich gerettet und dann auf dem Bildschirm angezeigt. Nach der Festlegung der Monitorfunktionen wurde das in Bild 5.3-2 dargestellte Struktogramm des Monitorprogramms entworfen. Die Einsprungpunkte für einen Reset, einen Neustart und einen Interrupt sind besonders gekennzeichnet. In der Hauptschleife des Programms werden die Kommandos anhand der Kennbuchstaben unterschieden. Bei Eingabe unzulässiger Zeichen oder bei fehlerhaften Adressen ertönt die Hupe, und es wird ein Fragezeichen ausgegeben. Bei den Interrupteinsprüngen sind Programmunterbrechungen mit der Möglichkeit einer Fortsetzung, Programmabbrüche mit einer Rückkehr in den Monitor und der

5.3

RESET

Ein einfaches

Monitorprogramm

Serienschnittstelle programmieren

Neustart

Monitorregister und Datenbereich laden Vektortabelle mit Monitoradressen anlegen 0 11 t o r -

Hauptschleife

Monitorregister vorbesetzen Meldung MONITOR 1.0 Grundstellung *> S A

Np

Kommandobuchstaben lesen

/

0 k

H E 0) "O c SO P « X T5 •o « C c c 3 Ol »o c CT» £ C o 4> a> c CT» N c 3 c C O) a» 0> u«o c Jki « o> fO u C7> 0> 0) «TJ N k. C Ol 4> •M x: JZ 1A ca. u

Bild 5 . 3 - 2 :

G

IN E

o c

» j—

QJ V) c 3 O. a> 4-> «

£ u a> N c

e •M t.

?

Hupe c " auf dem Bildschirm ausgegeben. Anschließend erwartet der Monitor die Eingabe eines Buchstabens zur Auswahl des Kommandos. Die Abfrage geschieht durch eine Kette von Vergleichsbefehlen. Wurde der Buchstabe erkannt, so wird das Kommando ausgeführt, anderenfalls wird der Bereich bis zur nächsten Abfrage übersprungen. Durch die Aneinanderreihung der Kommandos war es möglich, die Teilprogramme unabhängig voneinander zu entwickeln und zu testen. Bild 5.3-10 zeigt das S-Kommando. S bedeutet Substitute oder Speicher ändern. ; BILD 5.3-10 SPEICHERBYTES ANZEIGEN, EINGEBEN, A E N D E R N SFUN: CALL EI NAD ADRESSE D E S BYTES L E S E N JNC SFUN1 KORREKTE E I N G A B E JMP nDNC FEHLERnELDUNG SFUN1: CALL AUSAD NEUE Z E I L E DS:BX A U S G E B E N riDU AL,CBXD DATENBYTE LADEN CALL AUSBY UND AUSGEBEN I10U AL, - LADEN CALL AUSZ UND AUSGEBEN CALL SFUN2: EINBY BYTE LESEN JC SFUNH STEUERZEICHEN U N T E R S U C H E N nou CBXD,AL BYTE SPEICHERN cnp CBXD,AL UERGLEICHEN OB RICHTIG G E L A D E N SFUN3 JNE UNGLEICH: SPEICHERFEHLER INC BX GLEICH: N A E C H S T E S B Y T E JflP SFUN1 SFUN3: MOU AL, ' . ' FEHLERHARKE . CALL AUSZ AUSGEBEN CALL AUSZ nou AL, 7 HUPE CALL AUSZ JHP SFUN1 ; K O n n A N D O Z E I C H E N AUSWERTEN SFUN4: cnp LEERZEICHEN ? AL,BOH JNE SFUN5 NEIN: WEITER INC BX JA: ADRESSE + 1 jnp SFUN1 SFUNS: cnp AL,'+' PLUSZEICHEN ? JNE NEIN: WEITER SFUNB JA: A D R E S S E + 1 INC BX jnp SFUN1 cnp SFUN6: AL, MINUSZEICHEN ? JNE SFUN7 NEIN: WEITER DEC BX JA: A D R E S S E - 1 JHP SFUN1 cnp CR W A G E N R U E C K L A U F ? SFUN7: AL.ODH NEIN: WEITER JNE SFUNB nDN2 GRUNDSTELLUNG jnp MONC FEHLERnELDUNG SFUNB: jnp

Bild 5.3-10:

Das S-Kommando zum Ändern von Speicherbytes

Nach der Eingabe der Adresse des Speicherbytes werden auf einer neuen Zeile die laufende Adresse (Segment:Offset) und der augenblickliche Inhalt hexadezimal ausgegeben. Der Benutzer kann nun diesen Inhalt ändern oder mit einem Unterkommando die laufende Adresse erhöhen bzw. vermindern. Bei der Spei-

232

5

Anwendungsbeispiele

c h e r u n g eines neuen W e r t e s wird g e p r ü f t , ob die Änderung der S p e i c h e r s t e l l e t a t s ä c h l i c h auch e r f o l g t ist. Da nach jeder Eingabe eines n e u e n Bytes durch zwei H e x a d z i m a l z i f f e m die Adresse a u t o m a t i s c h erhöht wird, können auf diese Weise sehr schnell T e s t p r o g r a m m e e i n g e g e b e n w e r d e n . Bild 5.3-11 zeigt das A - K o m m a n d o f ü r den S t a r t eines P r o g r a m m s ohne T e s t h i l f e n . A b e d e u t e t A u s führen.

;

BILD

(10N4 : AFUN :

AFUN1:

Bild 5.3-11:

5.3-11 CMP JNE CALL JNC JMP XOR PUSH PUSH PUSH IREI

PROGRAMM A U S F U E H R E N OHNE T E S T H I L F E N KOMMANDO A F U E R A U S F U E H R E N AL,'ft' N E I N : WEITER TESTEN M0N5 STARTADRESSE LESEN E I NAD KORREKTE EINGABE AFUN1 FEHLERMELDUNG MONC S T A T U S R E G I S T E R OOOOH A X , AX NACH S T A P E L AX S T A R T - S E G M E N T NACH S T A P E L DS S T A R T - O F F S E T NACH S T A P E L BX START ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !

?

Das A - K o m m a n d o zum Ausführen eines P r o g r a m m s

N a c h der Eingabe der S t a r t a d r e s s e werden das mit Nullen v o r b e s e t z t e S t a t u s r e g i s t e r sowie das S e g m e n t und der O f f s e t der S t a r t a d r e s s e auf den MonitorS t a p e l g e b r a c h t . Das P r o g r a m m wird mit dem B e f e h l IRET g e s t a r t e t , das diese drei Wörter vom Stapel holt und in die e n t s p r e c h e n d e n R e g i s t e r l ä d t . Da der I n t e r r u p t - E i n s p r u n g für die STOP-Taste n i c h t vorbesetzt wird, kann d a s Programm nur mit einem R e s e t abgebrochen w e r d e n . Im G e g e n s a t z dazu l i e f e r n die K o m mandos Go und T r a c e T e s t h i l f e n f ü r eine Untersuchung des P r o g r a m m a b l a u f s . Für die Untersuchung von P e r i p h e r i e r e g i s t e r n kann das in Bild 5.3-12 d a r g e s t e l l t e P - K o m m a n d o v e r w e n d e t werden. P b e d e u t e t P e r i p h e r i e t e s t .

; BILD S . 3 - 1 2 P E R I P H E R I E R E G I S T E R L E S E N UND AUSGEBEN MÖNS: CMP AL,'P' KOMMANDOZEICHEN P ? JNE HONG N E I N : WEITER TESTEN PFUN: CALL E I NAD P O R T A D R E S S E L E S E N NACH BX PFUN1: CALL AUSNZ NEUE Z E I L E CALL AUSüJD P O R T A D R E S S E AUSGEBEN CALL AUSLZ L E E R Z E I C H E N AUSGEBEN MOU DX,BX P O R T A D R E S S E NACH DX IN AL,DX B Y T E UON P O R T L E S E N CALL AU5BY UND AUSGEBEN MOU AL,'-' - A L S MARKE CALL AUSZ AUSGEBEN PFUNc? : CALL EINBY N E U E S B Y T E ODER KOMMANDO L E S E N JC PFUN3 KOMMANDO U N T E R S U C H E N OUT D X , AL B Y T E AUF P O R T A U S G E B E N JMP PFUN1 ADRESSE BLEIBT ; KOMMANDOZEICHEN AUSWERTEN CMP PFUN3: AL,50H LEERZEICHEN ? JE PFUN1 J A : ADRESSE B L E I B T CMP AL,'+' + ZEICHEN ? JNE PFUN4 N E I N : WEITER TESTEN INC BX PORTADRESSE + 1 JMP PFUN1 NEUE E I N G A B E

5.3 Ein einfaches Monitorprogramm PFUN4:

PFUN5: PFUN6: Bild 5 . 3 - 1 2 :

CI1P JNE DEC JHP CUP JNE JMP JHP

AL, PFUN5 BX PFUN1 AL,ODH PFÜNB MDN2 MONC

233

- ZEICHEN ? NEIN: WEITER TESTEN PORTADRESSE - 1 NEUE EINGABE CR ALS ENDEZEICHEN ? NEIN: FEHLER JA: ENDE DER FUNKTION FEHLERMELDUNG

Das P-Kommando zum Peripheiietest

Im Gegensatz zum S-Kommando bleibt beim P-Kommando die Adresse des Peripheriepotts unverändert, weil die Eingabe von einem bestimmten Register oder die Ausgabe auf einem bestimmten Register untersucht werden sollen. Die Adresse des gerade zu untersuchenden Peripherieports kann jedoch mit den Unterkommandos " + " und " - " erhöht bzw. vermindert werden. Die in ein R e g i ster eingeschriebenen Werte werden nicht durch Zurücklesen kontrolliert. Das in Bild 5 . 3 - 1 3 dargestellte D-Kommando dient zur Ausgabe eines Speicherbereiches von 2 5 6 Bytes. D bedeutet Dump gleich Speicherauszug.

; BILD 5 . 3 - 1 3 SPEICHERBLOCK AUSGEBEN CMP AL,-D' MONE : KOMMANDDZEICHEN D ? DFUN JE KOMMANDO D A U S F U E H R E N JMP M0N7 N E I N : WEITER TESTEN DFUN : CALL E I NAD A D R E S S E D S : B X ODER NUR BX L E S E N JNC DFUNO KORREKTE E I N G A B E JMP MONC FEHLERMELDUNG DFUNO: BL.OFOH MASKE 1 1 1 1 OOOO 1 B - B Y T E - G R E N Z E AND DFUN1: MOU AH, I B Z A E H L E R 1B Z E I L E N CALL AUSTN TEXT AUSGEBEN JMP DFUNB TEXT UEBERSPRINGEN DB 'SEG . OFF. D 1 E 3 4 S 6 7 B 9 A ' DB ' B C D E F 01E34SB7BSABCDEFS" AUSAD DFUN5: CALL S E G M E N T : O F F S E T AUSGEBEN PUSH BX LAUFENDE ADRESSE RETTEN nou CX, I B Z A E H L E R F U E R 1B B Y T E S DFUN3: MOU AL,CBX] BYTE LADEN INC BX ADRESSE + 1 AUSBY BYTE AUSGEBEN CALL CALL AUSLZ L E E R Z E I C H E N AUSGEBEN D F U N 3 B I S 1B B Y T E S A U S G E G E B E N LOOP' POP BX L A U F E N D E A N F A N G S A D R E S S E ZURUECK MOU CX, I B Z A E H L E R FUER 1B Z E I C H E N Z E I C H E N LADEN DFUN4: MOU AL,CBXJ INC BX ADRESSE + 1 CMP AL,EOH S T E U E R Z E I C H E N < EOH ? JB DFUN4A J A : DURCH . ERSETZEN CMP AL,BOH A S C I I - Z E I C H E N < BOH ? DFUN5 J A : A L S A S C I I - Z E I C H E N AUSGEBEN JB DFUN4A MOU AL, ' . ' B Y T E S < EOH ODER > 7 F H DURCH . DFUNS: CALL AUSZ Z E I C H E N AUSGEBEN LOOP DFUN4 B I S I G Z E I C H E N AUSGEGEBEN DEC ZEILENZAEHLER - 1 AH JNZ DFUN2 B I S 1B Z E I L E N A U S G E G E B E N CALL AUSTN TEXT AUSGEBEN JMP DFUNB TEXT UEBERSPRINGEN DB ' * D -S ' CALL DFUN6: EINZ ANTWORTZEICHEN LESEN CMP AL,ODH CR W A G E N R U E C K L A U F ? JNE DFUN7 N E I N : WEITER TESTEN JMP J A : ENDE DER F U N K T I O N M0N2

234

5

Anwendungsbeispiele

DFUN7:

DFUNB:

DFUN9:

DFUNA:

Bild 5.3-13:

CtIP JNE JMP CMP JNE JHP CMP JNE SUB JMP JMP

AL,20H DFUNB DFUN1 AL,'+" DFUN9 DFUN1 AL, DFUNA BX,515 DFUN1 MDNC

LEERZEICHEN ? N E I N : WEITER TESTEN J A : N A E C H S T E N BLOCK + HEICHEN ? N E I N : WEITER TESTEN J A : NAECHSTEN BLOCK - ZEICHEN ? N E I N : WEITER TESTEN J A : VORHERGEHENDEN BLOCK FEHLERMELDUNG

Das D-Kommando zur Ausgabe von Speicherbereichen

Auf einer Zeile erscheinen die Adresse ( S e g m e n t : O f f s e t ) des ersten Bytes sowie 16 Bytes einmal hexadezimal und dann als ASCII-Zeichen, um T e x t e leichter erkennen zu können. A l l e Steuerzeichen kleiner 20H und größer 7FH werden dabei durch einen Punkt ersetzt. Es wird immer ein Block von 256 Bytes auf 16 Zeilen ausgegeben. Mit Unterkommandos können der nächste bzw. der vorhergehende Speicherblock angefordert werden. Bild 5.3-14 zeigt die Ausgabe der Benutzerregister mit dem R-Kommando und das Setzen eines Haltepunktes mit dem H-Kommando.

; BILD 5.3-14 R E G I S T E R AUSGEBEN UND H A L T E P U N K T S E T Z E N M0N7: CMP KOMMANDOZEICHEN R ? AL,'R' JNE MONB N E I N : WEITER TESTEN RFUN: CALL AUSRE R E G I S T E R AUSGEBEN JMP MONB NEUES KOMMANDO ERWARTEN ; HALTEPUNKT SETZEN CMP MONB: AL,'H' KOMMANDOZEICHEN H ? JNE MÖNS N E I N : WEITER TESTEN HFUN: CALL E I NAD HALTEPUNKTADRESSE DS:BX LESEN HFUN1 JNC KORREKTE E I N G A B E JMP MONC FEHLERMELDUNG MOU HFUN1: ES:CSI+00:,DS ; H A L T E P U N K T - SEGMENT MOU ES:CSI+02],BX ; HALTEPUNKT - OFFSET JMP MÖNS ; NEUES KOMMANDO ERWARTEN

Bild 5.3-14:

Die Kommandos R (Registerausgabe) und H (Haltepunkt)

Das R-Kommando gibt die im R A M - B e r e i c h vom Monitor verwalteten Register des Benutzers aus. Das CS-Register am linken Rand zeigt das gerade adressierte Segment an. Die Register werden beim Start des Monitors mit Werten (meist Null) vorbesetzt. Die Segmentregister zeigen auf das Segment 0040. Der Stapelzeiger wird auf den O f f s e t 0100 im Segment 0040 gesetzt. Darüber kann der Benutzer seinen Befehlsbereich mit der Assembleranweisung " O R G 0100H" anlegen. In dieser einfachen Version des Monitors kann der Benutzer den Inhalt seiner Register nur anzeigen, aber nicht direkt mit H i l f e des Monitors verändern. Dies kann nur mit H i l f e des S-Kommandos im R A M - B e r e i c h durchgeführt werden. Bild 5.3-21 zeigt die Adressen der Register. Man beachte, daß im Speicher zuerst das L O W - B y t e und dann das HIGH-Byte eines Wortes angeordnet sind. Ein Haltepunkt muß auf das erste Byte eines Befehls gesetzt w e r -

5.3 Ein einfaches Monitorprogramm

235

den. Dieses B y t e wird später vor dem Start des Programms mit dem G - K o m mando durch den Code OCCH e r s e t z t , der einen Interrupt INT 3 auslöst und auf diese Weise in den Monitor zurückspringt. Beim Erreichen eines Haltepunktes wird also das Benutzerprogramm abgebrochen. Ein Haltepunkt kann nicht auf die Adresse 0 0 4 0 : 0 0 0 0 gesetzt werden, da dies als Marke dafür verwendet wird, daß kein Haltepunkt gesetzt ist. Beim Abbruch eines Programms wird der H a l t e punkt a u t o m a t i s c h wieder g e l ö s c h t . Bild 5 . 3 - 1 5 zeigt den Start eines Programms mit Testhilfen durch die Kommandos G für Go gleich Gehe und

T für T r a c e

gleich Programmverfolgung im Einzelschritt.

BILD MÖNS:

5.3-15 C(1P JNE CALL JNC

PROGRAMMSTART P1IT T - T R A C E UND G-GO AL,'T' KOMMANDOZEICHEN T ? MONA NEIN: WEITER TESTEN E I NAD STARTADRESSE DX:BX LESEN TFUN : TFUN1 KORREKTE E I N G A B E MONC FEHLERMELDUNG jtip E S : C S I + 1 4 D , DS TFUN1: MOU CODESEGHENT S T A R T A D R E S S E E S : C S I + 1 6 3 , BX DFFSET STARTADRESSE MOU DR B Y T E PTR E S : CS I + 4 3 D , O I H ; OOOO 0 0 0 1 T JHP GFUN3 K E I N HALTEPUNKT B E I TRACE PROGRAMMSTART CUT G - G O MONA: CMP KOMMANDOZEICHEN G ? AL,'G' KOMMANDO G AUSFUEHREN JE GFUN NEIN: WEITER TESTEN JMP MONB S T A R T A D R E S S E NACH D S : B X L E S E N E I NAD GFUN : CALL KORREKTE E I N G A B E GFUN1 JNC FEHLERMELDUNG MONC JHP ES:CSI+14D,DS CODESEGMENT S T A R T A D R E S S E GFUN1: MOU ES:CSI+163,BX OFFSET STARTADRESSE MOU AX,ES:CSI+00: HALTEPUNKT SEGMENT nou BX,ES:CSI+OS: HALTEPUNKT O F F S E T nou AX,0040H W I E B E I MONITORSTART ? cnp GFUNS N E I N : ALSO HALTEPUNKT JNE BX,OOOOH W I E B E I MONITORSTART ? cnp GFUN3 J A : K E I N HALTEPUNKT JE HALTEPUNKT S E T Z E N GFUN2: MOU DS,AX ; HALTEPUNKT SEGMENT MOU A L . C B X : ; CODE B E I HALTEPUNKT LADEN MOU AH, AL ; CODE AUCH NACH AH MOU ES:CSI+043,AX ; CODE NACH S P E I C H E R RETTEN MOU A L , OCCH ; CODE D E S B E F E H L S INT 3 MDU C B X H . A L ; NACH HALTEPUNKT A N S T E L L E CODE : K E I N HALTEPUNKT: I N T E R R U P T U E K T O R E N UND R E G I S T E R LADEN INTERRUPTUEKTOREN SETZEN CALL INTSET GFUN3: JMP GFUN4 W E I T E R NACH R E G I S T E R LADEN IOOH JMP UOOH: DIUISIONSFEHLER I01H U01H: JMP TRACE-EINSPRUNG I02H JMP UOEH: NMI-STOP-TASTE I03H U03H: I N T 3 - B E F E H L HALTEPUNKT JMP I04H U04H: JMP OUERFLOWFEHLER AX, C S I N T S E T : MOU CODESEGMENTREGISTER BP, SP MOU BP - S T A P E L Z E I G E R BX,CBP: MOU BX - B E F E H L S Z A E H L E R " J M P G F U N 4 " BX,3 BX - O F F S E T UON " U O O H : " ADD D I , D I D I - OOOO O F F S E T U E K T O R T A B E L L E XOR D S , D I MOU DS - SEGMENT U E K T O R T A B E L L E C X , 5 MOU ZAEHLER FUER 5 UEKTOREN C D I D , B X O F F S E T UEKTOR LADEN I N T S E 1 : nou C D I + E ] , A X MOU ; SEGMENT UEKTOR LADEN DI , 4 NAECHSTER UEKTOR ADD B X , 3 NAECHSTER J M P - B E F E H L ADD INTSE1 S C H L E I F E B I S CX - 0 LOOP RET RUECKSPRUNG

236

GFUN4:

5 Anwendungsbeispiele

MOU MOU MOU

nou

MOU MOU MOU MOU PUSH PUSH PUSH PUSH MOU MOU POP IRET

Bild 5.3-15:

SS,CSI+323 SP,CSI+343 BP,CSI+3BD ES,CSI+HO] DI,CSI+303 DX,CSI+26D CX,CSI+24D BX,CSI+E5D CSI+42] CSI+14D CSI+16] CSI+3B3 AX,CSI+50] SI,CSI+5B] DS

STAPEL-SEGMENTREGISTER STAPELZEIGER BASISZEIGER EXTRADATEN-SEGMENTREGISTER DESTI NAT ION-1NDEXREGISTER DX-REGISTER CX-REGISTER BX-REGISTER STATUSREGISTER CODE-SEGMENTREGISTER BEFEHLSZAEHLER DATEN-SEGMENTREGI STER AX-REGISTER SOURCE-INDEXREGISTER DATEN-SEGMENTREGISTER AUS STAPEL PC CS UND STATUS AUS STAPEL START!!!!

Die Kommandos G (Go) und T (Trace) mit Testhilfen

Eine Testhilfe ermöglicht es dem Benutzer, die Wirkung seiner Befehle durch Anzeige der Registerinhalte zu kontrollieren, das Programm beim Erreichen eines bestimmten Befehls durch Setzen eines Haltepunktes anzuhalten oder das Programm Befehl für Befehl im Einzelschritt zu verfolgen. Der Benutzer muß dann sein Programm fortsetzen können. Dabei dürfen die Registerinhalte des Benutzers in keiner Weise verändert werden. Vor dem Start werden die Interruptvektoren für die Programmabbrüche Divisionsfehler, Einzelschritt, NMIInterrupt (STOP-Taste), Haltepunkt und Overflow gesetzt. Bei einem T-Kommando wird das T-Bit des Statusregisters auf 1 gesetzt, der Haltepunkt wird nicht geladen. Der Start erfolgt mit dem Befehl IRET über den Benutzerstapel, der das Statusregister, den Befehlszähler und den Offset der Startadresse aufnimmt. Bild 5.3-16 zeigt den Abbruch eines Benutzerprogramms durch einen Interrupt-Einsprung in den Monitor.

; BILD 5.3-16 IOOH: PUSH MOU JMP I 01H : PUSH MOU JMP I02H: PUSH MOU JMP I03H: PUSH MOU JMP I04H: PUSH MOU RSAUE: PUSH PUSH XOR MOU MOU MOU MOU MOU MOU

INTERRUPT -

SI

SI,4430H RSAUE SI SI,54S2H RSAUE SI SI ,53S4H RSAUE SI SI,4B50H RSAUE SI SI ,4F5BH SI DS SI ,SI DS, SI SI ,STOP CSI+20D,AX CSI+25D,BX CSI+24D,CX CSI+263,DX

NSPRUENGE SI NACH BENUTZERSTAPEL KENNUNG DO REGISTER RETTEN 51 NACH BENUTZERSTAPEL KENNUNG TR REGISTER RETTEN SI NACH BENUTZERSTAPEL KENNUNG ST REGISTER RETTEN SI NACH BENUTZERSTAPEL KENNUNG HP REGISTER RETTEN SI NACH BENUTZERSTAPEL KENNUNG OU KENNUNG NACH BENUTZERSTAPEL DS NACH BENUTZERSTAPEL SEGMENT 0000 NACH DATEN-SEGMENTREGISTER DATENBEREICH BENUTZERLUERTE AX RETTEN BX RETTEN CX RETTEN DX RETTEN

5.3 Ein einfaches

RSAUE1:

RSAUE2:

Monitorprogramm

237

tIDU CSI+303,DI DI RETTEN nou CSI+3S3,SS SS RETTEN MOU CSI+363,BP BP RETTEN nou CSI+40D,ES ES RETTEN POP CSI+383 DS RETTEN POP •X KENNUNG UOM BENUTZERSTAPEL POP CSI+2B3 S I RETTEN POP CSI+1G3 PC RETTEN POP C5I+14D CS RETTEN POP CSI+42D STATUSREGISTER UOn BENUTZERSTAPEL AND BYTE PTR C S I + 4 3 D , O F E H : nASKE 1111 1110 T - 0 nou CSI+343,SP SP RETTEN MOU AX,CSI+OOl HALTEPUNKT SEGnENT LADEN nou BX,CSI+053 HALTEPUNKT OFFSET LADEN CHP AX.0040H HALTEPUNKT GESETZT ? JNE RSAUE1 J A : ZURUECKLADEN cnp BX,0000H HALTEPUNKT GESETZT ? JE RSAUE2 N E I N : NICHT ZURUECKLADEN nou ES, AX ES - HALTEPUNKT SEGnENT nou AH,CSI+043 ALTER CODE nou AL,ES:CBX] CODE UDN HALTEPUNKT HOLEN cnp AL,OCCH CODE DES BEFEHLS " I N T 3 " ? JNE RSAUE5 WAR NICHT GESETZT WARUn ? ? ? ? nou ES:CBX3,AH ALTEN CODE ZURUECK AN HALTEPUNKT DEC WORD PTR C S I + 1 6 3 : BEFEHLSZAEHELR - 1 BEI HALTEPUNKT nou AX,0040H HALTEPUNKT i n n E R LOESCHEN nou CSI+003,AX SEGnENT 0040H - K E I N HALTEPUNKT XDR AX, AX OFFSET OOOOH nou CSI+023,AX OFFSET 0 0 0 0 - K E I N HALTEPUNKT nou CSI+04D,AX CODERETTUNG GELOESCHT

n O N I T O R - R E G I S T E R LADEN UND FORTSETZUNGSSCHLEIFE nou ES, AX EXTRADATEN-SEGnENT nou S S , AX STAPEL-SEGnENT nou SP,STOP STAPELZEIBER AUSRE CALL REGISTER AUSGEBEN CALL AUSNZ NEUE Z E I L E MOU AL,'*• * FUER FORTSETZUNGSSCHLEIFE CALL AUSZ AUSGEBEN MOU A L , DH 1 . ZEICHEN CALL AUSZ AUSGEBEN MOU A L , DL E. ZEICHEN AUSZ AUSGEBEN CALL nou AL,'-' - A L S PROMPT AUSZ CALL AUSGEBEN CALL EINZ ANTWORT LESEN cnp A L , "T 1 T - TRACE ? JNE RSAUE3 N E I N : WEITER TESTEN OR BYTE PTR ES : C S I + 4 3 3 , 0 1 H ; 0000 0001 T - 1 jmp GFUN4 NEUER E I N Z E L S C H R I T T cnp AL,'G' G - GO ? JNE N E I N : WEITER TESTEN RSAUE4 jnp GFUN4 J A : PROGRAnn STARTEN OHNE HALTEPUNKT jnp MONI ; ABBRUCH UND NACH HAUPTSCHLEIFE

Bild 5.3-16:

Jeder

Interrupteinsprünge in den Monitor

Interrupteinsprung

bedeutet, daß das Statusregister, der Befehlszähler

und das Codesegmentregister

auf

den augenblicklich zugeordneten Stapel, in

diesem Fall den Benutzerstapel, g e l e g t w e r d e n . N a c h dem R e t t e n des S I - R e g i sters wird der Einsprungpunkt durch eine Kennung f e s t g e h a l t e n , die zunächst im Stapel a b g e l e g t wird. Denn werden alle R e g i s t e r des Benutzers in den R A M B e r e i c h g e r e t t e t . Dabei

werden insgesamt 6 Wörter aus dem

Benutzerstapel

238

5

Anwendungsbeispiele

gezogen. Der Benutzer-Stapelzeiger hat damit den gleichen Inhalt wie vor dem Interrupt. Die im Stapel liegenden Daten des Benutzers bleiben unberührt. Die darunter liegenden, also z.B. bereits freigegebenen T e i l e des Stapels sind j e doch von den 6 Wörtern überschrieben worden. Nach einer Meldung des Einsprungpunktes durch die Kennung hat der Benutzer die Möglichkeit, das Programm mit den Unterkommandos G oder T fortzusetzen. Jeder andere Kennbuchstabe führt zurück in die Hauptschleife des Monitors. Bild 5.3-17 zeigt das Laden von Daten (z.B. Programmen) über eine Parallelschnittstelle sowie die Antwort auf eine fehlerhafte Eingabe.

; BILD HD N B :

5.3-17 DATEN UON P A R A L L E L S C H N I T T S T E L L E LADEN UND FEHLERMELDUNG CMP KOMMANDOBUCHSTABE E ? AL,'E' JNE MONC N E I N : WEITER TESTEN EFUN: CALL E I NAD LADEADRESSE D S : B X LESEN DX,BX MOU OFFSET NACH DX R E T T E N JNC EFUN1 GUELTIGE EINGABE JMP FEHLERMELDUNG MONC EFUN1: CALL AUSTN TEXT AUF NEUER Z E I L E AUSGEBEN JHP EFUN5 TEXT U E B E R S P R I N G E N DB 'B-PORT >S' EFUNE: CALL PORTADRESSE E I N G E B E N NACH BX EINWD CUP ABBRUCHZEICHEN ? AL.50H JBE EFUN3 L E E R Z E I C H E N ODER S T E U E R Z E I C H E N JTIP MONC FEHLERMELDUNG EFUN3: XCHG DX.BX DX-PORTADRESSE BX-OFFSET ADD DX,4 DX-ADRESSE S T E U E R R E G I S T E R MOU AL,93H A - E I N B - E I N CH-AUS C L - E I N •UT DX, AL NACH S T E U E R E G I S T E R B S 5 5 SUB DX,2 DX-ADRESSE C - P O R T STEUERLEITUNGEN MOU EFUN4: AL.OOH OOOO 0 0 0 0 BUSY - LOU) OUT D X , AL EMPFAENGER B E R E I T IN EFUN5: A L , DX DATA STROBE DS T E S T E N TEST MASKE 0 0 0 0 0 0 1 0 DS - ? AL,02H JN2 K E I N E DATEN DA EFUN5 D X - ADRESSE B - P O R T SUB DX,2 IN DATEN L E S E N A L , DX MOU DATEN S P E I C H E R N CBX],AL ADD DX,2 DX-ADRESSE C - P D R T I10U 1111 1 1 1 1 BUSY - ACK - HIGH AL.OFFH OUT DX, AL MELDUNG DATEN UEBERNOMMEN INC BX SPEICHERADRESSE + 1 DATA STROBE DS T E S T E N IN EFUN6: A L , DX TEST MASKE 0 0 0 0 0 0 1 0 DS - ? AL,02H ALTE DATEN STEHEN NOCH AN JZ EFUN6 CTIP BX,OFFFFH ; ENDE DES S P E I C H E R S E G M E N T E S ? N E I N : W E I T E R EMPFANGEN UND S P E I C H E R N JNE EFUN4 JMP BEGIN MONITOR N E U S T A R T : E I N G A B E F E H L E R : UNBEKANNTER KOMMANDOBUCHSTABE FEHLERMELDUNG MONC: MOU AL , ' ? ' CALL AUSZ AL,7 HUPE MOU CALL AUSZ NEUE S C H L E I F E JMP MONI

Bild 5.3-17:

Das E-Kommando (Empfang von Daten) und Fehlermeldung

5.3 Ein einfaches Monitorprogramm ; BILD 5.3-18 ORG •B DB DU DUI DB PROG ENDS END

Bild 5 . 3 - 1 8 :

239

RESET - STARTADRESSE OSFOH ; NUR F U E R U E B E R S E T Z U N G SOH ; CODE NDP-BEFEHL OEAH ; CODE JMP INTERSEGMENT OBOOH ; B E F E H L S Z Ä H L E R S P R U N G Z I E L CS KBYTE3 OFFOOH : CODESEGMENT SPRUNGZIEL 'HON14.B6K2' ; K E N N U N G D E R U E R S I O N ; E N D E DES S E G M E N T E S START ; STARTADRESSE

B e s t i m m u n g d e r S t a r t a d r e s s e des Monitors

Der a m Ende d e s E P R O M - B e r e i c h e s auf der p h y s i k a l i s c h e n S p e i c h e r a d r e s s e F FFFO l i e g e n d e B e f e h l JMP b e s t i m m t die L a g e des M o n i t o r p r o g r a m m s , d a s bis auf d i e s e n e i n e n B e f e h l l a g e u n a b h ä n g i g ist. Es w u r d e mit d e r Anweisung " O R G 0 1 0 0 H " r e l a t i v zum Adreßzähler 0100 ü b e r s e t z t , l ä u f t a b e r o h n e Ä n d e r u n gen ( U m a d r e s s i e r u n g ) ab A d r e s s e 0800 (JMP 0 F F 0 0 H : 0 8 0 0 H ) . D a m i t l i e g t e s auf den o b e r s t e n 2 K B y t e d e s A d r e ß b e r e i c h e s von der p h y s i k a l i s c h e n S p e i c h e r a d r e s s e F F 8 0 0 bis F F F F F . Bei e i n e m 8 - B i t - S y s t e m m i t dem Prozessor 8088 kann es in e i n e n 2 - K B y t e - B a u s t e i n g e l a d e n w e r d e n . Bei e i n e m 1 6 - B i t - S y s t e m ist es j e w e i l s in d i e b e i d e n o b e r s t e n 1-K.Byte der p a r a l l e l g e s c h a l t e t e n B a u s t e i n e zu b r i n g e n . Der B e r e i c h zwischen dem P r o g r a m m und den B e f e h l e n NOP und JMP am Ende w u r d e d u r c h die B y t e s F F a u s g e f ü l l t . D u r c h Ä n d e r u n g der S p r u n g a d r e s s e des J M P - B e f e h l s kann d a s M o n i t o r p r o g r a m m auf j e d e m S p e i c h e r platz ablaufen.

physikalische Speicheradresse 0 0FFF

0040:OFFF Benutzer bereich 0040:0100 Benutzerstapel (vom Monitor angelegt) 1

0 0500 0 04 FF

CS

|0040|

PC |0000 |

SS

100401

SP 101001

DS 100401

ES

|0040 |

sonst. Register: |0000|

Benutzerreg i ster

Bild 5 . 3 - 1 9 :

V o r b e s e t z t e B e n u t z e r r e g i s t e r und d e r B e n u t z e r b e r e i c h

240

5

Anwendungsbeispiele

Bild 5 . 3 - 1 9 zeigt die vorbesetzten Benutzerregister und den Benutzerbereich des Schreib/Lesespeichers, der aus mindestens einem 2 - K B y t e - R A M bestehen s o l l t e . Die R e g i s t e r sind so vorbesetzt, daß der Benutzer sein Programm ab der O f f s e t - A d r e s s e 0100 laden kann. Darunter ist der B e n u t z e r - S t a p e l a n g e l e g t . Der Benutzer hat natürlich die F r e i h e i t , sowohl mit den Monitorkommandos als auch in seinem Programm j e d e physikalische Speicheradresse anzusprechen und auch die V e k t o r t a b e l l e zu verändern. Bei jedem Neustart des Monitors werden zunächst alle Interruptvektoren mit Monitoreinsprüngen vorbesetzt. Vor jedem P r o g r a m m s t a r t mit den Kommandos G und T werden zusätzlich die I n t e r r u p t vektoren INT 0 bis INT 4 mit Monitoradressen geladen. Ist dies unerwünscht, so kann ein Benutzerprogramm auch mit dem A - K o m m a n d o ohne T e s t h i l f e n g e s t a r t e t werden. Bild 5 . 3 - 2 0 zeigt die dem Benutzer verfügbaren I n t e r r u p t e i n sprünge mit dem Aufruf von Unterprogrammen für die Eingabe und Ausgabe von Zeichen von und zum Bedienungsterminal.

Befehl

Register

Wirkung

00H 01H 02H 03H 04H 10H 11H 17H 20H 21H 21H 21H

beiiebig beliebig beliebig beliebig beliebig beliebig AL=xx AL=Zeichen beliebig AH=1 AL=xx AH=2 DL=Z. AH=6 AL=xx

INT 21H sonst.

AH=8 AL=xx beliebig

Registerausgabe *D0- (Divisionsfehler) Registerausgabe *TR- (Einzelschritt) Registerausgabe *ST- (STOP-Taste) Registerausgabe *HP- (Haltepunkt) *0V- (Overflow) Rückkehr in den Monitor Zeichen nach AL lesen ohne Echo Zeichen aus AL ausgeben Rückkehr in den Monitor Zeichen nach AL lesen mit Echo Zeichen aus DL ausgeben Empfänger testen CY = 0: AL = 00 kein Zeichen CY = 1: AL = Zeichen nach AL qelesen Zeichen nach AL lesen ohne Echo wie INT 10H und INT 20H Rückkehr Monitor

INT INT INT INT INT INT INT INT INT INT INT INT

Bild 5 . 3 - 2 0 :

Für den Benutzer verfügbare Interruptvektoren

Der Benutzer kann seine in den R A M - B e r e i c h g e r e t t e t e n R e g i s t e r i n h a l t e nicht d i r e k t , sondern nur mit Hilfe des S - K o m m a n d o s im Speicher ändern. Bild 5 . 3 21 zeigt die Adressen der Benutzerregister. Dabei ist zu b e a c h t e n , daß bei Wörtern im Speicher zuerst das L O W - B y t e und dann das H I G H - B y t e angeordnet ist. Der Befehlszähler wird immer durch die Kommandos A, G und T neu g e laden. Für die Übersetzung von kleinen Testprogrammen enthält der Anhang hexadezimale Befehlslisten für die wichtigsten B e f e h l e . Größere Programme können auf einem Personal Computer mit Hilfe des B e t r i e b s s y s t e m s e n t w i c k e l t und über die p a r a l l e l e D r u c k e r s c h n i t t s t e l l e geladen werden. Bild 5 . 3 - 2 2 zeigt ein T e s t programm, das ähnlich wie das einführende Beispiel des Kapitels 4 Zeichen vom

5.3 Ein einfaches

physikalische Speicheradr. 0 04M 0 04A8 0 04A6 0 04A4 0 04A2 0 04A0 0 049 E 0 049 C 0 049 A 0 0498 0 0496 0 0494 0 0492 0 0490 0 048E 0 048C 0 048A 0 0488 0 0486 0 0484 0 0482 0 0480 Bild 5 . 3 - 2 1 :

dez. +42 +40 +38 +36 +34 +32 +30 +28 +26 +24 +22 +20 + 18 + 16 + 14 + 12 +10 +8 +6 +4 +2 +0

Register/Wort Statusregister ES Extraseqmentr. DS Datensegmentr. BP Basiszeiger SP Stapelzeiger SS Stapelsegmentr. DI Destinationind. S1 Sourceindexreg. DX DX-Register CX CX-Register BX BX-Register AX AX-Register frei PC Befehlszähler CS Codesegmentreg. frei frei frei frei Haltepunkt Code Haltepunkt Befehlsz. Haltepunkt Segment

Anordnung d e r B e n u t z e r r e g i s t e r im

vorbesetzt 0000 0040 0040 0000 0100 0040 0000 0000 0000 0000 0000 0000 0000 0000 0040 0000 0000 0000 0000 0000 0000 0040

Speicher

Auf c

Seite:

Z E I L E Ad r e s s e

Inhalt

0

Name

Befeh1

DRG

2

R

JFI

STFTßT:

0 402

R.H

41

LOOP;

O MOV

CD

M

5 0 H0G

3C

JFT

4

6 7

Operand

Bemerkung

• M A 5.'S - A I

1

3

241

Monitorprogramm

O 400

(MOS

>S

C H o fo

CD

(0

¥

MOV /WT

/ITH

M

A4 H

CMP

3

.. ICLCU^,

A L JFTH

ilNE

LOOP

IMT

JD W

/XMitfbuiS* Ü& : NOMTOR

ETNB ••

Bild 5.3-22:

T e s t p r o g r a m m f ü r die E i n g a b e und A u s g a b e von Z e i c h e n

T e r m i n a l liest und w i e d e r a u s g i b t . Als E i n g a b e m a r k e w i r d e i n S t e r n a u s g e g e b e n . Bei

der

Eingabe

der

Endemarke

Stern

kehrt

das

Programm

zurück

M o n i t o r . M a n b e a c h t e , d a ß d a s S p r u n g z i e l L O O P in d e r h e x a d e z i m a l e n

in

den

Über-

setzung als Abstand vom n ä c h s t e n B e f e h l zum Sprungziel einzusetzen ist. Dazu e n t h ä l t der Anhang eine Zahlentabelle, aus der der v o r z e i c h e n b e h a f t e t e relative Abstand abzulesen

ist.

242

J

Anwendungsbeispiele

MONITOR 1 . 0 *>S=100 0 0 4 0 : 0 1 0 0 AA-BO 0040:0101 AA-2A 0 0 4 0 : 0 1 0 2 AA-CD 0 0 4 0 : 0 1 0 3 AA-17 0 0 4 0 : 0 1 0 4 AA-CD 0 0 4 0 : 0 1 0 5 AA-11 0 0 4 0 : 0 1 0 6 AA-3C 0 0 4 0 : 0 1 0 7 AA-2A 0040:0108 AA-75 0040:0109 AA-F8 0 0 4 0 : 0 1 OA AA-CD 0040:010B AA-10 0 0 4 0 : 0 1 OC A A *>H=1_0A *>G=100 DAS IST E I N T E S T L A U F • CS PC CODE AX BX CX DX SI DI SS SP BP DS ES STAT Ü04CT CT10Ä CD10CT027tCTOOCTCTOOCTCTOOCTCTOOCTÜÖOIT TT04U C I OCT 000CT CT04CT CT04CT F 0 4 6 *HP- & MONITOR 1 . 0 *>

Bild 5.3-23:

Bild 5.3-23

Eingabe und Start des Ein/Ausgabe-Testprogramms

zeigt die Eingabe des Programms aus der hexadezimalen U b e r -

setzungsliste, das Setzen eines Haltepunktes auf die Adresse 10A (Befehl INT 10H) und den Start des Programms ab Adresse 100. Nach der Eingabe der Endemarke " * " wurde der Haltepunkt erreicht. Das Programm wurde mit dem U n t e r kommando " G " fortgesetzt und kehrte zurück in den Monitor. Bild 5.3-24 zeigt ein Testprogramm mit vier Zählern in den Registern A X , BX, CX und D X . Um die

Berechnung

des relativen Sprunges zu umgehen, wurde ein berechneter

Sprung über ein sonst unbenutztes Register verwendet. Dabei wird das D I - R e g i ster durch den Befehl " M O V D I , S T A R T " mit dem O f f s e t des Sprungziels g e l a den. Der Befehl

"JMP DI" springt Hann zu dem im DI-Register

enthaltenen

Abstand. Bild 5.3-25 zeigt das Eingeben des Programms und die Verfolgung im Einzelschritt m : t dem T-Kommando. Mit dem Unterkommando G wird das Programm f r e i gestartet, mit der STOP-Taste durch einen NMI-Interrupt a b g e brochen und dann im Einzelschritt w e i t e r v e r f o l g t .

5.3 Ein einfaches

A ü f 9 a b 6 !

Z e i l e

Adresse

ftdiAS^-jy-

~ W t Name

I n h a l t

0 j

Befeh 1

• 8JLA

1

3 4 5 6 7

S e l t e : Operand

0

HO0

/fOOW

I N C

A X

IA)C

a

H*

INC

C X

Ö

k*

IWC

D X

( W 0 4 -

6

( H O T -

F F

4.TART:

4"0

O-fCH 0

XOi.

F

0 0

o-f

MOV ftMP

e ?

3

Bemerkung

S . V J 4 O Q b

2

Monitorprogramm

D i

y

START D I

5 N D

Bild 5.3-24: Testprogramm mit Zählern und berechnetem Sprung *>s=ioo 0040:0100 AA-40 0040:0)01 AA-43 0 0 4 0 : 0 1 0 2 AA-41 0040:0103 AA-42 0040:0104 AA-BF 0040:0105 AA-00 0 0 4 0 : 0 1 0 6 AA-01 0040:0107 AA-FF 0040:0108 AA-E7 0040:0109 AA*n=100 CS PC CODE AX 0 0 4 0 TJ10T 4341 TOOT •TR-T CS PC CODE AX 0 0 4 0 17107 4142 OOOT *TR-T CS PC CODE AX Ü04O 17103 42BF TOOT •TR-T CS PC CODE AX 0 0 4 0 Ü 1 0 T BFOO TOOT «TR-T CS PC CODE AX 0 0 4 0 5 1 0 7 F F E J ÜOOT •TR-T CS PC CODE AX 0 0 4 0 17100 4 0 4 3 TJOOT •TR-T CS PC CODE AX U041T1710T 4341 TO02 5S3 * T R - fr CS PC CODE AX TO4TJ TJlCfT 4341 "309T •ST-T CS PC CODE AX O04Ü 0 1 0 ? 4142 T 0 9 T *TR-T CS PC CODE AX O04Ü Ü 1 0 3 42BF 3 0 9 T •TR-T CS PC CODE AX 0 0 4 0 0 1 0 * BFOO 3 0 9 T • T R - e* MONITOR 1 . 0 *>

Bild 5.3-25:

DI SS SP BP DS ES STAT BX CX DX SI TOGO UOÖÜ TJOÖO TOOO TOOO TO4U "0100 TOOO TO417 TO40 F002 BX CX DX Sl DI SS SP BP DS ES STAT TOOT OOOO 170017 OOOTT 170017 170417 171017 00017 170417 170417 F002 DI SS SP BP DS ES STAT BX CX DX SI TOOT TOOT TOOU ÜOOÜ 170017 "0040 0 1 0 0 TOOO TO40 TO40 F002 BX CX DX SI TOOT TOOT TOOT TOOO

DI SS SP BP DS ES STAT TOOO U 0 4 0 0 1 0 0 TOOO TO40 0 0 4 0 F 0 0 2

DI SS SP BP DS ES STAT BX CX DX SI ÜQQT TOOT ÜOQT TOOU O U S T D D 4 0 17100 TOOO 0 D 4 0 0 Q 4 0 F Q 0 2 BX CX DX SI TOOT TOOT TOOT TOOÜ

DI SS SP BP DS ES STAT 17100 TO40 171 CD TOOO 00417 170417 F 0 0 2

BX CX DX Sl TOOT TOOT TOOT TOOÜ

01 SS SP BP DS ES STAT 0 1 0 0 0 0 4 0 0 1 0 0 0 0 0 0 0 0 4 0 0 0 4 0 F002

DI SS SP BP DS ES STAT BX CX DX SI 70917 "3090 '30917 TOÖO 0 1 0 0 00417 U l O O TOOO U 0 4 U 0 0 4 0 F 0 0 2 BX CX DX SI DI SS SP BP DS ES STAT J 0 9 T 10917 30917 TO017 0 1 0 0 0 0 4 0 0 1 0 0 TOOO 0 0 4 0 0 0 4 0 F 0 0 2 BX CX DX SI DI SS SP BP DS ES STAT 7 0 9 T TOST TO9Ü TOOÜ "010X7 170417 TJ100 TOOO 17040 170417 F 0 0 2 BX CX DX SI DI SS SP BP DS ES STAT J 0 9 T 3 0 9 T 3 0 9 T 170017 17100 00417 0 1 0 0 ODOO 0 0 4 0 0 0 4 0 F 0 0 2

Eingabe und Einzelschrittverfolgung des Zählerprogramms

243

244

5.4

5

Anwendungsbeispiele

Analogperipherie

Uortperipherie (Analogbausteine)

Byteperipherie (Digitalbausteine)

CE £5

A/D 2 (AD 574A) starten:60H lesen:6 " , ' S ' 20H,'Q',' , 'S" 2 0 H , *U)' , - • , ' S • S0H.7,'?• • 'S'

100H REAL AX,AKKU BX, PUFF SI,REAL AUSREAL BX,T1 AUST AX, AKKU EX,PUFF D I , REAL EINREAL ERRÜR REAL STC13 ST.STCl) REALQ

REALW

BEFEHLSBEREICH PUSH UND KONSTANTE PI LADEN ZAHL SPEICHERN UND POP WARTEN B I S OPERATION BEEENDET ADRESSE 1 2 B - B I T - A K K U ADRESSE AUSGABEPUFFER ; ADRESSE LONG-REAL-ZAHL UMWANDELN UND AUSBEBEN NEUE Z E I L E UND > AUSGEBEN ADRESSE 1EB—BIT—AKKU ADRESSE EINGABEPUFFER ADRESSE LONG-REAL-ZAHL ZAHL LESEN UND SPEICHERN CY - 1 : FEHLER PUSH UND ZAHL LADEN ZAHL I N DEN STAPEL KOPIEREN ; QUADRIEREN QUADRAT SPEICHERN UND POP ABSOLUTWERT BILDEN WURZEL ZIEHEN WURZEL SPEICHERN WARTEN AUF ENDE DES BEFEHLS LZ UND QAUSGEBEN ADRESSE 1 2 B - B I T - A K K U ADRESSE AUSGABEPUFFER ; ADRESSE QUADRATZAHL LZ UND WAUSGEBEN ADRESSE 1 2 B - B I T - A K K U ADRESSE AUSGABEPUFFER ; ADRESSE WURZEL ZAHL UMWANDELN UND AUSGEBEN TESTSCHLEIFE HUPE LZ UND ? AUSGEBEN TESTSCHLEIFE

; BUST - TEXT AUS CBX] B I S ENDEMARKE S AUSGEBEN AUST: PUSH AX AX RETTEN AUST1: MOU AL,[BX] CMP AL,'S' ENDEMARKE ? JE AUST2 JA: FERTIG CALL AUSZ N E I N : ZEICHEN AUSGEBEN INC BX NAECHSTES ZEICHEN JMP AUST1 SCHLEIFE B I S ENDEMARKE AUST2: POP AX AX ZURUECK RET ! SYSTEM-UNTERPROGRAMME EINZE: INT 11H INT 17H RET

EINGABE NACH AL AUSGABE AUS AL

AUSZ:

KONST PROG

Bild 5.6-3:

INT RET

17H

AUSGABE AUS AL

ORG DQ ENDS END

2Ü0H 123.125

KONSTANTENBEREICH ENDE DES SEGMENTES

START

Testprogramm zur Berechnung von Quadrat und Wurzel

5.6 Einföhrung

in den Arithmetikprozessor

8087

271

*>G0 Startadresse:

0ffset>100

3.14159265358979 >1_ Q= 1.00000000000000 >2_ Q= 4.00000000000000 >3_ Q= 9.00000000000000 > 4 . Q= 16.0000000000000

>Q_ Q=0 W=0

W= W= W= W=

1.00000000000000 1.41421356237310 1.73205080756888 2.00000000000000

>1000000.0 Q= 1000000000000.00 W= 1000.00000000000 >10000000. Q= 100000000000000. W= 3162.27766016838 >100000000 Q= **************** W= 10000.0000000000 >0.0000010 Q= 0.00000000000100 W= 0.00100000000000 >0.0000001 Q= 0.00000000000001 W= 0.00031622776602 >0.0000000001 Q-**************** VJ= 0.00001000000000 > 0 . 0 Q=0 w=o > 1 6 . 0 Q= 256.000000000000 W= 4.00000000000000 > - 1 6 . Q= 256.000000000000 W= 4.00000000000000 > 0 . 1 6 Q= 0.02560000000000 W= 0.40000000000000

>-. >6 0= 0.02560000000000 U= 0.40000000000000

>123.125 Q= 15159.7656250000 W= 11.0961705105861 >9999999999999999.9999999999999999 Q=**************** w= 1OQQOQQQQ.QQQQOQO

Bild 5.6-4: Ergebnisse des Testprogramms

Bei der Untersuchung des Arithmetikprozessors durch Testprogramme ist es nötig, Dezimalzahlen über die Konsole ein- und auszugeben. Dies geschieht in dem in Bild 5.6-3 dargestellten Programm durch die beiden Unterprogramme EINREAL und AUSREAL, die als externe Unterprogramme aufgerufen werden. Die vollständige Programmliste dieser beiden Unterprogramme befindet sich im Anhang. Sie benötigen zwei Hilfsspeicher (AKKU = 8 Wörter und PUFF = 16 Bytes), deren Adressen in den Registern AX und BX zu übergeben sind. Das Unterprogramm EINREAL speichert die auf der Konsole eingegebene Zahl in einem Vierfachwort als LONG-REAL-Zahl, die Adresse ist im DI-Register zu übergeben. Das Unterprogramm AUSREAL gibt eine LONG-REAL-Zahl mit 15 Dezimalstellen auf der Konsole aus; die Adresse ist im SI-Register zu übergeben. Bild 5.6-4 zeigt einen Testlauf. Läßt sich die Zahl nicht in 15 Dezimalstellen darstellen, so erscheinen Sterne als Fehlermeldung. Die im Bild 5.6-3 eingerahmt dargestellten Befehle sind Befehle für den Arithmetikprozessor, sie beginnen mit dem Kennbuchstaben "F". Der Befehl FLDPI lädt die Konstante PI in das oberste Stapelregister. Der folgende Befehl FSTP REAL speichert den Inhalt des obersten Stapelregisters in den Arbeitsspeicher (Adresse REAL) und gibt das Register wieder f r e i . Der Befehl FLDPI wirkt wie ein PUSH-Befehl, der Befehl FSTP wirkt wie ein POPBefehl. Bei der Arbeit mit den Stapelregistern des Arithmetikprozessors ist darauf zu achten, daß die Anzahl der PUSH-Operationen gleich der Anzahl der POP-Operationen ist, sonst würde der Stapel "überlaufen".

272

5

Anwendungsbeispiele

Operand zahl oder zahl oder zahl oder zahl oder

Anweisung DW DD DQ DT

? ? ? ?

lege lege lege lege

2 3

Wirkung Wort (2 Byte) im Speicher an Doppelwort (4 Byte) im Speicher an Vierfachwort (8 Byte) im Speicher an Zehnfachwort (10 Byte) im Speicher an ; BILD 5 . 6 - 5 VEREINBARUNG VON KONSTANTEN UND VARIABLEN .8087 ; BEFEHLE ARITHHETIKPROZESSDR SEGMENT ; PR06RAMMSE6NENT PROG

4

0000

5 6 7

0200 0200

0001

MINT

OBS DU

1

; »ORT-INTEGER

8 9

0202 0206

Ol 00 00 00 Ol 00 00 00 00 00

SINT LINT

DD DD

1 1

i SHORT-INTEGER ! LONG-INTEGER

10 11

020E

00 00 00 00 80 3F

DD 10

i SHORT-REAL

0 0 00 00 00 00

5REA IRE«

J.O

0212

1.0

; .LONG-SEAL

021«

TO 3F 00 00 00 00 00 00 00 80 FF 3F

TREA

DT

1.0

; TiltP-REAL

Ol 00 00 00 00 00 00 00 00 00

BCDP

DT

1

j BCD-GEPACKT

ORG DN

300H

VWINT VSINT VLINT

; VARIABLENBEREICH ; HORT-INTEGER

DD DO

7

12 n 14

ASSUME

IS u 17

0224

00

CS:PROB,DS:PR06,ES:PR06,DS:PR06 200H ; KONSTANTENBEREICH

18

0300

19 20

0300 0302

????

21 22

0306 030E

7777777797777997 79777997

VSREA

DD

7

23 24

0312 031«

9997777997997779

VLREA

7

i SHORT-REAL ; LONG-REAL

999779979999779979

VTREA

DO DT

7

j TEMP-REAL

VBCDP

DT

9

i BCD-GEPACKT

ORG

100H

| BEFEHLSBEREICH

FILD FISTP

HINT VLINT

j PUSH UND LADE HORT-INTEGER-KONSTANTE ; SPEICHERE NACH L0N6-INTESER UND POP

25 26 27 28 29 30 31

799 77997

0324

999999999999779999

i SHORT-INTEGER j LONG-INTEGER

?? 0100 0100 0105

9B DF 06 0200 9B DF 3E 0306 Ol OA 9B 1)9 06 020E Ol OF 9B ÜB 3E 031« 0114 9B I F 24 0224 0119

35

Olli' B

38 39

7

77

32 33 34 36 37

7

0121

R R R

START:

FLD FSTP

ft H

FBLD FBSTP JHP

9fl DF 36 0324 R Ol 90

; SYSTEMAUFRUF EJIT: INT

CD 10

PR06

0123

DUMP:

Anfangsadresse: Endadresse:

0080:0200 0080:0210 0080:0220

DUMP:

; PUSH UND LADE SHORT-REAL-KONSTANTE j SPEICHERE NACH TEMP-REAL UND POP ; PUSH UND LADE BCD-GEPACKT ; SPEICHERE NACH BCD-GEPACKT UND POP

VBCDP Ein ICH

; RUEEKSPRUN6 NACH SYSTEM ; RUECKSPRUN6 NACH SYSTEM

START

Offset 0200 Offset 022F

, 0 1 - 2 3 4 5 6 7 8 101 00101 00 00 00101 00 00 80 3F«00 00 00 00 00 00 FO 00 80 FF 3fH 01 00 00 00 00

Anfangsadresse: Endadresse:

0080:0300 0080:0310 0080:0320

ENDS END

SREA VTREA BCDP

9 A 00 00 3FU00 00 00

B C D E F 00 00 00100 00 00 00 00 (¡OJO 00 00 OÖ] 00 ÖÖ

Offset 0300 Offset 032F

0 1 2 3 4 5 6 7 8 9_ A B C D E 00 00 00 00 00 001Ö1 00 00 00 00 00 00 QÖ|00 00 00 00 00 00 00 00 00..00. 00j0C)__g0_gCL00 00 00 80 FF~tFp1 00_00 OOJO 00_00 00 00 00~]90

F 00 00 90

Bild 5.6-5: Vereinbarung von Konstanten und Variablen im Arbeitsspeicher

5.6 Einßhrung in den Arithmetikprozessor

8087

Die Vereinbarung von Konstanten und Variablen im Arbeitsspeicher entsprechend Bild 5.6-5 erfolgt mit Hilfe des Assemblers. Dabei können folgende Zahlendarstellungen verwendet werden: Typ INTEGER WORD INTEGER SHORT INTEGER LONG REAL SHORT REAL LONG REAL TEMP BCD PACKED

Vereinbarung Darstellung DW 16-Bit dual mit Vorzeichen DD 32-Bit dual mit Vorzeichen DQ 64-bit dual mit Vorzeichen DD VZ 8-bit-Char. 23-bit-Mant. DQ VZ 11-bit-Cha. 52-bit-Mant. DT VZ 15-bit-Cha. 64-bit-Mant. DT VZ-Byte 18 Dezimalstellen

indir, WORD DWORD QWORD DWORD QWORD TBYTE TBYTE

adr. PTR PTR PTR PTR PTR PTR PTR

Konstanten von Typ INTEGER und BCD werden ohne Punkt, Konstanten vom. Typ REAL werden mit einem Punkt eingegeben. Weitere Einzelheiten sind den Unterlagen des verwendeten Assemblers zu entnehmen. Alle Zahlen werden grundsätzlich mit dem wertniedrigsten Byte beginnend im Speicher abgelegt nach der Regel:

LOW-Byte - LOW-Adresse und HIGH-Byte - HIGH-Adresse

Speicheroperanc

(mem)

WORD und SHORT INTEGER SHORT und LONG REAL

fID PUSH X X ST ST(1) ST(2) ST(3) ST(4) ST(5) Operand ST(6) ST(7) Stapel vorher

Befehl FLD FILD FLD

Operand mem mem ST(i)

ST(i)

-ted

FLD man (REAL) FILD mem (INTEGER)

r.

— • ST Operand STO) X X 1 ST(2) • ST(3) 1 ST(4) « ST(5) < ST(6) Operand « 1 ST(7) Stapel nachher