1、第5讲 8051的指令系统,3.3.2 算术操作类指令 单字节的加、减、乘、除法指令,都是针对8位二进制无符号数。 执行的结果对Cy、Ac、OV 三种标志位有影响。 但增1和减1指令不影响上述标志。 1.加法指令 共有4条加法运算指令: ADD A, Rn ;(A)+(Rn)A,n=07 ADD A,direct ;(A)+(direct)A ADD A, Ri ;(A)+(Ri)A, i=0,1 ADD A, #data ; (A)+#dataA,一个加数总是来自累加器A,而另一个加数可由不同的寻址方式得到。结果总是放在A中。 使用加法指令时,要注意累加器A中的运算结果对各个标志位的影响:(
2、1) 如果位7有进位,则置“1”进位标志Cy,否则清“0”Cy(2) 如果位3有进位,置“1”辅助进位标志Ac,否则清“0”Ac(Ac为PSW寄存器中的一位)(3)如果位6有进位,而位7没有进位(正+正=负),或者位7有进位,而位6没有(负+负=正),则溢出标志位OV置“1”,否则清“0”OV。,溢出标志位OV的状态,只有在带符号数加法运算时才有意义。当两个带符号数相加时,OV=1,表示加法运算超出了累加器A所能表示的带符号数的有效范围 例 (A)=53H,(R0)=FCH,执行指令 ADD A,R0结果为: (A)=4FH,Cy=1,Ac=0,OV=0,P=1注意:上面的运算中,由于位6和位
3、7同时有进位,所以标志位OV=0。 例 (A)= 85H,(R0)=20H,(20H)=AFH,执行指令: ADD A,R0 结果为:(A)=34H,Cy=1,Ac=1,OV=1,P=1注意:由于位7有进位,而位6无进位,所以标志位OV=1,2.带进位加法指令标志位Cy参加运算,因此是三个数相加。共4条: ADDCA,Rn;(A)+(Rn)+CA,n=07 ADDCA,direct;(A)+(direct)+CA ADDCA,Ri ;(A)+(Ri)+CA,i=0,1 ADDCA,#data ;(A)+#data+CA 例:(A)=85H,(20H)=FFH,Cy=1,执行指令: ADDC A
4、,20H结果为:(A)=85H,Cy=1,Ac=1,OV=0,P=1 (A中1 的位数为奇数) 3.增1指令 5条增1指令: INC A,INC Rn ;n=07INC direct INC Ri ;i=0,1 INC DPTR 不影响PSW中的除P外的任何标志。 第5条指令INC DPTR,是16位数增1指令。指令首先对低8位指针DPL的内容执行加1的操作,当产生溢出时,就对DPH的内容进行加1操作,并不影响标志Cy的状态。 4.十进制调整指令 用于对BCD码十进制数加法运算结果的内容修正。 指令格式: DA A 两个BCD码按二进制相加之后,必须经本指令的调整 才能得到正确的压缩BCD码的
5、和数,二进制数的加法运算原则并不能适用于十进制数的加法运算,有时会产生错误结果。例如:(a)3+6=9 0011+0101=1001 运算结果正确(b)7+8=15 0111+1000=1111 运算结果不正确(c)9+8=17 1001+1000=00001 C=1 结果不正确二进制数加法指令不能完全适用于BCD码十进制数的加法运算,对结果作有条件的修正 十进制调整 出错原因和调整方法: BCD码只用了了其中的10个,6个没用到的编码。,(1010,1011,1100,1101,1110,1111)为无效码 凡结果进入或者跳过无效码编码区时,其结果就是错误的。调整的方法是把结果加6调整,即所
6、谓十进制调整修正。修正方法应是:(a)累加器低4位大于9或辅助进位位Ac=1,则进行低4位加6修正。(b)累加器高4位大于9或进位位Cy=1,则进行高4位加6修正。,具体是通过执行指令:DA A 来自动实现的 。例 (A)=56H,(R5)=67H,把它们看作为两个压缩的BCD数,进行BCD数的加法。执行指令: ADD A,R5 DA A 由于高、低4位分别大于9,所以要分别加6进行十进制调整对结果进行修正。结果为: (A)=23H,Cy=1 可见,56+67=123,结果是正确的。 5.带借位的减法指令 4条指令: SUBB A,Rn ; (A)-(Rn)- CyA,n=07 SUBB A,
7、direct ; (A)-(direct)- CyA,SUBB A,Ri;(A)-((Ri))- CyA, i=0,1 SUBB A,#data ;(A)-#data - CyA从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存在累加器A中。如果位7需借位则置“1” Cy,否则清“0”Cy; 如果位3需借位则置“1”Ac,否则清“0”Ac;如果位6需借位而位7不需要借位,或者位7需借位,位6不需借位,则置“1”溢出标志位OV,否则清“0”OV。例 (A)=C9H ,(R2)=54H,Cy=1,执行指令: SUBB A,R2 结果:(A)=74H,Cy=0,Ac=0,OV=1(位6向位7
8、借位),6减1指令 4条指令:DEC A;(A)-1ADEC Rn ;(Rn)-1Rn,n=07DEC direct;(direct)-1directDEC Ri ;(Ri)-1(Ri),i=0,1减1指令不影响标志位。 7乘法指令 MUL AB ;ABBA如果积大于255,则置“1”溢出标志位OV,8除法指令 DIV AB ;A/BA(商),余数B如果B的内容为“0”(即除数为“0”),则存放结果的A、B中的内容不定,并置“1”溢出标志位OV。3.3.3 逻辑运算指令1. 简单逻辑操作指令 (1) CLR A功能是累加器A清“0”。不影响Cy、Ac、OV等标志。 (2) CPL A功能是将累
9、加器A的内容按位逻辑取反,不影响标志。 2左环移指令 RL A,功能是累加器A的8位向左循环移位,位7循环移入位0,不影响标志。 3带进位左环移指令 RLC A功能是将累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy移入Acc.0,不影响其它标志。 4右环移指令 RR A功能是累加器A的内容向右环移一位,Acc.0移入Acc.7,不影响其它标志。 5带进位环移指令 RRC A这条指令的功能是累加器A的内容和进位标志Cy一起向右环移一位,Acc.0进入Cy,Cy移入Acc.7。,6累加器半字节交换指令 SWAP A将累加器A的高半字节(Acc.7Acc.4)和低半字
10、节(Acc.3Acc.0)互换。 例 (A)=0C5H,执行指令: SWAP A 结果:(A)=5CH,7逻辑与指令 ANL A,Rn ; (A)(Rn)A,n=07 ANL A,direct ; (A)(direct)A ANL A,#data ; (A)#dataA ANL A,Ri ; (A)((Ri))A,i=01 ANL direct,A ; (direct)(A)direct ANL direct,#data ; (direct)#datadirect例 (A)=07H,(R0)=0FDH,执行指令: ANL A,R0 结果:(A)=05H,8.逻辑或指令 ORL A,Rn ;(A
11、)(Rn)A ,n=07 ORL A,direct ;(A)(direct)A ORL A,#data ;(A) dataA ORL A,Ri ; (A)(Ri)A,i=0,1 ORL direct,A ;(direct)(A)direct ORL direct,#data;(direct)#datadirect 例 (P1)=05H,(A)=33H,执行指令 ORL P1,A结果:(P1)=37H,9逻辑异或指令 XRL A,Rn ;(A) (Rn)A XRL A,direct ;(A) (direct)A XRL A,Ri ;(A)((Ri))A ,i=0,1 XRL A,#data ;(
12、A)#dataA XRL direct,A ;(direct)(A)direct XRL direct,#data ;(direct) #data direct 例 (A)=90H,(R3)=73H 执行指令: XRL A,R3结果:(A)=E3H,3.3.4 控制转移类指令 1无条件转移指令 AJMP addrll 2K字节范围内的无条件跳转指令, 64K程序存储器空间分为32个区,每区2K字节,转移的目标地址必须与AJMP下一条指令的地址的高5位地址码A15-A11相同。 执行指令时,先PC加2,然后把addrll送入PC.10PC.0,PC.15PC.11保持不变,程序转移到目标地址。,
13、本指令是为能与MCS-48的JMP指令兼容而设的。 2.相对转移指令 SJMP rel rel是带符号的偏移字节数,其范围-128+127,负数表示反向转移,正数表示争相转移。实现的程序转移是双向的。在编写程序时,也可以直接写上要转向的目标地址标号就可以。例如: LOOP:MOV A,R6 SJMP LOOP 程序在汇编时,由汇编程序自动计算和填入偏移量。手工汇编时,偏移量rel的值则需程序设计人员自己计算。,3长跳转指令 LJMP addr16 指令执行时把指令的第二和第三字节分别装入PC的高位和低位字节中,无条件地转向addr16指出的目标地址。目标地址可以在64K程序存储器地址空间的任何
14、位置。 4间接跳转指令 JMP A+DPTR 由A中8位无符号数与DPTR的16位数内容之和来确定。以DPTR内容作为基址,A的内容作变址。给A赋予不同的值,即可实现程序的多分支转移。,5条件转移指令 规定的条件满足,则进行转移,条件不满足则顺序执行下条指令。 当条件满足时,把PC装入下一条指令的第一个字节地址,再把带符号的相对偏移量rel加到PC上,计算出目标地址。JZ rel;(PC)+2PC,如果(A)=0,则转移 (PC)+relPC;如果(A)0,则顺序执行。JNZ rel; (PC)+2PC,如果(A)0,则转移 (PC)+relPC; 如果(A)=0,则顺序执行。,6比较转移指令
15、CJNE A, direct, rel;CJNE A, #data, rel;CJNE Rn, #data, rel;CJNE Ri, #data, rel; 比较前面两个操作数的大小,如果它们的值不相等则转移。转移的目标地址为(PC)+3+relPC, 如果目标字节数(无符号整数)小于源字节数(无符号整数),则置进位标志位Cy,否则清“0”Cy。若两个操作数的值相等,则顺序执行。不影响操作数。,7循环转移指令 这是一组把减1与条件转移两种功能结合在一起的指令。共两条指令:DJNZ Rn,rel; (PC+2)PC,(Rn)-1 Rn,当(Rn) 0 时,则(PC) +relPC,否则结束循环
16、, 程序往下执行。DJNZ direct,rel 将源操作数(Rn或direct)减1,结果回送到Rn寄存器或direct中去。如果结果不为0则转移。允许把寄存器Rn或内部RAM的direct单元用作程序循环计数器。主要用于控制程序循环。以减1后是否为“0”作为转移条件,即可实现按次数控制循环。,例:利用DJNZ延时程序: MOV R7, #0FFH; LOOP2:MOV R6, #0FFH;LOOP1:NOP DJNZ R6,LOOP1; DJNZ R7,LOOP2;,8调用子程序指令 在程序设计中,有时因操作需要而反复执行某段程序,则这段程序能被公用,以减少程序编写和调试的工作量,于是引进
17、主程序和子程序的概念。通常把具有一定功能的公用程序段作为子程序,子程序的最后一条指令(1)短调用指令ACALL addr11 与AJMP指令相类似,是为了与MCS-48中的CALL指令兼容而设的。(2)长调用指令LCALL addr169子程序的返回指令RET,执行本指令时:(SP)PCH,然后(SP)-1SP(SP)PCL,然后(SP)-1SP功能是从堆栈中退出PC的高8位和低8位字节,把栈指针减2,从PC值开始继续执行程序。10中断返回指令RETI功能与RET指令相似,两指令不同之处,是本指令清除了中断响应时,被置“1”的MCS-51内部中断优先级寄存器的优先级状态。11空操作指令NOP,
18、3.3.5 位操作指令 1.数据位传送指令 MOV C,bit MOV bit,C 例 MOV C,06H ;(20H).6Cy06H是内部RAM 20H字节位6的位地址。 MOV P1.0,C ;CyP1.0 2位变量修改指令 CLR C;清“0”Cy CLR bit;清“0”bit位 CPL C;Cy求反,CPL bit ;bit位求反 SETB C ;置“1” Cy SETB bit ;置“1” bit位这组指令将操作数指出的位清“0”、求反、置“1”, 不影响其它标志。 例 CLR C ;0Cy CLR 27H ;0(24H).7位 CPL 08H ;(21H).0位 SETB P1.
19、7 ;1P1.7位 3位变量逻辑与指令 ANL C,bit ;bitCyCy ANL C,/bit; ;/bit CyCy,4位变量逻辑或指令 ORL C,bit ORL C,/bit 5条件转移类指令JC rel ;如果进位位Cy=1,则转移JNC rel ;如果进位位Cy=0,则转移JB bit,rel ;如果直接寻址位=1,则转移JNB bit,rel ;如果直接寻址位=0,则转移JBC bit,rel ;如果直接寻址位=1, 则转移,并清0直接寻址位,1、已知:R0=20H,试问8031执行如下指令后,累加器A、R7、20H、和21H单元中内容是什么?MOVA,#18H ;A= HMO
20、V R7,#28H;R7=HMOVR0,#38H;(20H)= HMOV21H,#48H;(21H)= H,2、已知:R1=32H,(30H)=AAH,(31H)=BBH,(32H)=CCH,试如下指令执行后累加器A、50H、R6、32H和P1口中内容是什么?MOVA,30H ;A= HMOV50H,A;(50H) = HMOV R6,#31H;R6=HMOVR1, 30H;(32H)= HMOVP1,#48H;(P1H)= H,3、已知: (40H)=11H、 (41H)=22H,R0=40H和R1=41H,试问如下指令执行后累加器A、40H、41H、42H单元中内容是什么?MOVA, R0 ;A= HMOV R1 ,A;(41H) = HMOV 42H, R1; (42H) =H,4、已知: 试编出把30H单元和40H单元内容进行交换的程序,5、MOV20H,#25H; (20H)= HMOV25H,#10H; (25H)= H MOVP1,#0CAH; (P1)= HMOV R0,#20H; (R0)= HMOVA, R0 ;A= HMOVR1,A;R1 = HMOV B, R1;B=HMOVR1, P1;(P1)= HMOVP3,P1;(P3)= H,