gpt4 book ai didi

assembly - 什么是带符号除法(idiv)指令?

转载 作者:行者123 更新时间:2023-12-04 12:23:13 24 4
gpt4 key购买 nike

在 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

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


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

最佳答案

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

您应该使用 cdq 将扩展 eax 签名为 edx在使用 idiv 之前,而不是通过将 EDX 归零来进行零扩展。

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

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

关于assembly - 什么是带符号除法(idiv)指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54000965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com