imul 有符号乘法,将被乘数与乘数均作为有符号数。
mul 无符号乘法,将被乘数及乘数均作为无符号数。
可以有三个操作数:imul eax,eax,0Ch
第3操作数是乘数,
第2操作数是被乘数,
运算结果放入第1操作数。
执行操作
IMUL al,r/m8 : AX <= AL * r/m
IMUL ax,r/m16 : DX:AX <= AX * r/m
IMUL eax,r/m32 : EDX:EAX <= EAX * r/m
IMUL r16,r/m16 : 字寄存器 <= 字寄存器 * r/m
IMUL r32,r/m32 : 双字寄存器 <= 双字寄存器 * r/m 双字
IMUL r16,r/m16,imm8 : 字寄存器 <= r/m16 * 符号扩展的立即数字节
IMUL r32,r/m32,imm8 : 双字寄存器 r/m32 * 符号扩展的立即数字节
IMUL r16,imm8 : 字寄存器 <= 字寄存器 * 符号扩展的立即数字节
IMUL r32,imm8 : 双字寄存器 <= 双字寄存器 * 符号扩展的立即数字节
IMUL r16,r/m16,imm16 : 字寄存器 <= r/m16 * 立即数字
IMUL r32,r/m32,imm32 : 双字寄存器 <= r/m32 *立即数双字
IMUL r16,imm16 : 字寄存器 <= r/m16 * 立即数字
IMUL r32,imm32 : 双字寄存器 <= r/m32 *立即数双字
根据操作数的数量,此指令有三种形式。
单操作数形式
此形式与 MUL 指令使用的形式完全相同。这里,源操作数(位于通用寄存器或内存位置)乘以 AL、AX 或 EAX 寄存器(取决于操作数大小)中的值,乘积分别存储到 AX、DX:AX 或 EDX:EAX 寄存器。
双操作数形式
三操作数形式
此种形式需要一个目标操作数(第一个操作数)与两个源操作数(第二个与第三个操作数)。这里,第一个源操作数(可以是通用寄存器或内存位置)乘以第二个源操作数(立即数)。乘积随后存储到目标操作数(通用寄存器)。
说明
标志位影响
有效位进位到结果的上半部分时,CF 与 OF 标志设置为 1。结果正好可以存储到结果的下半部分时,清除 CF 与 OF 标志。
无论操作数是否有符号,乘积的下半部分都相同,所以双操作数与三操作数形式也可以使用无符号操作数。不过,此时不能使用 CF 与 OF 标志确定结果的上半部分是否非零。
