Tengo una pregunta acerca de las excepciones EXCEPTION_INT_OVERFLOW y EXCEPTION_INT_DIVIDE_BY_ZERO.Win32 EXCEPTION_INT_OVERFLOW frente a EXCEPTION_INT_DIVIDE_BY_ZERO
Windows interceptará los errores #DE generados por la instrucción IDIV y terminará generando y la excepción SEH con uno de esos 2 códigos.
La pregunta que tengo es ¿cómo se diferencia entre las dos condiciones? La información sobre idiv en el manual de Intel indica que generará #DE tanto en "divide por cero" como en "casos de subdesbordamiento".
Eché un vistazo rápido a la sección sobre el error #DE en el Volumen 3 del manual de Intel, y lo mejor que pude deducir es que el sistema operativo debe decodificar la instrucción DIV, cargar el argumento del divisor y luego comparar a cero
Eso me parece un poco loco. ¿Por qué los diseñadores de chips no usarían una bandera de algún tipo para diferenciar entre las 2 causas del error? Siento que debo estar perdiendo algo.
¿Alguien sabe con certeza cómo el SO diferencia entre las 2 causas diferentes de falla?
¿Tiene alguna documentación que indique que 'IDIV' incluso puede producir' EXCEPTION_INT_OVERFLOW'? Entiendo que 'INT_MIN/-1' es problemático, pero la descripción de' EXCEPTION_INT_OVERFLOW' no parece incluir este caso. –
@Ben Lo verifiqué experimentalmente. Cuando hago INT_MIN/-1, la instrucción IDIV da como resultado un EXCEPTION_INT_OVERFLOW, y cuando hago INT_MIN/0 obtengo EXCEPTION_INT_DIVIDE_BY_ZERO. En ambos casos, la excepción se produce después de intentar la ejecución de la instrucción IDIV. –
@Scott: Hmmm ... Falla la documentación de MSDN. No es que haya algo inusual en eso. –