Rechnerstrukturen Sommersemester 2003 3. Übung Ausgabe 13.05.03 Abgabe 21.-23.05.03 Bei Fragen und Problemen können Sie uns per E-mail unter den folgenden Adressen erreichen: Mesut Güneş [email protected] Ralf Wienzek [email protected] Daniel Keysers [email protected] Aufgabe 1 (2+2+2+2+4=12 Punkte): Normalformen Gegeben sei die Boolesche Funktion f (x1 , x2 , x3 ) = (x1 + x2 + x3 ) · (x1 + x2 + x3 ) · (x1 + x2 + x3 ) a) Stellen Sie die Funktionstabelle auf und bestimmen Sie die einschlägigen Indizes! b) Bestimmen Sie die DNF von f ! c) Bestimmen Sie die KNF von f ! d) Bestimmen Sie die KRE von f ! e) Die Boolesche Funktion g = g(x1 , x2 , . . . , xn ) : B n → B habe genau i einschlägige Indizes, d.h. g liefere für genau i der 2n möglichen Belegungen der Variablen eine 1 als Funktionswert (0 ≤ i ≤ 2n ). Geben Sie eine einfache Regel in Abhängigkeit von i dafür an, ob der Term x1 · x2 · . . . · xn in der komplementfreien Ringsummenentwicklung von g vorkommt, sowie eine Begründung für diese Regel. Aufgabe 2 (3+3=6 Punkte): Boolesche Funktionen a) Sei f : B 13 → B die 13-stellige Boolesche Funktion mit f (x12 , x11 , . . . , x1 , x0 ) = 0 genau dann, wenn (x12 x11 . . . x1 x0 )2 durch 4711 teilbar ist. Geben Sie diese Funktion wahlweise in DNF oder KNF an. b) Wie viele 13-stellige Boolesche Funktionen gibt es? Zur Beantwortung dieser Frage bestimmen Sie zwei Zahlen m und d, sodass m · 10d die Anzahl der 13-stelligen booleschen Funktionen ist, 1 d eine ganze Zahl ist, und 10 ≤ m < 1 gilt. 1 Geben Sie m auf vier Nachkommastellen genau an. Aufgabe 3 (5 Punkte): Funktionale Vollständigkeit Ein System {f1 , . . . , fn } Boolescher Funktionen heißt funktional vollständig, wenn sich jede Boolesche Funktion durch Einsetzungen bzw. Kompositionen von Funktionen aus {f1 , . . . , fn } darstellen lässt. Zeigen Sie: {→, 0} ist funktional vollständig. Zur Erinnerung: x → y = x + y (und 0 ist die 0-stellige, konstante Funktion, die immer 0 liefert). m × 10d ist dann eine normalisierte Gleitkomma-Darstellung der Anzahl der 13-stelligen booleschen Funktionen. m heißt die Mantisse und d der Exponent dieser Darstellung zur Basis 10. 1 1 Rechnerstrukturen Sommersemester 2003 Aufgabe 4 (4+4+4+4=16 Punkte): Einfache Ein-/Ausgabe a) Das folgende Programm sehr_einfache_Ausgabe.mms gibt den Wert des Registers x als positive, ganze Zahl mit höchstens vier Stellen aus: Buffer x digit Main Loop BYTE " 0",#a,0 IS $14 IS $42 LOC #100 SET x,242 GETA $17,Buffer SET $18,3 DIV x,x,10 GET digit,rR ADD digit,digit,’0’ STBU digit,$17,$18 SUB $18,$18,1 BNZ x,Loop SET $255,$17 TRAP 0,Fputs,StdOut TRAP 0,Halt,0 vier Zeichen, newline, String-Terminator 0 get address of Buffer -> $17 $18 zaehlt die Stellen herunter 3...0 durch 10 teilen um die letzte Stelle als Rest zu erhalten der Rest der Division steht in rR -> digit addiere den Wert des ASCII Zeichens ’0’ store byte unsigned, schreibe das Zeichen in den Buffer mit dem Offset $18 (3...0) Offset herunterzaehlen branch if x not zero -> loop Adresse des Buffer in $255 laden String, auf den $255 zeigt, ausgeben Was passiert bei Zahlen, die dezimal mehr als vier Stellen benötigen? Wie kann man verhindern, dass außerhalb des Buffers geschrieben wird? Ändern Sie das Programm entsprechend ab. (Dabei sollen von allen Zahlen mit mehr Stellen nur die letzten vier Stellen ausgegeben werden.) b) Ändern Sie das Programm so ab, dass die Zahlen im Dualsystem ausgegeben werden. c) Ändern Sie das Programm so ab, dass auch negative Zahlen ausgegeben werden können. d) Das folgende Programm sehr_einfache_Eingabe.mms benutzt zwei verschiedene Arten zur Eingabe von Daten. Wenn ein Kommadozeilenparameter übergeben wird (z.B. durch mmix sehr_einfache_Eingabe Hallo), so wird der Programmname (der immer der erste Parameter ist) und der erste weitere Parameter ausgegeben. Ansonsten wird von StdIn (üblicherweise die Tastatur) eine Zeichenfolge gelesen und die ersten 7 Zeichen werden ausgegeben. Eingabe OCTA 0,8 Buffer newline BufAddr EinAddr Vergl Main BYTE " " BYTE #a,0 IS $42 IS $43 IS $41 LOC #100 CMP Vergl,$0,1 BP option1 GETA GETA STOU SET TRAP SET TRAP GETA Vergl,option2 BufAddr,Buffer EinAddr,Eingabe BufAddr,EinAddr,0 $255,EinAddr 0,Fgets,StdIn $255,BufAddr 0,Fputs,StdOut $255,newline Platz fuer die Uebergabe der Buffer-Adresse es sollen 8 Zeichen gelesen werden inkl. terminierender 0 an diese Stelle wird die Eingabe geschrieben ein newline-Zeichen mit String-Terminator compare, ist die Anzahl der Kommandozeilen-Parameter groesser als 1 (steht in $0) Wenn ja (Ergebnis positiv) gehe zu option2 sonst hier weiter, Adressen bestimmen Speichere die Adresse des Buffer bei ‘Eingabe’ Setze Register $255 Lies String von StdIn nach Buffer und gib ihn wieder aus 2 Rechnerstrukturen Sommersemester 2003 TRAP 0,Fputs,StdOut TRAP 0,Halt,0 option2 LDOU $255,$1,0 TRAP GETA TRAP LDOU 0,Fputs,StdOut $255,newline 0,Fputs,StdOut $255,$1,8 TRAP GETA TRAP TRAP 0,Fputs,StdOut $255,newline 0,Fputs,StdOut 0,Halt,0 gefolgt von newline lies die Adresse des ersten Kommandozeilen-Parameters in $255 ($1 zeigt darauf) und gib diesen aus die Adresse des zweiten Parameters steht 8 Byte weiter, lies sie ein ... Vollziehen Sie das Programm nach und schreiben Sie mit diesen Informationen ein Programm, das eine kleine, positive, ganze Zahl von StdIn einliest und die Zeichenkette Rechnerstrukturen ausgibt, wenn diese Zahl gleich 42 ist, sonst nichts tut. 3