MUL
用途: 该指令完成两个无符号值的乘法运算。
语法结构/举例
mul regB|memB mul bl
mul regW|memW mul [aword]
仅80386有:
mul regDW|memDW mul ebx
示范代码
DATASEG
multiplicand dw 1024
multiplier dw 32
answer dw 0
CODESEG
mov ax,[multiplicand] ;将被乘数装入ax
mul [multiplier] ;dx:ax←ax*multiplier
jc Exit ;若结果超过16位则跳转
mov [answer],ax ;否则存储
描述:8086程序使用无符号乘法指令要比使用带符号乘法指令(见imul)简单得多。mul指令只有一个操作数,该操作数可以是一个通用寄存器,也可以是一个存储器操作数,它们表示乘数。乘数的长度决定着被乘数及结果的存放。若乘数为一个字节,则被乘数为al,结果存放在ax寄存器中;若乘数为一个字,则被乘数为ax中,结果存放在dx:ax中(ax中存放结果的低位部分);若乘数为一个双字(仅80386有),则被乘数放在eax中,结果存放在edx:eax中(eax存放结果的低32位部分)。这样可以保证目的寄存器不可能发生溢出。
mul指令运行之后,of和cf标志位可以用来决定结果的长度。若结果的长度超过了源操作数的长度,则这两个标志都将被置1,否则,这两个标志将被清零。这样,若mul bl语句运行之后cf=0,则ah为0,且8位结果存放在al中;若该语句运行之后cf=1,则说明结果占据了32的双字寄存器dx:ax。如范例中所示,用户可以在mul语句之后自行测试cf(或of)的值来检查结果是否大于源操作数的长度。
-------------------------
IMUL
用途:完成两个带符号数的乘法操作。
语法结构/举例
imul regB|memB imul [byte bx]
imul regW|memW imul cx
仅80286、80386有:
imul regW|immB imul cx,9
imul regW|immW imul bx,451
imul regW,regW|memW,immW imul cx,[word bx],3
imul regW,regW|memW,immW imul ax,bx,300
仅80386有:
imul regDW|memDW imul [dword bx]
imul regDW,immB imul ebx,10
imul regDW,immDW imul eax,32769
imul regW,regW|memW imul bx,cx
imul regDW,regDW|memDW imul ecx,[dword bx]
imul regDW,regDW|memDW,immB imul eax,edx,12
imul regDW,regDW|memDW,immDW imul eax,[dword bx],35790
示范代码
mov al,4 ;被乘数
mov bl,-2 ;乘数
imul bl ;ax←al*bl
;(ax=0FFF8h,cf=of=0)
mov al,127 ;被乘数
mov bl,-128 ;乘数
imul bl ;ax←al*bl
;(ax=0C080h,cf-of=1)
描述:根据所使用处理器的不同,imul指令有三种基本格式,所带操作数为1~3个。其中有些格式需要显式地指定寄存器。其最简单的格式就是通过al寄存器完成一个字节寄存器或变量的乘运算,并将结果存放在ax寄存器中;与之相似的另一种格式就是用ax完成对一个字寄存器或变量的乘法,并将结果放在dx:ax中(低字放在ax中);对于80386处理器,imul指令还可以通过eax完成对一个双字寄存器或变量的乘法,并将结果放在edx:eax中。对于上述三种格式,若imul指令执行之后cf和of都为0,则高字节(字或双字)部分只是其低字节(字或双字)部分的符号扩展。也就是说,如范例中的第一部分所示,4*-2将把ax设置成0FFF8h。因为cf和of都为0,因此,指令对al(0F8h)进行符号扩展形成16位的值。当cf和of都为1时(如范例中第二部分所示),结果将占用整个目的寄存器(范例中为ax,其值为二进制补码形式的0C080h,即十进制的-16,256,这是127*-128所得的结果)。
80286和80386处理器在上述指令的基础上扩充出imul指令的带乘法操作数的格式。在双操作数格式中,第一个操作数中存放被乘数;第二个操作数中是一个立即数——乘数(一个字节或字)。在三操作数格式中,第一个操作数指定了存放结果的目的寄存器,第二个寄存器中为被乘数,第三个操作数为一个立即数——乘法(一个字节或字)。未来的80386处理器还可以将这种格式扩展成为各种双字寄存器操作数,存储器操作数和立即值的组合形式。对于这些扩充格式,若在imul执行之后cf和af都为0,则说明所指定的目的寄存器可以容纳得下产生的结果;否则,说明结果太大,该寄存器容纳不下。
MUL,IMUL指令溢出
最新推荐文章于 2024-09-24 11:46:35 发布