资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单片机技术及应用,基于,汇编及,C51,第,3,章,51,单片机指令系统及,汇编程序设计,主 要 章 节,3.1 指令系统概述,3.2 51单片机的寻址方式,3.3 51单片机的指令系统,3.4 51单片机汇编程序设计概述,3.5 51单片机常用汇编程序设计,2026/10/24,2,1,3.1 指令系统概述,一、,51,单片机汇编指令格式,标号,:,操作码,操作数,1,操作数,2 ;,注释,(1),操作码指明指令的功能,(2),操作数给指令操作提供数据、数据的地址或指令的地址,(3),标号是指令的符号地址,后面需带冒号,(4),注释是对指令的解释,前面需带分号,2026/10/24,3,1,3.1 指令系统概述,二、,51,单片机汇编指令常用符号,(1)Ri,和,Rn (2)#data,(3)#data16(4)rel,(5)addr16,和,addr11(6)direct,(7)bit(8)(X),(9)/,和符号,2026/10/24,4,1,3.2 51单片机的寻址方式,二、,寄存器寻址,操作数存放在寄存器中,指令中直接给出寄存器名称,寄存器:八个通用寄存器,R0,R7,、累加器,A,、寄存器,B,和数据指针寄存器,DPTR(DPH,和,DPL),例如:,MOV A,R1,2026/10/24,6,1,3.2 51单片机的寻址方式,三、,直接寻址,操作数存放在存储单元中,指令中直接提供存储单元的地址,访问对象:片内数据存储器和特殊功能寄存器。,例如:,MOV A,30H,2026/10/24,7,1,3.2 51单片机的寻址方式,四、,寄存器间接寻址,操作数存放在存储单元中,存储单元的地址又存放在寄存器中,指令中通过相应的寄存器来提供的存储单元的地址,间接寻址用到的寄存器:通用寄存器,R0,、,R1,和数据指针寄存器,DPTR,。,访问的对象为:片内数据存储器和片外数据存储器,片内数据存储器,:,用,R0,和,R1,作指针,(MOV),片内数据存储器,:,用,R0,和,R1,访问低端的,256,字节;,(MOVX),用,DPTR,访问整个,64K,;,2026/10/24,8,1,3.2 51单片机的寻址方式,五、,变址寻址,操作数存放在存储单元中,操作数的地址由指令中提供的基址寄存器和变址寄存器中的内容相加得到,基址寄存器是:数据指针寄存器,DPTR,和程序计数器,PC,;,变址寄存器,:,累加器,A,访问的对象只能是程序存储器,(MOVC),格式只有两种:,MOVC A,A+DPTR,MOVC A,A+PC,2026/10/24,10,1,3.2 51单片机的寻址方式,六、,指令寻址,操作对象是地址,1.,绝对寻址,直接提供目的位置的地址或地址的一部分,2.,相对寻址,以当前程序计数器,PC,值加上指令中给出的偏移量,rel,得到目的位置的地址,(1),当前,PC,值是指转移指令执行时的,PC,值,它等于转移指令的地址加上转移指令的字节数。,(2),偏移量,rel,是,8,位有符号数,以补码表示,它的取值范围为,-128,+127,。,相对寻址的目的地址为:,目的地址,=,当前,PC+rel=,转移指令的地址,+,转移指令的字节数,+rel,2026/10/24,11,1,3.3 51单片机的指令系统,3.3.1,数据传送类指令,三组:普通传送指令、数据交换指令、堆栈操作指令。用到的助记符有:,MOV,、,MOVX,、,MOVC,、,XCH,、,XCHD,、,PUSH,、,POP,和,SWAP,。,1.,普通数据传送指令,1,),片内数据存储器传送指令,MOV,指令格式:,MOV,目的操作数,源操作数,2026/10/24,13,1,1.,普通数据传送指令,2),片外数据存储器传送指令,MOVX,四条,格式:,MOVX A,DPTR;A,(DPTR),MOVX DPTR,A;(DPTR),A,MOVX A,Ri;A,(Ri),MOVX Ri,A;(Ri),A,2026/10/24,15,1,1.,普通数据传送指令,3),程序存储器传送指令,MOVC,两条:一条是用,DPTR,基址变址寻址,一条是用,PC,基址变址寻址。,格式如下:,MOVC A,A+DPTR;A,(A+DPTR),MOVC A,A+PC ;A,(A+PC),2026/10/24,16,1,3.,堆栈操作指令,堆栈操作有两种:,“入栈”,助记符,PUSH,;,“出栈”,助记符,POP,;,格式如下:,PUSH direct ;SP,SP+1,(SP),(direct),POP direct ;(direct),(SP),SP,SP-1,2026/10/24,18,1,3.3.2,算术运算类指令,1.,加法指令,1,),一般的加法指令,ADD,四条,格式如下:,ADD A,Rn;A,A+Rn,ADD A,direct;A,A+(direct),ADD A,Ri;A,A+(Ri),ADD A,#data;A,A+#data,2026/10/24,19,1,1.,加法指令,2),带进位加法指令,ADDC,四条,格式如下:,ADDC A,Rn;A,A+Rn+C,ADDC A,direct;A,A+(direct)+C,ADDC A,Ri;A,A+(Ri)+C,ADDC A,#data;A,A+#data+C,2026/10/24,20,1,1.,加法指令,3),加,1,指令,INC,5,条,格式如下:,INC A;A,A+1,INC Rn;Rn,Rn+1,INC direct;(direct),(direct)+1,INC Ri;(Ri),(Ri)+1,INC DPTR;DPTR,DPTR+1,2026/10/24,21,1,2.,减法指令,1),带借位减法指令,SUBB,四条,格式如下:,SUBB A,Rn;A,A-Rn-C,SUBB A,direct;A,A-(direct)-C,SUBB A,Ri;A,A-(Ri)-C,SUBB A,#data;A,A-#data-C,2026/10/24,22,1,3.3.2,算术运算类指令,乘法指令,MUL,:,(无符号数),MUL AB ;AB B A,CY,复位。对于,OV,:当积大于,255,时,,OV,为,1,;否则,,OV,为,0,除法指令,DIV,:,(无符号数),DIV AB;AB,商,放,A,,余数放,B,一般情况下,CY,和,OV,都清,0,,只有当,B,寄存器中的除数为,0,时,,CY,和,OV,才被置,1,2026/10/24,24,1,3.3.2,算术运算类指令,5),十进制调整指令,十进制调整指令只有一条:,DA A,调整过程为:,(1),若累加器,A,的低四位为十六进制的,A,F,或辅助进位标志,AC,为,1,,则累加器,A,中的内容做加,06H,调整。,(2),若累加器,A,的高四位为十六进制的,A,F,或进位标志,CY,为,1,,则累加器,A,中的内容做加,60H,调整。,2026/10/24,25,1,3.3.3,逻辑操作指令,1.,逻辑与指令,ANL,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,2026/10/24,26,1,3.3.3,逻辑操作指令,3.,逻辑异或指令,XRL,XRL A,Rn ;A,A,Rn,XRL A,direct ;A,A,(direct),XRL A,Ri ;A,A,(Ri),XRL A,#data ;A,A,data,XRL direct,A ;(direct),(direct),A,XRL direct,#data ;(direct),(direct),data,2026/10/24,28,1,4.,清零和求反指令,(1),清零指令:,CLR A ;A,0,(2),求反指令:,CPL A ;A,2026/10/24,29,1,3.3.4,控制转移指令,1.,无条件转移指令,1),无条件长转移指令,LJMP,指令格式:,LJMP addr16;PC,PC+2;PC,addr16,可以转移到程序存储器,64KB,空间的任意位置,缺点是:执行时间长,字节数多。,2),无条件绝对转移指令,AJMP,指令格式:,AJMP addr11;PC10,0,addr11,当前位置,2KB,范围以内转移,2026/10/24,31,1,1.,无条件转移指令,3),无条件相对转移指令,SJMP,指令格式:,SJMP rel;PC,PC+2;PC,PC+rel,转移范围为,-128,+127,HERE,:,SJMP HERE,或,SJMP$,4),无条件散转指令,JMP,指令格式:,JMP A+DPTR;PC,A+DPTR,2026/10/24,32,1,2.,条件转移指令,1),累加器,A,判零条件转移指令,判,0,指令,JZ,:,JZ rel ;PC,PC+2,;,若,A=0,则,PC,PC+rel;,否则,顺次执行下一条指令,判非,0,指令,JNZ,:,JNZ rel ;PC,PC+2,;,若,A,0,则,PC,PC+rel;,否则,顺次执行下一条指令,2026/10/24,33,1,2),比较转移指令,CJNE,有四条,格式如下:,CJNE A,#data,rel ;PC,PC+3,;,若,A data,则,C=0,PC,PC+rel,转移,;,若,A data,则,C=0,PC,PC+rel,转移,;,若,Rn data,则,C=0,PC,PC+rel,转移,;,若,(Ri)(direct),则,C=0,PC,PC+rel,转移,;,若,A (direct),则,C=1,PC,PC+rel,转移,;,若,A=(direct),不转移,顺次执行下一条指令,2026/10/24,35,1,3),减,1,不为零转移指令,DJNZ,两条,格式如下:,DJNZ Rn,rel ;PC,PC+2,Rn,Rn-1,;,若,Rn,0,PC,PC+rel,转移,;,否则,顺次执行下一条指令,DJNZ direct,rel;PC,PC+2,(direct),(direct)-1,;,若,(direct),0,PC,PC+rel,转移,;,否则,顺次执行下一条指令,2026/10/24,36,1,3.,子程序调用及返回指令,1),长调用指令,指令格式:,LCALL addr16;PC,PC+3,;SP,SP+1,;,(,SP,),PC,7,0,;SP,SP+1,;,(,SP,),PC,15,8,;PC,addr16,转移到子程序去执行,2026/10/24,37,1,2),绝对调用指令,指令格式:,ACALL addr11;PC,PC+2,;SP,SP+1,;(SP),PC,7,0,;SP,SP+1,;(SP),PC,15,8,;PC,10,0,addr11,转移到子程序去执行,2026/10/24,38,1,3),子程序返回指令,指令格式:,RET ;PC,PC+1,;PC,15,8,(SP),;SP,SP-1,;PC,7,0,(SP),;SP,SP 1;,返回执行调用指令的下一条指令,2026/10/24,39,1,3),中断返回指令,指令格式:,RETI;PC,PC+1,;PC,15,8,(SP),;SP,SP-1,;PC,7,0,(SP),;SP,SP 1;,返回执行中断断点位置的下一条指令,返回前先清除中断的优先级触发器,2026/10/24,40,1,3.3.5,位操作类指令,1.,位传送指令,MOV,MOV C,,,bit;C,(bit),MOV bit,,,C;(bit),C,2.,位逻辑操作指令,1),位清,0,CLR C;C,0,CLR bit;(bit),0,2),位置,1,SETB C;C,1,SETB bit(bit),1,2026/10/24,41,1,2.,位逻辑操作指令,3),位取反,CPL C;C,/C,CPL bit;(bit),(bit),4),位与,ANL C,bit;C,C,(bit),ANL C,/bit;C,C,(/bit),5),位或,ORL C,bit;C,C,(bit),ORL C,/bit;C,C,(/bit),2026/10/24,42,1,3.,位转移指令,1),以,C,为条件的位转移指令,JC rel;PC,PC+2,;,若,C=1,PC,PC+rel,转移,;,否则,顺次执行下一条指令,JNC rel;PC,PC+2,;,若,C=0,PC,PC+rel,转移,;,否则,顺次执行下一条指令,2026/10/24,43,1,2),以,bit,为条件的位转移指令,JB bit,rel;PC,PC+3,;,若,(bit)=1,PC,PC+rel,转移,;,否则,顺次执行下一条指令,JNB bit,rel;PC,PC+3,;,若,(bit)=0,PC,PC+rel,转移,;,否则,顺次执行下一条指令,JBC bit,rel;PC,PC+3,;,若,(bit)=1,PC,PC+rel,且,(bit),0,转移,;,否则,顺次执行下一条指令,4.,空操作指令,NOP,NOP ;PC,PC+1,2026/10/24,44,1,3.4 51单片机汇编程序设计概述,3.4.1 51,单片机汇编程序设计过程,(,1,)明确课题的具体内容,对程序功能、运算精度、执行速度等方面的要求及硬件条件。,(,2,)把复杂问题分解为若干个模块,确定各模块的处理方法,画出程序流程图,(,简单问题可以不画,),。对复杂问题可分别画出分模块流程图和总的流程图。,(,3,)存储器资源分配,如各程序段的存放地址、数据区地址、工作单元分配等。,(,4,)编制程序,根据程序流程图精心选择合适的指令和寻址方式来编制源程序。,(,5,)对程序进行汇编、调试和修改。将编制好的源程序进行汇编,检查修改程序中的错误,执行目标程序,对程序运行结果进行分析,直至正确为止。,2026/10/24,45,1,3.4.2 51,单片机汇编程序常用伪指令,1.ORG,伪指令,格式:,ORG addr ;,通常用十六进制数表示地址,2.DB,伪指令,格式:,标号,:DB,项或项表,3.DW,伪指令,格式:,标号,:DW,项或项表,2026/10/24,46,1,4.DS,伪指令,格式:,标号,:DS,数值表达式,5.EQU,伪指令,格式:,符号,EQU,项,6.DATA,伪指令,格式:,符号,DATA,直接字节地址,2026/10/24,47,1,7.XDATA,伪指令,格式:,符号,XDATA,直接字节地址,8.BIT,伪指令,格式:,符号,BIT,位地址,9.END,伪指令,格式:,END,2026/10/24,48,1,3.5 51单片机常用汇编程序设计,3.5.1,数据传送程序,【例,3-18,】,把片内,RAM,的,30H,3FH,的,16,个字节的内容传送到片外,RAM,的,1000H,单元位置处。,2026/10/24,49,1,程序如下:,ORG 0000H,LJMP MAIN,ORG,1000H,MAIN:MOV R2,#16,MOV R0,#40H,MOV DPTR,#2000H,LOOP:MOV A,R0;R0,DPTR,MOVX DPTR,A,INC R0,INC DPTR,DJNZ R2,LOOP,SJMP$,END,2026/10/24,50,1,3.5.2,运算程序,【例,3-20,】,两个两字节无符号数相乘,其中:被乘数的高字节放在,R7,中,低字节放在,R6,中;乘数的高字节放在,R5,中,低字节放在,R4,中。乘得的积有,4,个字节,按由低字节到高字节的次序存于片内,RAM,中以,ADDR,为首地址的区域中。,R3,R2,R1,R0,2026/10/24,51,1,程序如下:,ORG 0000H,LJMP MAIN,ORG 0100H,MAIN:MOV R0,#ADDR,MUL1:MOV A,R6,MOV B,R4,MUL AB ;R6,R4,结果的低字节直接存入积的第一字节单元,MOV R0,A ;,结果的高字节存入,R3,中暂存起来,MOV R3,B,MUL2:MOV A,R7,MOV B,R4,MUL AB ;R7,R4,结果的低字节与,R3,相加后,再存入,R3,中,ADD A,R3,MOV R3,A,MOV A,B ;,结果的高字节加上进位位后存入,R2,中暂存起来,ADDC A,#00,MOV R2,A,2026/10/24,52,1,MUL3:MOV A,R6,MOV B,R5,MUL AB ;R6,R5,结果的低字节与,R3,相加存入积的第二字节单元,ADD A,R3,INC R0,MOV R0,A,MOV A,R2,ADDC A,B ;,结果的高字节加,R2,再加进位位后,再存入,R2,中,MOV R2,A,MOV A,#00,ADDC A,#00 ;,相加的进位位存入,R1,中,MOV R1,A,MUL4:MOV A,R7,MOV B,R5,MUL AB ;R7,R5,结果的低字节与,R2,相加存入积的第三字节单元,ADD A,R2,INC R0,MOV R0,A,MOV A,B,ADDC A,R1 ;,结果的高字节加,R1,再加进位位后存入积的第四字节单元,INC R0,MOV R0,A,SJMP$,END,2026/10/24,53,1,3.5.3,代码转换程序,【例,3-22,】,一位十六进制数转换成,8,段式数码管共阴极显示码。设数放在,R2,中,查得的显示码也放于,R2,中。,1,)用,MOVC A,,,A+DPTR,构造的查表程序段:,ORG 0200H,CONVERT:,MOV DPTR,#TAB ;DPTR,指向表首地址,MOV A,R2 ;,转换的数放于,MOVC A,A+DPTR ;,查表指令转换,MOV R2,A,RET,TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,DB 7FH,67H,77H,7CH,39H,5EH,79H,71H ;,显示码表,2026/10/24,54,1,2,)用“,MOVC A,,,A+PC”,构造的查表程序段:,ORG 0200H,CONVERT:MOV A,R2 ;,转换的数放于,ADD A,#03H;,加查表指令相对于表首的位移量,MOVC A,A+PC ;,查表指令转换,MOV R2,A,RET,TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,DB 7FH,67H,77H,7CH,39H,5EH,79H,71H ;,显示码表,2026/10/24,55,1,3.5.4 分支程序,1.,一般分支程序,【例,3-23,】,从片外,RAM,的,1000H,单元开始放了,200,个英文符号,要求统计它们当中字符“,A,”的个数,放于,R7,中。,程序段如下:,ORG 0000H,LJMP MAIN,ORG 0100H,MAIN:MOV R2,#200,MOV DPTR,#1000H,MOV R7,#0,LOOP:MOVX A,DPTR,CJNE A,#41H,NEXT,INC R7,NEXT:INC DPTR,DJNZ R2,LOOP,SJMP$,END,2026/10/24,56,1,2.,多分支程序,JMP A+DPTR,实现多分支程序过程如下:,先用无条件转移指令,(,“,AJMP,”或“,LJMP,”,),按顺序构造一个转移指令表,通过转移指令表中的指令可转移到各个分支。,将转移指令表的首地址装入,DPTR,中,用分支信息形成变址装入累加器,A,。,执行多分支转移指令,JMP A+DPTR,实现转移。,2026/10/24,57,1,【例,3-24,】,现有,10,路分支,分支号分别为,0,9,,要求根据,R2,中的分支号转向各个分支的程序。,程序段如下:,ORG 1000H,MOV A,R2,RL A;,分支信息乘,2,形成变址值放入累加器,A,MOV DPTR,#TAB ;DPTR,指向转移指令表的首地址,JMP A+DPTR;,转向形成的散转地址,RET,TAB:AJMP OPR0 ;,转移指令表,AJMP OPR1,AJMP OPR9,OPR0,:,OPR1,:,OPR9,:,2026/10/24,58,1,3.5.5 延时程序,【例,3-25,】,下面是延时,500us,的程序,设系统时钟频率,12MHZ,。,DEL500us,:,MOV R7,,,#124;1,个机器周期,NOP;1,个机器周期,LOOP,:,NOP;1,个机器周期,NOP;1,个机器周期,DJNZ R7,,,LOOP;2,个机器周期,RET;2,个机器周期,系统时钟频率,12MHZ,,机器周期,1us,。延时时间计算如下:,延时时间,=1+1+124,(1+1+2)+2,1us=500us,2026/10/24,59,1,习,题,2,、,3,、,5,、,6,、,7,、,9,、,10,、,12,2026/10/24,60,1,
展开阅读全文