Klausur 202

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 202
1a, 2,3
b, 2,3,4,7
c, Ein Zeiger auf den als naechstes auszufuehrenden Befehl
d, Sind wir uns nicht sicher:
Berechnungsreihenfolge links → rechts
Rundungsfehler
Berechnungsreihenfole rechts → links
Ergebnis immer 0, da (int) 9/10 = 0

Ich bin fuer Letzteres

e, Structs, Arrays
f, Guenstige Ausnutzung des Speicherplatzes
g, shll=srll

2a, 2N*M/8
b, 2+14=16 Byte
2
16 Byte > 102416 Byte
c, A=5000+(x
4+y)*2

3a, sin(x)=x-x3/3!+x5/5!-x**7/7!+ usw.
Mutliplikation durch Addition/Shiften
Fakultaet
pow(a,b)
Gleitpunktdivision durch Newton-Raphson

b, a shiften um 3 + a shiften um 2

4,
search: pushl %ebx
subl $8, %esp //2,3
movl 20(%esp), %eax // 4
cmpl %eax, 24(%esp) // 4
jne .L2 // 4
movl $array, %ebx // 5
movl 20(%exp), %eax // 5
movl (%ebx, %eax, 8), %eax // 5
cmpl %eax, 16(%esp) // 5
jne .L1 // 5
movl 20(%esp), %eax // 6
movl %eax, (%esp) // 6
jmp .L4
.L1: movl $-1, (%esp) // 8
jmp .L4
.L2: addl 24(%esp), %eax // 11
shrl $1, %eax // 11
movl %eax, 4(%esp) // 11
movl $array, %ebx // 12
movl (%ebx, %eax, 8), %ebx // 12
cmpl %ebx, 16(%esp) // 12
jg .L3 // 12
pushl %eax // 13
pushl 20(%esp) // 13
pushl 16(%esp) // 13
call search // 13
jmp .L5 // 14
.L3: pushl 24(%esp) // 15
incl %eax // 15
pushl %eax // 15
pushl 16(%esp) // 15
call search // 15
.L5: movl %eax, (%esp) // 13, 15
.L4: movl (%esp), %eax // 18
add $8, %esp // 19
popl %ebx // 19
ret // 19

5a, siehe 702
b, siehe Skript
c, Widerherstellung der Register

6a, alles verODERn, invertieren
b, 28*28=2**16
2 * MUL8 + 16 VA


Da bin ich eigentlich überall eurer Meinung bis auf:

Wie kommt Ihr darauf?

16VA, da zweimal jeweils auf beiden Seiten des Mittleren „*“ eine 8- und eine 4-Bit zahl addiert wird?

Und nur 2 MUL8, da ihr quasi „in einem Zug“ die Multiplikationen links und rechts berechnet (die oberen und unteren gleichzeitig)? (anschliessend werden vermutlich die ergebnisstellen wieder auseinander gezogen)


@swarson: Bei Aufgabe 4 hab ich mal ne Frage:
wenn ich ein pushl mache, wird doch der Stack dabei automatisch um 4 verringert. Müsste man dann nicht nach der Zeile “jg .L3” den Offset anders berechnen, sprich, nach jedem pushl noch mal 4 zusätzlich drauf zählen, oder hab ich da jetzt was verpeilt?
Und warum werden nach dem “call search” die Parameter nicht wieder mit einem “addl $12, %esp” vom Stack genommen?
Verwirrt mich jetzt irgendwie… :-/


Die 6b hab ich so gemacht:
A = ah2^4+al
B = bh
2^4+bl
AB = (ah2^4 + al) * (bh2^4 + bl) =
= ah
bh2^8 + ahbl2^4 + albh2^4 + albl
Laut Aufgabe sind nur die unteren 8 Bit interessant, also kann man ahbh2^8 gleich schonmal weglassen.
Von den beiden mittleren Summanden sind jeweils nur die unteren 4 Bit interessant, die muss ich zusammenzählen, braucht 4 VA.
Das Ergebnis ist aber wegen der 2^4 nur für die oberen 4 Bit des Ergebnisses interessant, also muss ich die unteren 4 Bit dieses Ergebnisses (könnten ja auch 5 sein, wenn’s nen Übertrag gibt) zu den oberen 4 Bit des letzten Summanden al*bl addieren. Macht wieder 4 VA.
Damit bin ich bei 3xMUL8 und 8xVA

Ist da ein Denkfehler drin? Wie man mit 2xMUL8 und 16VA hinkommt versteh ich auch nicht wirklich.


@Wifu: müßte so stimmen …


@wifu: hast bei beiden sachen recht! also keine sorge…


juhuu, ich versteh’s doch noch :slight_smile:
Freut mich, dass ich auch endlich mal was sinnvolles beitragen kann.


Nein, da hast du recht, ich verwende sonst immer ebp.

Weil ich das auch ganz gerne mal vergesse (aber Speicher kostet ja nix mehr (:wink: