Autor: Tomasz Lisowski (jtlis_at_pf.NOSPAM.pl)
Data: Sun 30 Nov 2003 - 09:32:14 MET
Użytkownik "MiW" <miw_at_zeus.polsl.gliwice.pl> napisał w wiadomości
news:bqb4qe$pne$1_at_zeus.polsl.gliwice.pl...
> Witam !
>
>
> fld qword ptr [ebx + 48]
> fld qword ptr [ebx + 8]
> fld ST(0)
> fadd ST(0),ST(2)
> fstp qword ptr tmp [8]
> fsub ST(0),ST(1)
> fstp qword ptr tmp [48]
>
Stos FPU ma ograniczoną pojemność i nie ostrzega Cię, gdy wykonująć FLD
tracisz ósmą pozycję na stosie :-)
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ę:
fld qword ptr [ebx + 8] ;B
fld qword ptr [ebx + 48] ;A, B
fld ST(1) ;B, A, B
fadd ST(0),ST(1) ;B+A, A, B
fstp qword ptr tmp [8] ;A, B
fsubp ST(1),ST(0) ;B-A - tu jest istota pomysłu !!!
fstp qword ptr tmp [48]; stos jest pusty
Pozdrawiam
Tomasz Lisowski
To archiwum zostało wygenerowane przez hypermail 2.1.7 : Wed 19 May 2004 - 11:46:32 MET DST