klausur-gra-2010-02-15 Aufgabe 6 (Achtung Lösung!)

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-gra-2010-02-15 Aufgabe 6 (Achtung Lösung!)
Und nochmal ich…
Falls noch jemand Lust hat, bitte Senf abgeben:

Schreiben Sie eine Assembler-Funktion, die zwei Fliesskomma-Zahlen miteinander multipliziert. blabla
Bit 31: vorzeichen
Bit 30-16: exponent
Bit 15-0: mantisse

Mein Vorschlag:

xor ecx, ecx
mov eax, a
mov ebx, b
mul word ax, bx
mov word cx, ax
shl eax, 1
shr eax, 17
shl ebx, 1
shr ebx, 17
add word ax, bx
shl eax, 16
add ecx, eax
mov eax, a
mov ebx, b
shr eax, 31
shr ebx, 31
add eax, ebx
shl eax, 31
add ecx, eax

Muss ich, wenn ich mit dem 16 Bit Anteil eines Registers (z.B. eax) arbeite, dann immer dieses mov word cx, ax explizit hinschreiben? oder reicht es, einfach nur die kleinen Registernamen zu benutzen (ax)?


Sieht so mal ganz gut aus.
Was man glaub ich aber schreibt, ist mulw / addw und so weiter.
Man kann sich auch noch den zusätzlichen Speicherzugriff durch das erneute Laden sparen…
=> statt

shl eax, 1
shr eax, 17
shl ebx, 1
shr ebx, 17

kann man

shr eax, 15 # Vorzeichen steht auf dem Bit 16 => gerade außerhalb von ax
shr ebx, 15
shr ax, 1  # Nur ax shiften!
shr bx, 1

machen, und danach (wenn man die Exponenten addiert hat (und den Bias abgezogen, das hast vllt. vergessen!)) zB. den fertigen Exponenten in dx zwischenspeichern (in cx liegen ja die Mantissen), und danach dann

shr ebx, 16
shr eax, 16
add / xor ax, bx
shl eax, 15 # VZ auf Bit 15 schieben, gerade noch in ax
add eax, edx
shl eax, 16 # VZ + Exponent ganz nach links schieben
add eax, ecx

Deins macht halt mehr Speicherzugriff, sollte aber auch so passen.


was nutzen die ganzen shift operationen um 1? Und insbesondere warum eins nach linkss und dann X+1 nach rechts wieder?


Um das Vorzeichenbit zu verwerfen.