汇编语言IMUL指令:有符号数乘法
原文链接:http://c.biancheng.net/view/3603.html,仅作记录,侵权必删!!!
单操作数格式
单操作数格式将乘积存放在 AX、DX:AX 或 EDX:EAX 中:
IMUL reg/mem8 ; AX = AL * reg/mem8 IMUL reg/meml6 ; DX:AX = AX * reg/meml6 IMUL reg/mem32 ; EDX:EAX = EAX * reg/mem32
双操作数格式(32位模式)
32 位模式中的双操作数 IMUL 指令把乘积存放在第一个操作数中,这个操作数必须是寄存器。第二个操作数(乘数)可以是寄存器、内存操作数和立 即数。16位格式如下所示:
IMUL regl6, reg/meml6 IMUL regl6, imm8 IMUL regl6, imml6
32 位操作数类型如下所示,乘数可以是 32 位寄存器、32 位内存操作数或立即数(8 位 或 32 位):
IMUL reg32, reg/mem32 IMUL reg32, inun8 IMUL reg32, imm32
三操作数格式
32 位模式下的三操作数格式将乘积保存在第一个操作数中。第二个操作数可以是 16 位寄存器或内存操作数,它与第三个操作数相乘,该操作数是一个8位或16 位立即数:
IMUL regl6, reg/meml6,imm8 IMUL regl6, reg/meml6, iirrnl6
而 32 位寄存器或内存操作数可以与 8 位或 32 位立即数相乘:
IMUL reg32, reg/mem32, imm8 IMUL reg32, reg/mem32, imm32
在 64 位模式下执行 IMUL
在 64 位模式下,IMUL 指令可以使用 64 位操作数。在单操作数格式中,64 位寄存器或内存操作数与 RAX 相乘,产生一个 128 位且符号扩展的乘积存放到 RDX:RAX 寄存器中。在下面的例子中,RBX 与 RAX 相乘,产生 128 位的乘积 -16。
mov rax, -4 mov rbx, 4 imul rbx ; RDX = 0FFFFFFFFFFFFFFFFh, RAX = -16
也就是说,十进制数 -16 在 RAX 中表示为十六进制 FFFF FFFF FFF0,而 RDX 只包含 TRAX 的高位扩展,即它的符号位。
三操作数格式也可以用于 64 位模式。如下例所示,被乘数 (-16) 乘以 4,生成 RAX 中的乘积 -64:
.data multiplicand QWORD -16 .code imul rax, multiplicand, 4 ; RAX = FFFFFFFFFFFFFFC0 (-64)
无符号乘法
由于有符号数和无符号数乘积的低半部分是相同的,因此双操作数和三操作数的 IMUL 指令也可以用于无符号乘法。但是这种做法也有一点不便的地方:进位标志位和溢出标志位将无法表示乘积的高半部分是否为零。