16

我正在使用运行时调试器。

EAX:0000 0023 EDX:5555 5556

imul edx

EAX:aaaa aac2 EDX:0000 000b

我完全糊涂了,不知道这个乘法是如何工作的。这里发生了什么事?我在这里的一个类似问题中注意到 imul ebx ; result in EDX:EAX我不理解 EDX:EAX 表示法:/

4

1 回答 1

38

当单操作数形式imul传递一个 32 位参数时,它实际上意味着源操作数和源操作数EAX * src都是EAX32 位寄存器或内存。

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

在你的情况下imul edx,你得到EDX:EAX = EAX * EDX. 显式源操作数可以是隐式操作数之一,甚至EAX可以平方成EDX:EAX.


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

imul ecx, esi确实ecx *= esi如您所愿,无需触摸EAXor EDX。就像 Cunsigned x=...; x *= y;一样,结果的宽度与输入的宽度相同。

imul还有一个直接形式:imul ecx, ebx, 1234does ecx = ebx * 1234。许多汇编程序会imul ecx, 1234接受imul ecx, ecx, 1234.


这些 32x32 => 32 位形式的有imul符号或无符号都可以正常工作;单操作数的结果mulimul在上半部分(in EDX)不同,而在低半部分EAX输出不同。

请参阅英特尔的指令参考手册条目以获取imul.

于 2010-09-29T04:41:35.790 回答