什么是有符号除法(idiv)指令?

时间:2019-01-02 03:41:36

标签: assembly x86 division integer-division signed-integer

在intel指令中,idiv(integer divsion)表示带符号的除法。
我得到了idiv的结果,但是我不太理解结果。

-示例

0xffff0000 idiv 0xffff1100


-我的错误预测
据我所知,quotient应该为0,而remainder应该为0xffff0000,这是因为...

0xffff0000 / 0xffff1100 = 0  
0xffff0000 % 0xffff1100 = 0xffff0000  


-但是结果是...
idiv

之前
eax            0xffff0000            # dividend
esi            0xffff1100            # divisor
edx            0x0                     

idiv

之后
eax            0xfffeedcc            # quotient
edx            0x7400   29696        # remainder


-问题
结果就是我无法预期的价值。
有人可以解释一下签名除法(idiv)吗?


-附加。 这是有关idiv的更多信息。
idiv使用eax寄存器作为源寄存器。
  执行结果是商存储在eax上,余数存储在edx上。

1 个答案:

答案 0 :(得分:3)

idiv将edx:eax除以显式源操作数。请参阅英特尔的instruction manual entry

由于edx为0,所以edx:eax为正数。您将4294901760除以-61184,得到-70196,余数为29696。

请记住,除数(EDX:EAX)和除数(在您的情况下为ESI)都被解释为2的补码数字,因此任何设置了高位的位模式都为负。

00000000ffff0000 = 4294901760
ffff1100 = -61184
fffeedcc = -70196
7400 = 29696

在使用idiv之前,您应使用cdq将eax扩展到edx,而不是通过将EDX清零来扩展eax。

但是,这仍然无法提供您期望的结果,因为-65536除以-61184等于1,余数为-4352。


(负股息和正除数将得出负余数:X86 IDIV sign of remainder depends on sign of dividend for 8/-3 and -8/3?