2010-09-29 122 views
10

我正在使用运行时调试器。imul汇编指令 - 一个操作数?

EAX:0000 0023 EDX:5555 5556

imul edx 

EAX:AAAA AAC2 EDX:0000 000B

我心乱如麻,无法弄清楚如何乘工作。这里发生了什么事?我在一个类似的question hereimul ebx ; result in EDX:EAX注意到我不明白的EDX:EAX的符号,但:/

回答

21

imul的一个操作数形式传递一个32位的参数(如你的情况与EDX)这实际上意味着EAX * EDX其中EAXEDX都是32位寄存器。

两个32位值的乘积不一定适合32位:完整的乘法结果最多可能需要64位。答案的高32位将写入EDX寄存器,低32位写入EAX寄存器;这是用EDX:EAX表示法表示的。


如果只希望结果的低32位,使用的imul 2操作数形式;它运行得更快,并且没有任何隐式操作数(所以你可以使用任何最方便的寄存器)。

imul ecx, esi确实ecx *= esi像你期望的那样,没有触及EAXEDX。它就像C,其中unsigned x=...;x *= y;与输入的结果具有相同的宽度。

imul也有一个直接的形式:imul ecx, ebx, 1234确实ecx = ebx * 1234。对于imul ecx, ecx, 1234,许多汇编程序将接受imul ecx, 1234作为简写。


imul工作的32×32这些=> 32位的形式正确地对符号或无符号;一个操作数mulimul的结果仅在上半部分(EDX)中不同,而不是输出的低半部分EAX

请参阅Intel's instruction reference manual entry for imul

+0

当寄给'imul'的寄存器是'eax'时会发生什么?它仍然做同样的事情吗?如果你给它的东西不是'eax'或'edx',比如'eax'? – 2013-05-04 23:35:44

+2

imul指令有很多种形式。采用单个32位参数(内存或寄存器)的表单总是返回EDX:EAX对中的结果。 – 2013-05-05 12:38:35