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

8

在Intel指令集中,idiv(整数除法)表示有符号除法。
我得到了idiv的结果,但是对结果不太理解。

- 例子

0xffff0000 idiv 0xffff1100


- 我的错误预测
据我所知,应该是0,余数应该是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中。


你说“8086指令”,但是你使用的“eax”和“edx”并不是8086寄存器。请澄清一下。另外请注意,idiv指令使用(e)dx寄存器作为源寄存器,这一点你没有说明。 - Raymond Chen
@RaymondChen 谢谢您的建议。我编辑了我的问题以使其更加清晰。 - Jiwon
@Jiwon - 这个问题仍然没有展示idiv之前edx中的内容。 - rcgldr
1
你看过类似(idiv) IA-32汇编语言参考手册这样的东西吗? - David C. Rankin
可能是重复问题:汇编中的IDIV未能给出所需结果(NASM) - Raymond Chen
1个回答

9

idiv除法指令将edx:eax寄存器与显式源操作数相除。请参阅英特尔的指令手册

由于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清零来进行零扩展。
但是,即使如此,这仍然无法给出您期望的结果,因为-65536除以-61184等于1,余数为-4352。
(负被除数和正除数将给出负余数:X86 IDIV sign of remainder depends on sign of dividend for 8/-3 and -8/3?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接