imul汇编指令 - 一个操作数?

时间:2010-09-29 04:34:42

标签: assembly x86 multiplying

我正在使用运行时调试程序。

EAX:0000 0023 EDX:5555 5556

imul edx

EAX:aaaa aac2 EDX:0000 000b

我完全糊涂了,无法弄清楚这种倍增是如何起作用的。这里发生了什么事?我注意到类似的question here imul ebx ; result in EDX:EAX我不理解EDX:EAX表示法:/

1 个答案:

答案 0 :(得分:24)

imul的单操作数形式传递32位参数时(与EDX的情况一样),它实际上意味着EAX * EDX EAX和{ {1}}是32位寄存器。

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


如果您只想要结果的低32位,请使用EDX:EAX的2操作数形式;它运行得更快,没有任何隐式操作数(所以你可以使用最方便的寄存器)。

imul按照您的预期imul ecx, esi完成,而不会触及ecx *= esiEAX。它就像C,其中EDX unsigned x=...;的结果宽度与输入的宽度相同。

x *= y;也有即时形式:imul imul ecx, ebx, 1234。许多汇编程序会接受ecx = ebx * 1234作为imul ecx, 1234的简写。


这些32x32 => 32位形式的imul ecx, ecx, 1234可以正常用于签名或未签名;单操作数imulmul的结果仅在上半部分(imul中)不同,而不是低半部EDX输出。

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