【问题标题】:What is signed division(idiv) instruction?什么是有符号除法(idiv)指令?
【发布时间】:2019-01-02 03:41:36
【问题描述】:

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 中。

【问题讨论】:

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


【解决方案1】:

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 归零来进行零扩展。

但是,这仍然不会给出您期望的结果,因为 -65536 除以 -61184 等于 1,余数为 -4352。


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

【讨论】:

    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多