Jiw*_*won 5 x86 assembly division integer-division signed-integer
在 intel 指令中,idiv(integer divsion) 表示有符号除法。
我得到了 的结果idiv,但我不太明白结果。
- 例子
0xffff0000 idiv 0xffff1100
Run Code Online (Sandbox Code Playgroud)
- 我的错误预测
据我所知,quotient应该是 0,并且remainder应该是 0xffff0000 并且因为...
0xffff0000 / 0xffff1100 = 0
0xffff0000 % 0xffff1100 = 0xffff0000
Run Code Online (Sandbox Code Playgroud)
——然而,结果却是……
之前idiv
eax 0xffff0000 # dividend
esi 0xffff1100 # divisor
edx 0x0
Run Code Online (Sandbox Code Playgroud)
后 idiv
eax 0xfffeedcc # quotient
edx 0x7400 29696 # remainder
Run Code Online (Sandbox Code Playgroud)
- 问题。
结果是我无法预料的价值。
有人可以解释一下签名除法(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
Run Code Online (Sandbox Code Playgroud)
您应该cdq在使用 idiv 之前使用将扩展 eax 签名为 edx ,而不是通过将 EDX 归零来进行零扩展。
但是,这仍然不会给出您期望的结果,因为 -65536 除以 -61184 等于 1,余数为 -4352。
(负被除数和正除数会产生负余数:余数的X86 IDIV 符号取决于 8/-3 和 -8/3 的被除数符号?)