Autor Wątek: asm - instrukcja fcomip zwraca zawsze to samo!  (Przeczytany 1159 razy)

Offline Icy Tower

  • Użytkownik

# Czerwiec 10, 2010, 03:01:00
Jest środek nocy a ja walczę od dwóch godzin z jedną instrukcją. Dla tych co się znają: fcomip - porównanie dwóch liczb w FPU z ustawieniem flag w CPU.

Nie rozumiem czemu bez względu na dane zawsze fcomip twierdzi, że pierwsza liczba jest większa. Fcomip jest w stanie jedynie poprawnie stwierdzić kiedy liczy są równe, ale nie która z nich jest większa. Objawia się to tym, że zawsze wykonuję skok w tym kodzie:

fld qword ptr [esi]//; load vertexArray[j].y to FPU
fld qword ptr [ebp + 10h]//; load y to FPU
fcomip st,st(1) //; compare vertexArray[j].y and y
ffree st(0)
jge first_if_comp //jump if not true

Jezu, marzę o tym, żeby jakiś zabłąkany geniusz mi odpowiedział o 2:00 w nocy... błagam
« Ostatnia zmiana: Czerwiec 10, 2010, 03:33:29 wysłana przez Icy Tower »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 10, 2010, 03:37:03
Próbowałeś może dodać "fwait" przed "jge"?

Offline Avaj

  • Użytkownik

# Czerwiec 10, 2010, 09:45:15
Można pisać st, st(1)? nie musi być st(0), st(1)?

Offline władek.kwaś...

  • Użytkownik

# Czerwiec 10, 2010, 10:33:29
FCOMIP ustawia flagi ZF, PF, CF. Dokładniej (0,0,0) to >, (0,0,1) to <, (1,0,0) to =

JGE skacze, jeśli SF = OF.

prawdopodobnie należy użyć
jnc, które skacze jeśli flaga CF nie jest ustawiona, czyli  st(0)>=st(i)
« Ostatnia zmiana: Czerwiec 10, 2010, 10:38:20 wysłana przez władek.kwaśnicki »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 10, 2010, 11:10:28
Można pisać st, st(1)? nie musi być st(0), st(1)?
Wszystko zależy od kompilatora.


EDIT:
Cytuj
prawdopodobnie należy użyć
jnc, które skacze jeśli flaga CF nie jest ustawiona, czyli  st(0)>=st(i)
Dla czytelności lepszy będzie zestaw JA, JB, JE, JNA, JNB, JNE - Jump if (Not) Above/Below/Equal (który w praktyce jest po prostu innymi nazwami tych samych instrukcji).
« Ostatnia zmiana: Czerwiec 10, 2010, 11:12:45 wysłana przez Krzysiek K. »

Offline Icy Tower

  • Użytkownik

# Czerwiec 11, 2010, 01:56:46
Dzięki za odpowiedzi. Po 3 godzinach szukania wpadłem na przyczynę o 3:45 w nocy. Najistotniejsze jest to co napisał władek.kwaśnicki.

Spodziewałem się, że fcomip ustawi flage znaku, a ona zamiast tego ustawiała flagę przeniesienia (carry). Po uwzględnieniu tego, wszystko zaczęło działać.