imul 指令有许多不同的变体。
您偶然发现的变体是 16 位乘法。它将 AX 寄存器与作为参数传递给 imul 的任何内容相乘,并将结果存储在 DX:AX 中。
一种 32 位变体的工作方式类似于 16 位乘法,但将寄存器写入 EDX:EAX。要使用此变体,您只需使用 32 位源操作数即可。
E.g:
; a 16 bit multiplication:
mov ax, [factor1]
mov bx, [factor2]
imul bx ; 32-bit result in DX:AX
; or imul word [factor2]
; a 32 bit multiplication:
mov eax, [factor1]
mov ebx, [factor2]
imul ebx ; 64-bit result in EDX:EAX
在 386 或更高版本上,您还可以编写imul以两个操作数的形式。这使得它更加灵活且更易于使用。在此变体中,您可以自由选择任意 2 个寄存器作为源和目标,CPU 不会浪费时间在任何地方写入高半结果。并且不会破坏 EDX。
mov ecx, [factor1]
imul ecx, [factor2] ; result in ecx, no other registers affected
imul ecx, ecx ; and square the result
或者使用有符号的 16 位输入来匹配您的imul
。 (对无符号输入使用 movzx)
movsx ecx, word [factor1]
movsx eax, word [factor2] ; sign-extend inputs to 32-bit
imul eax, ecx ; 32-bit multiply, result in EAX
imul eax, eax ; and square the result
imul 的这个变体是引入 386,并且有 16 位和 32 位操作数大小可供选择。 (以及 64 位模式下的 64 位操作数大小)。
在 32 位代码中,您始终可以假设 386 条指令,例如imul reg, reg/mem
可用,但如果您不关心较旧的 CPU,则可以在 16 位代码中使用它。
186 引入了 3 操作数立即数形式。
imul cx, bx, 123 ; requires 186
imul ecx, ebx, 123 ; requires 386