Assembly IDIV:检查边界

Assembly IDIV:检查边界,assembly,x86,division,Assembly,X86,Division,IDIV文档(found)有一行奇怪的文字,上面写着: if(Temporary > 0x7FFFFFFF || Temporary < 0x80000000) Exception(DE); //f a positive result is greater than 7FFFFFFFH or a negative result is less than 80000000H if(临时>0x7FFFFFFF | |临时64位除法,以便轻松支持除数不适合32位的情况。对于32位和16位

IDIV
文档(found)有一行奇怪的文字,上面写着:

if(Temporary > 0x7FFFFFFF || Temporary < 0x80000000) Exception(DE); //f a positive result is greater than 7FFFFFFFH or a negative result is less than 80000000H
if(临时>0x7FFFFFFF | |临时<0x8000000)异常(DE)//f阳性结果大于7FFFFFH或阴性结果小于80000000H
这个错误检查的目的到底是什么?如果我们执行0x80000000/-1之类的操作,它就会失败,但这似乎无法直观地解释为什么它会有用


特别要注意的是,对于找到的
IMUL
,情况并非如此。

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

然而,这在实践中很少发生。使用
cltq
(AT&T助记符),又称
cdq
/
cqo
(英特尔/NASM助记符),将
rax
扩展为
rdx
,这是很常见的,因此通常不会出现这种情况。128b股息输入仅在扩展精度情况下才会出现。(当然,编译器更喜欢对64位操作数使用128乘64->64位除法,以便轻松支持除数不适合32位的情况。对于32位和16位操作数也是如此。不过,对于32位模式下的
int64\t/int32\t
,编译器会知道升级后的32位变量在上32,并且可以直接执行单个
idiv
。除非结果不适合32b…)

英特尔的insn ref手册(请参阅x86标记维基中的链接)评论说,“溢出是用#DE(除法错误)异常而不是CF标志表示的。”IDK解释他们为什么做出这样的选择,而不是只在除法为零或其他情况下出错