Hans Delfs Helmut Knebl Christian Schiedermeier Grundlagen der Informatik nhtw – Nürnberger Hochschulskripten für Technik und Wirtschaft Prof. Dr. Hans Delfs Prof. Dr. Helmut Knebl Prof. Dr. Christian Schiedermeier Georg–Simon–Ohm Fachhochschule Nürnberg Fachbereich Informatik Alle Recht vorbehalten. c 2001 bei den Autoren Copyright Nürnberger Hochschulskripten für Technik und Wirtschaft Nano–Verlag, Nürnberg 22 1.4 Aufgaben 1.4 1.4.1 Aufgaben Testaufgaben Ganze Zahlen ohne Vorzeichen. 1. Wandeln Sie die folgenden Dezimalzahlen ohne Vorzeichen in das Dual-, Hexadezimal- und 8er-System um: 37, 236, 255, 1997. 2. Wandeln Sie die folgenden Dual- bzw. Hexadezimalzahlen ohne Vorzeichen in das Dezimalzahlsystem um: 100001, 101100, 011111, 100000, 111111, F F F F , F E00, E021, 7F F F F , 8F F F F , F F F F 2A. 3. Welcher Wochentag ist in 312321 Tagen nach dem heutigen Tag? 4. Wandeln Sie folgenden Zahlen ins Dezimalsystem um und führen Sie die Rechnung im Ausgangssystem durch: (120102)3 , (120102)5 5. Addieren Sie wie ein Computer, der im Dualsystem mit 8 Stellen bzw. im Hexadezimalsystem mit 3 Stellen rechnet: 37 + 45, 236 + 37, 1997 + 1998, 3995 + 320. Sind die Ergebnisse korrekt ? 6. Multiplizieren Sie im Dualsystem 37 · 31. 7. Führen Sie für b = 3 und b = 5 aus: (120102)b ∗ (211101)b . 8. Subtrahieren Sie wie ein Computer, der im Dualsystem mit 8 Stellen und Einer- bzw. Zweier-Komplement rechnet: 255 − 236, 236 − 255. Sind die Ergebnisse korrekt ? Ganze Zahlen mit Vorzeichen. 1. Wandeln Sie die folgenden Dezimalzahlen in das Dual- (12 Stellen), Hexadezimal- (4 Stellen) und 8er-System (5 Stellen) um, jeweils mit Darstellung im b- und (b − 1)-Komplement: −37, −236, −255, −1997. 2. Wandeln Sie die folgenden Dual- bzw. Hexadezimalzahlen in Dezimalzahlen (Darstellung mit Vorzeichen und Betrag) um. Nehmen Sie dabei an, daß die Dual-/Hexadezimalzahlen im b- bzw. (b − 1)- Komplement vorliegen: 100001, 101100, 011111, 100000, 111111, F F F F F , F F E00, 9E021, 7F F F F , 8F F F F . 1 ARITHMETIK 23 3. Ganze Zahlen sollen binär mit einer Exzeß-Darstellung abgelegt werden.10 Bits stehen zur Verfügung. Es sollen nach Möglichkeit gleich viele positive und negative Zahlen darstellbar sein. Wählen Sie eine geeignete ExzeßDarstellung für −48, +237, −534, +511 und geben Sie die Bitmuster an. 4. Welche Zahlen würden Sie im Dezimalsystem (Hexadezimalsystem) zu negativen Zahlen erklären, falls die Darstellung im b bzw. b − 1 Komplement erfolgt. 5. Führen Sie die Berechnung von 1992 − 2222 durch Addition bei der Darstellung im Neuner- bzw. Zehner-Komplement durch. 6. Wie viele Stellen benötigen Sie in einem Rechner, der dual mit Zweierbzw. Einer-Komplement-Arithmetik arbeitet, um folgende Rechnungen auszuführen: 236 − 37, 255 − 236, 236 − 256? Führen Sie die Rechnungen durch. Reelle Zahlen. 1. Geben Sie die 2-adische Entwicklung von 81 7 , 1536, 8192 2048 an. 2. Konvertieren Sie (a) Vom Dual- ins Dezimal- bzw. Hexadezimalsystem: 10110.110010, 1000.0000011, 0.111001. (b) Vom Hexadezimal- ins Dual- bzw. Dezimalsystem : 175.2213, 0.2059, 0.001, F 2E.F F F, B00F.0030. 3. Geben Sie für die folgenden Gleitkommazahlen die normalisierte Darstellung an: (a) Dualsystem, Exponentenbasis 2: 0.001011 · 212 , (b) Dualsystem, Exponentenbasis 23 = 8: 0.001011 · 84 , 0.00011001 · 8−12 . 0.11001 · 2−39 . 4. Für die Darstellung z = m · 2e von binären normalisierten Gleitkommazahlen stehen insgesamt 24 Stellen zur Verfügung, davon 1 Bit für das Vorzeichen und 8 Bit für den Exponenten. Die Exponenten seien codiert in (a) Zweier-Komplement-Darstellung, (b) Einer-Komplement-Darstellung, 24 1.4 Aufgaben (c) Exzeß 128 - Darstellung. Lösen Sie für alle 3 Fälle folgende Aufgaben: (a) Was ist der Unter- und Überlaufbereich der Darstellung ? (b) Welche Zahl wird durch die Bitmuster e = 10111010 und m = 10011010 . . . 0 dargestellt? (c) Wie groß ist der Abstand zwischen zwei benachbarten darstellbaren Zahlen z in den Bereichen 2−30 ≤ z < 2−29 , 2−15 ≤ z < 2−14 , 1 ≤ z < 2, 221 ≤ z < 222 . 17 darstellbar ? Welche darstellbaren Zahlen (d) Ist die Zahl z = 256 + 256 haben minimalen Abstand von z ? Geben Sie deren Bitmuster und den Abstand an. 5. Lösen Sie für das IEEE-Standard-Format (single- und double precision) die (für das IEEE-Format sinnvoll interpretierbaren) Teile der vorangegangenen Aufgabe und zusätzlich: 37 Sind die Zahlen 8192 + 1024 und (1 − 2−13 ) · 2−137 darstellbar ? Geben Sie die Bitmuster an. 1.4.2 Übungsaufgaben Ganze Zahlen ohne Vorzeichen. 1. Sei a2 a1 a0 eine dreistellige Zahl im Dezimalsystem. Dann ist a2 a1 a0 a2 a1 a0 durch 7, 11 und 13 teilbar. Warum gilt dies? 2. Diskutieren Sie die Konvertierung von einem b–adischen System in ein Badisches System für B = bk und umgekehrt. Speziell: b = 2, b = 24 = 16. 3. (a) Zeigen Sie, daß für den Übertrag üi bei der Multiplikation gilt: 0 ≤ üi ≤ b − 2. (b) Zeigen Sie, daß bei der Multiplikation einer N -stelligen Zahl mit einer M -stelligen Zahl eine (M + N )-stellige Zahl entsteht. 4. (a) Zeigen Sie: Eine Zahl im Dezimalsystem ist genau dann durch 3 teilbar, wenn ihre Quersumme durch 3 teilbar ist. (b) Gibt es weitere Zahlen, für die das gilt ? 5. Entwickeln Sie ausgehend von der Addition, die ein Rechner ausführen kann einen Algorithmus zur Addition von großen Zahlen. 1 ARITHMETIK 25 6. Multiplikation nach Karatsuba, Ofman: Seien x0 , x1 , y0 und y1 n-stellige Zahlen in einem b–adischen Zahlensystem. x = x0 + bn x1 , y = y0 + bn y1 . xy = x1 y1 b2n + (x1 y0 + x0 y1 )bn + x0 y0 . Setze u := (x1 + x0 )(y1 + y0 ). Dann ist (x1 y0 + x0 y1 ) = u − x1 y1 − x0 y0 (drei statt vier Multiplikationen). Wenden Sie dieses Verfahren zur Multiplikation von 32-Bit Zahlen an. Ganze Zahlen mit Vorzeichen. 1. Ganze Zahlen mit Vorzeichen seien mit N Stellen im Zweier-Komplement dargestellt. 6 −2N −1 gilt: Zeigen Sie, daß für so dargestellte Zahlen A, B mit B = Die Bedingung A < B ist genau dann erfüllt, falls bei der Berechnung von A − B (= A + B̄) gilt: SF 6= OF . 2. (Überlauferkennung durch Vorzeichenverdoppelung) Seien a = (aN −1 , . . . , a0 ) und b = (bN −1 , . . . , b0 ) Darstellungen im zweier Komplement. α = (aN , a), aN = aN −1 , β = (bN , b), bN = bN −1 , = (eN , e) die formal gebildete Summe e = (eN −1 , . . . , e0 ). Zeigen Sie: es = as + bs ⇐⇒ eN −1 = eN . Reelle Zahlen. 1. Führen Sie folgende Gleitkommazahlen in eine normalisierte Darstellung über: 0.0000666 · 15−2 , 0.0666 · 153 . (a) Mantisse und Exponent im 10er-System (b) Mantisse und Exponent (und Exponentenbasis) im 8er-System 2. Diskutieren Sie Vor– und Nachteile einer Exponentenbasis 2N in der normierten Darstellung von Gleitkommazahlen bei zugrunde liegendem Dualsystem im Vergleich zur Exponentenbasis 2. 3. Entwickeln Sie einen Algorithmus zum Vergeich von Gleitkommazahlen nach dem IEEE Standard. 4. Entwickeln Sie einen Algorithmus zur Addition von Gleitkommazahlen nach dem IEEE Standard. 54 2.3 Aufgaben 2.3 2.3.1 Aufgaben Testaufgaben 1. Stellen Sie folgende Funktionen dar (Tabelle, KNF, DNF): 1 i gerade 0 sonst 1 i<j 2 2 (b) g : B × B −→ B, g(i, j) = 0 sonst 4 (a) g : B −→ B, g(i) = 2. Führen Sie die Vereinfachung der in der vorherigen Aufgabe definierten Schaltabbildungen durch und stellen Sie die Schaltnetze mit Hilfe von NAND– und NOR–Gattern dar. 3. Stellen Sie die Schaltfunktionen für die Addition bzw. Multiplikation von zweistelligen Dualzahlen auf. Vereinfachen Sie die Schaltfunktionen und zeichnen Sie die dazugehörigen Schaltnetze. 4. (Demultiplexer) n Dmux : B n × B−→ B 2 , (c, i) 7−→ (Dmux0 (c, i) . . . Dmux2n −1 (c, i)). i j = c, Dmuxj (c, i) = 0 sonst. Der Baustein schaltet aufgrund der Steuerleitungen c = (c0 , . . . , cn−1 ) den Eingang auf einen der Ausgänge. Geben Sie für n = 4 die Schaltfunktionen an. 5. Entwickeln Sie einen Multiplexer aus einem Decodierer, einem ODER– Gatter (das mehr als 2 Eingänge haben darf) und m UND-Gattern. 6. Zeigen Sie, daß jedes Schaltnetz aus 2 zu 1 – Multiplexern aufgebaut werden kann. 7. Ein Schaltnetz soll bei Eingabe der Zahlen z : −3 ≤ z ≤ 2 die Eingabe in Abhängigkeit einer Steuerleitung s um 1 erhöhen (s = 0) bzw. um 1 erniedrigen (s = 1). Die Codierung der Zahlen erfolgt im Zweierkomplement. (a) Geben Sie die Schaltfunktionen an. (b) Vereinfachen Sie die Schaltfunktionen mit Hilfe von KV-Diagrammen. 2 SCHALTUNGEN 55 8. Ein Flüssigkeitsbehälter habe zur Anzeige von drei Pegelständen drei Anzeigeleitungen x1 , x2 , x3 . Es gelte: x1 = 1 falls 13 ≤ Pegel x2 = 1 falls 23 ≤ Pegel x3 = 1 falls Behälter voll. Zwei Pumpen füllen den Behälter. Dabei gilt: P1 und P2 an, falls Pegel < 13 P2 an, falls 13 ≤ Pegel < 32 P1 an, falls 23 ≤ Pegel < voll. Bestimmen Sie die Schaltfunktionen zur Steuerung der Pumpen P1 und P2 , vereinfachen Sie die Schaltfunktionen und zeichnen Sie das dazugehörige Schaltnetz. 9. Gegeben sei ein Schaltwerk mit zwei Flipflops Q0 , Q1 und zwei externen Eingängen e0 , e1 . Entwerfen Sie das Schaltnetz für folgende Funktionstabelle: e0 e1 Q0 Q1 0 0 Q0 Q1 1 0 . 0 1 1 0 1 1 1 1 Q̄0 Q̄1 10. Konstruieren Sie einen dreistelligen Dualzähler modulo 8, dessen Inhalt bei jedem Zählimpuls um 3 vergrößert wird. 2.3.2 Übungsaufgaben 1. Ein Schaltnetz hat 3 Eingänge (x1 , x2 , x3 ), 3 Steuerleitungen (c1 , c2 , c3 ) und 3 Ausgänge (y1 , y2 , y3 ). In Abhängigkeit der Steuerleitungen (c1 , c2 , c3 ) soll den Ausgängen eine Permutation der Eingänge zugewiesen werden: (y1 , y2 , y3 ) = (xπ(1) , xπ(2) , xπ(3) ) und π = π(c1 , c2 , c3 ). Geben Sie die Schaltfunktionen in möglichst einfacher Form an. 2. Seien x = xn−1 . . . x0 und y = yn−1 . . . y0 vorzeichenlose ganze Zahlen. Cm−1 := Cm−2 (xm−1 · ym−1 + xm−1 · ym−1 ) + xm−1 ym−1 , m ≥ 1, C−1 = 0. (a) Zeigen Sie: y < x ⇐⇒ Cn−1 = 1. (b) Wenden Sie das Verfahren für n = 4 an und geben Sie das Schaltnetz an. 56 2.3 Aufgaben 3. (Gray–Code) Sei k ∈ N, n = 2k+1 − 1. Ein Gray–Code für die Menge {0, 1, . . . , n} ist eine bijektive Abbildung gck : {0, 1, . . . , n} → B k+1 , mit (gck (i) und gck (i + 1)) unterscheiden sich an genau einer Stelle, i = 0, . . . , n. (a) Zeigen Sie: Durch Gk : B k+1 → B k+1 , Gk (x0 , . . . , xk ) := (g0 , . . . , gk ), wobei gk := xk und gi := xi x̄i+1 + x̄i xi+1 , i = 0, . . . , k − 1 wird ein Graycode auf {0, 1, . . . , n} definiert, falls (x0 , . . . , xk ) als Darstellung einer Zahl im Dualsystem aufgefaßt wird. Hinweis: Dk : B k+1 → B k+1 , Dk (x0 , . . . , xk ) := (d0 , . . . , dk ), wobei dk := xk und di := xi d¯i+1 + x̄i di+1 , i = k − 1, . . . , 0 definiert eine Umkehrabbildung zu Gk . (b) Realisieren Sie Gk und Dk durch Schaltnetze. 4. Entwickeln Sie ein rekursives Verfahren zur Konstuktion von Gray–Codes. 5. Entwickeln Sie einen Zähler, der im Gray–Code mod 8 zählt. 6. Konstruieren Sie einen rückwärtszählenden Dualzähler modulo 2n . 7. (von Neumann’scher Additionsalgorithmus) Seien a = xn−1 . . . x0 , b = yn−1 . . . y0 Binärdarstellungen von ganzen Zahlen (ohne Vorzeichen). a1 := (xn−1 ⊕ yn−1 ) . . . (x0 ⊕ y0 ), b1 := (xn−1 ∧ yn−1 ) . . . (x0 ∧ y0 )0. (x ⊕ y := (x + y) mod 2.) (a) Zeigen Sie: a + b = a1 + b1 . (b) Iteriert man das Verfahren, so gilt: a + b = a1 + b1 = a2 + b2 = . . .. Zeigen Sie: bi = bi,n . . . bi,i 0 . . . 0. (c) Nach n + 1 Schritten gilt: a + b = an+1 (bn+1 = 0). (d) Entwickeln Sie ein Schaltwerk für die von Neumann’sche Addition für n = 4. Modellieren Sie das Schaltwerk als endlichen Automaten. 8. Ein Fußgängerüberweg über eine Straße wird mit einer Ampel geregelt. Die Ampel schaltet auf Anfrage eines Fußgängers für Fußgänger grün“ ” und Autos rot“. Der Umschaltvorgang erfolgt in folgenden Phasen: Die ” Ampel zeigt für Autos 1 Zeiteinheit Gelb“ (für Fußgänger rot“), 4 ” ” Zeiteinheiten rot“ (für Fußgänger grün“) und 1 Zeiteinheit rot-gelb“ ” ” ” (für Fußgänger rot“) und dann wieder grün“ (für Fußgänger rot“). ” ” ” Entwickeln Sie ein Schaltwerk, welches die Ampel steuert. Modellieren Sie die Problemstellung zunächst durch einen endlichen Automaten und setzen Sie dann den Entwurf in ein Schaltwerk um. 98 5.5 Aufgaben 5.5 Aufgaben 5.5.1 Testaufgaben 1. Decodieren Sie: (a) 1000 1111 1110 1111 1100 0000 0000 0000. (b) 0000 0000 0000 0000 0001 0000 0000 0000. Geben Sie jeweils die Decodierregel an, die Sie verwendet haben. 2. Übersetzen Sie in Maschinenbefehle: 1 2 3 lw $t0 400($t1) add $t0 $s2 $t0 sw $t0 400($t1) 3. Setzen Sie in Assemblercode um: a = b + 100 4. Konvertieren Sie in eine 32–Bit Zahl ohne Veränderung des Wertes: (a) 1100 0000 0000 0000. (b) 0001 0000 0000 0000. 5. Schreiben Sie ein Assemblerprogramm, das eine 16–Bit Zahl im 2’er Komplement in eine 32–Bit Zahl ohne Veränderung des Wertes umwandelt. 6. Geben Sie Assemblercode an, der das Einer– und Zweierkomplement einer vorzeichenlosen ganzen Zahl berechnet. 7. Seien a und b ganze Zahlen, dargestellt im Zweierkomplement. Mit welcher Folge von Assemblerbefehlen überprüfen Sie auf verschiedene Vorzeichen. 8. Setzen Sie in Assemblercode um: x[10] = x[11] + 5 5 DIE MASCHINENPROGRAMMEBENE EINES RECHNERS 99 9. a und b seien Arrays und c der Inhalt von Register $s0. Setzen Sie in Assemblercode um: for i = 0 to 100 do a[i] = b[i] + c 10. Schreiben Sie ein Assemblerprogramm, welches ein Receiver–Bit–Feld mit Daten füllt. 11. Welche Methoden kennen Sie, um ein Register mit einer 32–Bit Konstanten zu laden? 12. Schreiben Sie ein Programm, das den Inhalt eines Registers in Binärdarstellung bzw. Oktaldarstellung ausgibt. 13. Setzen Sie in Assemblercode um: while (save[i] == k) do i=i+j Sie sollen dabei nur eine Jump– oder Branch–Anweisung benutzen. 14. Setzen Sie die aus der Programmiersprache C bekannten Funktionen in Assemblercode um: char ∗strcpy(char ∗dst, const char ∗src), int strlen(const char ∗s). 15. Schreiben Sie ein Unterprogramm, das in einem gegebenen String Kleinbuchstaben in Großbuchstaben umwandelt. 16. Beschreiben Sie mit einem Satz, was das folgende Programm tut: 1 begin: addi $t0 $zero 0 2 addi $t1 $zero 1 3 loop: slt $t2 $a0 $t1 4 bne $t2 $zero finish $t1 5 add $t0 $t0 6 addi $t1 $t1 2 7 loop j 8 finish: add $v0 $t0 $zero 100 5.5 Aufgaben 17. Beschreiben Sie, was das folgende Programm tut: 1 2 3 4 5 6 sll srl sll srl or or $t0 $s0 $t1 $s1 $s1 $s0 $s0 $s0 $s1 $s1 $s1 $s0 31 1 31 1 $t0 $t1 18. Geben Sie eine Assemblerbefehlsfolge an, die einen zusammenhängenden Bereich (mit constanten Grenzen) von $s0 an die niederwertigen Stellen von $s1 kopiert. 19. Optimieren Sie das Sortierbeispiel. 20. Geben Sie Implementierungen für die folgenden Pseudobefehle: (a) Branch on greater (less) than equal (b) Branch on greater (less) than equal unsigned (c) Branch on greater (less) than (d) Branch on greater (less) than unsigned 5.5.2 Übungsaufgaben 1. Mit welcher Folge von Assemblerbefehlen können Sie ohne zusätzlichen Speicher die Inhalte von zwei Registern vertauschen. 2. Seien a und b vorzeichenlose ganze Zahlen. Bei der Addition von a und b tritt ein Überlauf auf falls gilt: 232 − 1 < a + b (⇐⇒ 232 − a − 1 < b). Setzen Sie dieses Kriterium zur Überlauferkennung in Assemblercode um und überlegen Sie dabei, wie Sie 232 − a − 1 effizient berechnen können. 3. Seien a und b ganze Zahlen, dargestellt im Zweierkomplement. Sie kennen folgendes Kriterium zur Überlauferkennung: Es tritt bei der Addition c = a + b genau dann ein Überlauf auf, falls gilt: sign(a) = sign(b) = 6 sign(c). Setzen Sie dieses Kriterium in Assemblercode um. Benutzen Sie dabei die vozeichenlose Addition und überlegen Sie, wie Sie effizient auf verschiedene Vorzeichen überprüfen. 5 DIE MASCHINENPROGRAMMEBENE EINES RECHNERS 101 4. Schreiben Sie ein Unterprogramm, das den Inhalt eines Registers auf eine Potenz von zwei testet. 5. Schreiben Sie ein Unterprogramm, das den Inhalt eines Registers in Hexadezimaldarstellung ausgibt. Sie sollen dabei ohne Übersetzungstabel” le“ auskommen. Vergleichen Sie Ihre Lösung mit der in der Vorlesung besprochenen Lösung. 6. Schreiben Sie ein Unterprogramm, das einen arithmetischen Ausdrucks in Infix–Notation in umgekehrte polnische Notation umwandelt. Jeder arithmetische Ausdruck ist dabei als Zeichenkette im ASCII–Code gegeben. Die Zahlen seien im Dezimalsystem codiert. 7. Schreiben Sie ein Unterprogramm, das den Wert eines arithmetischen Ausdrucks in umgekehrter polnischer Notation ausrechnet. Der arithmetische Ausdruck in umgekehrter polnischer Notation soll dabei als Zeichenkette im ASCII–Code übergeben werden. Die Zahlen seien im Dezimalsystem codiert. 8. Schreiben Sie ein Unterprogramm, das den größten gemeinsammen Teiler von zwei Zahlen berechnet. 9. Setzen Sie die aus der Programmiersprache C bekannte Funktion int strcmp(const char ∗s1, const char ∗s2) in Assemblercode um. 10. Schreiben Sie ein Unterprogramm, das 64–Bit Zahlen addiert. 11. Schreiben Sie ein Unterprogramm, das zwei Matrizen multipliziert. 12. Setzen Sie die folgende Funktion in Assemblercode (Rekursion/Iteration) um: Algorithmus 5.1. int Fac(n) 1 if n > 0 2 then return nFac(n − 1) 3 else return 1 13. Setzen Sie die folgende Funktion in Assemblercode (Iteration) um: 102 5.5 Aufgaben Algorithmus 5.2. int Fib(n) 1 if n > 1 2 then return (Fib(n − 1) + Fib(n − 2)) 3 else if n == 1 4 then return 1 5 else return 0 14. ( Die Türme von Hanoi“– puzzle) ” A B C Abbildung 48: Die Türme von Hanoi Arbeitsschritt: Bewege eine Scheibe von einem Stab zu einem anderen, wobei eine Scheibe nie auf einer kleineren abgelegt werden darf. Ziel: Bewege den Turm von A nach B. Die folgende Funktion gibt eine Folge von Arbeitsschritten aus, die zum Ziel führen. Algorithmus 5.3. hanoi(n, A, B, C) 1 if n > 0 then hanoi(n − 1, A, C, B) 2 3 Bewege Scheibe n von A nach B hanoi(n − 1, C, B, A) 4 Setzen Sie den Algorithmus in Assemblercode um. Können Sie die Rekursion in eine Iteration umwandeln?