🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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)
#312
Author: Jareq
Date: Mon, 05 Jun 2006 12:49
32 lines
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)
#313
Author: Bogdan (bogdro)
Date: Mon, 05 Jun 2006 14:37
39 lines
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)
#317
Author: Wojciech Muła
Date: Mon, 05 Jun 2006 14:42
24 lines
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)
#316
Author: Michał
Date: Mon, 05 Jun 2006 14:56
11 lines
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)
#314
Author: Jareq
Date: Mon, 05 Jun 2006 18:46
26 lines
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)
#315
Author: Bogdan (bogdro)
Date: Tue, 06 Jun 2006 08:40
34 lines
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