==== Aufgabe 1 ==== * 1) w, f , f, f, w, w, w, w * 2) w, w, f, w, f, w, f(edit: zero-bit hat nichts mit rechten zu tun), f(edit:adressirungsart ist doch egal es geht nur darum ob ich auf die speicheadresse zugreifen darf oder nicht. das wie ist doch egal) * 3) mov für Speicherzugriff; in/out für IO-Zugriff - ist aber privilegierte Operation (vgl. Tastatur-Blinker-Aufgabe!) * 4) Die Behandlung eines Interrupts darf nicht durch einen anderen Interrupt unterbrochen werden, da sie nicht neu aufgesetzt werden kann. ==== Aufgabe 2 ==== 1. * A E X * A E X * A X E * A X E * EA EA EA * A E E * E X A 2. Da gibt's bestimmt eine schöne Zeichnung im Skript. * Eingänge: IOR, IOW, Adressbus * Ein-/Ausgang: Datenbus * Fest: Adresse des Geräts * Adresse am Adressbus wird durch Komparator mit Geräteadresse verglichen. Ausgang des Komparators wird verundet mit IOR (-> Leitung zu Sensor) und IOW (-> Leitung zu Aktor). * Sensor hat Ausgang auf Datenbus, Aktor Eingang von Datenbus. ==== Aufgabe 3 ==== * 1) Größe einer Struktur: 2 + 10 + 4 = 16 Bytes\\ Größe des Adressraums: 2^16 Bytes = 64 kB; 48 kB für Programm => 16 kB frei für Daten\\ 16 kB / 16 Bytes = 1024 * 2) Neue Strukturgröße: 4 + 10 + 2 (Alignment) + 4 = 20 Bytes; 1024 Datensätze: 20 kB * 3) movl 8(%esp), %eax xorl %ebx, %ebx orb %al, %bl shrl $8, %eax shll $8, %ebx orb %al, %bl shrl $8, %eax shll $8, %ebx orb %al, %bl shrl $8, %eax shll $8, %ebx orb %al, %bl movl %ebx, 4(%esp) ret ==== Aufgabe 4 ==== * 1) tanx -> Taylorreihe; div -> Newton-Rphson / Shift / Subtraktion; mul -> Addition / Shift * 2) (steht nirgends schnell): #define unsigned int ui #define unsigned short us ui mult(us x, us y) { ui sum = 0; for (int i = 0; i < y; i++) sum += x; return sum; } Das funktioniert so nicht. Hierbei muss immer geshiftet werden. Am besten ein Beispiel rechnen und dann sieht man es. ==== Aufgabe 5 ==== * 1) #define unsigned int ui ui fibo(ui x) { ui res; if (x < 2) { res = 1; goto more; } x = x - 1; res = fibo(x); x = x - 1; res = res + fibo(x); more: return res; } * 2) movl 4(%esp), %ebx cmpl $2, %ebx jge else //unsigned -> jae ? movl $1, %eax ret else: subl $1, %ebx pushl %ebx call fibo addl $4, %esp movl %eax, %ecx subl $1, %ebx pushl %ebx call fibo addl $4, %esp addl %ecx, %eax ret Das funktioniert so nicht... Wegen der tiefen Rekursion werden die Register immer wieder ueberschrieben. Man muss hierbei den Stack verwenden, in em da das Zwischenergebnis gespeichert wird. Ich denke, bei call werden die Register automatisch auf dem Stack gesichert und bei ret wiederhergestellt. Ist das nicht gerade der Unterschied zu iret? ==== Aufgabe 6 ==== ??? ==== Aufgabe 7 ====