我正在使用运行时调试器。imul汇编指令 - 一个操作数?
EAX:0000 0023 EDX:5555 5556
imul edx
EAX:AAAA AAC2 EDX:0000 000B
我心乱如麻,无法弄清楚如何乘工作。这里发生了什么事?我在一个类似的question here是imul ebx ; result in EDX:EAX
注意到我不明白的EDX:EAX的符号,但:/
我正在使用运行时调试器。imul汇编指令 - 一个操作数?
EAX:0000 0023 EDX:5555 5556
imul edx
EAX:AAAA AAC2 EDX:0000 000B
我心乱如麻,无法弄清楚如何乘工作。这里发生了什么事?我在一个类似的question here是imul ebx ; result in EDX:EAX
注意到我不明白的EDX:EAX的符号,但:/
当imul
的一个操作数形式传递一个32位的参数(如你的情况与EDX
)这实际上意味着EAX * EDX
其中EAX
和EDX
都是32位寄存器。
两个32位值的乘积不一定适合32位:完整的乘法结果最多可能需要64位。答案的高32位将写入EDX
寄存器,低32位写入EAX
寄存器;这是用EDX:EAX
表示法表示的。
如果只希望结果的低32位,使用的imul
2操作数形式;它运行得更快,并且没有任何隐式操作数(所以你可以使用任何最方便的寄存器)。
imul ecx, esi
确实ecx *= esi
像你期望的那样,没有触及EAX
或EDX
。它就像C,其中unsigned x=...;
x *= y;
与输入的结果具有相同的宽度。
imul
也有一个直接的形式:imul ecx, ebx, 1234
确实ecx = ebx * 1234
。对于imul ecx, ecx, 1234
,许多汇编程序将接受imul ecx, 1234
作为简写。
imul
工作的32×32这些=> 32位的形式正确地对符号或无符号;一个操作数mul
和imul
的结果仅在上半部分(EDX
)中不同,而不是输出的低半部分EAX
。
当寄给'imul'的寄存器是'eax'时会发生什么?它仍然做同样的事情吗?如果你给它的东西不是'eax'或'edx',比如'eax'? – 2013-05-04 23:35:44
imul指令有很多种形式。采用单个32位参数(内存或寄存器)的表单总是返回EDX:EAX对中的结果。 – 2013-05-05 12:38:35