四、算术运算类指令 1、概述 ①算术运算类指令都是通过算术逻辑运算单元ALU进行数据运 算处理的指令,包括加、减、乘、除四则运算。使用的助记符为: ADD、ADDC、INC、DA、SUBB、DEC、MUL、DIV等八种。 ②执行结果影响进位标志(Cy)、辅助进位(Ac)、溢出标志(OV)及 奇偶标志(P)。加1和减1指令不影响这些标志。 程序状态字寄存器PSW为标志寄存器。其格式如下: Cy AC FO RS1 RSO 0V-P☐ 1)Cy:进位标志位 保存运算后最高位的进位/借位状态,当有进位/借位,Cy=1,否 则Cy=0。 2)AC:辅助进位标志位 保存低半字节的进位/借位状态,当D3产生进位/借位,AC=1, 否则AC=O。用于十进制调整。 3)OV:溢出标志, ①无符号数相加时,若Cy=1,则产生溢出(和大于255): ②带符号数相加时,最高位是符号位(0正,1负),A为8位 剩余7位,能表示128个数,所以8位带符号的数为(一128—127), 所以Or=C6©C7(C6表示第6位向第7位有进位),产生溢出0V=1, 否则0V=0. 4)P:奇偶标志位反映累加器A中数据的奇偶性。当1的个数 为奇数,P=1,否则P=0
5)F0:用户自定义标志位。 6)RS1、RS0: 工作寄存器区选择位。复位时,PSW=0O州 2、加法指令 ADD A,Rn :(A)+(Rn)→(A) ADD A,direct ;(A)+(direct)→(A) ADD A,@Ri :(A)+(Ri)→(A) ADD A,#data ;(A)+data→(A) 源操作数:Rn、direct、@Ri或立即数。 目的操作数:累加器A。 功能:将工作寄存器Rn、片内RAM单元中的内容、间接地址存 储器中的8位无符号二进制数及立即数与累加器A中的内容相加,相 加的结果仍存放在A中。 例:设(A)=C3H,(RO)=AAH 执行指令:ADDA,RO 11000011B +10101010B 01101101B 执行结果:(A)=6DH,(CY)=1,(OV)=1,(AC)=0。 第六位无进位而第七位有进位,故0V=1,即出现二个负数相加, 结果为正数的错误。 3、带进位加法指令 ADDC A,Rn ;(A)-(A)+(Rn)+(CY) ADDC A,direct (A)-(A)+(direct)+(CY)
ADDC A,@Ri (A)-(A)+((Ri))+(CY) ADDC A,data ;(A)-(A)+#data+(CY) 源操作数:Rn、direct、@Ri或立即数。 目的操作数:累加器A。 功能:将工作寄存器Rn、片内RAM单元中的内容、间接地址存 储器中的8位无符号二进制数及立即数与累加器A的内容和当前进位 标志CY的内容相加,相加的结果仍存放在A中。执行结果影响进位 标志(Cy)、辅助进位(Ac)、溢出标志(OV)及奇偶标志(P)。 用途:这组指令常用于多字节数相加,实现8的倍数位(如16位、 32位)数的加法,这样,数可以扩展到26=65536个,扩大了数的范围, 高位相加时考虑低位的进位。用法除考虑Cy之外,其余与ADD一样。 Cy是下一位进上来的,在计算的末尾。 例:设(A)=C3H,(R0)=AAH,(CY)=1。 执行指令:ADDC A,RO 11000011 10101010 1(CY) 01101110 执行结果: (A)=6EH,(CY)=1,(OV)=1,(AC)=0。 对于带符号数的带进位相加,溢出标志为1,意味着出错,上 例为二个负数相加,出现结果为正数的错误。 4、带借位减法指令
SUBB A,Rn :(A)-(Rn)-(CY)→(A) SUBB A,direct ;(A)-(direct)-(CY)-(A) SUBB A,@Ri ;(A)-(Ri)-(CY)→(A) SUBB A,#dala :(A)-data-(CY)→(A) 功能: 1、从A中减去进位位CY和指定的变量,结果(差)存入A中。 2、若第7位有借位则CY置1,否则CY清0:若第3位有借位, 则AC置1,否则AC清0。 3、若第7位和第6位中有一位需借位而另一位不借位,则0V置 1:OV位用于带符号的整数减法。OV=1,则表示正数减负数结果为 负数,或负数减正数结果为正数的错误结果。 例:设(A)=0C9H,(R2)=54,(CY)=1。 执行指令:SUBB A,R2 11001001 -0101 0100 0000 0001 01110100 执行结果: (A)=74H,(CY)=0,(AC)=0,(0V)=1。 5、增量(加1)指令 INC Rn (Rn)-(Rn)+1 INC direct (direct)-(direct)+1 INC @Ri: (Ri))←(Ri)+1
INC A (A)←(A)+1 INC DPTR (DPTR)←(DPTR)+1 功能:将工作寄存器R、片内RAM单元中的内容、间接地址存 储器中的8位无符号二进制数、累加器A和数据指针DPTR等存储空 间的内容加1,相加的结果仍存放在原单元中。这类指令不影响各个 标志位。 6、减1指令 DEC Rn;(Rn)-→(Rn) DEC direct (direct)-1-(direct) DEC @Ri:(Ri)-1→(Ri) DECA;(A)-1→(A) 功能:与减1指令相反。(存储空间的内容减1) 7、二-十进制码(BCD码)调整指令 DA A BCD(Binary Coded Decimal)码是用4位二进制码来表示一个 十进制数,BCD码只是一种表示形式,与其数值没有关系。BCD码有 很多种(8521、5421、2421、余3码、格雷码等)下图为8421一BCD 码 十进0123456789 二进0000 0000010101011010 制码00011011000110110001 BCD码与二进制码的区别:
(0101001)0m=(59)。(权值8421,每4位一组) (01011001)2=(79)0(权值2,=0,1,2,3,4,5….) 功能:DAA跟在BCD码加法后面,将A中的二进制码(相加时 按二进制计算,但本身是BCD码不是普通的二进制数)由硬件自动调 整为8421一BCD码,用于实现BCD码的加法运算(与加法结合)。 用法:DAA指令只能跟在ADD或ADDC加法指令后,不适用于 减法。 十进制加法指令: ADDA,源操作数 DA A 带进位十进制加法指令: ADDC A,源操作数 DA A 调整规则:调整的实质是将十六进制的加法运算转换成十进制, 具体操作为: ①若累加器A的低4位大于9(A一F),或者辅助进位位AC=1, 则累加器A的内容加06H(A←(A)+06H),且将AC置“1”。 ②若累加器A的高4位大于9(A一F),或进位位Cy=1,则累 加器A的内容加60H(A←(A)+60H),且将Cy置“1”。 所以:总共可能的加数为06(低满),60H(高满),66H(高低 满) 调整后,辅助进位位AC表示十进数中个位向十位的进位,进位 标志Cy表示十位向百位的进位
例:(A)=01010110=56BCD, (R3)=01100111=67BCD,(CY)=1: 执行下述二条指令:ADDC A,R3 DA A 执行ADDC A,R3 (A)01010110(56BCD) (R3)01100111(67BCD) 十 (CY) 1 10111110(高、低四位均大于9) 执行DAA +01100110(加66H的BCD码) Cy=100100100(得到124BCD) 即BCD码数56+67+1=124。经DAA指令校正后,答案 正确 8、乘法和除法指令 格式:MLAB; a×b=ba(两8位相乘得16位积,b存高8位,a存低8位) DIV A B;a÷b=a…b(a存商,b存余数) 【注意 ①这是MCS-51单片机唯一的一类单字节4周期指令,它相当于 4条加法指令的运行时间。 ②在乘法指令中对PSW的影响有Cy、OV、和P。具体如下: 0V表明积的大小,当积超过255(B≠0)时,0V=1:P取决于A中 “1”的个数:Cy→0(Cy总是清0):
③在除法指令中,若B=0时OV=1,表示除数=0除法无意义,其 余情况下OV被复位;Cy、P与乘法相同。在执行除法指令时。 逻辑运算指令 包括:与、或、异或、清除、求反、移位等操作。 1、单操作数指令(A累加器为操作数) 1)A清0指令: CLR AA+0 2)A取反指令: CPL A ;A-/A 3)循环移位指令: ①8位循环指令: A,←—A0 RLA;A循环左移一位 RRA;A循环右移一位 A→0 ②9位循环指令: RLC A: 带Cy循环左移一位 RRCA:带Cy循环右移一位 2、双操作数逻辑运算指令(对位逻辑运算): ANL(与)、ORL(或)、XRL(异或) 1)以A为中心的双操作(结果放在A中) #data AL、 direct ORL @Ri XRL R 2)以直接地址为中心的双操作(结果放在直接地址中)
ANL ong d XRL J 例:P47的例子一P1,PSW是特殊功能寄存器,相当于direct。 六、控制转移类指令 作用:用于改变程序计数器P℃值,以控制程序走向,作用区域 是程序存储器空间。 分类:无条件转移指令、条件转移指令、循环转移指令、子程序 调用和返回指令及空操作指令等。 1、无条件转移指令 LJMP addr16: AJMIP addr11:SJMP rel:JMP @A十DPTR功能:程序无条件地转移到各自指定的目标地址去执 行 1)长转移指令LJMP addrle6:(PC)←addrle6(三字 节指令) 转移范围:64K字节(2=65536B=2×2°=64×1K=64KB≠65KB) 目标要求:addr16指定的64K程序存储器地址空间的任何地方。 2)绝对转移指令AJMP addr11:(PC)·(PC)+2,(PC100)- addr11(双字节指令) 转移范围:2K字节(2"=2×20=2×1KB=2KB) 月标地址:P℃的16位地址=P℃当前值高5位+指令中低11 位地址(addrl1)。 操作过程:先将P℃加2(使P℃指向下一条指令),然后把addrl1
送入PC10~PC0,PC15~PC11保持不变,程序转移到指定的地方。 目标要求:转移目标必须与AP下一条指令的第一个字节在同 一个2K字节范围内。(同一页面内) 注意:a、MCS-15的ROM系统是以2K为一页来划分程序存储器, 这样对于4K的片内ROM存储器可以分为2页:片外64K的ROM可以 分为32页。在执行AMP指令时,PC的高5位决定了ROM中的页地 址:而AJP指令的低11位地址用来选择页内地址. 页面(PC高5位) 页内地址 0页00000 0000H到07FFH 1页00001 O80OH到OFFFH 2页00010 10001到17FFH b、AJMP指令应当与目标地址在同一页内。更具体的说:目标地 址应当与AMP指令取出后的PC值(PC=PC+2)在同一页内。否则转 移将会出现错误