我正在使用运行时调试器。
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都是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符号或无符号都可以正常工作;单操作数的结果mul仅imul在上半部分(in EDX)不同,而在低半部分EAX输出不同。