在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上。
答案 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?)