3.3算术运算指令•3.3.1加法、减法指令•3.3.2乘法、除法指令•3.3.3加1、减1指令•3.3.4十进制调整指令•3.3.5算术运算类指令应用实例3.3.1加法、减法指令1.不带进位的加法指令汇编指令格式机器指令格式操作ADDA,Rn28H~2FHA←(A)+(Rn)ADDA,direct25HdirectA←(A)+(direct)ADDA,@Ri26H~27HA←(A)+((Ri))ADDA,#data24HdataA←(A)+#data注意:当和的第3位或第7位有进位时,分别将AC、CY标志位置1;否则为0。如果第6位向第7位有进位而第7位没有向前进位,或者如果第7位向前有进位而第6位没有向第7位进位,OV=1,否则OV=0。该操作也影响标志位P。@RidirectRnACC#dataADDA,RnADDA,@RiADDA,directADDA,#data【例3-10】已知累加器A的内容为E7H,(30H)=97H,则指出执行指令ADDA,30H后的结果和各标志位的状态。解:11100111B+10010111B1(Cy)01111110B执行后,A=7EH,Cy=1,AC=0,P=0,OV=1。3.3.1加法、减法指令2.带进位加法指令汇编指令格式机器指令格式操作ADDCA,Rn38H~3FHA←(A)+(Rn)+CYADDCA,direct35HdirectA←(A)+(direct)+CYADDCA,@Ri36H~37HA←(A)+((Ri))+CYADDCA,#data34HdataA←(A)+#data+CY注意:本指令的执行将影响标志位AC、CY、OV、P,与ADD指令相同。ADDC与ADD指令的区别就是相加时再加上Cy,其余功能一样。@RidirectRnACC#dataADDCA,RnADDCA,@RiADDCA,directADDCA,#data【例3-11】已知累加器A的内容为A7H,R0=30H,(30H)=5BH,Cy=1,则指出执行指令ADDCA,@R0后的结果和各标志位的状态。解:10100111B01011011B+1Cy1(Cy)00000011B执行后,A=03H,Cy=1,AC=1,P=0,OV=0。3.3.1加法、减法指令3.带借位减法指令汇编指令格式机器指令格式操作SUBBA,Rn98H~9FHA←(A)-CY-(Rn)SUBBA,direct95HdirectA←(A)-CY-(direct)SUBBA,@Ri96H~97HA←(A)-CY-((Ri))SUBBA,#data94HdataA←(A)-CY-#data注意:减法指令都是带进位位减法。执行不带借位的运算时,可在“SUBB”指令前用“CLRC”指令将CY清0。如果第7位有借位,则CY置1,否则清0。若第3位有借位,则AC置1;否则清0。两个带符号数相减,还要考查OV标志,若OV为1,表示差数溢出,即破坏了正确结果的符号位。该操作也影响标志位P。@RidirectRnACC#dataSUBBA,RnSUBBA,@RiSUBBA,directSUBBA,#data【例3-12】已知累加器A=A7H,R0=58H,Cy=0,则指出执行指令SUBBA,R0后的结果和各标志位的状态。解:10100111B-01011000B-0Cy0(Cy)01001111B执行后,A=4FH,Cy=0,AC=1,P=1,OV=1。说明:(1)当加、减法运算结果的最高位有进位或有借位时,Cy=1,否则Cy=0。(2)当加、减法运算时,低4位向高4位有进位或者借位时,AC=1,否则AC=0。(3)在加、减法过程中,D6和D7未同时产生进位或者借位时,OV=1,否则OV=0。(4)当运算结果A中“1”的个数为奇数时,P=1,否则P=0。(5)在加、减法指令中,其目的操作数只能是累加器A。【例3-13】编写计算12A4H+0FE7H的程序,将结果存入内部RAM41H和40H单元,40H存低8位,41H存高8位。解:单片机指令系统中只提供了8位的加减法运算指令,两个16位数(双字节)相加可分为两步进行,第一步先对低8位相加,第二步再对高8位相加。高8位低8位12A4H①A4H+E7H=8BH进位1+0FE7H②12H+0FH+1=22H228BH进位1②①加法指令ADDCADD程序如下:PLUS:MOVA,#0A4H;被加数低8位→AADDA,#0E7H;加数低8位E7H与之相加,A=8BH,Cy=1MOV40H,A;A→(40H),存低8位结果MOVA,#12H;被加数高8位→AADDCA,#0FH;加数高8位+A+CY,A=22HMOV41H,A;存高8位运算结果RET3.3.2乘法、除法指令1.乘法指令汇编指令格式机器指令格式操作MULABA4HBA←(A)×(B)说明:①将累加器A的内容与寄存器B的内容相乘,乘积的低8位存放在累加器A中,高8位存放于寄存器B中。②如果乘积超过0FFH,则溢出标志OV置“1”,否则清“0”。进位标志Cy总是被清“0”。2.除法指令汇编指令格式机器指令格式操作DIVAB84HA←(A)÷(B)的商,B←(A)÷(B)的余数注意:若除数(B)=00H,则结果无法确定,则OV置1。CY总是被清0。该操作说明:①将累加器A中的内容除以寄存器B中的8位无符号整数,所得商的整数部分存放在累加器A中,余数存放在寄存器B中,进位标志Cy和溢出标志OV清“0”。②若原来B(除数)中的内容为0,则执行该指令后A与B中的内容不确定,并将溢出标志OV置“1”,在任何情况下,进位标志Cy总是被清“0”。【例3-15】已知A=50H,R0=0A0H,(50H)=34H,指出每条指令执行后相应单元内容的变化。MOVB,R0;R0→B,B=0A0HMULAB;A×B→BA,50H×0A0H=3200H,则B=32H,A=00HMOVA,50H;(50H)→A;A=34HDIVAB;(A/B)商→A,余数→B;(34H)/(32H),商A=01H,余数B=02H3.3.3加1、减1指令1.加1指令汇编指令格式机器指令格式操作INCA04HA←(A)+1INCRn08H~0FHRn←(Rn)+1INCdirect05Hdirectdirect←(direct)+1INC@Ri06H~07H(Ri)←((Ri))+lINCDPTRA3HDPTR←(DPTR)+1注意:该操作不影响PSW标志位。3.3.3加1、减1指令2.减1指令汇编指令格式机器指令格式操作DECA14HA←(A)-1DECRn18H~1FHRn←(Rn)-lDECdirect15Hdirectdirect←(direct)-1DEC@Ri16H~17H(Ri)←((Ri))-1注意:该操作不影响PSW标志位。说明:①加1、减1指令在涉及A时,会影响P标志位,其他情况不会影响任何标志位。②无16位减1指令,即无DECDPTR指令,使用时请注意。【例3-14】已知A=00H,R0=50H,(50H)=0FFH,指出每条指令执行后相应单元内容的变化。DECA;A-1→A,A=0FFHINC@R0;(R0)+1→(R0),(50H)=00HINCR0;R0+1→R0,R0=51HDEC50H;(50H)-1→50H,(50H)=0FFH3.3.4十进制调整指令汇编指令格式机器码格式操作DAAD4H调整累加器A内容为BCD码注意:这条指令一般跟在ADD或ADDC指令后,将相加后存放在累加器中的结果进行十进制调整,完成十进制加法运算功能(不能用于十进制减法的调整)。调整方法如下:若(A0-3)9或AC=1,则(A0-3)+6→A0-3若(A4-7)9或CY=1,则(A4-7)+6→A4-7该操作影响标志位P。3.3.5算术运算类指令应用实例【例13】有两个BCD码表示的4位十进制数,分别存放在内部数据存储器的50H~51H单元和60H~61H单元,试编写程序求这两个数之和,并将结果存放在40H~42H单元。解:求两个BCD数之和的运算程序如下:MOVA,50H;取第一个数低2位BCD码ADDA,60H;加第二个数低2位BCD码DAA;十进制调整MOV40H,A;保存结果的低2位MOVA,51H;取高位BCD码ADDCA,61H;高位相加DAA;十进制调整MOV41H,A;保存结果的高2位MOVA,#00HADDCA,#00H;计算进位MOV42H,A;保存进位3.3.5算术运算类指令应用实例【例14】试编程计算5678H-1234H的值,结果保存在R6、R5中。解:减数和被减数都是16位二进制数,计算时要先进行低8位的减法,然后再进行高8位的减法,在进行低8位减法时,不需要考虑借位,所以要在减法指令之前将借位标志清0。程序如下:MOVA,#78H;被减数低8位送累加器CLRC;清进位标志位CYSUBBA,#34H;减去减数MOVR5,A;保存低8位MOVA,#56H;被减数高8位送累加器SUBBA,#12H;减去减数MOVR6,A;保存高8位3.3.5算术运算类指令应用实例【例15】试分析执行下列指令以后,寄存器和内部RAM的状态。MOVR0,#30H;数30H送入R0MOV30H,#40H;数40H送入片内RAM30H单元MOV31H,#50H;数50H送入片内RAM31H单元INC@R0;将片内RAM30H单元中的内容加1INCR0;将R0中的内容加1INC@R0;将片内RAM31H单元中的内容加1解:分析结果:(R0)=31H(30H)=41H(31H)=51H