Thread View: pl.comp.lang.asm
6 messages
6 total messages
Started by Jareq
Mon, 05 Jun 2006 12:49
Zmiennoprzecinkowe - konwersja Temporary Real (80bity) na Long Real (64bity)
Author: Jareq
Date: Mon, 05 Jun 2006 12:49
Date: Mon, 05 Jun 2006 12:49
32 lines
2135 bytes
2135 bytes
Witam, Napisałem program hybrydowy (C + assembler) i po pewnych wyliczeniach otrzymuje liczbe zmiennoprzecinkową na ST(0). Chcę ją przekazać do modułu w C++ do zmiennej typu double. Wszystko generalnie (tylko generalnie) jest ok, ale jesli liczba nie miesci sie na 64 bitach to oczywiscie wystepuje w module C overflow - nie da sie przedstawic liczby na zmiennej double. Postanowilem wiec ze zamienie liczbe ze stosu (czyli zapisana na 80 bitach) na double (czyli 64 bity). Okazuje sie ze nie jest to (dla mnie) takie proste. Czy spotkal sie ktos kiedys z tym problemem? Czy jest jakis sposob zeby najpierw sprawdzic czy taka liczba da sie przedstawic na 64 bitach? Zaznacze, ze chce to zrobic w module asemblerowym (wiec porownywanie do DBL_MAX w module c++ odpada - aczkolwiek jest to jakies rozwiazanie). Najlepiej gdyby w module asemblerowym liczba ze stosu koprocesora byla przenoszona do jakiejs zmiennej QWORD z konwersja (no i jakos zeby dalo sie sprawdzic czy jest to w ogole mozliwe - wtedy ustawie sobie flage, czy zmienna i sprawdze ja w module C++ - jesli bedzie zero to znaczy ze liczba moze byc zapisana do zmiennej tylu double, jesli nie to znaczy ze otrzymalismy za duzy wynik). Mam nadzieje ze nie zakrecilem za bardzo. Z gory dzieki za podpowiedzi. Pozdrawiam, -- Jareq
Re: Zmiennoprzecinkowe - konwersja Temporary Real (80bity) na Long Real (64bity)
Author: Bogdan (bogdro)
Date: Mon, 05 Jun 2006 14:37
Date: Mon, 05 Jun 2006 14:37
39 lines
2936 bytes
2936 bytes
Jareq napisał(a): > Witam, > > Napisałem program hybrydowy (C + assembler) i po pewnych wyliczeniach > otrzymuje liczbe zmiennoprzecinkową na ST(0). Chcę ją przekazać do > modułu w C++ do zmiennej typu double. Wszystko generalnie (tylko > generalnie) jest ok, ale jesli liczba nie miesci sie na 64 bitach to > oczywiscie wystepuje w module C overflow - nie da sie przedstawic liczby > na zmiennej double. > > Postanowilem wiec ze zamienie liczbe ze stosu (czyli zapisana na 80 > bitach) na double (czyli 64 bity). Okazuje sie ze nie jest to (dla mnie) > takie proste. Czy spotkal sie ktos kiedys z tym problemem? > > Czy jest jakis sposob zeby najpierw sprawdzic czy taka liczba da sie > przedstawic na 64 bitach? Zaznacze, ze chce to zrobic w module > asemblerowym (wiec porownywanie do DBL_MAX w module c++ odpada - > aczkolwiek jest to jakies rozwiazanie). Wyłuskaj wartość DBL_MAX, zapisz ją na stałe w kodzie asm (od razu jako DT, w końcu to jest stała), załaduj na stos FPU, wykonaj FCOMIP i jesteś w domu :) (wystarczy sprawdzić wartość flag). > Najlepiej gdyby w module asemblerowym liczba ze stosu koprocesora byla > przenoszona do jakiejs zmiennej QWORD z konwersja (no i jakos zeby dalo > sie sprawdzic czy jest to w ogole mozliwe - wtedy ustawie sobie flage, > czy zmienna i sprawdze ja w module C++ - jesli bedzie zero to znaczy ze > liczba moze byc zapisana do zmiennej tylu double, jesli nie to znaczy ze > otrzymalismy za duzy wynik). Więcej roboty będzie niż w powyższym sposobie. Możesz po prostu zapisać st0 do zmiennej qword, po czym sprawdź status FPU, czy nie wystąpił wyjątek, wyłączając uprzednio sygnalizowanie wyjątków. -- Pozdrawiam, Bogdan (Linux i FreeDOS) Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Prawdziwy, bezpieczny komunikator: www.JabberPL.org
Re: Zmiennoprzecinkowe - konwersja Temporary Real (80bity) na Long Real (64bity)
Author: Wojciech Muła
Date: Mon, 05 Jun 2006 14:42
Date: Mon, 05 Jun 2006 14:42
24 lines
1888 bytes
1888 bytes
Jareq wrote:
> Postanowilem wiec ze zamienie liczbe ze stosu (czyli zapisana na 80
> bitach) na double (czyli 64 bity). Okazuje sie ze nie jest to (dla mnie)
> takie proste. Czy spotkal sie ktos kiedys z tym problemem?
Spróbowałbym tak:
* zapisać wierzchołek stosu do jakiejś zmiennej 80-bitowej
* zbadać jaki jest wykładnik tej liczby:
* jeśli jest większy od +1023, to znaczy że liczba jest za
duża - nie zmieści się w double
* w przeciwnym razie:
fld tword ptr [liczba 80-bitowa]
fstp qword ptr [liczba 64-bitowa]
To jest chyba najprostsza droga, tzn. to 'fld 80-bity'/'fstp 64-bity' bo
nie przypominam sobie, żeby 'fstp rejestr' dawał możliwości konwersji
(chyba, że po zmianie słowa kontrolnego, ale to by było jeszcze większa
rzeźbie).
w.
--
Tępi głupcy są własnymi nieprzyjaciółmi, gdy dopuszczają
się złych uczynków, których owoce są gorzkie.
Re: [OT] Zmiennoprzecinkowe - konwersja Temporary Real (80bity) na Long Real (64bity)
Author: Michał
Date: Mon, 05 Jun 2006 14:56
Date: Mon, 05 Jun 2006 14:56
11 lines
1255 bytes
1255 bytes
Jareq wrote: > Witam, [...] > Z gory dzieki za podpowiedzi. Hmm, wygląda na to, że o czymś nie wiem. Nie można po prostu zrobić fst do zmiennej 64 bitowej? Czy chodzi może o zbyt dużą dokładność i dla 64 bitów było by NAN? -- Pozdrawiam
Re: Zmiennoprzecinkowe - konwersja Temporary Real (80bity) na Long Real (64bity)
Author: Jareq
Date: Mon, 05 Jun 2006 18:46
Date: Mon, 05 Jun 2006 18:46
26 lines
2027 bytes
2027 bytes
Bogdan (bogdro) napisał: > Wyłuskaj wartość DBL_MAX, zapisz ją na stałe w kodzie asm (od razu > jako DT, w końcu to jest stała), załaduj na stos FPU, wykonaj FCOMIP i > jesteś w domu :) (wystarczy sprawdzić wartość flag). Tak też zrobiłem i działa, ale... > Więcej roboty będzie niż w powyższym sposobie. Możesz po prostu > zapisać st0 do zmiennej qword, po czym sprawdź status FPU, czy nie > wystąpił wyjątek, wyłączając uprzednio sygnalizowanie wyjątków. ...chciałem właśnie zrobić to w powyższy sposób, jednak chyba namieszałem coś z statusem - w zasadzie to które bity w status word powinienem sprawdzić? Chciałem właśnie zdjąć ze stosu koprocesora st0 do zmiennej qword, następnie sprawdzić (jakoś - niestety właśnie z tym etapem miałem problem) czy wszystko "poszło ok". Niestety walka ze status word nie przyniosła rezultatów. Także ogólnie działa, ale jak ktoś jeszcze wie jak to jest z tym fstp do zmiennej qword to będę wdzięczny (tzn. co się dzieje ze status word). -- Pozdrawiam Jareq
Re: Zmiennoprzecinkowe - konwersja Temporary Real (80bity) na Long Real (64bity)
Author: Bogdan (bogdro)
Date: Tue, 06 Jun 2006 08:40
Date: Tue, 06 Jun 2006 08:40
34 lines
2513 bytes
2513 bytes
Jareq napisał(a):
>> Więcej roboty będzie niż w powyższym sposobie. Możesz po prostu
>> zapisać st0 do zmiennej qword, po czym sprawdź status FPU, czy nie
>> wystąpił wyjątek, wyłączając uprzednio sygnalizowanie wyjątków.
>
> ...chciałem właśnie zrobić to w powyższy sposób, jednak chyba
> namieszałem coś z statusem - w zasadzie to które bity w status word
> powinienem sprawdzić?
Poczytaj Intel Architecture Software Developer's Manual:
http://developer.intel.com/design/Pentium4/documentation.htm
Bity 3 i 4, sądząc po tym, co zrobiłem w moim kodzie.
> Chciałem właśnie zdjąć ze stosu koprocesora st0 do zmiennej qword,
> następnie sprawdzić (jakoś - niestety właśnie z tym etapem miałem
> problem) czy wszystko "poszło ok". Niestety walka ze status word nie
> przyniosła rezultatów.
>
> Także ogólnie działa, ale jak ktoś jeszcze wie jak to jest z tym fstp do
> zmiennej qword to będę wdzięczny (tzn. co się dzieje ze status word).
Ja u siebie sprawdzam tak:
fstsw ax
and al, 18h ; spr., czy over-/under-flow
jeśli wynik jest niezerowy, to wystąpił over/underflow.
--
Pozdrawiam, Bogdan (Linux i FreeDOS)
Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Prawdziwy, bezpieczny komunikator: www.JabberPL.org
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads