1.
2. Da gibt's bestimmt eine schöne Zeichnung im Skript.
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
#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.
#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?
???