Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Klausur 701
1a, Performancekritische Teile
Betriebssystemprogrammierung
Speicherkritische Anwendungen
b, Byte=8Bit
Maschinenwort=Datum mit der Breite des Datenbusses
Addresse=Ortsangabe eines Maschinenwortes
c, 2**N Byte
d, Hoehere Uebertragungsrate
Mehr Speicher addressierbar
Nachteile: Verschwendung bei Zugriff auf kleine Daten
Addressierung evtl. aufwendiger
So wirkliche Nachteile fallen mir nicht ein, abgesehen von der steigenden Komplexitaet der Hardware
e, 1024
f, Allignment auf 12
2a, Skript und 202
b, movl a, %eax
addl a, %eax
movl %eax, a
ergibt shll $1, a
c, Keine Ahnung, waere super wenn da jemand ne Idee hat
3,
.equ x 8
.equ res -4
fibo: pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl x(%ebp), %eax
cmpl $1, %eax
jg else
movl $1, %eax
jmp end
else: decl %eax
pushl %eax
call fibo
movl %eax, res(%ebp)
movl x(%ebp), %eax
subl $2, %eax
pushl %eax
call fibo
addl res(%ebp), %eax
end: movl %ebp, %esp
popl %ebp
ret
4a, Programme, die keine tiefe Aufrufstruktur haben (<=1) laufen, bei mehr Abstiegen ist keine Rueckkehr mehr moeglich
b, Schnell, keine verschachtelten Funktionsaufrufe (z.B. Rekursion) moeglich
c, Da sind wir uns wieder nicht sicher. Ist damit gemeint, dass unterschiedlicher Code fuer sin(x) erzeugt werden muss oder dass das sichtbare Codestueck fuer “sin(x)” und “y=sin(x)” verschieden sein muss. Im ersten Fall nein, im zweiten ja
d, Zuwenig: Zugriff auf falsche Daten
Zuviell: davor zuviel gepusht: kein Unterschied
danach zuviel gepush: Zugriff auf falsche Daten
5a & b, siehe 702
6, c1=(y1 und x1) oder (y1 und c0) oder (x1 und c0) =
=(y1 und x1) oder (y1 und y0 und x0) oder (x1 und x0 und y0)
zu 2d siehe Skript ´Seite 196!
hmm, da ist leider nur die frage, der rest ist leer :] (bei mir). ich schau mal, ob das bei den loesungen dabei ist, die du gepostet hast, koenntest du ansonsten nochmal eine extrawurst fuer mich anfertigen?
Zu 2c:
-Entweder mit sukzessiver Div von 2:
xor %ecx, ecx
loop: cmpl $2 , %eax
jl done
subl $2 , %eax
incl %ecx
jmp loop
done: movl %ecx , result
Also so ungeführ müsst die gehen
-Oder man ersetzt rechtsshift durch sieben Linksshifts (kann man drch Addition wiederum ersetzen), anschließend inc if carry Bit.AmEnde dann mit einer maske verunden (andl $0*7fff ffff).
LÖsung dazu aus fau-informatik-2001.de
movb $7, %cl
_loop:addl %eax, %eax
jnc _noinc
incl %eax
_noinc:decb %cl
jnz _loop
andl $0x7fffffff, %eax
zu 1d:
Vorteil Adressbusse:Anzahl direkt addressierbarer Speicherzellen wächst exponentiell.(pro Bit eine Verdopplung des Speichers)
Vorteil Datenbusse:Mehr Informationen können gleichzeitg aus Speicher geholt bzw geschrieben werden=> höhere Performance
Nachteil:Zu breite Busse nur noch teuer bringen aber keine Verbesserung mehr!
-mit 128 Adressbussen könnte man jedes Atom im Weltall adressieren (unnutzbar)
-größte zu verarbeitende Daten sind 64 Bit (Double-Bit)
Zur 3:
der gcc erzeugt für die else funktion folgenden Code
subl $12, %esp
movl 8(%ebp), %eax
decl %eax
pushl %eax
call fibo
addl $16, %esp
movl %eax, %ebx
subl $12, %esp
movl 8(%ebp), %eax
subl $2, %eax
pushl %eax
call fibo
addl $16, %esp
leal (%eax,%ebx), %eax
movl %eax, -8(%ebp)
der rest ist weitgehend so wie in der Lösung hier, kann mir jemand erklären was “leal (%eax,%ebx), %eax” macht und wie das die Addition der beiden Funktionsergebnisse ersetzt oder überles ich da irgendwas?
leal (%eax,%ebx), %eax :
des leal macht nicht viel, ausser eine Konstante die allerdings wie eine Speicheradresse aussieht in das Register zu schieben …
Also:
Interpretiere (%eax,%ebx) als Speicheradresse;
Berechne also die effektive Adresse (weiss allerdings nicht, welcher Scaling Faktor benutzt wird, wenn man ihn weglaesst)
Die berechnete Adresse interpretierst du als Konstante $Adresse und schiebst se nach %eax