13.2.2算术运算指令AX、DX寄存器乘除AX寄存器乘除AX、DX寄存器乘除AX寄存器乘除AX寄存器加减0~9非压缩型BCD数AX寄存器乘除AX寄存器加减0~99压缩型BCD数十进制所有的通用寄存器或存储器加减-32768~+3276716位带符号所有的通用寄存器或存储器加减-128~+1278位带符号所有的通用寄存器或存储器加减0~6553516位无符号所有的通用寄存器或存储器加减0~2558位无符号二进制可作累加器使用的寄存器或存储器运算数据范围数据类型1.算术运算的数据类型8086/8088有丰富的算术运算指令,而且可以处理4种类型的数据(无符号二进制数,有符号二进制数,非压缩型BCD数,压缩型BCD数),如下表所示:22.算术运算指令对标志位的影响对标志位有影响,不同的指令影响不同。规则:当无符号数运算产生溢出时,CF=1当有符号数运算产生溢出时,OF=1运算结果为零,ZF=1运算结果为负数,SF=1运算结果中有偶数个1,PF=13指令类型指令格式操作功能对标志的影响OSZAPC加法指令ADDdst,src(dst)←(dst)+(src)○○○○○○ADCdst,src(dst)←(dst)+(src)+(CF)○○○○○○INCdst(dst)←(dst)+1○○○○○△减法指令SUBdst,src(dst)←(dst)-(src)○○○○○○SBBdst,src(dst)←(dst)-(src)-(CF)○○○○○○DECdst(dst)←(dst)-1○○○○○△NEGdst(dst)←0-(src)○○○○○1CMPdst,src(dst)-(src)○○○○○○乘法指令MULsrc(AX)←(src)(AL)(DX:AX)←(src)(AX)○××××○IMULsrc(AX)←(src)(AL)(DX:AX)←(src)(AX)○××××○除法指令DIVsrc(AL)←(AX)/(src)的商(AH)←(AX)/(src)的余数(AX)←(DX:AX)/(src)的商(DX)←(DX:AX)/(src)的余数××××××IDIVsrc(AL)←(AX)/(src)的商(AH)←(AX)/(src)的余数(AX)←(DX:AX)/(src)的商(DX)←(DX:AX)/(src)的余数××××××4符号扩展指令CBW若(AL)80H,则(AH)←00H,否则(AH)←FFH△△△△△△CWD若(AX)8000H,则(DX)←0000H,否则(DX)←FFFFH△△△△△△十进制调整指令AAA非压缩型BCD码加法调整指令×××○×○DAA压缩型BCD码加法调整指令△○○○○○AAS非压缩型BCD码减法调整指令×××○×○DAS压缩型BCD码减法调整指令△○○○○○AAM非压缩型BCD码乘法调整指令×○○×○×AAD非压缩型BCD码除法调整指令×○○△○×8086/8088的算术运算指令共20条,除符号扩展指令(CBW,CWD)外,其余指令都影响状态标志位。53二进制数运算指令1)加法指令(1)不带进位加法指令格式:ADDdst,src功能:两个数相加,结果送dst(dst)=(dst)+(scr)说明:操作数可以是字节型,也可以是16位。源操作数可以使用立即数、寄存器操作数或存储器操作数,目的操作数可以使用寄存器操作数或存储器操作数,但不能是立即数。例如:ADDAX,3A5FH;ADDAX,[BX+1000H];ADD[BX+DI],AX;6(2)带进位加法指令格式:ADCdst,src功能:除了两个操作数相加外,再加上进位信号(将进位位加到最低位)。(dst)=(dst)+(src)+CF;CF是进位标志。例如:ADDCAX,BX;(AX)←(AX)+(BX)+CFADCAL,BL;(AL)←(AL)+(BL)+CFADCAX,0100H[BX];(AX)←(AX)+(0100H+BX)+CF7ADC指令的用途是可以进行多字节的加法运算。例如两个32位的数进行相加,第一个数存放在存储器中以符号地址DAT1开始的存储空间,第二个数存放在DAT2开始的存储空间。计算它们的和,并存放在DAT1。D0D15D16D31dstscr+dst--和低16位使用加法指令高16位使用带进位加法指令,低16位的进位信号一起加进来8开始SIDAT1DIDAT2AX[SI]AX(AX)+[DI][SI](AX)低十六位加法置地址AX[SI+2][SI+2](AX)AX(AX)+[DI+2]+CF结束高十六位用带进位加法两个字(32位)加法程序流程框图9程序代码LEASI,DAT1;地址SILEADI,DAT2;地址DIMOVAX,[SI];取低16位数据ADDAX,[DI];不带进位位的加法MOV[SI],AX;保存低16位结果MOVAX,[SI+2];取高16位ADCAX,[DI+2];(AX)=(SI+2)+(DI+2)+CFMOV[SI+2],AX;保存高16位结果……对于任意字长的数的加法,都可以这样进行。10这里我们没有判断溢出标志位OF,第一字节有进位或溢出,表明超过16位的表示范围,将进位信号加到高16位上,如果高16位出现溢出,需要看我们结果字长了:如果保留3个字长,则将进位再加到更高位上否则判断产生溢出错误。ADD,ADC指令影响标志位:CF,OF,ZF,SF,AF,PF11(3)加一指令格式INCdst功能将目标操作数的内容+1,再送回目标操作数。(dst)(dst)+1目的操作数可以使寄存器或存储器,但不能是立即数和段寄存器例如:INCCX;(CX)(CX)+1说明:INC指令影响标志位,但不影响标志CF。122)减法指令(1)不带借位的减法指令(1)格式:SUBdst,src(2)功能:(dst)(dst)–(src)对操作数的限制同加法指令ADD,ADC。例如:SUBAX,0200H;目的操作数寄存器,源操;作数为立即数SUBAX,BX;都是寄存器操作数SUBAL,BHSUB[DI+100H],BX;相对寻址……该指令影响标志位。此时的CF是借位标志位。13(2)带借位的减法指令格式:SBBdst,src功能:(dst)(dst)-(src)-CF它与减法指令SUB的区别在于还减去借位信号CF。它与带进位位的加法指令一样,用于做多字(字节)的减法。例如SBBAX,2100HSBBAL,BL对标志位的影响同SUB指令。14(3)减一指令格式:DECdst功能:(dst)(dst)-1例如:如果(AX)=1234H,执行DECAX后,(AX)=1233HDECWORDPTR[BP]对于堆栈区间BP指向的一个字内容-1。WORDPTR告诉编译程序,是字操作数。该指令影响标志位,但不影响CF。15(4)求补指令格式:NEGdst功能:执行(dst)0-(dst)的操作,可得到负数的绝对值。操作数可以8位,也可以是16位。注意:补码的定义。在编写程序时,要判断待求补的数据(原码),如果是正数(或0),补码就等于原码,如果是负数,则除符号位外,逐位取反+1。因此,将负数的符号位先取反(变为0),再使用NEG指令。16如果一个正数调用NEG指令,实际上求出的是它的机器负数。例如(AL)=14H,执行NEGAL后(AL)=0ECH-14H如果一个负数,如果不先保存符号位,使用NEG指令后,实际上变成了他的绝对值。例如:moval,0ech;(al)=-14hnegal;(al)=14h17(5)比较指令格式:CMPdst,src功能:做(dst)与(src)的比较,设置标志位。(实际上是进行(dst)–(src)运算,但不保存结果,只是改变标志位)该指令一般用于比较两个数的大小,依据比较结果进行程序的转移控制,使程序转到不同的分支。18标志位的状态判断比较结果ZF=1,则两个操作数相等对于两个无符号数,CF=0,则dstsrc,若CF=1,则dstsrc对于两个有符号数,需用SF和OF判断两个数同号,SF=0,则dstsrc,若SF=1,则dstsrc两个数异号,OF=SF,则dstsrc,否则dstsrc193)乘法指令(1)无符号数乘法指令格式:MULsrcsrc可以是字节数据,也可以是16位的字数据。功能:将原操作数与默认的目的操作数(AX或AL)相乘,结果保存在AX或DX,AX中。AL源操作数×ALAHAX源操作数AXDX×20•如果src是字节操作数,则(AX)(AL)×(src)例如:MULBL;(AX)(AL)×(BL)MULBYTEPTR[SI];(AX)(AL)×((SS)+(SI))SI所指存储单元内容•如果src是字操作数,则(DX,AX)(AX)×(src)其中,DX保存结果的高16位,AX保存结果的低16位。例如:MULBX;(DX,AX)(AX)×(BX)MULWORDPTR[DI+100H]•对标志位的影响:影响CF,OF.如果乘积的高半部分不为0,则CF=OF=1,否则CF=OF=0.21(2)带符号的乘法指令格式:IMULsrc功能:与MUL相同,仅两个数是带符号的数。对标志位的影响:同MUL,运算结果只影响状态标志CF、OF。224)除法指令8086/8088CPU执行除法时规定:除数只能是被除数的一半字长。当被除数为16位时,除数应为8位;当被除数为32位时,除数应为16位AL源操作数AHAX商余数8位16位被除数除数AXAXDXDX商余数16位32位除数被除数源操作数23当除数是字节数据时,被除数必须放在AX中;当除数是字数据时,被除数必须放在DX,AX中。即将DX看作是AX的扩展。除法指令运算结果对状态标志无定义。8086/8088规定IDIV指令运算结果余数的符号与被除数相同。带符号数除法运算中,当被除数位数不够时,需要进行带符号扩展。24(1)无符号数除法指令格式:DIVsrcsrc可以是字节数据,也可以是16位的字数据。功能:将两个无符号数做除法运算,商和余数分别保存在指定位置。①如果src是字节操作数,则被除数在AX,(AL)(AX)/(src)(商)(AH)余数例如:DIVBLDIVBYTEPTR[SI]25②如果src是字操作数,则被除数在寄存器对DX,AX中,DX为高16位,AX为低16位,作(DX,AX)/(src)运算,(AX)保存商,(DX)保存余数。例如:DIVBX;DIVWORDPTR[DI+100H]对标志位的影响:不产生有效标志位,即CF,AF,OF,SF,ZF都是不确定的。但当除数为零或很小时会产生类型号为0的中断。26(2)带符号除法指令格式:IDIVsrcsrc可以是字节数据,也可以是16位的字数据。功能:将两个带符号数做除法运算,商和余数分别保存在指定位置。其它与DIV指令相同。275)符号扩展指令对于无符号的数,只要将高位清0,对于带符号数的除法,将补码扩展,必须考虑符号。用符号扩展指令可以方便的进行扩展。扩展指令主要用于在除法指令前,将被除数扩展到所需要的字长。例如-47/5-47=10101111B,补码:11010001B(0D1H)MOVAL,0D1HMOVBL,05HCWB;带符号扩展为16位。IDIVBL28(1)字节扩展指令格式:CBW功能:把AL中的带符号数扩展为16为字长(符号位扩展到AH中)。例如(AL)=35H,(AH=0),执行CBW指令后,(AX)=0035H(AL)=84H(-60),则执行CWB指令后(AX)=0FF84H(-60)。29(4)字扩展指令格式:CWD功能:将AX中的符号位扩展到DX中。例如:(AX)=8FF3H,(DX)=0,执行CWD后(DX)=0FFFFH,(AX)=8FF3H304.十进制(BCD码)运算指令加法减法乘法除法AAAAASAAMAADDAADASAAA---ASCIIAdjustforAdditionDAA---DecimalAdjustforAdditio