汇编指令之算术指令

算术指令
    IBMPC机的算术运算指令包括二进制运算及十进制运算指令。算术指令用来执行算术运算,它们中有双操作数指令,也有单操作数指令。如前所述,双操作数指令的两个操作数中除源操作数为立即数的情况外,必须有一个操作数在寄存器中。单操作数指令不允许使用立即数方式。算术指令的寻址方式,均遵循这两个规则。

(一)加法指令
ADD     加法
ADC     带进位加法
INC      加1
1.ADD    加法指令
格式:    ADD    DST,SRC
执行的操作;(DST)〈一 (SRC)十(DST)
2.ADC    带进位加法指令
格式:    ADC    DST,SRC
执行的操作:(DST) 〈— (SRC)十(DST)十CF   (CF为进位位的值)。
3.INC    加1指令
    格式    INC    OPR
    执行的操作:(OPR)〈—  (OPR)十1
    以上三条指令都可以做字或字节运算,而且除INC指令不影响CF标志位外,它们都影响条件标志位。

下面介绍标志位的变化规则
 有进位时CF1,无进位时CF0OF位则根据操作数的符号及其变化情况来设置;若两个操作数的符号相同,而结果的符号与之相反时,OF=1;否则OF=0。溢出位OF既然是根据数的符号及其变化来设置的,当然它是用来表示带符号数的溢出的。

关于CF的使用:
    CF位可以用来表示无符号数的溢出。由于无符号数的最高有效位只是数字意义,而无符号怠义,所以从该位产生的进位应该是结果的实际进位值,但是在有限数位的范围内就说明了结果的溢出情况,另一方面,它所保存的进位值有时是有用的。例如,双字长数运算时,可以利用进位值把低位字的进位计入高位字中等。这可以根据不同情况在程序中加以处理。

OF位可以用来表示带符号数的溢出,CF位可以用来表示无符号数的溢出。

说明:因为OF表示的只是有符号数 即只有两个操作数符号相同,而结果的符号与之相反时,OF=1,即表示有符号数溢出。
CF是进位标志,如果不是上述的地位字的进位加到高位,即在有限的数位内如果无符号数相加结构进位了,则说明相加结构溢出。

(二)减法指令
SUB    减法
SBB    带借位减法
DEC    减1
NEG    求补
CMP    比较
1.SUB   减法指令
格式:    SUB    DST,SRC
执行的操作:(DST)〈一 (DST)-  (SRC)
2.SBB   带借位减法指令
格式:    SBB    DST, SRC
执行的操作;(DST) 〈一 (DST) - (SRC) - CF
其中CF为进位位的值。
3。DEC  减1指令
  格式:    DEC    OPR
  执行的操作:(OPR)〈一 (OPR) - 1
4.NEG  求补指令
  格式:    NEG    OPR
  执行的操作:(OPR) 〈一  -(OPR)
亦即把操作数按位求反后末位十1,因而执行的操作也可表示为
    (OPR)〈— 0FFFFH - (OPR)十1
5.CMP    比较指令
   格式:    CMP  OPRl,OPR2    .
   执行的操作;(OPRl) - (OPR2)
   注意:CMP指令进行与SUB减法操作相似,但是不保存结果,它起到改变条件标志位的作用。
以上五种指令均可以进行字节或字运算,除DEC指令不影响CF标志外,它们都影响条件标志位。

减法运算的条件码情况与加法类似。CF位说明无符号数相减的溢出,同时它又确实是被减数的最高有效位向高位的借位值。OF位则说明带符号数的溢出。
当作为无符号数运算时,若减数>被减数,此时有借位则CF1,否则CF0
减法的OF位的设置方法为:若两个数的符号相反,而结果的符号与减数相同则OF1,除上述情况外OF0OF1说明带符号数的减法溢出,结果是错误的。

NEG指令的条件码设置情况:NEG指令的条件码按求补后的结果设置:只有当操作数为0时求补运算的结果使CF0,其它情况则均为1。所以只有当字节运算时对一128求补以及字运算时对一32768求补的情况下OF1,其它则均为0

例子:XY均为双精度数,它们分别存放在地址为XX2YY2的存储单元中,存放时,高位字在高地址中,低位字在低地址中。下列指令序列实现:X+Y

MOV AX,X
MOV DX,X+2
ADD AX,Y
ADC DX,Y+2;用ADC将进位的值也加上

(三)乘法指令

  MUL     无符号数乘法

  IMUL    带符号数乘法

1MUL   无符号数乘法指令

  格式:    MUL    SRC

  执行的操作:

    字节操作数:(AX) 〈一 (AL)*(SRC)

    字操作数:  (DXAX) 〈— (AX)*(SRC)

2IMUL  带符号数乘法指令

  格式;   IMUL  SRC

  执行的操作:与MUL相同,但必须是带符号数。而MUL是无符号数。

注意:

(1)       在乘法指令里,目的操作数必须是累加器,字运算为AX,字节运算为AL。两个8位相乘得到的16位乘机存放在AX中,两个16位数相乘得到的是32位乘积,存放在DXAX中,其中DX存放高字节,AX存放低字节。

(2)       指令中的源操作数可以使用除立即数方式以外的任一种寻址方式。

    MUL指令和IMUL指令的使用条件是由数的格式决定的。很明显(11111111b)*(11111111b)当把它看作无符号数时应为255d×255d=65025d;而把它看作带符号数时则为(1)×(1)1。因此必须根据所要相乘数的格式来决定选用哪一种指令。

乘法指令对除CFOF以外的条件码位无定义(注意:无定义的意义和不影响不同,无定义是指指令执行后这些条件码位的状态不定,而不影响则是指该指令的结果并不影响条件码,因而条件码应保持原状态不变)

