Seite 1 von 1

H4/1

Verfasst: 9. Nov 2011 20:55
von Martin_H
Hi,
bei der Teilaufgabe a) sollen wir ja diese Berechnungen mit den SSE-Registern durchführen. Nun bin ich an dem Punkt, dass ich ein Register (z.B. xmm0) habe und dort die 3 Ergebnisse stehen (also -4571.2, 1636.4 und -2, sowohl eine vierte unwichtige Zahl). Wie bekomme ich nun diese 3 Ergebnisse ausgegeben?
Zunächst habe ich probiert, die erste Zahl von xmm0 in %eax zu speichern, alle möglichen befehle die mir dazu eingefallen sind, gaben leider Fehler aus. (Kann man überhaupt Float-Werte in die "normalen" Register speichern?) Dann kam ich auf die Idee die benötigten 3 Werte auf den Stack zu legen und dann mittels printf diese auszugeben, das gab dann immer ei Segmentation Fault (War ja klar, hab schliesslich irgendwas mit irgendwelchen Befehlen kopiert, sodass irgendwas beim Stack schief laufen musste, was aber genau schief läuft, habe ich nicht ganz rausfinden können).
Mein Problem ist also nur die Ausgabe der 3 benötigten Float-Werte, vielleicht weiss ja einer, wie das funktioniert, danke schonmal

Re: H4/1

Verfasst: 9. Nov 2011 21:11
von kai j
ich glaube, du musst nacheinander die Zahlen auf die 4. stelle des Registers shuffeln, in Register ablegen, und ausgeben.

Re: H4/1

Verfasst: 9. Nov 2011 21:17
von Martin_H
ok, das ist schonmal ein Ansatz.
Nun die grosse Frage^^: Wie hole ich die erste Zahl von xmm0 in ein Register?
Wenn ich das dann hab, gehts so weiter: Einfach erste Zahl in Register eax speichern, dann shuffeln, dann in ebx speichern ...? Und wie gebe ich Float-Werte aus? genauso, wie Integer-auch?

Re: H4/1

Verfasst: 13. Nov 2011 13:54
von Pflücker
Nach langem Suchen habe ich zufälligerweise von einem GDI-3-Übungsblatt der vergangenen Jahre erfahren, dass printf keine float-werte ausgeben kann sondern nur double-werte...
Ausgabe einer float Zahl via printf
Wichtig: printf ist leider nur double kompatibel,
daher muss float auf double erweitert werden
auch wenn %f genutzt wird!
vielleicht wäre an _irgendeiner_ Stelle auf dem Übungsblatt oder den Folien ein Hinweis darauf angebracht gewesen...

Nun zu meiner Frage: Können wir für die Ausgabe der 1a) einen Coderahmen aus den vergangenen Semestern zum Ausgeben von float-Zahlen nutzen, wenn wir dies kenntlich machen? Die Umwandlung ist nämlich mal locker so viel Code wie die eigentliche Berechnung (wenn nicht sogar mehr)...
Alternativ: Dürfen wir uns schwarzer Magie bedienen um die Werte zu prüfen, sprich vielleicht einfach garkeine Ausgabe sondern nur cmp-Vergleiche?
Oder: Dürfen wir uns die Ausgabe einfach sparen?

Re: H4/1

Verfasst: 13. Nov 2011 14:20
von xarfai
tatsächlich les ich in der Aufgabenstellung nichts von Ausgabe. Aber praktisch ist es ;-)

Im Foliensatz mit der Gleitkommarechnung steht ein beispielprogramm das eine float ausgiebt. Ich hab es damit mit recht wenig Zeilen hinbekommen.

Re: H4/1

Verfasst: 13. Nov 2011 14:27
von Pflücker
xarfai hat geschrieben:tatsächlich les ich in der Aufgabenstellung nichts von Ausgabe. Aber praktisch ist es ;-)
Naja da die Ausgabe mit zu dem C-Programm gehört, und wir die Funktion des C-Programms in Assembler realisieren sollen ... ;)
xarfai hat geschrieben: Im Foliensatz mit der Gleitkommarechnung steht ein beispielprogramm das eine float ausgiebt. Ich hab es damit mit recht wenig Zeilen hinbekommen.
Ich danke vielmals, damit geht es in der Tat flott ;)
Edit: @others: Es ist von Folie 29, Foliensatz 6 die Rede ;)

Re: H4/1

Verfasst: 13. Nov 2011 17:06
von Ronny
Streng genommen war es nicht beabsichtigt, dass die Aufgabe mit SSE geloest wird. Es steht auch nicht in der Aufgabenbeschreibung.
Es ist aber kein Problem, wenn Sie SSE verwenden, da die Aufgabe dafuer geeignet ist.

Re: H4/1

Verfasst: 13. Nov 2011 19:08
von simon.r
Man sollte sich bei der Aufgabe denke ich nicht so sehr auf SSE festlegen bzw. festbeißen, da es unter Umständen nicht wirklich viel bringt. Meine Implementierung kommt mit 3 mulps, 2 addps und einem addss aus; das ganze erkauft man sich aber mit massiven shuffles, was den Code doch eher schwer verständlich macht. Hinzukommt, dass es langsamer als eine reine FPU-Implementierung ist - mit den 10^9 Durchläufen um 5s.