==== 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