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) 1, 2, 1, 2, 2, 1, 2 ,1
- 2) Register; Immediate Operand; Direct Adress; Register Indirect (alle Variationen); Memory Indirect
- 3) 1, 1, 2, 2, 2, 2, 2, 2
- 4) 2, 1, 1, 2, 2, 1, 1, 2
- 5) Weil die Reihenfolge der einzelnen Bytes falsch gelesen wird, z. B. 0x000000FF → 0xFF000000
- 6) 2, 1, 1, 2, 2, 1, 2, 1
Aufgabe 2
- 1) struct bla { char y; short x; long z; } ; Little-Endian
- 2) Wenn er über Pointer Zugriff auf die Speicherinhalte hat.
Aufgabe 3
- 1) links vertikal Adressbus; rechts vertikal Datenbus; fehlend: IOR, IOW, MR, MW, Interrupt
- 2) ?
- 3) siehe Folien zu Rambaustein; MR, MW durch IOR, IOW ersetzen
Aufgabe 4
Multiply: .globl Multiply /* Mantisse der ersten Zahl laden (%eax) */ movl 4(%esp), %eax /* Mantisse der zweiten Zahl laden (%ebx) */ movl 8(%esp), %ebx /* Mantissen miteinander multiplizieren (%ax) */ imulw %bx, %ax andl $0x0000ffff, %eax /* Exponent der ersten Zahl laden, Vorzeichenbit entfernen (%ebx) */ movl 4(%esp), %ebx andl $0x7fff0000, %ebx /* Exponent der zweiten Zahl laden, Vorzeichenbit entfernen (%ecx) */ movl 8(%esp), %ecx andl $0x7fff0000, %ecx /* Exponenten miteinander addieren, in Ergebnis einfuegen (%eax) */ addl %ecx, %ebx orl %ebx, %eax /* Vorzeichen per XOR miteinander verknuepfen (%ebx) */ movl 4(%esp), %ebx xorl 8(%esp), %ebx /* Neues Vorzeichen in Ergebnis einfuegen (%eax) */ andl $0x800000, %ebx orl %ebx, %eax /* Ruecksprung */ ret
Aufgabe 5
- 1) Man will dem User keinen direkten Zugriff auf die Hardware erlauben. Aufrufsyntax ist ähnlich; Kontext ist unterschiedlich
- 2) Exceptions + Interrupts
Aufgabe 6
- 1)
int func(int v) { int i; for (i = 0; i*i < v; i++); return i; }
Einspruch: Bei einer for-Schleife wird ja schon vor dem Betreten die Bedingung geprüft, das passiert im Assembler-Code da aber nicht. Ich hätte da so was:
int func(int v) { int i; for (i = 0;; i++) { i *= i; if (i >= v) break; } return i; }
Die letzte Variante ist falsch, weil die Multiplikation mit %eax ist und %eax nicht zwischengespeichert wird. Dementsprechend ist die erste Variante richtig.
Noch etwas: Ich glaube die Ints müssen unsigned Ints sein.
- 2) ?
- 3)
unknown: pushl %ebp movl %esp, %ebp pushl $0 .L2: movl -4(%ebp), %eax imull -4(%ebp), %eax cmpl 8(%ebp), %eax jb .L4 jmp .L3 .L4: incl -4(%ebp) jmp .L2 .L3: movl -4(%ebp), %eax movl %ebp, %esp popl %ebp ret
Aufgabe 7
Funktionstabelle der Form: x_3 x_2 x_1 x_0 | c y_3 y_2 y_1 y_0
Mit Symmetriediagrammen vereinfacht:
- y_0 = !x_0
- y_1 = x_0 XOR x_1
- y_2 = x_0 x_1 !x_2 + !x_0 x_2 + !x_1 x_2
- y_3 = x_0 x_1 x_2 !x_3 + !x_2 x_3 + !x_0 x_3 + !x_1 x_3
- c = x_0 x_1 x_2 x_3