1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第3章 8051指令系统,(,课时:12学时,),教学目的,指令和指令系统的概念与分类。,掌握指令的格式和寻址方式。,掌握数据传送、算术运算、逻辑运算、控制转移和位操作指令的功能和应用。,学习重点和难点,指令的寻址方式。,控制转移指令和位操作指令。,第3章 8051指令系统,3.1 汇编语言,3.2 数据传送指令,3.3 算术运算指令,3.4 逻辑操作指令,3.5 控制程序转移类指令,3.6 位操作类指令,本章小结,习题,3.1 汇编语言,3.1.1 指令系统分类,3.1.2 指令格式,3.1.3 寻址方
2、式,3.1.4 寻址空间及符号注释,3.1.1 指令系统分类,基本概念,指令,是CPU根据人的意图来执行某种操作的命令。指令常以其英文名称或者缩写形式作为助记符。,一台计算机所能执行的全部指令的集合称为这个CPU的,指令系统,。,采用助记符表示的指令称为,汇编语言,。,使用这种指令编写的程序称为,汇编语言程序,。,3.1.2 指令格式,8051汇编语言指令由,操作码,段和,操作数,字段两部分组成。,汇编语言指令格式,标号:操作码助记符 目的操作数,源操作数;注释,机器语言指令格式,双字节指令格式,操作码代码 操作数或者地址,三字节指令格式,操作码代码 操作数或地址,操作数或地址,3.1.3 寻
3、址方式,基本概念,寻址,就是寻找指令中操作数或操作数所在地址。,寻址方式,就是找到存放操作数的地址,并把操作数提取出来的方法,即寻找操作数或者是操作数地址的方法。,8051单片机寻址方式共有7种:,寄存器,寻址、,直接,寻址、,立即数,寻址、,寄存器间接,寻址、,变址,寻址、,相对,寻址和,位,寻址。,1.寄存器寻址,寄存器寻址就是操作数存放在寄存器中,指令中指定的寄存器的内容就是操作数。,在寄存器寻址方式中以符号名称来表示寄存器。,寄存器寻址方式的寻址范围包括:,通用工作寄存器,有4组共32个通用工作寄存器。,部分专用寄存器累加器,A,、,B,寄存器、,DPTR,寄存器。,2.直接寻址,直接
4、寻址方式就是在指令中直接给出操作数所在存储单元的地址。此时,指令中操作数部分是操作数所在地址。,直接寻址方式的寻址范围是内部RAM,具体包括:,片内RAM的128个单元,在指令中以直接地址给出。,特殊功能寄存器(,SFR,)既可使用它们的,地址,,也可使用它们的,名字,。,3.立即数寻址,立即数寻址就是操作数在指令中直接给出,或者说指令操作码后面立即给出一字节或两字节操作数。,指令中给出的操作数是立即数,立即数前加“,#,”号标志,以区别直接寻址中的直接地址。,16位立即数传送指令“MOV DPTR,#datal6”,其中,#data16,是一个16位立即数。,4.寄存器间接寻址,寄存器间接寻
5、址是把指定寄存器的内容作为操作数地址,该地址所指定的单元内容作为操作数。,为了区分寄存器寻址和寄存器间接寻址,在寄存器间接寻址中,所用到的寄存器的前面要加间接寻址符“,”。,寄存器,R0,、,R1,和数据指针,DPTR,可以作为间接寻址寄存器。,寄存器间接寻址示意图,例如:,寄存器R0内容为30H,片内RAM 30H单元的内容为45H。,解:,指令“,MOV A,R0,”的功能是将R0的内容30H传送给累加器A,指令执行结果是,累加器A中的内容为30H,。,指令“,MOV A,R0,”的功能是将R0的内容30H作为操作数的地址,根据这一地址找到内部RAM 30H单元,将其内容45H传送至累加器
6、A,指令执行结果是,累加器A中内容为45H,。,4.寄存器间接寻址,5.变址寻址(基址寄存器+变址寄存器间接寻址),变址寻址是以,DPTR,或者,PC,作为基址寄存器,其内容为,基地址,,以累加器,A,作为变址寄存器,其内容为,变址,,并将两个寄存器内容也就是基址和变址相加,形成16位操作数地址。然后在程序存储器中找到该地址所对应的单元,其内容即为操作数。,变址,寻址,示意图,例如:,指令“MOVC A,A+DPTR”是变址寻址。,解:假设DPTR的内容为2030H,累加器A的内容为12H。,该指令的功能是将2030H和12H相加,得到2042H作为操作数地址,在程序存储器中找到2042H单元
7、将其内容送至累加器A。,5.变址寻址(基址寄存器+变址寄存器间接寻址),6.相对寻址,相对转移指令执行时,是以当前的PC值加上指令中规定的偏移量rel而形成实际的转移地址。这里所说的,PC的当前值,是执行完相对转移指令后的PC值。,一般将相对转移指令操作码所在地址称为源地址,转移后的地址称为目的地址。于是有:,目的地址=源地址+相对转移指令本身字节数+rel,相对寻址只出现在相对转移指令中,以修正PC的方式来控制程序的转移目的。,相对转移指令操作示意图,例如:,在程序存储器中2000H单元有一条双字节的相对转移指令“SJMP 75H”。,解:程序存储器2000H、2001H单元的内容80H、
8、75H是“SJMP 75H”的机器语言代码。,6.相对寻址,7.位寻址,位寻址指令中给出的是位地址,即片内RAM某一单元中的一位。位地址在指令中用,bit,表示。,单片机片内RAM有两个区域可以进行位寻址。具体如下:,内部RAM中的位寻址区,该区共有16个单元,单元地址是20H2FH,一共有128位,位地址为007FH。,特殊功能寄存器的可操作位,有11个单元地址能被8整除的寄存器,它们都可以进行位寻址,实际可寻址位为83个。,可寻址位在指令中的表示方式,直接使用,位地址,。,例:PSW寄存器的第5位可表示为D5H。,20H单元的第7位可表示为07H。,用,位名称,表示。,例:PSW寄存器的第
9、5位可表示为F0。,单元地址加位号,表示。,例:PSW寄存器的第5位可表示为D0H.5。,20H单元的第7位可表示为20H.7。,可以用,寄存器名称加位号,表示。,例:PSW寄存器的第5位可表示为PSW.5。,3.1.4 寻址空间及符号注释,寻址方式,寻址空间,直接寻址,片内RAM低128字节和特殊功能寄存器(只能采用直接寻址),寄存器寻址,工作寄存器R0R7、A、B、DPTR,寄存器间接寻址,片内RAM低128字节(R0、R1、SP用于PUSH/POP指令时),片外RAM(R0、R1、DPTR),变址寻址,程序存储器,相对寻址,程序存储器(控制转移用),位寻址,片内RAM202FH单元的12
10、8个可寻址位和特殊功能寄存器中的83个可寻址位,寻址方式中常用符号注释,Rn(n=07),当前选中的工作寄存器组R0R7。它在片内数据存储器中的地址由PSW中的RSl和RS0确定,可以是00H07H(第0组)、08H0FH(第1组)、10H17H(第2组)或18H1FH(第3组)。,Ri(i=0,1),当前选中的工作寄存器组中可以用于寄存器间接寻址的的两个工作寄存器R0、R1。它在片内数据存储器中的地址由RSl、RS0确定,分别有01H,02H;08H,09H;10H,11H和18H,19H。,#data,8位立即数,即包含在指令中的8位操作数。,#data16,16位立即数,即包含在指令中的
11、16位操作数。,direct,8位片内RAM单元(包括SFR)的直接地址。,addr11,11位目的地址,用于ACALL和AJMP指令中。,addr16,16位目的地址,用于LCALL和LJMP指令中。,rel,补码形式的8位地址偏移量,以下条指令第一字节地址为基值。,地址偏移量在-128+127范围内。,bit,片内RAM或SFR的直接寻址位地址。,,间接寻址方式中,表示间接寻址的符号。,,位操作指令中,表示对该位先取反再参与操作,但不影响该位原值。,(X),某一个寄存器或者存储单元X中的内容。,(X),由X间接寻址的单元的内容,即X指向的地址单元中的内容。,,指令中数据的传送方向,将箭头右
12、边的内容送入箭头左边的单元。,3.2 数据传送指令,3.2.1 内部RAM数据传送指令,3.2.2 外部RAM传送指令,3.2.3 查表指令,3.2.4 交换指令,3.2.5 堆栈操作指令,3.2.6 数据传送类指令应用实例,3.2.1 内部RAM数据传送指令,内部RAM数据传送指令共有15条,用于8051单片机片内数据存储器和寄存器之间的数据传送。,采用的寻址方式有:,立即数寻址,直接寻址,寄存器寻址,寄存器间接寻址,数据传输形式如右图,所示。,3.2.1 内部RAM数据传送指令,1.以累加器A为目的操作数的指令,汇编指令格式 机器指令格式 操 作,MOV A,Rn,E8HEFH A (Rn
13、),MOV A,direct,E5H direct A (direct),MOV A,Ri,E6HE7H A (Ri),MOV A,#data,74H data A#data,注意:上述操作不影响源字节和任何别的寄存器内容,只影响PSW的P标志位。,3.2.1 内部RAM数据传送指令,2.以寄存器Rn为目的操作数的指令,汇编指令格式 机器指令格式 操 作,MOV Rn,A,F8HFFH Rn (A),MOV Rn,direct,A8HAFH direct Rn (direct),MOV Rn,#data,78H7FH data Rn#data,注意:8051指令系统中没有“MOV Rn,Ri”
14、和“MOV Rn,Rn”传送指令,也没有“MOV Ri,Ri”指令。,3.2.1 内部RAM数据传送指令,3.以直接地址为目的操作数的指令,汇编指令格式 机器指令格式 操作,MOV direct,A,F5H direct direct (A),MOV direct,Rn,88H8FH direct direct (Rn),MOV direct2,direct1,85H direct1 direct2 direct2 (direct1),MOV direct,Ri,86H87H direct direct (Ri),MOV direct,#data,75H direct data direct#
15、data,注意:“MOV direct2,direct1”指令在译成机器码时,源地址在前,目的地址在后。如“MOV 50H,90H”的机器码为“85 90 50”。,3.2.1 内部RAM数据传送指令,4.间接地址为目的操作数的指令,汇编指令格式 机器指令格式 操 作,MOV Ri,A,F6HF7H (Ri)(A),MOV Ri,direct,A6HA7H direct (Ri)(direct),MOV Ri,#data,76H77H data (Ri)data,注意:(Ri)表示以Ri中的内容为地址所指定的RAM单元。,5.十六位数据传送指令,汇编指令格式 机器指令格式 操 作,MOV DP
16、TR,#data16,90H dataH dataL DPH dataH,DPL dataL,注意:这是唯一的16位立即数传送指令。,3.2.2 外部RAM传送指令,汇编指令格式 机器指令格式 操 作,MOVX DPTR,A,F0H 外(DPTR)(A),MOVX A,DPTR,E0H A 外(DPTR),MOVX Ri,A,F2HF3H 外(Ri)(A),MOVX A,Ri,E2HE3H A 外(Ri),注意:8051没有专门的,输入/输出指令,在访问,外部的设备时,可以采用,这种方式与外部设备的端,口打交道。,3.2.3 查表指令,汇编指令格式 机器指令格式 操 作,MOVC A,A+DP
17、TR,93H PC (PC)+1,A (A)+(DPTR),MOVC A,A+PC,83H PC (PC)+1,A (A)+(PC),注意:前一条指令只能查,找指令所在位置以后256B,范围内的代码或常数,后,一条指令查表范围可达整,个程序存储器的64KB空间。,3.2.4 交换指令,1.字节交换指令,汇编指令格式 机器指令格式 操 作,XCH A,Rn,C8CFH (A),(Rn),XCH A,direct,C5H (A),(direct),XCH A,Ri,C6HC7H (A),(Ri),注意:该操作只影响标志位P。,2.半字节交换指令,汇编指令格式 机器指令格式 操 作,XCHD A,R
18、i,D6HD7H (A)03,(Ri)03,注意:该操作只影响标志位P。,3.2.4 交换指令,3.累加器半字节交换指令,汇编指令格式 机器码格式 操 作,SWAP A,C4H (A)03,(A)47,注意:该操作不影响标志位P。,3.2.5 堆栈操作指令,1.入栈指令,汇编指令格式 机器指令格式 操 作,PUSH direct,C0H direct SP (SP)+1,(SP)(direct),注意:堆栈指针SP先加1,并指向栈顶的上一个空单元,然后再将直接地址(direct)寻址的单元内容压入当前SP所指示的堆栈单元中。该操作不影响标志位P。,2.出栈指令,汇编指令格式 机器指令格式 操
19、作,POP direct,D0H direct direct (SP),SP (SP)-1,注意:先将堆栈指针(SP)所指示的内部RAM(栈顶)单元中内容送入由直接地址寻址的单元中,然后再将栈指针(SP)减1并回送SP。该操作不影响标志位P。,3.2.6 数据传送类指令应用实例,【例5】,使用不同的指令将累加器A的内容送至内部RAM的26H单元。,解:在访问内部RAM时,可以有多种寻址方式供选择,在实际应用中要注意根据实际情况选择合适的寻址方式来进行数据传送。可以通过下面指令采用不同寻址方式实现。,MOV26H,A,;目的操作数采用直接寻址,,源操作数采用寄存器寻址,MOVR0,#26H,MO
20、VR0,A,;目的操作数采用寄存器间接寻址,,源操作数采用寄存器寻址,MOV26H,ACC,;采用直接寻址,MOV26H,0E0H,;采用直接寻址,PUSH ACC,;利用栈操作,直接寻址,POP 26H,3.2.6 数据传送类指令应用实例,【例6】,已知(A)=23H,(R0)=30H,内部RAM(30H)=45H,(45H)=56H,试分析分别执行下列指令后累加器A的内容,并写出源操作数的寻址方式。,解:这四条指令代表了数据传送指令中常用的四种寻址方式,在使用时要特别注意不同寻址方式的区别,搞清楚谁是最终的操作数。要注意题中第一条指令与第二条指令、第三条与第四条指令的区别。,指令 结果寻址
21、方式,MOV A,R0,(A)=30H寄存器寻址,MOV A,R0,(A)=45H寄存器间接寻址,MOV A,45H,(A)=56H直接寻址,MOV A,#45H,(A)=45H立即数寻址,3.2.6 数据传送类指令应用实例,【例7】,将外部RAM 2000H单元的内容传送至外部RAM 3000H单元。,解:8051单片机指令系统中没有外部RAM两个单元直接传送数据的指令,只有外部RAM和累加器的传送指令,要想实现题目中要求的功能,必须通过累加器A进行。,具体程序如下:,MOVDPTR,#2000H,;送源数据地址,MOVXA,DPTR,;源数据送累加器,MOVDPTR,#3000H,;送数据
22、目的地址,MOVXDPTR,A,;累加器内容送目的单元,3.2.6 数据传送类指令应用实例,【例8】,(A)=20H,(B)=30H,分析执行下面指令以后的结果。,PUSH ACC,PUSH B,POP ACC,POP B,解:根据堆栈的“,先入后出、后入先出,”操作原则进行分析,执行上面指令以后结果为:,(A)=30H,(B)=20H,。,程序执行结果和初始状态比较,两寄存器内容进行了互换,正是由“先入后出”的存储原则造成的。,在子程序调用时,堆栈经常用来保护现场,利用PUSH保护现场,利用POP恢复现场。,恢复现场时,一定要注意POP指令的顺序要和PUSH指令对称,后压入的数据先弹出,先压
23、入的数据后弹出,使得现场正确恢复到原来状态。,3.2.6 数据传送类指令应用实例,【例9】,在程序存储器中有一平方表,从2000H单元开始存放,如图所示,试通过查表指令查找出6的平方。,解:采用DPTR作为基址寄存器的查表程序比较简单,查表范围大,也容易理解。只要预先使用一条16位数据传送指令,把表的首地址2000H送入DPTR,然后进行查表就可以了。,相应的程序如下:,MOV A,#6,;设定备查的表项,MOV DPTR,#2000H,;设置DPTR为表始址,MOVC A,A+DPTR,;将A的平方值查表后送A,如果需要查找其他数的平方,只需要将累加器A的内容(变址)改一下即可。,2000H
24、0,2001H,1,2002H,4,2003H,9,2004H,16,2005H,25,2006H,36,2007H,49,2008H,64,2009H,81,3.3 算术运算指令,3.3.1 加法、减法指令,3.3.2 乘法、除法指令,3.3.3 加1、减1指令,3.3.4 十进制调整指令,3.3.5 算术运算类指令应用实例,3.3.1 加法、减法指令,1.加法类指令,汇编指令格式 机器指令格式 操 作,ADD A,Rn,28H2FH A (A)+(Rn),ADD A,direct,25H direct A (A)+(direct),ADD A,Ri,26H27H A (A)+(Ri),A
25、DD A,#data,24H data A (A)+#data,注意:当和的第3位或第7位有进位时,分别将AC、CY标志位置1;否则为0。如果第6位向第7位有进位而第7位没有向前进位,或者如果第7位向前有进位而第6位没有向第7位进位,OV=1,否则OV=0。该操作也影响标志位P。,3.3.1 加法、减法指令,2.带进位加法指令,汇编指令格式 机器指令格式 操 作,ADDC A,Rn,38H3FH A (A)+(Rn)+CY,ADDC A,direct,35H direct A (A)+(direct)+CY,ADDC A,Ri,36H37H A (A)+(Ri)+CY,ADDC A,#data
26、34H data A (A)+#data+CY,注意:本指令的执行将影响标志位AC、CY、OV、P,与 ADD指令相同。,3.3.1 加法、减法指令,3.带借位减法指令,汇编指令格式 机器指令格式 操 作,SUBB A,Rn,98H9FH A (A)-CY-(Rn),SUBB A,direct,95H direct A (A)-CY-(direct),SUBB A,Ri,96H97H A (A)-CY-(Ri),SUBB A,#data,94H data A (A)-CY-#data,注意:在执行不带借位的运算时,可在“SUBB”指令前用“CLR C”指令将CY清0。如果第7位有借位,则CY
27、置1,否则清0。若第3位有借位,则AC置1;否则清0。两个带符号数相减,还要考查OV标志,若OV为1,表示差数溢出,即破坏了正确结果的符号位。该操作也影响标志位P。,3.3.2 乘法、除法指令,1.乘法指令,汇编指令格式 机器指令格式 操 作,MUL AB,A4H BA (A)(B),注意:若乘积大于0FFH,则OV置1,否则清0(此时B的内容为0)。CY总是被清0。该操作也影响标志位P。,2.除法指令,汇编指令格式 机器指令格式 操 作,DIV AB,84H A(A)(B)的商,B(A)(B)的余数,注意:若除数(B)=00H,则结果无法确定,则OV置1。CY总是被清0。该操作也影响标志位P
28、3.3.3 加1、减1指令,1.加1指令,汇编指令格式 机器指令格式 操 作,INC A,04H A (A)+1,INC Rn,08H0FH Rn (Rn)+1,INC direct,05H direct direct (direct)+1,INC Ri,06H07H (Ri)(Ri)+l,INC DPTR,A3H DPTR (DPTR)+1,注意:该操作不影响PSW标志位。,3.3.3 加1、减1指令,2.减1指令,汇编指令格式 机器指令格式 操 作,DEC A,14H A (A)-1,DEC Rn,18H1FH Rn (Rn)-l,DEC direct,15H direct direc
29、t (direct)-1,DEC Ri,16H17H (Ri)(Ri)-1,注意:该操作不影响PSW标志位。,3.3.4 十进制调整指令,汇编指令格式 机器码格式 操 作,DA A,D4H 调整累加器A内容为BCD码,注意:这条指令一般跟在ADD或ADDC指令后,将相加后存放在累加器中的结果进行十进制调整,完成十进制加法运算功能(不能用于十进制减法的调整)。调整方法如下:,若(A,0-3,)9或AC=1,则(A,0-3,)+6A,0-3,若(A,4-7,)9或CY=1,则(A,4-7,)+6A,4-7,该操作影响标志位P。,3.3.5 算术运算类指令应用实例,【例13】,有两个BCD码表示的4
30、位十进制数,分别存放在内部数据存储器的50H51H单元和60H61H单元,试编写程序求这两个数之和,并将结果存放在40H42H单元。,解:,求两个BCD数之和的运算程序如下:,MOV A,50H,;取第一个数低2位BCD码,ADD A,60H,;加第二个数低2位BCD码,DA A,;十进制调整,MOV 40H,A,;保存结果的低2位,MOV A,51H,;取高位BCD码,ADDC A,61H,;高位相加,DA A,;十进制调整,MOV 41H,A,;保存结果的高2位,MOV A,#00H,ADDC A,#00H,;计算进位,MOV 42H,A,;保存进位,3.3.5 算术运算类指令应用实例,【
31、例14】,试编程计算5678H1234H的值,结果保存在R6、R5中。,解:减数和被减数都是16位二进制数,计算时要先进行低8位的减法,然后再进行高8位的减法,在进行低8位减法时,不需要考虑借位,所以要在减法指令之前将借位标志清0。程序如下:,MOV A,#78H,;被减数低8位送累加器,CLR C,;清进位标志位CY,SUBB A,#34H,;减去减数,MOV R5,A,;保存低8位,MOV A,#56H,;被减数高8位送累加器,SUBB A,#12H,;减去减数,MOV R6,A,;保存高8位,3.3.5 算术运算类指令应用实例,【例15】,试分析执行下列指令以后,寄存器和内部RAM的状态
32、MOV R0,#30H,;数30H送入R0,MOV 30H,#40H,;数40H送入片内RAM 30H单元,MOV 31H,#50H,;数50H送入片内RAM 31H单元,INC R0,;将片内RAM 30H单元中的内容,加1,INC R0,;将R0中的内容加1,INC R0,;将片内RAM 31H单元中的内容,加1,解:分析结果:,(R0)=31H,(30H)=41H,(31H)=51H,3.4 逻辑操作指令,3.4.1 逻辑“与”、“或”、“异或”指令,3.4.2 清零、取反指令,3.4.3 循环移位指令,3.4.4 逻辑运算类指令应用实例,3.4.1 逻辑“与”、“或”、“异或”指令
33、1.逻辑“与”指令,汇编指令格式 机器指令格式 操 作,ANL A,Rn,58H5FH A (A)(Rn),ANL A,direce,55H direct A (A)(direct),ANL A,Ri,56H57H A (A)(Ri),ANL A,#data,54H data A (A)#data,ANL direct,A,52H direct direct (direct)(A),ANL direct,#data,53H direct data direct (direct)#data,注意:后2条指令若直接地址正好是I/O端口P0P3,则为端口的“读改写”操作。前4条指令的操作影响标志位
34、P。,3.4.1 逻辑“与”、“或”、“异或”指令,2.逻辑“或”指令,汇编指令格式 机器指令格式 操 作,ORL A,Rn,48H4FH A (A)(Rn),ORL A,direct,45H direct A (A)(direct),ORL A,Ri,46H47H A (A)(Ri),ORL A,#data,44H data A (A)#data,ORL direct,A,42H direct direct (direct)(A),ORL direct,#data,43H direct data direct (direct)#data,注意:后2条指令若直接地址正好是I/O端口P0P3,则
35、为端口的“读改写”操作。前4条指令的操作影响标志位P。,3.4.1 逻辑“与”、“或”、“异或”指令,3.逻辑“异或”指令,汇编指令格式 机器指令格式 操 作,XRL A,Rn,68H6FH A (A)(Rn),XRL A,direct,65H direct A (direct)(A),XRL A,Ri,66H67H A (A)(Ri),XRL A,#data,64H data A (A)#data,XRL direct,A,62H direct direct (direct)(A),XRL direct,#data,63H direct data direct (direct)#data,注
36、意:后2条指令若直接地址正好是I/O端口P0P3,则为端口的“读改写”操作。前4条指令的操作影响标志位P。,3.4.2 清零、取反指令,1.累加器A清0指令,汇编指令格式 机器指令格式 操 作,CLR A,E4H A 0,注意:该操作影响标志位P。,2.累加器A取反指令,汇编指令格式 机器指令格式 操 作,CPL A,F4H A (),对累加器A的内容逐位取反,不影响标志位。,注意:该操作不影响标志位P。,3.4.3 循环移位指令,1.累加器A循环左移指令,汇编指令格式 机器指令格式 操 作,RL A,23H,注意:该操作不影响PSW标志位。,2.累加器A循环右移指令,汇编指令格式 机器指令格
37、式 操 作,RR A,03H,注意:该操作不影响PSW标志位。,3.4.3 循环移位指令,3.累加器A带进位循环左移指令,汇编指令格式 机器指令格式 操 作,RLC A,33H,注意:该操作影响标志位P和CY。,4.累加器A带进位循环右移指令,汇编指令格式 机器指令格式 操 作,RRC A,23H,注意:该操作影响标志位P和CY。,3.4.4 逻辑运算类指令应用实例,【例16】,将P1口的P1.2、P1.3、P1.7清零,其余位不变。,解:相应的指令为:,ANL P1,#01110011B,【例17】,利用逻辑运算指令将P1口的P1.1、P1.3、P1.5置1,其余位保持不变。,解:相应的指令
38、为:,ORL P1,#00101010B,【例18】,利用逻辑运算指令,将内部RAM中40H单元的1、3、5、7位取反,其他位保持不变。,解:相应指令为:,XRL 40H,#0AAH,;0AAH=10101010B,3.4.4 逻辑运算类指令应用实例,【例19】,利用逻辑运算指令将当前工作寄存器设定为第3组工作寄存器。,解:相应指令为:,ORL PSW,#00011000B,【例20】,无符号8位二进制数(A)=00111101B=3DH,CY=0。试分析执行“RLC A”指令后累加器A的内容。,解:执行指令“RLC A”的结果为,(A)=01111010B=7AH,CY=0,7AH正是3DH
39、的2倍,该指令执行的是乘2操作。,3.4.4 逻辑运算类指令应用实例,【例21】,拆字程序:在内部RAM 40H单元保存有以压缩BCD码表示的2位十进制数,编程将它们拆开,分别保存在内部RAM的41H、42H单元。,解:程序如下:,MOV A,40H,;压缩BCD码送累加器,ANL A,#0FH,;高4位清0,保留低4位,MOV 41H,A,;保存低4位BCD码,MOV A,40H,;取数据,MOV A,#0F0H,;低4位清0,保留高4位,SWAP A,;高低位交换,MOV 42H,A,;保存高4位BCD码,3.5 控制程序转移类指令,3.5.1 无条件转移指令,3.5.2 条件转移指令,3
40、5.3 调用、返回指令,3.5.4 空操作指令,3.5.5 控制转移类指令应用实例,3.5.1 无条件转移指令,无条件转移指令是指当程序执行到该指令时,程序无条件转移到指令所提供的地址处执行。,无条件转移类指令有四类:,绝对转移,LJMP,长转移,AJMP,相对转移(短转移),SJMP,间接转移(散转指令),JMP,3.5.1 无条件转移指令,1.绝对转移指令,汇编指令格式 机器指令格式 操 作,AJMP addr11,a10a9a800001 a7a0 PC(PC)+2,PC100addrll,(PC1511)不变,注意:本条指令提供11,位地址,可在该指令后,面一个存储单元所在的,2KB
41、区域内无条件转移。,3.5.1 无条件转移指令,2.长转移指令,汇编指令格式 机器指令格式 操 作,LJMP addr16,02H addr16 PC addrl6,注意:本条指令提供16,位目的地址,所以程序,可转向64KB程序存储器,地址空间的任何单元。,3.5.1 无条件转移指令,3.相对转移(短转移)指令,汇编指令格式 机器指令格式 操 作,SJMP rel,80H rel PC (PC)+2,PC (PC)+rel,注意:本条指令的操作数是相对地址,rel是一个带符号的偏移量(补码),其范围为-128+127共256字节。负数表示反向转移,正数表示正向转移。,如果指令中偏移量rel=
42、FEH,因为FEH是-2的补码,所以转移目的地址=PC+2-2=PC,结果转向自己,导致无限循环。这条指令称为原地踏步指令,即程序执行到这条指令时,不再向下执行,而在该指令处原地踏步。,3.5.1 无条件转移指令,4.间接转移指令(散转指令),汇编指令格式 机器指令格式 操 作,JMP A+DPTR,73H PC (A)+(DPTR),注意:该指令采用的是变址寻址方式,指令执行过程对DPTR、A和标志位均无影响。这条指令可以根据累加器A的不同值实现多个方向的转移,可代替众多的判断跳转指令,具有散转功能,所以又称散转指令。,3.5.2 条件转移指令,条件转移指令是指根据给出的条件进行判断,,若,
43、条件满足,,则程序转向由偏移量确定的目的地址处去执行。,若,条件不满足,,程序将不会转移,而是按原顺序执行。,8051有丰富的条件转移指令。,3.5.2 条件转移指令,1.累加器判零转移指令,汇编指令格式 机器指令格式 操 作,JZ rel,60H rel PC (PC)+2,若A=0,则程序转移PC(PC)+rel,若A0,则程序往下顺序执行,JNZ rel,50H rel PC (PC)+2,若A0,则程序转移PC(PC)+rel,若A=0,则程序往下顺序执行,注意:相对偏移量为一个带符号的8位数,偏移范围为-128+127,共256个字节。本指令不改变累加器A的内容,也不影响任何标志位。
44、3.5.2 条件转移指令,2.比较转移指令,汇编指令格式 机器指令格式 操 作,CJNE A,direct,rel,B5H direct rel,累加器内容和直接寻址单元比较,CJNE A,#data,rel,B4H data rel,累加器和立即数比较,CJNE Rn,#data,rel,B6HB7H data rel,寄存器内容和立即数比较,CJNE Ri,#data,rel,B8HBFH data rel,间接寻址单元内容和立即,数比较,注意:若目的操作数=源操作数,程序顺序执行,CY=0;,若目的操作数源操作数,程序转移,PC(PC)+rel,并且CY=0;,若目的操作数源操作数,程
45、序转移,PC(PC)+rel,并且CY=1。本指令执行后不影响任何操作数。,3.5.2 条件转移指令,3.减1非0转移指令(循环转移指令),汇编指令格式 机器指令格式 操 作,DJNZ Rn,rel,D8HDFH rel PC (PC)+2,Rn (Rn)-1;,若(Rn)0,则程序转移 PC(PC)+rel;,若(Rn)=0,则程序往下顺序执行,DJNZ direct,rel,D5H direct relPC (PC)+3,direct (direct)-1,若(direct)0,则程序转移PC(PC)+rel;,若(direct)=0,则程序往下顺序执行,3.5.2 条件转移指令,3.减1
46、非0转移指令(循环转移指令),注意:在一般的应用中,经常把rel设为负值,使得程序负向跳转。通过改变指令中Rn或者direct单元的内容,就可以控制程序负向跳转的次数,也就控制了程序循环的次数,所以该指令又称为循环转移指令。,3.5.3 调用、返回指令,通常把具有一定功能的公用程序段作为,子程序,,在主程序中采用调用指令,调用子程序,,子程序的最后一条指令为,返回主程序,指令(RET)。,8051指令系统中有两条调用指令,分别是,绝对调用,和,长调用指令,。,主程序调用子程序及从子程序返回主程序的过程如右图所示。,3.5.3 调用、返回指令,1.绝对调用指令,汇编指令格式 机器指令格式 操 作
47、ACALL addr11,a10a9a810001 a7a0 PC (PC)+2,SP (SP)+1,(SP)(PC0PC7),SP (SP)+1,(SP)(PC8 PC 15),PC0PC10 addr010,PC11PC15不变,注意:本指令提供11位子程序目的地址,调用地址的形成方法和绝对转移指令类似;被调用的子程序首地址必须在ACALL指令后一字节所在的2KB范围内的程序存储器中。,3.5.3 调用、返回指令,2.长调用指令,汇编指令格式 机器指令格式 操 作,LCALL addr16,12H addr16 PC (PC)+3,SP (SP)+1,(SP)(PC0PC7),SP (S
48、P)+1,(SP)(PC8PC15),PC addr16,注意:本指令提供16位子程序目的地址,被调用的子程序首地址可设置在64KB程序存储器地址空间的任何位置。,3.5.3 调用、返回指令,3.返回指令,汇编指令格式 机器指令格式 操 作,RET,22H PC815 (SP),弹出断点高8位,SP (SP)-1,PC07 (SP),弹出断点低8位,SP (SP)-1,注意:本指令的作用是从子程序返回。当程序执行到本指令时,表示结束子程序的执行,返回调用指令(ACALL或LCALL)的下一条指令处(断点)继续往下执行。因此,它的主要操作是将栈顶的断点地址送PC,于是,子程序返回主程序继续执行。
49、3.5.3 调用、返回指令,3.返回指令,汇编指令格式 机器指令格式 操 作,RETI,32H PC815 (SP),弹出断点高8位,SP (SP)-1,PC07 (SP),弹出断点低8位,SP (SP)-1,注意:本指令是中断返回指令,除具有RET指令的功能外,还具有开放低优先级中断、恢复中断逻辑等功能。在编程时不能将两种返回指令混用,中断返回一定要安排在中断服务程序的最后。,3.5.4 空操作指令,汇编指令格式 机器指令格式 操 作,NOP,00H PC (PC)+1,注意:这是一条单字节指令,除PC加1指向下一条指令以外,它不执行其他任何操作,不影响其他寄存器和标志位。NOP指令常用来
50、产生一个机器周期的延迟,用来编写软件延时程序。,3.5.5 控制转移类指令应用实例,【例22】,在累加器A中保存有命令键键值,编写程序使程序根据键值不同而转向不同的子程序入口。,解:,本题可以采用散转指令,程序如下:,KEY:CLR C,;清进位,RLC A,;键值乘2,MOV DPTR,#KEYTAB,;DPTR指向命令键跳转表首址,JMP A+DPTR,;散转到命令键入口,KEYTAB:AJMP KEYPR0,;转向0号键处理程序,AJMP KEYPR1,;转向1号键处理程序,AJMP KEYPR2,;转向2号键处理程序,从程序中看出,当(A)=00H时,散转到KEYPR 0;当(A)=0






