Du befindest dich hier: FSI Informatik » jahrgaenge » 2006 » "Muster"-Lösungen » "Muster"-Lösungen zu Klausuren aus Technische Informatik 2 » Aufgabe 1   (Übersicht)

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