klausur 07/2003

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 07/2003
so,
hier koennen wir mal die ergebnisse vergleichen:

1a) 128 KByte
1b) genauso viel, bloss anordnung der bytes betroffen
1c) manchmal mehr, wenn weniger als 4 byte gebraucht werden
1d) 1024

2a) 0, da x+y = 1 0000 0000 (overflow)
2b) wenn bei der addl-op ein carry entstehen sollte, wird dies beim rotatebefehl wieder links reingeshiftet, ausserdem entspricht rotateright = division durch 2

3a)
60: unbekannt
56: c
52: b
48: a
44: 3
40: returnadresse x

3b)
max:
movl $0, %ebx     # init schleifenzaehler
movl $0, %eax     # init maximum
loop:
cmpl %ebx, 4(%esp)     # vgl zaehler mit parameteranzahl
je end     # wenn erreicht, dann ende
cmpl %eax, 8(%esp, %ebx, 4)     # vgl i-ten parameter mit aktuellem maximum
jle weiter     # kein neues maximum
movl 8(%espl, %ebx, 4), %eax     # neues maximum merken
weiter:
incl %ebx     # zaehler erhoehen
jmp loop     # schleife
end:
ret     # return (ergebnis in %eax)

4) da hab ich jetzt keine lust, das abzuschreiben, duerfte auch kein prob sein (sonst konkret fragen!), nur eine sache: wie schreibt man den ausdruck a[i] um? man koennte die indirekte adressierung mit scalefactor verwenden, allerdings kennt man z.b. die baseadresse vom array nicht. langt dann vielleicht a[0 + i], um zu zeigen, was man meint?

5) ??? da verstehe ich (und jeder, den ich gefragt habe) schon die letzte zeile nicht : subl $x - func, %eax. was hat das zu bedeuten, hat irgendjemand eine ahnung (linqs?)?

6) 8 elemente, jedes besteht aus einem xor vom vorherigen carry (beim ersten gleich 1) mit dem eingang und einem and mit dem vorherigen carry und dem eingang, um das naechste carry zu berechnen.

hoffe, dass ich helfen konnte und mir geholfen werden kann…


Dann mach ich das mal (nochmal, man ist ja zu dumm um auf speichern zu klicken ):slight_smile:

i=-1;
int rega;
next: i++;
if (i>=5) goto else;
rega=a[i]
rega+=10;
if (rega<i) goto ende;
if (i>=y) goto ende;
goto for;
else: rega=b;
rega+=c;
rega*=a[i];
rega/=b;
rega+=y;
y=rega;
for: if (i<10) goto next;
ende: ....

Wir haben auch schon versucht, das mit gas zu assemblieren, aber es ging nicht.
Unsere beste Vermutung:

func:

call x
x:
popl %eax // enthaelt jetzt x:
subl $x - func, %eax // x-(x-func)=func

evtl. wird damit die Adresse von func ausgerechnet, aber entweder ist vor dem x ein $ zuviel oder es fehlt vor dem func (ich denk das Letztere)

Gruss
Swarsron


zu Aufgabe 5:

Ich habe den Code mal mit as assembliert (wie auf den ersten Vorlesungsfolien beschrieben)… hat tatsächlich funktioniert.

“$x - func” wird dabei durch eine Konstante ersetzt, welche dem Offset der Symbole x und func im Maschinencode entspricht.

In %eax steht nach der Ausführung dann tatsächlich die Adresse von func.

Ich hätte ebenfalls erwartet, daß man “$x - $func” verwenden muß, um diesen Effekt zu erzielen. Weshalb man solch spezielle Eigenschaften eines bestimmten Assemblers in einer Klausur abfragt, kann ich nicht ganz nachvollziehen.

Im Anhang findet sich das Listing meines Testprogrammes.

Attachment:
KL.LST: https://fsi.cs.fau.de/unb-attachments/post_8691/KL.LST


also ich haette jedenfalls intuitiv auch auf dieses ergebnis getippt. ist zwar scheisse, weil man bei klausuren eigentlich nicht raten muessen sollte, aber egal.


Mhh, in meiner Doku wird bei ‚ror‘ das LSB ins Carry geschickt und als MSB vorne angehängt. Das Carry ist damit also verloren!!

Eigentlich sollte es nur gehen wenn ich ein ‚rcr‘ mache, also ein ‚Rotate right through Carry‘…

Aber eine andere Lösung sehe ich auf Anhieb auch nicht…

Grüße, ShadowMG


und nochmal zur Aufgabe 5:

Man könnte sich das ganze geklammert vorstellen. Da ja eigentlich nicht mehr als zwei Operatoren bei SUBL erlaubt sind ist also $x-func wahrscheinlich als $(x-func) zu verstehen.

Hab zwar nichts weiter dazu gefunden, hört sich aber wenigstens plausiebel an :smiley:


Musst du nicht, x-func wird vom Assembler ausgerechnet und dann ist es wieder nur ein Operand