Inhaltsverzeichnis

Aufgabe 1

Aufgabe 2

1.

2. Da gibt's bestimmt eine schöne Zeichnung im Skript.

Aufgabe 3

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

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

#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

#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;
}
 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