(3)       对于MUL指令,如果乘积的高一半为0、即字节操作的(AH)或字操作的(DX)0,则CFOF均为0;否则(即字节操作时的(AH)或字操作时的(Dx)0)CFOF均为1。这样的条件码设置可以用来检查字节相乘的结果是字节还是字,或者可以检查字相乘的结果是字还是双字。

(4)       对于IMUL指令,如果乘积的高一半是低一半的符号扩展则CFOF均为0,否则就均为1

.    (AL)0B4H(BL)11H求执行指令

IMUL    BLMUL    BL 后的乘积值。

(AL)0B4H为无符号数的180D,带符号数的一76D

(BL) =11H为无符号数的17D,带符号数的17D

执行IMUL的结果为:  AX)=0FAF4H=-1292D

执行MUL 的结果为:   (AX)0BF4H3060D

CF = OF =1

(四)除法指令

    DIV     无符号数除法

    IDIV    带符号数除法

由于使用除法指令的需要,这里顺便介绍两条符号扩展指令

    CBW    字节转换为字

    CWD    字转换为双字

1DIV    无符号数除法指令

格式为:       DIV   SRC

执行的操作:

字节操作16位被除数在AX中,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中。表示为:

AL)〈— AX)/(SRC)的商

       (AH)〈一   (AX)(SRC)的余数

字操作32位被除数在DXAX中,其中DX为高位字;16位除数为源操作数,结果的16位商在AX中,16位的余数在DX中。表示为:

商和余数均为无符号数。

2IDIV   带符号数除法指令

格式:    IDIV    SRC

    执行的操作: DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号和被除数的符号相同。

注意:

(1)       除法指令的寻址方式与乘法指令相同。其目的操作数必须存放在AXDX中。

(2)       其源操作数可以用除立即数以外的任何寻址方式。

(3)       除法指令对所有条件码均无定义。

由于除法指令的字节操作要求被除数为16位,字操作要求被除数为32位,因此常常需要用符号扩展的办法取得除法指令所需要被除数的格式,为此需要进行如下符号扩展指令来实现符号扩展的功能:

3CBW字节转换为字指令

    格式.    CBW

    执行的操作:DL的内容符号扩展到AH

(AL)的最高有效位为1,则(AH)0FFH

4 CWD字转换为双字指令

    格式:    CWD

    执行的操作:AX的内容符号扩展到DX。即如(AX)的最高有效位为0,则(DX)0000H;如(AX)的最高有效位为l,则(DX)0FFFFH

    这两条指令都不影响条件码。

注意除法指令的溢出

除法要求字节操作时商为8位,字操作时商为16位。如果字节操作时,被除数的高8位绝对值 〉除数的绝对值;或字节操作时,被除数的高16位绝对值 〉除数的绝对值,这时商就会产生溢出(注意符号位的扩展造成,当有效位最高位为1时,进行无符号计算,容易出现溢出),这种溢出的处理由中断来进行处理,为了避免这种情况,必要时程序应该进行溢出判断及处理

例.   (AX)0400H(DL)0B4H

(AX)为无符号数的1024D,带符号数的十1024D

      (DL)为无符号数的180D 带符号数的一76D

执行    DIV    BL的结果是:

(AH) = 7CH 124D 余数

(AL)05H5D      

IDIV   BL的结果是:

(AH)24H36D    余数

(AL) 0F 3H-13D  

十进制调整指令

DAA    加法的十进制调整指令

    执行的操作:

    (AL)〈— 把从AL中的和调整到压缩的DCD格式,这条指令之前必须执行ADDADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存放在AL寄存器中。本指令的调整方法是;

    如果AF标志(辅助进位位)1,或者AL寄存器的低4传是十六进制的A – F,则AL寄存器内容加06H,且将AF位置入1

    如果CF标志为1,或者AL寄存器的高4位是十六进制的A – F,则AL寄存器内容加 60H,并将CF位置1

    DAA指令对OF标志无定义,但影响所有其它条件标志。

例.  ADD    ALBL

      DAA

如指令执行前,  (AL)28  (BL)68

28

0010  1000

68

0110  1000

+

1001  0000

 

执行ADD指令后(AL)90CF0AF1

执行DAA指令时.因AF1而做

(AL)〈一(AL)+06

(AL)96CF0AF=结果正确。

DAS   减法的十进制调整指令

    执行的操作:

    (AL)〈一 AL中的差调整到压缩的BCD格式。

这条指令之前必须执行SUBSBB指令,减法指令必须把两个BCD码相减、并把结果存放在AL寄存器中。本指令的调整方法是;

    如果AF标志为l,或者AL寄存器的低4位是十六进制的AF,则使AL寄存器的内容减去06H.并将AF位置1

    如果CF标志为1,或者AL寄存器的高4位是十六进制的AF,则使AL寄存器的内容减去60H,并将CF位置l

三、逻辑运算指令

AND     逻辑与

OR       逻辑或

NOT     逻辑非

XOR     异或

TEST     测试

 TEST    测试指令

    格式:    TEST    OPRlOPR2

    执行的操作;(OPR1) (OPR2)

注意:两个操作数相与的结果不保存,只根据其特征置条件码

(1)       以上五种指令中,NOT不允许使用立即数,其它4条指令除非源操作数是立即数,至少有一个操作数必须存放在寄存器中,另一个操作数则可以使用任意寻址方式。

(2)       它们对标志位的影响情况是:NOT指令不影响标志位,其它4种指令将使CFOF0AF位无定义,而SFZFPF则根据运算结果设置。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值