Klausur 701

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)

:wink:


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