什么是带符号的除法(idiv)指令?
What is signed division(idiv) instruction?
在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。
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?)
在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。
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?)