我正在使用运行时调试器。
EAX:0000 0023 EDX:5555 5556
imul edx
EAX:aaaa aac2 EDX:0000 000b
我完全糊涂了,不知道这个乘法是如何工作的。这里发生了什么事?我在这里的一个类似问题中注意到 imul ebx ; result in EDX:EAX
我不理解 EDX:EAX 表示法:/
我正在使用运行时调试器。
EAX:0000 0023 EDX:5555 5556
imul edx
EAX:aaaa aac2 EDX:0000 000b
我完全糊涂了,不知道这个乘法是如何工作的。这里发生了什么事?我在这里的一个类似问题中注意到 imul ebx ; result in EDX:EAX
我不理解 EDX:EAX 表示法:/
当单操作数形式imul
传递一个 32 位参数时,它实际上意味着源操作数和源操作数EAX * src
都是EAX
32 位寄存器或内存。
两个 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
如您所愿,无需触摸EAX
or EDX
。就像 Cunsigned x=...;
x *= y;
一样,结果的宽度与输入的宽度相同。
imul
还有一个直接形式:imul ecx, ebx, 1234
does ecx = ebx * 1234
。许多汇编程序会imul ecx, 1234
接受imul ecx, ecx, 1234
.
这些 32x32 => 32 位形式的有imul
符号或无符号都可以正常工作;单操作数的结果mul
仅imul
在上半部分(in EDX
)不同,而在低半部分EAX
输出不同。