Article View: pl.comp.lang.asm
Article #313Re: Zmiennoprzecinkowe - konwersja Temporary Real (80bity) na Long Real (64bity)
From: 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
Technical Details
Message-ID:
<e61fnd$214$1@nemesis.news.tpi.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mailReferences:
<e6198o$2l7$1@node1.news.atman.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail From: "Bogdan (bogdro)" <bogdan@bogdan.pl> Newsgroups: pl.comp.lang.asm Subject: Re: Zmiennoprzecinkowe - konwersja Temporary Real (80bity) na Long Real (64bity) Date: Mon, 05 Jun 2006 16:37:28 +0200 Organization: tp.internet - http://www.tpi.pl/ Lines: 39 Message-ID: <e61fnd$214$1@nemesis.news.tpi.pl> References: <e6198o$2l7$1@node1.news.atman.pl> NNTP-Posting-Host: acsr48.neoplus.adsl.tpnet.pl Mime-Version: 1.0 X-Trace: nemesis.news.tpi.pl 1149518382 2084 83.11.45.48 (5 Jun 2006 14:39:42 GMT) X-Complaints-To: usenet@tpi.pl NNTP-Posting-Date: Mon, 5 Jun 2006 14:39:42 +0000 (UTC) User-Agent: Thunderbird 1.5.0.4 (X11/20060516) In-Reply-To: <e6198o$2l7$1@node1.news.atman.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit