FIST - Floatzahl in String konvertieren

14/06/2008 - 23:00 von Jens Kallup | Report spam
Hallo,

nachdem ich nun mit

fld tword[pi]

einen Wert in die FPU geschrieben habe, stellt sich nun die Frage,
wie man einen Wert wieder ausliest und das Ergebins in einen String
konvertiert.
Habe in diesen Zusammenhang kurz FIST ergoogelt aber ohne
Beschreibung ...
Dann sollte es möglich sein, diesen String auszugeben - entweder per
externer Funktion oder intern int 21h ...

Danke schonma
Jensl
 

Lesen sie die antworten

#1 Markus Wichmann
15/06/2008 - 10:21 | Warnen spam
Jens Kallup schrieb:
Hallo,

nachdem ich nun mit

fld tword[pi]

einen Wert in die FPU geschrieben habe, stellt sich nun die Frage,
wie man einen Wert wieder ausliest und das Ergebins in einen String
konvertiert.
Habe in diesen Zusammenhang kurz FIST ergoogelt aber ohne
Beschreibung ...
Dann sollte es möglich sein, diesen String auszugeben - entweder per
externer Funktion oder intern int 21h ...

Danke schonma
Jensl





Damit du nicht immer Googlen musst:

<http://www.amd.com/us-en/assets/con...94.pdf>
General Purpose Instructions and System Instructions

<http://www.amd.com/us-en/assets/con...68.pdf>
128-bit Media Instructions

<http://www.amd.com/us-en/assets/con...69.pdf>
64-bit Media and x87 Floating-Point Instructions

So, da hast du alle Instruktionen, die ein AMD64 kann auf einem
Haufen. Und ein AMD64 kann alles, was ein x86 kann. Nun zu FIST:

#v+
|Converts the value in ST(0) to a signed integer, rounds it if
|necessary, and copies it to the specified memory location. The rounding
|control (RC) field of the x87 control word determines the type of
|rounding used.
#v-

Bist du dir sicher, dass du, wenn du schon mit einem Pi von 20 Stellen
rechnest, hinterher alles wieder runden willst? Ich glaube, du suchst
eher FST oder FSTP: Die geben ein standardkonformes double zurück und
löschen wahlweise danach noch das oberste Stackregister der FPU (das P
von FSTP heißt "pop"). Damit kann man dann Delphi belasten :-).

Und int 21h ist in einer 32-bit-Anwendung eigentlich tabu. Es geht
zwar, aber, wie soll ich sagen... man kann es sich auch schwer machen.
Schließlich muss man für int 21h den String noch mit einem $
terminieren. Wenn man jedoch WriteConsole() aus der Kernel32.dll
verwendet, braucht man bloß die Buchstaben zàhlen zu lassen. Aber da
wir ja noch keinen string haben... halt, dem Manne kann geholfen
werden: Man nehme printf() aus msvcrt.dll oder crtdll.dll.
Funktioniert genauso wie das printf() aus C: Erst den double-Wert
pushen, dann die Adresse eines Strings '%f'#0, dann printf aufrufen
(call printf) und schließlich die Größe der Parameter zu esp addieren
(ich weiß dummerdings nicht, wie groß ein double ist).

Tschö,
Markus
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.

Ähnliche fragen