IDIV:检查边界

时间:2015-08-08 09:45:26

标签: assembly x86 division

IDIV文档(找到here)有一个奇怪的说法:

if(Temporary > 0x7FFFFFFF || Temporary < 0x80000000) Exception(DE); //f a positive result is greater than 7FFFFFFFH or a negative result is less than 80000000H

这次错误检查到底是什么意思?如果我们执行像0x80000000 / -1这样的操作,它就会失败,但它似乎并不直观,为什么会这样做。

请特别注意,IMUL找到here时并非如此。

1 个答案:

答案 0 :(得分:1)

idiv的被除数输入(rdx:rax的串联)是输出和除数操作数的两倍。因此,如果除数不够大,结果很容易失败。

但这在实践中很少发生。通过rax(AT&amp; T助记符)简化将rdx签名扩展为cltq,通常为cdq / cqo(英特尔/ NASM助记符) ,所以这通常永远不会出现。 128b股息输入只会出现在扩展精度的情况下。 (编译器当然更喜欢使用128乘64 - > 64位除法用于64位操作数,以便轻松支持除数不适合32位的情况。类似于32位和16位操作数。这可能会出现{{1但是,在32位模式下,编译器会知道提升的32位变量在高位32中将全为零,并且可以直接执行单个int64_t / int32_t。除非结果不适合32b ...)

英特尔的insn参考手册(参见x86标签wiki中的链接)评论“溢出用#DE(除错误)例外而不是CF标志表示。” IDK为什么做出这样的选择,而不是只将零除错或错误。