Assembly 什么是有符号分割(idiv)指令?

Assembly 什么是有符号分割(idiv)指令?,assembly,x86,division,integer-division,signed-integer,Assembly,X86,Division,Integer Division,Signed Integer,在英特尔指令中,idiv(整数除法)表示有符号除法。 我得到了idiv的结果,但我不太明白结果。 示例 0xffff0000 idiv 0xffff1100 -我的错误预测 据我所知,商应该是0,余数应该是0xffff0000,因为 0xffff0000 / 0xffff1100 = 0 0xffff0000 % 0xffff1100 = 0xffff0000 -然而,结果是… 在idiv之前 在idiv之后 -问题 结果是我无法预料的值。 有人能解释一下签名除法(idiv)

在英特尔指令中,idiv(整数除法)表示有符号除法。
我得到了idiv的结果,但我不太明白结果。

示例

0xffff0000 idiv 0xffff1100

-我的错误预测
据我所知,
应该是0,
余数
应该是0xffff0000,因为

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

-然而,结果是…
idiv之前

idiv之后


-问题
结果是我无法预料的值。
有人能解释一下签名除法(
idiv
)吗


-追加。 以下是有关
idiv
的更多信息
idiv
使用eax寄存器作为源寄存器。

作为执行的结果,商存储在eax,余数存储在edx

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



(负除数和正除数将产生负余数:)

您说“8086指令”,但使用的是“eax”和“edx”,它们不是8086寄存器。请澄清。还要注意,idiv指令使用(e)dx寄存器作为源寄存器,您没有指定源寄存器。@RaymondChen感谢您的建议。我编辑了我的问题以使其更清晰。@Jiwon-问题仍然没有显示idiv之前edx中的内容。您看过类似的内容吗?可能是重复的
eax            0xfffeedcc            # quotient
edx            0x7400   29696        # remainder
00000000ffff0000 = 4294901760
ffff1100 = -61184
fffeedcc = -70196
7400 = 29696