Re: pytanie dziwne jak na ta grupe ;-)... asembler x86 dla FPU

Autor: Tomasz Lisowski (jtlis_at_pf.NOSPAM.pl)
Data: Thu 04 Dec 2003 - 13:25:28 MET


Użytkownik "MiW" <miw_at_zeus.polsl.gliwice.pl> napisał w wiadomości
news:bqcce7$n3d$1_at_zeus.polsl.gliwice.pl...
> > Stos FPU ma ograniczoną pojemność i nie ostrzega Cię, gdy wykonująć FLD
> > tracisz ósmą pozycję na stosie :-)
>
> Alez ja doskonale o tym wiem :)
>
> > Jeżeli wykonujesz tę sekwencję wiele razy, to zawsze zostawiasz jeden
> > element na stosie. Poniżej masz swój kod z komentarzami zawierającymi
stan
> > stosu FPU od pozycji nr 0 w dół.
> >
> > fld qword ptr [ebx + 48] ;A
> > fld qword ptr [ebx + 8] ;B, A
> > fld ST(0) ;B, B, A
> > fadd ST(0),ST(2) ;B+A, B, A
> > fstp qword ptr tmp [8] ;B, A
> > fsub ST(0),ST(1) ;B-A, A
> > fstp qword ptr tmp [48]; A
> >
> > Widzisz! Zostaje A na stosie, a nie powinno nic zostać ...
> > Proponuję następującą zmianę:
>
> Wycialem taki 'luzny' fragment. Ten element byl dalej wykorzystywany. Na
> stosie nic nie zostawalo (sprawdzone debuggerem).

Skoro to nie to, a także nie wynika z flag, to może kwestia rejestrów
statusu lub kontrolnego (instrukcje typu FSTSW lub FLDCW). Może też wynikać
z operacji, które mogą nie zwrócić wyniku ostatecznego, jeżeli liczba
iteracji przekroczy zadany próg (np. FPREM czy FPREM1). Wtedy sygnalizują to
odpowiednią flagą (C2) i trzeba operację kontynuować :-). Jeżeli nie
oprogramowałeś takich przypadków, to masz problem ;-)

Pozdrawiam
Tomasz Lisowski



To archiwum zostało wygenerowane przez hypermail 2.1.7 : Wed 19 May 2004 - 11:51:22 MET DST