我正在使用运行时调试程序。
EAX:0000 0023 EDX:5555 5556
imul edx
EAX:aaaa aac2 EDX:0000 000b
我完全糊涂了,无法弄清楚这种倍增是如何起作用的。这里发生了什么事?我注意到类似的question here imul ebx ; result in EDX:EAX
我不理解EDX:EAX表示法:/
答案 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 *= esi
或EAX
。它就像C,其中EDX
unsigned x=...;
的结果宽度与输入的宽度相同。
x *= y;
也有即时形式:imul
imul ecx, ebx, 1234
。许多汇编程序会接受ecx = ebx * 1234
作为imul ecx, 1234
的简写。
这些32x32 => 32位形式的imul ecx, ecx, 1234
可以正常用于签名或未签名;单操作数imul
和mul
的结果仅在上半部分(imul
中)不同,而不是低半部EDX
输出。