Mam pytanie dotyczące wyjątków EXCEPTION_INT_OVERFLOW i EXCEPTION_INT_DIVIDE_BY_ZERO.Win32 EXCEPTION_INT_OVERFLOW vs EXCEPTION_INT_DIVIDE_BY_ZERO
Windows przechwyci błędy #DE wygenerowane przez instrukcję IDIV i zakończy się generowaniem wyjątków SEH i jednym z tych dwóch kodów.
Mam pytanie, w jaki sposób rozróżnia się te dwa warunki? Informacje o idiv w podręczniku Intela wskazują, że wygeneruje #DE zarówno w "dzieleniu przez zero", jak i "przypadkach niedopełnienia".
Rzuciłem okiem na sekcję o błędzie #DE w tomie 3 podręcznika intel, a najlepsze, co mogłem zebrać, to to, że OS musi dekodować instrukcję DIV, ładując argument dzielnika, a następnie porównując to do zera.
Wydaje mi się to jednak trochę szalone. Dlaczego projektanci chipów nie używają jakiejś flagi do rozróżnienia dwóch przyczyn błędu? Czuję, że muszę czegoś przegapić.
Czy ktoś wie na pewno, w jaki sposób OS rozróżnia dwie różne przyczyny niepowodzenia?
Czy posiadasz dokumentację wskazującą, że 'IDIV' może wytworzyć' EXCEPTION_INT_OVERFLOW'? Rozumiem, że 'INT_MIN/-1' jest problematyczne, ale opis' EXCEPTION_INT_OVERFLOW' nie zawiera tego przypadku. –
@Ben zweryfikowałem to eksperymentalnie. Kiedy wykonuję INT_MIN/-1, instrukcja IDIV powoduje EXCEPTION_INT_OVERFLOW, a kiedy robię INT_MIN/0 otrzymuję EXCEPTION_INT_DIVIDE_BY_ZERO. W obu przypadkach wyjątek jest generowany po próbie wykonania instrukcji IDIV. –
@Scotta: Hmmm ... Dokumentacja MSDN nie działa. Nie chodzi o to, że jest w tym coś niezwykłego. –