2 votes

Pourquoi IDIV avec -1 provoque-t-il une exception en virgule flottante ?

D'après ce que j'ai compris, idiv %ebx divisera edx:eax (concaténés en une valeur de 64 bits, dans cet ordre) avec des valeurs de 32 bits. ebx .

Cependant, lorsque j'essaie de diviser 0x00000000:0xfffffffb (0 et -5) avec 0xffffffff (-1), j'obtiens une exception de virgule flottante.

Quelqu'un peut-il expliquer pourquoi ? Je suis assez perplexe quant à la raison pour laquelle cela se produit, car je ne divise pas par 0 après tout.


Note que je sais que je dois signer pour prolonger edx:eax pour réaliser ce que je veux, c'est-à-dire calculer -5/-1 . Cependant, même sans extension de signe, le dessous devrait pas causer un FPE.

gdb screenshot

4voto

Martin Rosenau Points 2145

Notez que je sais que je dois signer pour prolonger edx:eax ...

Si vous ne signez pas l'extension eax , edx:eax est interprété comme un nombre signé de 64 bits :

Dans votre cas, ce serait 0x00000000fffffb, soit 4294967291 (et non -5).

div y idiv provoquera une exception dans deux cas :

  • Vous divisez par zéro
  • Le résultat de la division n'est pas dans l'intervalle qui peut être représenté par la fonction eax enregistrez

eax peut contenir des nombres signés compris entre -2147483648 et +2147483647, mais -4294967291 se situe en dehors de cette plage. Vous obtiendrez une exception.

ne devrait pas provoquer de FPE.

En effet, div y idiv provoquera une "exception de division d'entier", et non une "exception de virgule flottante".

Cependant, de nombreux systèmes d'exploitation afficheront le message "exception en virgule flottante" ; POSIX définit SIGFPE comme couvrant toute exception arithmétique.

2voto

user1857492 Points 532

Comme je cherchais un moyen d'étendre la signature edx:eax Alors que j'attendais une réponse à cette question, j'ai accidentellement trouvé la réponse moi-même.

Comme indiqué dans cette réponse Il s'avère que FPE (floating-point exception) est levée sur toutes les erreurs de division, y compris lorsque le quotient de la division déborde. Le lien vers la réponse indique également qu'en général, seules les exceptions -1 provoque le dépassement de ce quotient.

La solution consiste à étendre le signe avec cdq au lieu de mettre à zéro %edx .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X