资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本章学习任务:,了解指令和指令系统的概念与分类。,掌握指令的寻址方式。,掌握数据传送指令、算术和逻辑运算指令、控制转移指令和位操作指令的功能和应用。,第,3,章,MCS-51,单片机指令系统,3.1.1,指令与指令系统的概念,指令是使计算机内部执行相应动作的一种操作,是提供给用户编程使用的一种命令。,计算机能够执行的全部操作所对应的指令集合,称之为这种计算机的指令系统。,3.1,单片机指令系统概述,采用机器语言编写的程序称之为目标程序。,采用汇编语言编写的程序称之为源程序。,汇编语言不能被计算机直接识别并执行,必须经过一个中间环节把它翻译成机器语言程序,这个中间过程叫做汇编。,汇编有两种方式:机器汇编和手工汇编。,机器汇编是用专门的汇编程序,在计算机上进行翻译;手工汇编是编程员把汇编语言指令逐条翻译成机器语言指令。,3.1.2,指令格式,8051,汇编语言指令由操作码助记符字段和操作数字段两部分组成。,指令格式如下:,操作码,目的操作数,,源操作数,MCS-51,指令系统中,有单字节、双字节或三字节指令。,3.1.3,指令系统说明,(,1,),Rn,:表示工作寄存器,可以是,R0,R7,中的一个。,(,2,),Ri,:表示寄存器间接寻址,,Ri,只能是,R0,或,R1,。,(,3,),DPTR,:表示以,DPTR,为数据指针的间接寻址,用于对外部,64K RAM/ROM,寻址。,(,4,),#data,:,8,位立即数,实际使用时,data,应是,00H,FFH,中的一个。,(,5,),direct,:,8,位直接地址,实际使用时,direct,应该是,00H,FFH,中的一个,也可以是采用物理地址表示的特殊功能寄存器,SFR,中的一个。,(,6,),#data16,:,16,位立即数。,(,7,),bit,:位地址。,(,8,),addr11,:,11,位目标地址。,(,9,),addr16,:,16,位目标地址。,(,10,),rel,:,8,位带符号地址的偏移量,地址偏移量范围,128,+127,。,(,11,),$,:当前指令的地址。,(,12,)(,X,):某一个存储单元,X,中的内容。,(,13,)(,Ri,):由,Ri,间接寻址的单元的内容,即,Ri,指向的地址中的内容。,3.2,寻址方式,3.2.1,寄存器寻址,1,寄存器寻址方式,是指操作数在工作寄存器,R0,R7,、,A,、,B,、,DPTR,中,指令码内含有该操作数的工作寄存器地址。,2,指令举例:,MOV A,,,R0,其功能是将寄存器,R0,的内容传送到累加器,A,中,操作数在,R0,中。,3,寄存器寻址方式的寻址范围包括:,(,1,),4,个寄存器组共有,32,个通用寄存器。但在指令中只能使用当前寄存器组,因此在使用前常需通过对,PSW,中的,RS1,、,RS0,位的状态设置,来进行当前寄存器组的选择。,(,2,)部分专用寄存器。例如,累加器,A,、,B,以及数据指针,DPTR,等。,3.2.2,直接寻址,1,直接寻址方式,是指在指令中操作数直接以单元地址的形式给出。,8051,单片机中,片内,RAM,的所有单元都能采用直接寻址的表示方式。,2,指令举例:,MOV A,,,30H,3,直接寻址方式的寻址范围只限于内部,RAM,,具体说就是:,(,1,)低,128,个单元。在指令中直接以地址形式给出。,(,2,)专用寄存器。专用寄存器除以单元地址形式给出外,还可以以寄存器符号形式给出。应当指出,直接寻址是访问专用寄存器的唯一方法(,A,,,B,,,DPTR,除外)。,3.2.3,寄存器间接寻址,1,寄存器间接寻址方式,是指寄存器中存放的是操作数的地址,即操作数是通过寄存器间接得到的。,2,为了和寄存器间接寻址区别,在寄存器间接寻址方式中,在寄存器的名称前面加前缀标志“,”,。,3,指令举例:,MOV A,,,R0,指令以,R0,寄存器内容(假设为,20H,)为地址,把该地址单元的内容送到累加器,A,,其功能示意图如图,3-1,所示。,图,3-1,寄存器间接寻址方式示意图,4,寄存器间接寻址方式的寻址范围:,(,1,)内部,RAM,低,128,个单元。,(,2,)外部,RAM64KB,。,3.2.4,立即寻址,1,立即寻址方式,是操作数在指令中直接给出。通常把出现在指令中的操作数称为立即数。,2,为了与直接寻址指令中的直接地址相区别,在立即数前面加“,#”,标志。,3,指令举例:,MOV A,,,#3AH,除,8,位立即数外,指令系统中还有一条,16,条立即寻址指令,即:,MOV DPTR,,,#data16,;其功能是把,16,位,;,立即数送到数据指针,3.2.5,变址寻址,1,变址寻址方式,是以,DPTR,或,PC,作基址寄存器,以累加器,A,作变址寄存器,并以两者内容相加形成的,16,位地址作为操作数的地址。,2,指令举例:,MOVC A,,,A+DPTR,设指令前,A=54H,,,DPTR=3F21H,,则该指令的操作示意图如图,3-2,所示。,3,变址寻址方式作如下说明,(,1,)变址寻址方式只能对程序存储器进行寻址,或者说它是专门针对程序存储器的寻址方式。,(,2,)变址寻址的指令只有三条:,MOVC A,,,A+DPTR,MOVC A,,,A+PC,JMP A+DPTR,(,3,)变址寻址指令是单字节指令。,3.2.6,相对寻址指令,1,相对转移,是以转移指令所在地址为基地址,向前最大可转移(,127+,转移指令字节数)个单元,向后最大可转移(,128,转移指令字节数)个单元。,2,在相对寻址方式的转移指令中,给出了地址偏移量,把,PC,的当前值加上偏移量就构成了转移的目的地址。,3,PC,当前值是指执行完该转移指令后的下一条指令的地,即转移指令的地址值加上它的字节数。因此转移的目的地址可用如下公式表示:,目的地址,=,转移指令地址,+,转移指令字节数,+,rel,偏移量,rel,是一个带符号的,8,位二进制补码数,所能表示的范围是,128,+127,。,4,指令举例:,SJMP,rel,;跳转的目的地址,HERE+rel,HERE,:,3.2.7,位寻址,1,MCS-51,单片机有位处理功能,可以对数据位进行操作,因此就有相应的位寻址方式。,2,指令举例:,ANL C,,,30H,;累加位,C,的状态和地址为,30H,的位状态进行逻辑与操作,并把结果保存在,C,中。,3,位寻址方式的寻址范围:内部,RAM,中的位寻址区,单元地址为,20H,2FH,,共,16,个单元,128,位,位地址是,00H,7FH,。对于这,128,个位的寻址直接以位地址表示。,4,专用寄存器的位寻址区。可供位寻址的,11,个专用寄存器。,5,对这些寻址位在指令中有如下几种表示方法:,(,1,)直接使用位地址。例如,20H,的最低位地址是,00H,。,(,2,)位名称表示方法。专用寄存器中的一些寻址位是有符号名称的。专用寄存器中,PSW,的最低位可表示为,P,。,(,3,)单元地址加位的表示方法。专用寄存器中,PSW,的最低位可表示为,D0H.0,。,(,4,)专用寄存器符号加位的表示方法。例如专用寄存器中,PSW,的最低位可表示为,PSW.0,。,3.3,数据传送指令,数据传送指令的作用是将数据从一个地方传送到另一个地方,是单片机指令中用的非常多的一类指令。数据传送指令是对存储单元进行操作,对于不同的存储器的数据传送。,3.3.1,片内数据传送指令,1,以累加器,A,为目的寄存器的指令,MOV A,,,Rn,;,Rn,中内容送到累加器,A,中,MOV A,,,Ri,;,Ri,指向单元中内容送到,A,中,MOV A,,,direct,;(,direct,),A,MOV A,,,#data,;,#,dataA,,,例,3-1,设片内,RAM R0=00H,,(,23H,),=10H,,(,50H,),=34H,,执行完每条指令后,A,,,R0,中内容分别是什么?,解:,MOV A,,,#50H,MOV A,,,50H,MOV R0,,,#23H,MOV A,,,R0,2,以,Rn,为目的操作数的指令,MOV,Rn,,,A,;,ARn,,,n=0,7,MOV,Rn,,,direct,;(,direct,),Rn,MOV,Rn,,,#data,;,#,dataRn,,,n=0,7,3,以直接地址,direct,为目的操作数的指令,MOV direct,,,A,;,Adirect,MOV direct,,,Rn,;,Rndirect,,,MOV direct1,,,direct2,;(,direct 2,),direct1,MOV direct,,,Ri,;(,Ri,),direct,MOV direct,,,#data,;,#,datadirect,4,以寄存器间接地址为目的操作数的指令,MOV ,Ri,,,A,;,A,(,Ri,),,i=0,,,1,MOV ,Ri,,,direct,;(,direct,)(,Ri,),MOV ,Ri,,,#data,;,#data,(,Ri,),例,3-2,设片内,RAM,(,23H,),=10H,,(,10H,),=34H,,,R0=00H,,执行完每条指令后,A,,,R0,中内容分别是什么?,MOV A,,,#50H,;,A=50H,MOV R0,,,#23H,;,R0=23H,MOV R0,,,A,;(,23H,),=50H,MOV R0,,,10H,;(,23H,),=34H,5,16,位数据传送指令,MOV DPTR,,,#data16,;,#data16DPTR,6,堆栈操作指令,MCS-51,内部,RAM,中可以设定一个“先进后出,后进先出”的区域称作堆栈。,堆栈的一端固定,称为栈顶,另一端是活动的,称为栈底。,堆栈指针,SP,指出堆栈的栈顶位置,当栈顶地址等于栈底地址时,堆栈就是空的。,(,1,)进栈指令,PUSH direct,;,SPSP+1,,,;(,SP,)(,direct,),例,3-3,当,SP=60H,,,A=30H,,,B=70H,时,执行如下指令后,61H,单元、,62H,单元和,SP,中内容是什么?,PUSH ACC,PUSH B,(,2,)出栈指令,POP direct,;(,SP,)(,direct,),,;,SPSP,1,例,3-4,当,SP=62H,,(,62H,),=70H,,(,61H,),=30H,,执行指令后,DPTR,、,SP,内容分别是什么?,POP DPH,;(,SP,),DPH,,,SP,1SP,POP DPL,;(,SP,),DPL,,,SP,1SP,7,交换指令,(,1,)字节交换指令,XCH A,,,Rn,;,A,Rn,XCH A,,,direct,;,A,(,direct,),XCH A,,,Ri,;,A,(,Ri,),例,3-5,A=80H,,,R7=08H,,(,40H,),=F0H,,,R0=30H,,(,30H,),=0FH,,执行下列指令后,A,、,R7,、,40H,单元,30H,单元内容是什么?,XCH A,,,R7,;,A,与,R7,互换,XCH A,,,40H,;,A,与(,40H,)互换,XCH A,,,R0,;,A,与(,R0,)互换,结果:,A=0FH,,,R7=80H,,(,40H,),=08H,,(,30H,),=F0H,。,(,2,)半字节交换指令,XCHD A,,,Ri,;累加器的低,4,位与内部,;,RAM,低,4,位交换,例,3-6,R0=60H,,(,60H,),=3EH,,,A=59H,,执行完下列指令后,A,、,60H,单元中内容是什么?,XCHD A,,,R0,3.3.2,片外,RAM,数据传送指令,1,读片外,RAM,指令,MOVX A,,,DPTR,;,A,(,DPTR,),MOVX A,,,Ri,;,A,(,Ri,),读外部,RAM,存储器或,I/O,中的一个字节时,=0,2,写片外,RAM,指令,MOVX DPTR,,,A,;,A,(,DPTR,),MOVX ,Ri,,,A,;,A,(,Ri,),执行写指令时,=0,例,3-7,设外部,RAM,中(,0056H,),=ABH,,,A=78H,,分别完成这两个程序的编写(,1,)把,A,中内容送到,0056H,中,(,2,)把,0056H,中内容送入,7010H,中。,解:,(,1,),方法一:,MOV R0,,,#56H,MOVX R0,,,A,方法二:,MOV DPTR,,,#0056H,MOVX DPTR,,,A,(,2,),MOV R0,,,#56H,MOVX A,,,R0,MOV DPTR,,,#7010H,MOVX DPTR,,,A,3.3.3,片外,ROM,数据传送指令,1,PC,作基址寄存器,MOVC A,,,A+PC,;,PCPC+1,,,;,A,(,A+PC,),例如,A=30H,,执行地址,1000H,处的指令,1000H,:,MOVC A,,,A+PC,本指令占用一个字节,执行结果将程序存储器中,1031H,的内容送入,A,。,优点:不改变特殊功能寄存器及,PC,的状态,根据,A,的内容就可以取出表格中的常数。,缺点:表格只能存放在该条查表指令后面的,256,个单元之内,表格的大小受到限制,且表格只能被一段程序所利用。同时,编程时需要进行地址偏移量的计算即计算,MOVC A,,,A+PC,指令所在地址与表格存放首地址间的距离字节数,并需要一条加法指令进行地址调整。,地址偏移量计算公式为,地址偏移量,=,表格首地址(,MOVC,指令起始地址,+1,),2,DPTR,作为基址寄存器,MOVC A,,,A+DPTR,;,A,(,A+DPTR,),例如,DPTR=8100H,,,A=40H,,执行指令,MOVC A,,,A+DPTR,本指令的执行结果只和指针,DPTR,及累加器,A,的内容有关,与该指令存放的地址及常数表格存放的地址无关,因此表格的大小和位置可以在,64K,程序存储器中任意安排,一个表格可以为各个程序块公用。,例,3-8,从片外程序存储器,2000H,单元开始存放,0,9,的平方值,分别以,DPTR,和,PC,作为基址寄存器进行查表,得,6,的平方值。,解,:(,1,)以,DPTR,作为基址寄存器进行查表,MOV DPTR,,,#2000H,MOV A,,,#06H,MOVC A,,,A+DPTR,(,2,)以,DPTR,和,PC,作为基址寄存器进行查表,设,MOVC,指令所在地址(,PC,),=1FF0H,,则偏移量,=2000H,(,1FF0H+1,),=0FH,。,MOV A,,,#06H,ADD A,,,#0FH,MOVC A,,,A+PC,3.4,算术运算和逻辑运算指令,1,不带,Cy,的加法指令,ADD A,,,Rn,;,A+RnA,,,n=0,7,ADD A,,,direct,;,A+,(,direct,),A,ADD A,,,Ri,;,A+,(,Ri,),A,,,i=0,,,1,ADD A,,,#data,;,A+#dataA,3.4.1,算术运算指令,例,3-9,A=62H,,,R0=0CH,,执行指令,ADD A,,,R0,结果:,A=6EH,,,Cy=0,,,AC=0,,,OV=0,,,P=1,例,3-10,A=85H,,,R0=20H,,(,20H=AFH,,执行指令:,ADD A,,,R0,结果:,A=34H,,,Cy=1,,,AC=1,,,OV=1,,,P=1,2,带进位加法指令,ADDC A,,,Rn,;,A+Rn+CA,,,n=0,7,ADDC A,,,direct,;,A+,(,direct,),+CA,ADDC A,,,Ri,;,A+,(,Ri,),+CA,ADDC A,,,#data,;,A+data+CA,例,3-11,A=85H,,(,20H,),=FFH,,,Cy=1,,执行指令:,ADDC A,,,20H,结果为:,A=85H,,,Cy=1,,,AC=1,,,OV=0,,,P=1,(,A,中,1,的位数为奇数)。,3,加,1,指令,INC A,;,AA+1,INC,Rn,;,RnRn+1,INC direct,;,direct,(,direct,),+1,INC ,Ri,;(,Ri,)(,Ri,),+1,INC DPTR,;,DPTRDPTR+1,4,十进制调整指令,DA A,这条指令一般跟在,ADD,或,ADDC,指令后,用于对,BCD,码十进制数加法运算结果的内容修正。修正方法应是:,(,a,)累加器低,4,位大于,9,或辅助进位位,AC=1,,则进行低,4,位加,6,修正。,(,b,)累加器高,4,位大于,9,或进位位,Cy=1,,则进行高,4,位加,6,修正。,(,c,)累加器高,4,位为,9,,低,4,位大于,9,,则高,4,位和低,4,位分别加,6,修正。,二进制数的加法运算原则并不能适用于十进制数的加法运算,有时会产生错误结果。例如:,(,a,),3+6=9 0011+0101=1001,运算结果正确,(,b,),7+8=15 0111+1000=1111,运算结果不正确,(,c,),9+8=17 1001+1000=00001,,,Cy=1,结果不正确,例,3-12,完成两个,BCD,数加法运算,其中,A=56H,,,R5=67H,。,解,:,ADD A,,,R5,DA A,5,带借位的减法指令,SUBB A,,,Rn,;,A,Rn,CyA,,,n=0,7,SUBB A,,,direct,;,A,(,direct,),CyA,SUBB A,,,Ri,;,A,(,Ri,),CyA,SUBB A,,,#data,;,A,data,CyA,例,3-13,试分析,8051,执行如下指令后累加器,A,和,PSW,中标志位的变化状况。,CLR C,MOV A,,,#52H,SUBB A,,,#0B4H,6,减,1,指令,DEC A,;,A,1A,DEC,Rn,;,Rn,1Rn,,,n=0,7,DEC direct,;,direct,1direct,DEC ,Ri,;(,Ri,),1,(,Ri,),,i=0,,,1,7,乘法指令,MUL AB,;,ABBA,这条指令的功能是把累加器,A,和通用寄存器,B,中的两个,8,位无符号数相乘,所得,16,位乘积的低,8,位放在,A,中,高,8,位放在,B,中。,8,除法指令,DIV AB,;,ABA,(商),余数,B,这条指令的功能是对两个无符号数进行除法运算。其中被除数放在,A,中,除数放在,B,中。指令执行后,商存于,A,中,余数存于,B,中。,3.4.2,逻辑运算指令,1,逻辑与指令,ANL A,,,Rn,;,A A,Rn,ANL A,,,direct,;,A A,(,direct,),ANL A,,,Ri,;,A A,(,Ri,),ANL A,,,#data,;,A A data,ANL direct,,,A,;(,direct,)(,direct,),A,ANL direct,,,#data,;(,direct,)(,direct data,例,3-14,已知:,R0=30H,、(,30H,),=AAH,,试问,8031,执行如下指令后累加器,A,和,30H,单元中的内容是什么?,MOV A,,,#0FFH,ANL A,,,R0,结果为,A=30H,,(,30H,),=AAH,MOV A,,,#0FFH,ANL A,,,30H,结果为,A=AAH,,(,30H,),=AAH,2,逻辑或指令,ORL A,,,Rn,;,A A,Rn,ORL A,,,direct,;,A A,(,direct,),ORL A,,,Ri,;,A A,(,Ri,),ORL A,,,#data,;,A A data,ORL direct,,,A,;(,direct,)(,direct,),A,ORL direct,,,#data,;(,direct,)(,direct,),data,在实际编程中,逻辑或指令可使某个存储单元或累加器,A,中的数据某些位变为“,1”,而其他位不变。,3,逻辑异或指令,在实际编程中,逻辑异或指令可使某个存储单元或累加器,A,中的数据某些位变为反而其他位不变。,4,逻辑非指令,CPL A,;,A,注:逻辑非指令仅用于累加器,A,。,5,累加器,A,清零指令,CLR A,;,A 0,6,累加器,A,的移位指令,(,1,)不带进位的循环移位指令,左移指令,RL A,;,Ai+1 Ai,、,A0 A7,右移指令,RR A,;,Ai Ai+1,、,A7 A0,(,2,)带进位的循环移位指令,左移指令,RLC A,;,Ai+1 Ai,,,;,Cy A7,、,A0 Cy,右移指令,RRC A,;,Ai Ai+1,、,A7 Cy,、,;,Cy A0,例,3-15,已知,M1,和,M1+1,单元中有一个,16,位的二进制数(,M1,中为低,8,位),请通过编程令其扩大到二倍。,ORG 1000H,CLR C,;,Cy0,MOV R1,,,#M1,;操作数低,8,位地址送,R1,MOV A,,,R1,;,A,操作数低,8,位,RLC A,;低,8,位操作数左移,低位补,0,MOV R1,,,A,;送回,M1,单元,,Cy,中为最高位,INC R1,;,R1,指向,M1+1,单元,MOV A,,,R1,;,A,操作数高,8,位,RLC A,;高,8,位操作数左移,MOV R1,,,A,;送回,M1+1,单元,SJMP$,;停机,END,3.5,控制转移类指令,1,长转移指令,LJMP addr16,;,PC15-8addr158,;,PC7-0addr7-0,该指令执行时,第一字节为操作码,将指令的第二、三字节地址码分别装入,PC,的高,8,位和低,8,位中,程序无条件地转移到指定的目标地址去执行指令。,3.5.1,无条件转移指令,2,绝对转移指令,AJMP addr11,;,PC PC+2,,,;,PC100 addr11,该指令执行时,先将,PC,内容加,2,,(这时,PC,指向的是,AJMP,的下一条指令),然后把指令中的,11,位地址码传送到,PC10-0,,而,PC15-11,保持原来内容不变。,3,短转移指令,SJMP,rel,;,PC PC+2,,,PC,PC+rel,指令的执行分两步完成:,第一步,取指令。此时,PC,自身加,2,形成,PC,的当前值。,第二步,将,PC,当前值与偏移量,rel,相加形成转移的目的地址。即:,目的地址,=PC+2+relrel,是一个符号数,取值范围,+127,128,(,00H7FH,对应表示,0+127,,,80HFFH,对应表示,128,1,),负数表示反向转移,正数表示正向转移。,4,变址转移指令,JMP A+DPTR,;,PC A+DPTR,变址转移指令又称为散转指令,该指令具有散转功能,可以代替许多判别跳转指令。,DPTR,中内容与,A,中内容之和是转移地址,并直接送入,PC,中。,例 当,A=0,时,程序转到,ROUT00,处执行指令;当,A=01H,时,程序转到,ROUT01,处执行指令,当,A=2,时,程序转到,ROUT02,处执行指令当,A=03,时,程序转到,ROUT03,处执行指令。,MOV DPTR,,,#TABLE,RL A,JMP A+DPTR,TABLE,:,AJMP ROUT00,AJMP ROUT01,AJMP ROUT02,AJMP ROUT03,ROUT00,:,ROUT01,:,ROUT02,:,ROUT03,:,3.5.2,条件转移指令,条件转移指令是指当某种条件满足时,转移才进行;条件不满足时,程序就按顺序往下执行。,条件转移指令的共同特点一方面所有的条件转移指令都属于相对转移指令,转移范围相同,都在以,PC,当前值为基准的,256B,范围内(,+127,128,)。另一方面计算转移地址的方法相同,即:转移地址,=PC,当前值,+,rel,。,1,累加器,A,判零条件转移指令,JZ,rel,;若,A,0,,则转移执行,PC=,PC,+2+,rel,;若,A 0,,则顺序执行,PC=,PC,+2,JNZ,rel,;若,A 0,,则转移执行,PC=,PC,+2+,rel,;若,A,0,,则顺序执行,PC=,PC,+2,例,3-16,已知外部,RAM,中以,DATA1,为起始地址的数据块以零为结束标志。试通过编程将之传送到以,DATA21,为起始地址的内部,RAM,区。,解,:,ORG 0500H,MOV R0,,,#DATA1,;外部,RAM,数据块起始地址送,R0,MOV R1,,,#DATA2,;内部,RAM,数据块起始地址送,R1,LOOP,:,MOVX A,,,R0,;外部,RAM,取数送,A,JZ DONE,;若,A,0,,则转,DONE,MOV R1,,,A,;若,A0,,则给内部,RAM,送数,INC R0,;修改外部,RAM,地址指针,INC R1,;修改内部,RAM,地址指针,SJMP LOOP,;循环,DONE,:,SJMP$,;停机,END,2,比较条件转移指令,(,1,),CJNE A,,,#data,,,rel,若,A,data,,则,PC,目的,=PC,源,+3,若,Adata,,则转移执行,PC,目的,=PC,源,+3+rel,(,2,),CJNE A,,,direct,,,rel,若,A,(,direct,),则,PC,目的,=PC,源,+3,若,A,(,direct,),则转移执行,PC,目的,=PC,源,+3+rel,(,3,),CJNE ,Ri,,,#data,,,rel,若(,Ri,),data,,则顺序执行,PC,目的,=PC,源,+3,若(,Ri,),data,,则转移执行,PC,目的,=PC,源,+3+rel,(,4,),CJNE,Rn,,,#data,,,rel,若,Rndata,,则转移执行,PC=PC+3+,rel,若,Rn,data,,则顺序执行,PC=PC+3,3,减,1,条件转移指令,(,1,),DJNZ,Rn,,,rel,;指令首先完成,RnRn,1,功能,;若,Rn,0,,则顺序执行,PC,目的,PC,源,+2,;若,Rn0,,则转移执行,PC,目的,PC,源,+2+rel,(,2,),DJNZ direct,,,rel,;指令首先完成(,direct,)(,direct,),1,功能,;若(,direct,),0,,则顺序执行,PC,目的,PC,源,+3,;若(,direct,),0,,则转移执行,PC,目的,PC,源,+3+rel,例,3-17,试编程令片内,RAM,中以,DAT,为起始地址的数据块中的连续,10,个无符号数相加,并将和送到,SUM,单元。设相加结果不超过,8,位二进制数所能表示的范围。,解,:,ORG 1000H,MOV R2,,,#0AH,;数据块长度送,R2,MOV R0,,,#DAT,;数据块起始地址送,R0,CLR A,;累加器清零,LOOP,:,ADD A,,,R0,;加一个数,INC R0,;修改加数地址指针,DJNZ R2,,,LOOP,;,R2-10,,则,LOOP,MOV SUM,,,A,;存和,SJMP$,;停机,END,3.5.3,子程序调用及返回指令,调用子程序的程序称之为主程序,主程序和子程序之间的调用关系如图,3-4,所示。从图中可以看出,子程序调用要中断原有指令的执行顺序,转移到子程序的入口地址去执行子程序。与转移指令不同的是:子程序执行完毕后,要返回到调用指令的下一条指令(该指令地址称为断点地址)执行。因此,子程序调用指令必须将程序中断位置的地址保存起来,一般是放在堆栈中保存。,调用和返回构成了子程序调用的完整过程。为了实现这一过程,必须有子程序调用指令和返回指令。调用指令在主程序中使用,而返回指令则是子程序中的最后一条指令。,1,调用指令,(,1,)短调用指令,ACALL addr11,;,PCPC+2,;,SPSP+1,,(,SP,),PC,当前低,8,位,;,SPSP+1,,(,SP,),PC,当前高,8,位,;,PC10 0addr11,(,2,)长调用指令,LCALL addr16,;,PCPC+3,;,SPSP+1,,(,SP,),PC,当前低,8,位,;,SPSP+1,,(,SP,),PC,当前高,8,位,;,PCaddr16,2,返回指令,(,1,)子程序返回指令,调用子程序或执行中服程序时需保护断点,执行完子程序或执行中服程序后应返回断点。,RET,称为子程序返回指令,只能用在子程序末尾;,RETI,称为中断返回指令,只能用在中断服务程序末尾。,RET,;,PC,当前高,8,位(,SP),SPSP,1,;,PC,当前低,8,位(,SP,),,SPSP,1,(,2,)中断服务程序返回指令,RETI,;,PC,当前高,8,位(,SP,),,SPSP,1,;,PC,当前低,8,位(,SP,),,SPSP,1,该指令的功能是从堆栈中自动取出点的地址送入,PC,,使程序返回到主程序断点处继续往下执行。同时清除中断响应时被置位的优先级状态触发器,以告之中断系统已经结束中断服务子程序的执行,恢复中断逻辑以接受新的中断请求。,例,3-18,试利用子程序技术编出令,20H2AH,和,30H3EH,两个子域清零的程序。,解,:,ORG 1000H,MOV SP,,,#07H,;令堆栈的栈底地址为,70H,MOV R0,,,#20H,;第一清零区起始地址送,R0,MOV R2,,,#0BH,;第一清零区单元数送,R2,ACALL ZERO,;给,20H2AH,区清零,MOV R0,,,#30H,;数据块长度送,R2,MOV R2,,,#0FH,;第二清零区起始地址送,R0,ACALL ZERO,;第二清零区单元数送,R2,SJMP$,;停机,ORG 1050H,ZERO,:,MOV R0,,,#00H,;清零,INC R0,;修改清零区指针,DJNZ R2,,,ZERO,;,R2-10,,则,ZERO,RET,;返回,END,3.5.4,空操作指令,NOP,;,PCPC+1,特点:执行该指令仅用一机器周期时间,无任何功能。,3.6,位操作指令,位操作也称布尔变量操作,它是以位(,bit,)为单位进行运算和操作的。,MCS-51,单片机内部有一个功能相对独立的布尔处理机。布尔处理机借用进位标志,Cy,作为累加器,有位存储器(即位寻址区中的,128,位)。,3.6.1,位传送指令,1,位地址中的值(,0,或,1,)传送给进位标志,Cy,MOV C,,,bit,;,Cy,(,bit,),2,进位标志,Cy,的值(,0,或,1,)传送到位地址中,MOV bit,,,C,;(,bit,),Cy,注:,bit,为位地址,,C,为标志,Cy,的助记符,例,3-19,试通过编程把,00H,位中的内容和,7FH,位中的内容相交换。,解:,为了实现把,00H,位中的内容和,7FH,位中的内容相交换,可以采用,01H,位作为暂存器位,程序为:,MOV C,,,00H,;,Cy,(,00H,),MOV 01H,,,C,;暂存于,01H,位,MOV C,,,7FH,;,Cy,(,7FH,),MOV 00H,,,C,;存入,00H,位,MOV C,,,01H,;,00H,位的原内容送,Cy,MOV 7FH,,,C,;存入,7FH,位,SJMP$,;停机,END,3.6.2,位置,1,、位清,0,指令,1,位置,1,指令,SETB C,;进位标志,Cy,置,1,指令,SETB bit,;位地址中置,1,指令,2,位清,0,指令,CLR C,;进位标志,Cy,清,0,指令,CLR bit,;位地址中置,0,指令,3.6.3,位逻辑运算指令,1,位“与”运算指令,ANL C,,,bit,;,CyCy,(,bit,),ANL C,,,/bit,;,CyCy,(,/bit,),2,位“或”运算指令,ORL C,,,bit,;,CyCy,(,bit,),ORL C,,,/bit,;,CyCy,(,/bit,),3,位“非”运算指令,CPL C,;,Cy/Cy,CPL bit,;,bit,(,/bit,),3.6.4,位控制转移指令,1,以,Cy,中的内容为条件的转移指令,JC,rel,;若,Cy,1,,,PCPC+2+rel,;若,Cy,0,,,PCPC+2,JNC,rel,;若,Cy,0,,,PCPC+2+rel,;若,Cy,1,,,PCPC+2,例,3-20,已知内部,RAM,的,M1,和,M2,单元中各有一个无符号,8,位二进制数。试编程比较它们的大小,并把大数送到,MAX,中。,解:,MOV A,,,M1,CJNE A,,,M2,,,LOOP,LOOP,:,JNC LOOP1,MOV A,,,M2,LOOP1,:,MOV MAX,,,A,RET,2,以位地址中的值为条件的位控制转移指令,JB bit,,,rel,;若(,bit,),1,,,PCPC+3+rel,;若(,bit,),0,,,PCPC+3,JNB bit,,,rel,;若(,bit,),0,,,PCPC+3+rel,;若(,bit,),1,,,PCPC+3,JBC bit,,,rel,;若(,bit,),1,,,PCPC+3+rel,且,;(,bit,),0,;若(,bit,),0,,,PCPC+3,例,3-21,片内,RAM56H,单元中内容为一个符号数,编写程序完成判断其正负如果是零,则程序转移到,ROUT0,处;如果是正数,则程序转移到,ROUT1,处;如果是负数,程序转移到,ROUT2,处。,解:,MOV A,,,56H,JZ ROUT0,JB ACC.7,,,ROUT2,SJMP ROUT1,ROUT0,:,ROUT1,:,ROUT2,:,
展开阅读全文