资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第四章 指令系统,4.1,指令系统简介,指令,是规定计算机进行某种操作的命令。,由于计算机只能识别二进制数,所以计算机的指令均由二进制代码组成,为了阅读和书写方便,常把它写成十六进制形式,通常称这样的指令为,机器指令,。,助记符是根据机器指令不同的功能和操作对象来描述指令的符号,这种用助记符形式来表示的机器指令称为,汇编语言指令,。,80C51,指令分类,80C51,单片机共有,111,条指令。,1,按指令所占的字节数分类,单字节指令,49,条,双字节指令,45,条,三字节指令,17,条,每条指令的平均字节数:,2,按指令执行时间长短分,单周期指令,64,条,双周期指令,45,条,四周期指令,2,条,每条平均执行时间,:,3,按指令系统的功能分,1.,数据传送类:,29,条,2.,算术运算类:,24,条,3.,逻辑运算类:,24,条,4.,控制转移类:,17,条,5.,位操作类:,17,条,指令格式,汇编语言指令格式,标号:,操作码 操作数,1,,操作数,2,;注释,换行表示一条指令结束。,例:,LOOP,:,MOV A,,,#40H,;,取参数,1.,标号:,指令的符号地址,2.,操作码:,指明指令功能。,3.,操作数:,指令操作对象,数据、地址、寄存器名及约定符号。,4.,注释行:,说明指令在程序中的作用。,操作码和操作数,是指令主体。,标号是程序员根据编程需要,给指令设定的符号地址,可有可无;标号由,18,个字符组成,第一个字符必须是英文字母,不能是数字或其它符号;标号后必须用冒号;在程序中,不可以重复使用。,操作码表示指令的操作种类,规定了指令的具体操作。,操作数或操作数地址表示参加运算的数据或数据的地址。操作数和操作码之间必须用空格分开,有两个以上操作数的操作数之间用逗号分隔。操作数一般有以下几种形式:,没有操作数项,操作数隐含在操作码中,,如,RET,指令,;,只有一个操作数,,如,CPL A,指令,;,有两个操作数,,如,MOV A,#00H,指令,,操作数之间以逗号相隔;,有三个操作数,,如,CJNE A,#00H,NEXT,指令,,操作数之间也以逗号相隔。,注释是对指令的解释说明,用以提高程序的可读性;注释前必须以“;”和指令分开,注释在每条指令后都可以设有。,MOV _move,传送,XCH _exchange,交换,ANL _and logic,与逻辑运算,XRL _exclusive or,异或运算,MUL _Multiply,乘法,RR _rotate right,右循环,RET _return,子程序返回,4.2,寻址方式,4.2.1,符号注释,Rn,Ri,#data#data16,direct bit addr11,addr16,rel,/X (X),4.2,寻址方式,4.2.1,符号注释,Rn,:当前工作寄存器组中的寄存器,R0,、,R1R7,之一,,Ri,:,当前工作寄存器组中的寄存器,R0,或,R1,#data,:,8,位立即数,#data16,:,16,位立即数,direct,:,片内,RAM,或,SFR,的地址(,8,位),间接寻址寄存器,Bit,:,片内,RAM,或,SFR,的位地址,addr11,:,11,位目的地址,addr16,:,16,位目的地址,rel,:,补码形式的,8,位地址偏移量。,偏移范围为,-128,+127,/,:,位操作指令中,该位求反后参与操作,不影响该位,X,:,片内,RAM,的直接地址或寄存器,(X),:,直接寻址时,相应地址单元中的,内容;,间接 寻址时,表示由间址寄存器,X,指出的,地址单元中的内容,:,箭头左边的内容送入箭头右边的单元内,4.2.2,指令寻址方式,寻址方式,一,.,立即寻址方式,举例:,8,位立即数:,MOV A,,,#,40H,;,A40H,16,位立即数:,MOV DPTR,,,#,2100H,;,DPTR2100H,A,XX,MOV A,#40H,40H,二,.,直接寻址方式,MOV A,,,40H,;,A(40H),41H,78H,40H,56H,56H,例:,设存储器两个单元的内容如图所示,,执行指令,MOV A,,,40H,后,A=,?,思考题:,直接寻址方式指令和立即寻址方式指令的形式有什么不同?,MOV A,30H,30H,MOV A,30H,55H,XX,A,55H,三,.,寄存器寻址方式,例,:,MOV A,,,R0,;,AR0,设指令执行前,A=20H,,,R0=40H,,,执行指令后,,A=,?,,R0=,?,四,.,寄存器间接寻址方式,例,:,MOV A,,,R0,;,A(R0),设指令执行前,A=20H,,,R0=40H,,,地址为,40H,存储器单元内容如图所示,。,执行指令后,,A=,?,R0=,?,(40H)=,?,41H,67H,40,H,34H,34H,40H,34H,40H,40H,0100 0000,A,0010 0000,R0,0100 0000,R0,MOV A,R0,R0,MOV A,R0,A,XX,40H,40H,以,R0,作为间址寄存器方式:,MOV A,R0,以,DPTR,作为间址寄存器方式:,55H,A,R0,55H,取出,地址,78H,78H,3FFFH,A,DPTR,3FFFH,取出,地址,78H,78H,MOV DPTR,#3FFFH,MOVX A,DPTR,寄存器寻址:对选定的工作寄存器,R0,R7,、累加器,A,、通用寄存器,B,、地址寄存器,DPTR,中的数进行操作。,例:,MOV A,,,R0,;将,R0,工作寄存器中的数据送到累加器,A,中去。,提一个问题:,我们知道,工作寄存器就是内存单元的一部分,如果我们选择工作寄存器组,0,,则,R0,就是,RAM,的,00H,单元,那么这样一来,,MOV A,,,00H,和,MOV A,,,R0,不就没什么区别了吗?,的确,这两条指令执行的结果是完全相同的,都是将,00H,单元中的内容送到,A,中去,但是执行的过程不同,执行第一条指令需要,2,个机器周期,而第二条则只需要,1,个机器周期,第一条指令变成最终的目标码要两个字节(,E5H 00H,),而第二条则只要一个字节(,E8H,)就可以了,。,五,.,变址寻址方式,例:,MOVC A,,,A+DPTR,;,A(A+DPTR),设指令执行前,A=09H,,,DPTR=2000H,,,存储器单元内容如图所示。执行指令后,,A=,?,DPTR=,?,12H,2000H,2008H,89H,2009H,12H,E0,A,程序存储区,2040H 93,20E0H,47,2041H ,DPH 20,DPL 00,ALU,如:,MOVC A,,,A+DPTR,设,DPTR=2000H,,,A=E0H,20E0H,47,指令代码,六 相对寻址,如,:JC 23H,若,C=0,,,不跳转;,C=1,,,跳转,.,程序存储区,ALU,如:,JC 23,1025H,1000H 40,1025H,45,1001H,23,1024H 47,1002H,30,23H,1002H,指令代码,当前,PC,如,:SETB 3DH;,将,27H.5,位置,1,CLR C,;,Cy,位清,0,七 位寻址,操作数在片内,RAM,位地址区或,SFR,某些位中,寻址方式涉及的存储器空间,寻址方式,寻址空间,立即寻址,程序存储器,(操作数存放空间),直接寻址,片内,RAM,低,128,字节、,SFR,寄存器寻址,工作寄存器,R0,R7,A,B,DPTR,寄存器间接寻址,片内,RAM:R0,R1,SP,片外,RAM:R0,R1,DPTR,变址寻址,程序存储器,:A+PC,A+DPTR,相对寻址,程序存储器,256,字节范围内,:PC+,偏移量,位寻址,片内,RAM,的位寻址区,(20H,2FH,字节地址,),某些可位寻址的,SFR,4.3,数据传送类指令,常用助记符:,MOV,单片机,内部,RAM,中的数据传送,(一般传送指令),MOVX,累加器和单片机,外部数据存储器,间数据传送,MOVC,累加器和,程序存储器,之间的数据传送,XCH,累加器和某个内部,RAM,单元进行数据,交换,XCHD,累加器和某个内部,RAM,单元进行低半字节数据交换,SWAP,累加器内高低两半字节数据交换,PUSH,将某个内部,RAM,单元的数据压入堆栈,POP,将堆栈内的数据弹出,4.3.1,一般传送指令,一般传送指令是使用最频繁的一类指令,通用格式:,MOV ,,,属“复制”性质,而不是“搬家”,除了目的操作数为,ACC,的指令影响奇偶标志,P,外,一般不影响标志位。,MOV,指令在片内,RAM,的允许操作图,不允许的操作有,:,Ri,Ri,Rn,Rn,Ri,Rn,说明:,只有指令表中的指令才有对应指令代码,计算机才 能执行。编程时,不能随意“创造发明”指令。,1.,一条指令中不能同时出现两个工作寄存器:,非法,指令:,MOV R1,,,R2MOV R2,,,R0,2.,间址寄存器只能使用,R0,、,R1,。,非法,指令:,MOV A,,,R2,4.,指令表:,3.,#data,不能作为目的字节,思考题:,MOV A,,,C,MOV C,,,R0,MOVC A,,,A+R0,MOV A,,,R2,MOV A,Ri,MOV R8,00H,MOV#1FH,A,MOVX A,R0,MOV R1,R6,例,:,顺序执行下列指令序列,求每一步执行结果,。,MOV A,#30H,MOV 4FH,A,MOV R0,#20H,MOV R0,4FH,MOV 21H,20H,例:,用两种寻址方式实现,将片内,RAM 60H,单元的数据传送给累加器,A,。,解,1,:,MOV A,#60H,?,解,2,:,MOV R0,,,#60H,MOV A,,,R0,;,A=30H,;,(4FH)=30H,;,R0=20H,;,(20H)=30H,;,(21H)=30H,解,2,:,MOV R0,,,60H,?,MOV A,,,R0,解,1,:,MOV A,60H,给出每条指令执行后的结果,MOV 23H,#30H,MOV 12H,#34H,MOV R0,#23H,MOV R7,12H,MOV R1,#12H,MOV A,R0,MOV 34H,R1,MOV 45H,34H,MOV DPTR,#6712H,MOV 12H,DPH,MOV R0,DPL,MOV A,R0,;,(23H)=,30,H,;,(12H)=,34,H,;,R0=,23,H,XX,XX,XX,XX,XX,XX,XX,XX,XX,DPH,DPL,45H,34H,23H,12H,R7,R1,R0,XX,XX,XX,XX,30,34,XX,XX,23,XX,XX,XX,XX,30,34,34,12,23,67,12,34,34,30,34,34,12,23,67,12,34,34,30,67,34,12,12,;R7=,34,H,;R1=,12,H,;A=,30,H,;(34H)=,34,H,;(45H)=,34,H,;DPTR=,6712,H,;(12H)=,67,H,;R0=,12,H,;A=,67,H,内部,RAM,注意:,我们只能将程序存储器中的数据传出(读出),而不能将数据传入(写入)程序存储器。,因此,语句:,MOVC A+DPTR,A MOVC A+PC,A,都是错误的。,例:查表法求,Y=X,2,。设,X(0X15),在片内,RAM,的,20H,单元中,要求将查表求,Y,,,存入片内,RAM21H,单元。,1,),MOV DPTR,,,#3000H,;确定表首地址(基地址),MOV A,,,20H,;取,X,(,偏移量),MOVC A,,,A+DPTR,;,查表求,Y=X,2,MOV 21H,,,A,;,保存,Y,ORG 3000H,;,常数表格首地址,TAB:DB 00,,,01,,,04,,,09,,,,,225,;,平方表,2,),指令地址,源程序,ORG 1000H,;,程序起始地址,1000,H SQU:MOV A,,,20H,;取,X,1002H ADD A,,,#3,;,修正偏移量,1004H,MOVC A,,,A+PC,;,查表求,Y=X,2,1005H MOV 21H,,,A,;,存结果,1007H RET,;,子程序结束,1008H TAB:DB 00,,,01,,,04,;,平方表,100,BH DB 09,,,,,225,思考题:,当,0X255,时,如何用查表法编程求,Y=X,2,。,例:,查表法求,Y=X,2,。设,X(0X15),在片内,RAM,的,20H,单元中,要求将查表求,Y,,,存入片内,RAM21H,单元。,例:在累加器,A,中存放有,09,间的某个数,现要求查出该数的,7,段,共阴显示代码,并将代码传回累加器。,解决方案:在程序存储器中划出一个区域用于存放,09,的,7,段共阴显示代码,比如将代码存放在,0400H,开始的地方。程序如下,:,MOV DPTR,#0400H MOVC A,A+DPTR ORG 0400H DB 3FH,;,0,的,7,段共阴显示代码,DB 06H,;,1,的,7,段共阴显示代码,DB 5BH,;,2,的,7,段共阴显示代码,DB 4FH,;,3,的,7,段共阴显示代码,DB 66H,;,4,的,7,段共阴显示代码,例:,实现片外数据存储器数据传送,(2000H)(2100H),。,MOV DPTR,,,#2000H,MOVX A,,,DPTR,MOV DPTR,,,#2100H,MOVX DPTR,,,A,习题:,将片外,RAM 0000H,单元的数据传送到片内,RAM,的,60H,单元。,;,DPTR=2000H,;,A=X,;,DPTR=2100H,;,(2100H)=X,片外数据存储器不能直接寻址。下列为,非法,指令:,MOVX A,,,2000H,MOVX 2100H,,,2000H,思考题:,为什么对,DPTR,的数据传送使用内部传送指令?,堆栈操作指令,堆栈指针,SP,指出堆栈的栈顶位置。,(1),进栈指令,PUSH direct,先,将栈指针,SP,加,1,,然后把,direct,中的内容送到栈指针,SP,指示的内部,RAM,单元中。,例如:当,SP=60H,A=30H,B=70H,时,,执行:,PUSH,A,CC,;SP+1=61HSP,A61H,PUSH,B;,SP+1=62HSP,B62H,结果:,(61H)=30H,(62H)=70H,SP=62H,(2),出栈指令,POP direct,SP,指示的栈顶(内部,RAM,单元)内容送入,direct,字节单元中,栈指针,SP,减,1.,例如,:,当,SP=62H,,,(62H)=70H,,,(61H)=30H,执行:,POP DPH,;(SP)DPH,SP-1SP,POP DPL,;(SP)DPL,SP-1SP,结果:,DPTR=7030H,,,SP=60H,设,(30H)=x,和(,40H,),=y,,试利用堆栈作为媒体编出,30H,和,40H,单元中内容相交换的程序,MOV SP,#70H ;,令栈底地址为,70H,PUSH 30H,PUSH 40H,POP 30H,POP 40H,交换指令,实现片内,RAM,区的数据双向传送。,1.,字节交换指令,XCH A,,,Rn,;,A,Rn,XCH A,,,Ri,;,A (,Ri,),XCH A,,,direct,;,A (direct),习题:,将片内,RAM30H,单元与,40H,单元的数据交换。,例:,设,A=29H,,,执行指令,XCH A,,,2AH,后,,A=,?,(2AH)=,?,38H,29H,XCH 30H,,,40H ,对吗?,29 H,半字节交换指令,XCHD A,,,Ri,;,A,0,3,(Ri),0,3,SWAP A,;,A,4,7,A,0,3,交换片内,RAM 40H,单元和,41H,单元的低半字节。,已知外部,RAM,的,20H,单元中有一个数,x,和内部,RAM20H,单元中有一个数,y,,试编出可以使它们互相交换的程序。,MOV R1,#20H,MOVX A,R1,XCH A,R1,MOVX R1,A,习题:,找出指令错误并改正:,1,MOV A,,,#1000H,;,A1000H,2,MOVX A,,,1000H,;,A(1000H),片外,RAM,3,MOVC A,,,1000H,;,A(1000H),片外,ROM,4,MOVX 60H,,,A,;,片外,RAM(60H)A,5,MOV R0,,,60H,;,片内,RAM,:,(61H)(60H),MOV 61H,,,R0,6.,XCH R1,,,R2,;,R1R2,7.,MOVX DPTR,,,#2000H,;,DPTR2000H,8.,MOVX 60H,,,DPTR,;,片内RAM,片外,RAM,4.4,算术运算类指令,累加器,A,既可以看作是一个源操作数寄存器,也可以看作是目的操作数寄存器,0,表示相应的指令操作对该标志清,0,例,A=53H,,,R0=FCH,,,执行指令,ADD A,R0,结果,:,A=4FH,,,CY=1,,,AC=0,,,OV=0,,,P=1,注意:上面的运算中,由于位,6,和位,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,带进位加法指令,例:,A=85H,(,20H,),=FFH,CY=1,,,执行指令:,ADDC A,20H,结果为,:,A=85H,,,CY=1,,,AC=1,,,OV=0,,,P=1,(,A,中,1,的位数为奇数),设:,1067H,存在,R1R0,中,,3020H,存在,R3R2,中,计算,R1R0+R3R2,,结果存在,R5R4,中。,MOV A,R0,ADD A,R2,;,R0+R2,A,和,CY,MOV R4,A,MOV A,R1,ADDC A,R3,;,R1+R3+,CY,A,和,CY,MOV R5,A,又例:,先做,67H+20H=87H,,没有超过,0FFH,,,因此最终保存在,A,中的是,87H,,而,PSW,中的,CY=0,。,然后再做,10H+30H+CY,,,结果是,40H,,,所以最终的结果是,4087H,。,1067H+3020H,0001 0000 0110 0111,0011 0000 0010 0000,0100 000,0,1000 0111,1067H,3020H,4087H,加,1,指令,例:设,A=FFH,R0=25H,(26H)=3AH,DPTR=2000H,执行程序:,INC A,;,(,p,),INC R0 INC R0 INC DPTR,结果为:,A=00H,R0=26H,(26H)=3BH,DPTR=2001H,十进制调整指令,用于对,BCD,码十进制数加法运算结果的内容自动进行修正。,指令格式:,DA A,具体是通过执行指令:,DA A,来自动实现的。,BCD,编码十进制加法指令:,ADD A,,,源操作数,DA A,BCD,编码带进位十进制加法指令:,ADDC A,,,源操作数,DA A,BCD,编码十进制加,1,运算:,ADD A,#01,DA A,例:,10010011,(,93,),BCD,+00111000,(,38,),BCD,11001011,(,CBH,),131,相应程序:,MOV R2,,,#93H,MOV A,,,#38H,ADD A,,,R2,DA A,带借位减法指令,例,A=C9H,R2=54H,CY=1,,执行指令,:,SUBB A,R2,结果:,A=74H,CY=0,AC=0,OV=1,(位,6,向位,7,借位),减,1,指令,注意:减,1,指令也不会影响,PSW,的,各个标志位。,思考:设,A=FFH,R0=27H,(26H)=3AH,执行程序:,DEC A,;,(,p,),DEC R0 DEC R0,结果,(,A)=_ ,(R0)=_,(26H)=_,。,乘法运算,MUL AB,Eg,:,MOV A,#87H,MOV B,#0ABH,MUL AB,则:,A=,?(,2DH,),B=,?(,5AH,),OV=,?,1,除法运算,DIV AB,EG,:,MOV A,,,#100,MOV B,,,#26,DIV AB,则:,A=,?,03 B=,?,22,(,16H,),CY=,?,0,作业,1,80C51,单片机的片内都集成了哪些功能部件?各个功能部件的最主要的功能是什么,2.,内部,RAM,中,哪些单元可作为工作寄存器区,哪些单元可以进行位寻址?写出它们的字节地址。,3.,试编出将片内,RAM,中,30H,单元和,40H,单元的内容进行交换的程序。,4.,(,1,)已知片外,RAM,的,0302H,单元有一常数,x,,现欲将其取到累加器,A,,试编出相应程序。,(,2,)已知片外,ROM,的,0302H,单元有一常数,x,,现欲将其取到累加器,A,,试编出相应程序。,5.,在累加器,A,中存放有,0F,间的某个数,现要求查出该数的,7,段共阴显示代码,并将代码传回累加器。,6.,76,页第七题,7.,77,页第十二题,,8,,,10,,,16,,,18,,,21,,,23,已知两个,8,位无符号乘数分别放在,30H,和,31H,单元中,试编出令它们相乘并把积的低,8,位放在,32H,单元,.,积的高,8,位放入,33H,单元的程序,.,解,:,参考程序为,:,MOVR0,#30H,MOVA,R0,INCR0,MOVB,R0,MULAB,INCR0,MOVR0,A,INCR0,MOVR0,B,逻辑操作类指令,一、累加器,A,清,0,与取反指令(,2,条),1,、累加器,A,清,0,指令,CLR A,;,0,A,2,、,累加器,A,取反指令,(按位取反),CPL A,;(,/A,),A,,,相当,0FFH-A,A,如:,A=56H,CPL A,;,结果为,0,A9H,二、移位指令(,4,条),1,、累加器,A,循环左移,RL A,;,2,、,累加器,A,循环右移,RR A,;,3,、,累加器,A,带进位位循环左移,RLC A,;,4,、,累加器,A,带进位位循环右移,RRC A,;,设,A=11000101,,,Cy=0,,,分别执行下列单条指令:,CPL A,求:,A=,,,Cy=,RL A,RLC A,00111010 0,10001011 0,10001010 1,习题,1,:,如何将累加器,A,中的数据高,4,位清,0,,低位不变?,习题,2,:,如何将寄存器,R2,中的数据奇数位取反,偶数位不变?,例,A=01B,,,表示随机状态,为,1,或,0,,执行下述一组指令执行后,A,的值如何,?,XRL A,,,#0C0H,ORL A,,,#03H,ANL A,,,#0E7H,解:,执行上述指令后,,A=100011B,。,程序设计,:,读入,P1,口的数据,将其低,4,位清,0,高,4,位保留,再把结果放到内部,RAM,的,40H,单元。,MOV P1,#0FFH,;,使,P1,口置位输入方式,先要写,1,MOV A,P1,;,读,P1,口数据到,A,ANL A,#0F0H,;,A,的高,4,位和,0f,与,不变,低,4,位和,0,与,清,0,MOV 40H,A,;把,Acc,的值写到片内,RAM40H,单元,程序设计举例,:,将串口缓冲区,30H,中的数据送到内 部,RAM40H,单元,再将其低,7,位,(D6D0),全部变成,1.,MOV 40H,30H,ORL 40H,#7FH,异或指令可用于判断两个字节中的数据是否相等,.,程序设计,:,如果,(40H)=(60H),将,PSW,中的,F0,位置,1.,CLR F0 MOV A,40H XRL A,60H,JNZ OUT SETB F0 ;,(,40h,),=(60h)F0=1,.,out:.;,(,40h,),(60h),控制转移类指令(,17,条),无条件转移类指令,(,4,条),短转移类指令:,AJMP addr11,长转移类指令:,LJMP addr16,相对转移指令:,SJMP,rel,间接转移指令:,JMP A+DPTR,(,1,)上面的前三条指令,统统理解成:,PC,值改变,即跳转到一个标号处。,那么他们的,区别,何在呢?,间接转移指令:,JMP A+DPTR,转移地址由,A+DPTR,形成,并直接送入,PC,。,(,2,)第四条指令与前三条指令相比有所不同,条件转移指令,(,8,条),一、判,A,内容是否为,0,转移指令,(,2,条),JZ,rel,;如果,A=0,,,则转移,否则顺序执行。,JNZ,rel,;,如果,A0,,,就转移。,转移到相对于当前,PC,值的,8,位偏移量的地址去,。即:,新的,PC,值,=,当前,PC+,偏移量,rel,我们在编写汇编语言源程序时,可以直接写成:,JZ,标号;即转移到标号处。,MOV A,,,R0,JZ L1,MOV R1,,,#00H,AJMP L2,L1:MOV R1,,,#0FFH,L2:SJMP L2,END,在执行上面这段程序前:,如果,R0=0,,结果,R1=0FFH,。,而如果,R0,0,,则结果是,R1=00H,。,把上面的那个例子中的,JZ,改成,JNZ,,,看看程序执行的结果是什么,?,如果,R0=0,,结果,R1=00H,。,如果,R0,0,,结果是,R1,中的值为,0FFH,。,二、比较不等转移指令,(,4,条),CJNE A,,,#data,,,rel,CJNE A,,,direct,,,rel,CJNE,Rn,,,#data,,,rel,CJNE,Ri,,,#data,,,rel,此类指令的功能是将两个操作数比较,如,果两者相等,就顺序执行,如果不相等,就转移。,同样地,使用时,我们可以将,rel,理解成标号,即:,CJNE A,,,#data,,,标号,CJNE A,,,direct,,,标号,CJNE,Rn,,,#data,,,标号,CJNE,Ri,,,#data,,,标号,举例:,MOV A,,,R0,CJNE A,,,#10H,,,L1,MOV R1,,,#0,;,如,R0=10H,则不转移,R1=00H,;,AJMP L3,L1:JC L2,;如,CY=1,即,R010H,则转移,AJMP L3,L2:MOV R1,,,#0FFH,L3:SJMP L3,因此最终结果是:本程序执行前,,如果,R0=10H,,则,R1=00H,;,如果,R010H,,则,R1=0AAH,;,如果,R010H,,则,R1=0FFH,。,三、减,1,不为,0,转移指令(,2,条),DJNZ,Rn,,,rel,DJNZ direct,,,rel,例:,MOV 23H,#0AH,CLR A,LOOP:ADD A,23H,DJNZ 23H,LOOP,上述程序段的执行过程是:,将,23H,单元中的数连续相加,存至,A,中,每加一次,,23H,单元中的数值减,1,,直至减到,0,,共加(,23H,)次。,例:用于循环结构程序。设要求程序循环执行,100,次,MOV R2,,,#100,;,设循环计数器初值,LOOP,:,;多次循环程序段,DJNZ R2,,,LOOP,;,循环控制,;循环结束,调用与返回指令,(,4,条),一、,调用指令,(,2,条),LCALL addr16,;,长调用指令,(3,字节,),ACALL addr11,;,短调用指令,(2,字节,),使用时可以用:,LCALL,标号,ACALL,标号,标号表示子程序首地址,来调用子程序。,二、返回指令(,2,条),子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就可以了。,RET,;,子程序返回指令,RETI,;,中断子程序返回指令,两者不能互换使用。,空操作指令,(,1,条),NOP,空操作,就是不进行任何操作,停一个机器周期,一般用作短时间的延时。,设(,SP,),=5FH,,,符号地址“,SUBRTN”,指向,5678H,,,执行指令,0123H LCALL SUBRTN,0126H .,结果:,26H,60H,,,SP+1,SP,,,26H,SP,01H,61H,,,SP+1,SP,,,01H,SP,5678H,PC,,,转去执行“,SUBRTN”,子程序,6.,编写延时,10ms,子程序,fosc,=12MHz,。,解,:,fosc,=12MHz,,,一个机器周期为,1,s,。,DY10ms:MOV R6,#20 ;,置外循环次数,DLP1:MOV R7,#250;,置内循环次数,DLP2:DJNZ R7,DLP2;2,机周,250=500,机周,DJNZ R6,DLP1;500,机周,20=10000,机周,RET ;,说明:,MOV,Rn,指令为,1,个机器周期,;,DJNZ,指令为,2,个机器周期,;,RET,指令为,2,个机器周期,;,【,课堂练习题,】,按下列要求编写延时子程序:,延时,2ms,,,fosc,=6MHz,;,延时,5ms,,,fosc,=12MHz,;,延时,10s,,,fosc,=12MHz,;,例:,软件延时,1S,子程序。,(,设晶振为,6MHZ),MOV 22H,#05H,L3:MOV 23H,#64H,L2:MOV 24H,#0C7H,L1:NOP,NOP,NOP,DJNZ 24H,L1,DJNZ 23H,L2,DJNZ 22H,L3,(5*199+2+2)*100+2+2*5+2*2uS=999044uS=0.99S,7.10,秒延时程序。,12MHz,晶振,DELAY:MOV R5,100,DEL0:MOV R6,200,DEL1:MOV R7,250,DEL2:DJNZ R7,DEL2,DJNZ R6,DEL1,DJNZ R5,DEL0,RET,试利用子程序技术编出令,20H2AH,30H3EH,和,40H4FH,三个子域清零的程序,.,解,:,相应的程序为,:,ORG1000H,MOV SP,#70H,MOV R0,#20H,MOV R2,#0BH,ACALL ZERO,MOV R0,#30H,MOV R2,#0FH,ACALL ZERO,MOV R0,#40H,MOV R2,#10H,ACALL ZERO,SJMP$,ORG1050H,ZERO:MOV R0,#00H,INC R0,DJNZ R2,ZERO,RET,END,4.7,位操作类指令,(,17,条,),在进行位处理时,,CY,用作“位累加器”,4.7.1,位传送指令,(,2,条),MOV C,,,bit,;,bit,C,MOV bit,,,C,;,C,bit,这组指令的功能是实现位累加器(,CY,),和其它位地址之间的数据传递。,例:,MOV C,,,P1.0,;,将,P1.0,的状态送给,C,。,MOV P1.0,,,C,;,将,C,中的状态送到,P1.0,;引脚上去。,4.7.2,位清,0,和置位,(,4,条),位清,0,指令,CLR C,;,使,CY=0,CLR bit,;使指令的位地址等于,0,。,例:,CLR P1.0,;即使,P1.0,变为,0,位置,1,指令,SETB C,;,使,CY=1,SETB bit,;使指定的位地址等于,1,。,例:,SETB P1.0,;使,P.0,变为,1,4.7.3,位逻辑运算指令,(,6,条),位与指令,ANL C,,,bit,;,Cy,与指定位的值相与,结果送,Cy,ANL C,,,/bit,;,先将指定的位地址中的值取出后取反,再和,Cy,相与,结果送回,Cy,。但注意,:,指定的位地址中的值本身并不发生变化。,位取反指令,CPL C,;使,Cy,值取反。,CPL bit,;使指定的位的值取反。,例:,CPL P1.0,位或指令,ORL C,,,bit,ORL C,,,/bit,4.7.4,位条件转移指令,(,5,条),判,Cy,转移指令,JC,rel,JNC,rel,第一条指令的功能是如果,Cy=1,就转移,否则就顺序执行。,第二条指令则和第一条指令相反,即如果,Cy=0,就转移,否则就顺序执行。,同样理解:,JNC,标号,判位变量转移指令,JB bit,,,rel,JNB bit,,,rel,JBC bit,,,rel,第一条指令,:,如果指定的,(,bit,),=1,,则转移,否则顺序执行,第二条指令功能相反。,同样理解:,JB bit,,,标号,第三条指令是如果指定的,(,bit,),=1,,则转移,并把该位清,0,,否则顺序执行。,例:若,P1.7,的信号为,0,转移到,key-scan,子程序,若,P1.7,为,1,,则继续等待的指令程序如下:,wait,:,JNB P1.7,,,key-scan,SJMP wait,例:从,P1.7,引脚输出,5,个方波,MOV R2,,,#10,;,5,个方波,,10,个状态,LOP,:,CPL P1.7,;,P1.7,状态变反,DJNZ R2,,,LOP,查键程序,START:MOV P3,#0FFH,;置,P3,口为输入口,JNB P3.0,FUN0,;,P3.0,口为,0,转,FUN0,JNB P3.1,FUN1,;,P3.1,口为,0,转,FUN1,JNB P3.2,FUN2,;,P3.2,口为,0,转,FUN2,JNB P3.3,FUN3,;,P3.3,口为,0,转,FUN3,AJMP START,;转,START,循环,设,M,N,和,W,都代表位地址,试编程完成,M,N,中内容的异或操作,.,解,:,W=(/M)(N)+(M)(/N),相应的程序为,:,MOVC,N,ANLC,/M,MOVW,C,MOVC,M,ANL C,/N,ORLC,W,MOVW,C,如何记忆这,111,条指令?,1,表格列举法 按功能分为五类,每类列表记忆,请读者 自己总结。,2,英文还原法,增量,INC,Incremect,减量,DEC,Decrement,长转移,LJMP,Long jump,比较转移,CJNE,Compare jump not equality,空操作,NOP,No operation,交换,XCH,Exchange,加法,ADD,Addition,减法,Sub-Subtraction,乘法,MUL,Multiplication,除法,DIV,Division,左环移,RL,Rotate left,进位左环移,RLC,Rotate left carry,右环移,RR,Rotate right,进位右环移,RRC,Rotate right carry,3,相似功能记忆法,ADD/ADDC/SUBB A,,,data/direct/,Rn/Ri,ANL/ORL/XRL A,,,data/direct/,Rn/Ri,ANL/ORL/XRL direct,,,data/A,CJNE A,,,data,,,rel,CJNE A,,,direct,,,rel,CJNE,Rn,,,data,,,rel,CJNE,Ri,,,data,,,rel,MOV A,,,data/direct/A/,Rn/Ri,MOV,Rn,,,data/direct/A,MOV direct,,,data/direct/A/,Rn/Ri,MOV,Ri,,,data/direct/A,4,口诀记忆法,MUL AB,高位积,(,存于,)B,,低位积,(,存于,)A,。,DIV AB,A,除以,B,,商,(,存于,)A,余,(,下,)B,。,
展开阅读全文