MUL,IMUL指令溢出

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,则说明所指定的目的寄存器可以容纳得下产生的结果;否则,说明结果太大,该寄存器容纳不下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值