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。
请注意,我知道我需要签署延期
edx:eax...
如果不进行 sign-extend eax,edx:eax则被解释为 64 位有符号数:
在您的情况下,这将是 0x00000000fffffffb,即 4294967291 (而不是 -5)。
div并idiv会在两种情况下引发异常:
eax内eax可以保存 -2147483648 到 +2147483647 范围内的有符号数,但 -4294967291 超出该范围。你会得到一个例外。
不应导致 FPE。
事实上,divandidiv会导致“整数除法异常”,而不是“浮点异常”。
然而,许多操作系统会显示“浮点异常”消息;POSIX 将 SIGFPE 定义为涵盖任何算术异常。
| 归档时间: |
|
| 查看次数: |
1189 次 |
| 最近记录: |