为什么IDIV为-1会导致浮点异常?

acc*_*uck 2 x86 assembly gnu-assembler att

据我了解,idiv %ebx将除以edx:eax32 位(按顺序连接成 64 位值)ebx

但是,当我尝试将0x00000000:0xfffffffb(0 和 -5)除以0xffffffff(-1)时,出现浮点异常。

有人可以解释为什么吗?我很困惑为什么会发生这种情况,因为我毕竟没有除以 0。


请注意,我知道我需要签署扩展edx:eax才能实现我想要的,即计算-5/-1。然而,即使没有符号扩展,下面的内容也不会导致 FPE。

gdb 截图

Mar*_*nau 5

请注意,我知道我需要签署延期edx:eax...

如果不进行 sign-extend eaxedx:eax则被解释为 64 位有符号数:

在您的情况下,这将是 0x00000000fffffffb,即 4294967291 (而不是 -5)。

dividiv会在两种情况下引发异常:

  • 你除以零
  • 除法结果不在寄存器可以表示的范围eax

eax可以保存 -2147483648 到 +2147483647 范围内的有符号数,但 -4294967291 超出该范围。你会得到一个例外。

不应导致 FPE。

事实上,divandidiv会导致“整数除法异常”,而不是“浮点异常”。

然而,许多操作系统会显示“浮点异常”消息;POSIX 将 SIGFPE 定义为涵盖任何算术异常。