2015-08-08 99 views
1

IDIV文件(找到here)有这种怪异的行说:IDIV:检查边界

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

idiv的分红输入(连接rdx:rax)是输出和除数操作数的两倍宽。所以如果除数不够大,结果很容易失效。

虽然这很少发生在实践中。使用cltq(AT & T助记符),又称cdq/cqo(英特尔/ NASM助记符)将rax简单地签名扩展为rdx是很常见的,所以这通常不会出现。 128b股息投入只会出现在高精度的情况下。 (编译器当然更喜欢使用64位64位操作数的128乘64位,以便轻松支持除数不适合32位的情况,32位和16位操作数也是如此,这可能会出现在32位处理器中的int64_t/int32_t,模式,编译器会知道升级后的32位变量在32位上面是全零的,可以直接做一个idiv,除非结果不符合32b ......)

Intel insn ref manual(请参阅x86标记wiki中的链接)注释:“溢出用#DE(除错)异常而不是用CF标志指示。” IDK为什么做出这样的选择,而不是仅仅通过零或其他东西来划分错误。