资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,信息科学与工程学院自动化系,第三章,MCS-51,单片机指令系统,本章是全书的重点之一,是汇编语言程序设计的基础。,学习指令系统重点要掌握以下几点:,1、指令功能,2、寻址方式,3、操作数的位数和存储结构,4、对,PSW,的影响,5、,指令与存储区的对应关系,6、各类指针及其指向的地址范围,7、转移指令的转移范围,8、指令字节数和机器周期数,本章主要介绍单片机的寻址方式及指令系统,,是必须掌握的内容。,一台计算机所有指令的集合,,称为该计算机的,指令系统。,各种计算机都有专用的指令系统。,第三章 单片机的指令系统,3.1,MCS-51,指令系统概述,3.2,寻址方式,3.3,MCS-51,单片机的指令系统,3.1,MCS-51,指令系统概述,3.1.1,指令格式,3.1.2,指令字长和指令周期,3.1.3,指令分类,汇编语言,指令格式,机器语言,指令格式,3.1.1 指令格式,一条用助记符表示的汇编语言指令,操作码,操作数,指令的功能,指令的操作对象,ADD A,#10H ;ADD,为操作码,,A,及#10,H,为操作数,汇编语言指令,汇编语言指令格式,标号:操作码助记符,目的,操作数,,,源,操作数,;注释,例如:,Loop:MOV A,R0;(R0)-(A),机器语言指令格式,双字节:,单字节:,操作码,操作码,操作数或寻址方式,操作码,操作数或寻址方式,三字节:,操作码,操作数或寻址方式,操作数或寻址方式,例:,ADD A,#10H,或,指令字长有三种:,单字节,RET,双字节,MOV A,#68H,三字节,MOV 30H,46H,3.1.2 指令字长和指令周期,指令周期是指执行一条指令所需要的时间,1 机器周期指令,2 机器周期指令,4 机器周期指令,P303,附录,B,3.1.3 指令分类,按指令功能分类,按指令字长分类,按指令执行时间分类,3.2,寻址方式,寻址方式:7种,寄存器寻址,直接寻址,寄存器间接寻址,立即寻址,变址间接寻址,相对寻址,位寻址,寻址方式与寻址空间,MCS-51,单片机的两个突出特点,寻址:,1、寻找操作数,2、为,PC,指针寻找目标地址,寄存器寻址,操作数存放在寄存器中,MOV,A,R0,MOV,R0,#01001111B,工作寄存器(00,H1FH),RS1 RS0,寄存器组 片内,RAM,地址 寄存器,0 0 第0组 00,H07H R0R7,0 1,第1组 08,H0FH R0R7,1 0,第2组 10,H17H R0R7,1 1,第3组 18,H1FH R0R7,SETB RS0,MOV,R3,#56H,寄存器为,R0R7,,,A,,,DPTR,,,C,例如:,MOV A,R3 ;,机器码为,0,EBH,指令功能是把当前,R3,中的操作数送累加器,A。,指令执行示意图如图33所示。设(,R3)=12H,直接寻址,指令中直接给出操作数的地址,功能最强,可访问,种地址空间,内部数据存储器地址空间():,MOV,A,00H,MOV 30H,20H,特殊功能寄存器地址空间,唯一方式,MOV A,90H,MOV A,B,位地址空间,MOV C,00H,例:,MOV A ,30H;,机器码为,E530H,指令功能是把直接地址30,H,单元的内容送累加器,A,,即(30,H)(A),如图31所示。,34H,34H,寄存器间接寻址,将指定的寄存器的内容为地址,由该地址所指定的单元内容作为操作数。,mov,A,R0,01,02,03,30,H,31H,32H,(R0)=31H,(,R0)=(31H),(A)=02H,指针,例如:,MOV A,,R1;,机器码,E7H,设(,R1)=60H,(60H)=50H,,执行结果(,A)=50H,该指令执行过程如图34所示。,立即寻址,在指令中直接给出操作数,例:,MOV A,#,7Ah;747AH,把立即数7,AH,送累加器,A,,指令执行示意图如图3-2所示。,例:,MOV DPTR,#,1234h,(DPH)=12H,(DPL)=34H,注意:,立即数前加,“#”,号,以区别直接地址。,例如:,MOV A,#30H;(A)30H,MOV A,30H;(A)(30H),变址间接寻址,基址寄存器变址寄存器的,间接寻址方式,DPTR/PC A,MOVC A,A+DPTR,(A)(DPTR)+(A),MOVC A,A+PC,(A)(PC)+(A),JMP,A+DPTR,(PC)=(A)+(DPTR),MOVC A,A+PC;83H,设执行指令之前(,A,),=50H,指令功能是把该指令,当前地址,PC,值,与,A,累加器内容相加形成操作码地址,3,F51H,,,3F51H,中的内容,37,H,送,A,累加器。,PC,当前值,相对寻址,以当前的,PC,值为基准,加上指令中给出的相对偏移量(,rel),形成有效的转移地址。,jc,Loop;,jc,Loop,Loop:,rel,l,rel,补码,-128,127,JC,rel;,40,85,H,设,rel=,85,H,Cy=1,目标地址,PC,当前值,注:85,H=10000101B(,补码)其真值为-01111011,B=-7BH,位寻址,bit,位寻址范围:,1、内部,RAM,的位寻址区,共16个单元的128位,字节地址为20,H2FH,,位地址为00,H7FH。,可用直接位地址或字节地址加位的,表示方法。,例如:,MOV C,7AH,或,MOV C,2FH.2,2、特殊功能寄存器,SFR,可供位寻址的专用寄存器共11个,实有位地址位83位。位地址有4种表达方式。,以对程序状态寄存器,PSW,辅助进位位,AC,进行操作为例:,PSW Cy,AC,F0 RS,1,RS,0,OV P,D0H,D7H D6H,D0H,1),直接使用位地址,3),单元地址加位的表示法,MOV C,,0D6H,MOV C,,0D0H.6,2),位名称表示法,4),专用寄存器符号加位的表示法,MOV C,,AC,MOV C,,PSW.6,寻址方式,寻址空间,寄存器寻址,R0R7,A、AB、CY、DPTR,直接寻址,内部,RAM 00H7FH,特殊功能寄存器,SFR,80H0FFH,内部,RAM,中20,H2FH,单元的128,个位地址,SFR,中83个有效,位地址,80,H0FFH,寄存器,间接寻址,内部,RAM 00H7FH (R0、R1、SP),外部,RAM,或外部,I/O,口 0000,H0FFFFH,(R0、R1、DPTR),立即寻址,程序存储器,基址+变址,寄间寻址,程序存储器(,A+DPTR、A+PC),寻址方式与寻址空间,1、内部数据存储器的寻址方式,1),00,H1FH,寄存器寻址 4组,R0 R7,Rn,直接寻址,direct,寄存器间接寻址,R0,R1,例,:(01,H)(02H),MOV 02H,01H ;,源寻址和目的寻址均为直接寻址,MOV,R2,01H ;,源寻址为直接寻址,目的寻址为寄存器寻址,MOV,R0,#01H,MOV 02H,R0,;,源寻址为寄存器间接寻址,,目的寻址为直接寻址,内部数据存储器与内部,I/O,口统一编址,T1,2),20,H 2FH,可,位寻址区的寻址方式,字节寻址,方式:直接寻址,direct,寄存器间接寻址,R0,R1,位寻址,:,bit,直接寻址,例:,MOV 26H,C;,位寻址 (26,H)1,位,MOV 26H,A;,字节寻址(26,H)8,位,3),30,H 7FH,数据缓冲区的寻址方式,字节寻址,方式:直接寻址,direct,寄存器间接寻址,R0,R1,例:,MOV 56H,A;,字节寻址(56,H)8,位,MOV R0,#66H,MOV R0,#56H,可以将用户堆栈设在该区内,堆栈指针,SP,2、,SFR,及,I/O,口的操作,只能直接寻址,例:,P1,口 90,H,MOV A,90H,MOV A,P1,MOV P1,A,3、,关于,A,累加器有两种寻址方式:,MOV,A,#23H ;A,寄存器寻址,PUSH,ACC,POP,0E0H,;,直接寻址,统一编址,4、可做片内,RAM,的指针有:,R0,R1,,四个组共有8个,预先设置,RS1、RS0,,以选定组。,SETB RS0,CLR RS1;1,组,MOV R0,#34H ;R0,的地址是?,SETB RS1 ;3,组,MOV R0,#68H ;R0,的地址是?,R0/R1,指向的地址范围:00,H7FH,片外数据存储区和外部扩展的,I/O,口的寻址方式,指针:,R0,R1 8,位,DPTR 16,位,指令助记符:,MOVX,例:,MOV DPTR,#2000H,MOV A,#34H,MOVX,DPTR,A,MOV,P2,#20H,MOV,R0,#00H,MOV A,#34H,MOVX R0,A,外部数据存储器的地址,或,I/O,口的地址 16位,只能寄存器间接寻址,高8位地址,低8位地址,统一编址,R0/R1,指向的地址范围:,00,H0FFH,T2,3.3,MCS-51,单片机的指令系统,指令描述符号简介,指令分类:,数据传送类指令,(29),传送类指令举例,算术运算类指令,(24),逻辑运算类指令,(24),控制转移类指令,(17),布尔处理类指令,(17),指令描述符号(1),P30,Rn,-R0R7,工作寄存器,R,0,R,7,,,n=0,7,direct-,8,位直接地址,表示直接寻址方式,Ri,-,只能是,R0,或,R1,,,所以,i=0,,,1,#data-,8,位立即数,数据范围,00,H,FFH,#data16,-,16,位立即数,,数据范围,0000,H,FFFFH,addr16-,16,位目标地址,addr11-,低,11,位目标地址,指令描述符号(2),rel,8,位带符号地址偏移量,-128,127补码,bit,位地址,$,当前指令地址,数据传送,数据交换,(,X),X,单元的内容,(),以,X,单元的内容为地址的单元的内容,数据传送类指令(1)内部,A,累加器,Direct,直接,寻址,Ri,间接,寻址,Rn,寄存器,data,立即数,数据传送类指令,(2),mov,A,Rn,;(A),(,Rn,)n=07,mov,A,direct;(A),(,direct,),mov,A,Ri,;,(A),(,(,Ri,),)i=0,1,mov,A,#data;(A),#data,mov,Rn,A;(,Rn,),(A),mov,Rn,direct;(,Rn,),(,direct,),mov,Rn,#,data;,(,Rn,),#data,数据传送类指令,(3),mov,direct,A;(direct),(A),mov,direct,Rn,;(direct),(,Rn,)n=07,mov,direct,direct;(direct),(,direct,),mov,direct,Ri,;,(direct),(,(,Ri,),)i=0,1,mov,direct,#data;(direct),#data,mov,Ri,A;,(,Ri,),(A),mov,Ri,direct;(,Ri,),(,direct,),mov,Ri,#,data ;,(,Ri,),#data,MOV R1,R0,MOV R3,R0,MOV R1,R0,MOV R1,R0,数据传送类指令(4)交换指令,xch,A,Rn,;,(A),(,Rn,)n=07,xch,A,direct;(A),(,direct),xch,A,Ri,;,(A),(,(,Ri,),)i=0,1,xchd,A,Ri,;(,A,03,),(,(,Ri,),03,),swap A;(A,03,),(,A,47,),pop direct;,(direct),(sp),(sp),(sp)-1,push direct;(sp),(sp)+1,(sp),(direct),数据传送类指令(5)堆栈操作,1、堆栈 一种数据结构,是“先进后出”线性表。,2、堆栈操作:压入,PUSH,,弹出,POP,3、,堆栈区:占片内,RAM,中连续的存储单元,复位后,系统自动将,SP,指针指向07,H,用户可将堆栈区设在,30,H7FH,数据缓冲区内,,MOV SP,#5FH,堆栈有两种类型:,向,上,生长型和向,下,生长型两种,。,向上,生长型堆栈,栈底在,低地址,单元。随着数据进栈,地址递增,,SP,的内容越来越大,指针上移;反之,随着数据的出栈,地址递减,,SP,的内容越来越小,指针下移。如(,b),图所示。,栈顶,栈顶,MCS-51,属,向上,生长型堆栈,这种堆栈的操作规则如下:,进栈操作:先,SP,加1,后写入数据。,出栈操作:先读出数据,,SP,减1。,向下,生长型堆栈,栈底设在,高,地址单元。随着数据进栈,地址递减,,SP,内容越来越小,指针下移;反之,随着数据的出栈,地址递增,,SP,内容越来越大,指针上移。其堆栈操作规则与向上生长型正好相反。如(,a),图所示。,堆栈的使用有两种方式:,一种是,自动方式,,即在调用子程序或断点时,断点地址自动进栈。程序返回时,断点地址再自动弹回,PC。,这种操作无需用户干预。,另一种是,指令方式,,即使用专用的堆栈操作指令,执行进出栈操作,其进栈指令为,PUSH,,出栈指令为,POP。,例如:,保护现场就是一系列指令方式的进栈操作;,而恢复现场则是一系列指令方式的出栈操作。,需要保护多少数据由用户决定。,POP 01H,POP PSW,POP ACC,PUSH,ACC,PUSH PSW,PUSH 01H,保护现场:,恢复现场:,.,数据传送类指令,(6)外部,movx,A,Ri,;,(A),(,(,Ri,),)i=0,1,movx,A,DPTR;(A),(,DPTR,),movx,Ri,A,;(,(,Ri,),),(A),movx,DPTR,A;,(,DPTR,),(A),movc,A,A+DPTR;(A)(,(A)+(DPTR),movc,A,A+PC;(PC),(PC)+1,(A),(A)+(PC),mov,DPTR,#data16;(DPTR),#data16,内部,16位,外部数据,外部程序,传送类指令举例:,例31,已知(,R0)=30H,,问执行如下程序,,A、R4、30H,和31,H,单元的内容是什么。,MOV A,#10H,MOV R4,#36H,MOV R0,#7AH,MOV 31H,#01H,解:8031执行上述指令后的结果为:,(A)=10H,(R4)=36H,(30H)=7AH,(31H)=01H,例32,设内部,RAM,中30,H,单元的内容为40,H,40H,单元的内容为10,H,P1,口作输入口,其输入数据为0,CAH,,程序及执行后的结果如下:,MOV R0,#30H,;,单元地址30,H,送,R0,中,MOV A ,R0,;R0,间址,将30,H,单元内容送,A,MOV R1,A,;A,送,R1,MOV B,R1,;R1,间址,将40,H,单元内容送,B,MOV R1,P,1,;,将,P1,内容送40,H,单元,MOV P2,P1,;,将,P1,内容送,P2,执行结果:,(,R0)=30H,(R1)=40H,(A)=40H,(B)=10H,(P1)=0CAH (40H)=0CAH,(P2)=0CAH,例33,已知,片外,RAM,的70,H,单元中的一个数,X,,需送到,片外,RAM,的 1010,H,单元,试编写程序。,解:,ORG 1000H,MOV R0,#70H,MOV DPTR,#1010H,MOVX,A,R0,MOVX,DPTR,A,SJMP$,END,外部,RAM,之间不能直接传送数据,必须通过累加器,A,传送,MOVX DPTR,R0,例35,设(30,H)=X,(40H)=Y,,试利用堆栈区域实现30,H,和40,H,单元中的数据交换。,解:堆栈区是片内,RAM,的一个数据区,进栈和出栈的数据符合“先进后出”的原则。,MOV SP ,#50H;,设栈底(栈底不存数),PUSH 40H ;(51H)(40H),PUSH 30H ;(52H)(30H),POP 40H ;(40H)(52H),POP 30H ;(30H)(51H),没讲,例36,已知外部,RAM,20,20,H,单元中有一个数,X,,内部,RAM 20H,单元一个数,Y,,试编出可以使它们互相交换的程序。,解:,MOV P2,#,20,H,MOV R1 ,#,20,H,MOVX A ,,R1,XCH A,,R1,MOVX R1,A,SJMP$,END,指向内部,RAM,20H,单元,指向外部,RAM,2020H,单元,例37,已知片内50,H,单元中有一个09的数,,试编程把它变为相应的,ASCII,码的程序。,解:因为09的,ASCII,码为3039,H,程序如下:,MOV R0,#50H,MOV,A ,#30H,XCHD,A,R0,MOV R0,A,SJMP$,END,0 8,3 0,3 8,50,H,A,0 0,R0,例38,把01,H,单元内容送02,H,单元,有几种不同的实现方法。,MOV 02H ,01H;,直接寻址 3字节 2周期,MOV A ,01H ;,直接寻址+寄存器寻址,MOV 02H ,A,;4,字节 2周期,MOV A ,R1 ;,寄存器寻址 2字节 2周期,MOV R2 ,A,MOV R0 ,#01H;4,字节 3周期,MOV 02H ,R0;,间接寻址,PUSH 01H,;,栈操作 4字节 4周期,POP 02H,第三种方法占存储空间少,执行周期短。,算术运算类指令,程序状态字,PSW,加法指令,减法指令,乘/除指令,Cy:,进位标志;布尔累加器,AC:辅助进位标志(半进位),F0:用户标志,RS1/RS0:寄存器选择,OV:溢出标志,P:奇偶标志,程序状态字,PSW,Cy AC F0 RS1 RS0 OV -P,D7 D6 D5 D4 D3 D2 D1 D0,加法指令,不带进位的加法指令,带进位的加法指令,加 1 指令,二-十进制调整指令,不带进位的加法指令,add A,Rn,;(A)-(A)+(,Rn,),add A,direct;,(A)-(A)+(,direct,),add A,Ri,;,(A)-(A)+(,Ri,),add A,#data;,(A)-(A)+,#data,带进位的加法指令,add,c,A,Rn,;(A)-(A)+(,Rn,)+(,C,),add,c,A,direct;,(A)-(A)+(,direct,)+(,C,),add,c,A,Ri,;,(A)-(A)+(,Ri,)+(,C,),add,c,A,#data;,(A)-(A)+,#data,+(,C,),举例,加 1 指令,inc A ;(A),(A)+1,inc,Rn,;(,Rn,),(,Rn,)+1,inc direct ;(direct),(,direct,)+1,inc,Ri,;(,Ri,),(,Ri,),)+1,二-十进制调整指令,DA A,调整原则:,形式上非,BCD,码 需要加 06,H、60H、66H,调整,形式上是,BCD,码时:,CY AC,调整原则,0 0,不调整,0 1 +06,H,1 0 +60H,1 1 +66H,举例,:,BCD,码加法,减法指令,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)=,源,字节则(,C)=0;,若目的字节,源,字节则(,C)=1。,相等则继续执行。,cjne,A,direct,rel;,cjne,A,#data,rel;,cjne Rn,#data,rel;,cjne,Ri,#data,rel,循环转移指令,格式:,djnz,Rn,rel;rel:8,位相对偏移量,功能,:(,PC),(PC)+2,(,Rn,)(,Rn,)-1,IF(,Rn,)0 THEN,(PC),(PC)+rel ELSE go on,格式:,djnz,direct,rel;rel:8,位相对偏移量,功能,:(,PC),(PC)+3,IF(direct)0 THEN,(PC),(PC)+rel ELSE go on,子程序调用与返回指令,绝对调用指令,acall,addr11;(PC),(PC)+2,(SP)(SP)+1,(SP),(PC,07,),(SP)(SP)+1,(SP),(PC,815,),(PC,010,),addr11,(PC,1115,),不变,lcall,addr16,返回指令,ret;(PC,815,),(SP),(SP)(SP)-1,(PC,07,),(SP),(SP)(SP)-1,举例:,子程序调用与返回指令,举例,ORG 0000H,Start:,mov,A,#0,acall,Sub1,mov,A,#0,lcall,Sub2,sjmp,$,Su,b1,:inc A,ret,Sub2:,dec,A,ret,END,例315,设20,H21H,单元存放一个16位二进制数,X1(,高8位存于21,H,单元),30,H31H,单元存放另一个16位二进制数,X2(,高8位存于31,H,单元)。求,X1+X2 ,,和存于20,H21H,设两数之和不超过16位。,解:,ORG 2000H,MOV R0 ,#20H,MOV R1 ,#30H,MOV A ,R0;,取被加数低8位,ADD,A ,R1;,求和的低8位,MOV R0,A ;,存和的低8位,INC R0 ;,指向被加数高8位,INC R1 ;,指向加数高8位,MOV A ,R0 ;,取被加数高8位,ADDC,A,R1 ;,求和的高8位,MOV R0,A ;,存和的高8位,SJMP$;,停机,END,运算结果,高8位存于21,H,单元,,低8位存于20,H,单元。,(,21,H)(20H),+(31H)(30H),Cy(21H)(20H),ADDC ADD,例316,试分析执行以下程序后,各有关单元的结果。,MOV R1,#7FH,MOV 7EH,#00H,MOV 7FH,#40H,DEC R1,DEC R1,DEC R1,执行结果:(,R1)=7EH (7EH)=0FFH,(7FH)=3FH,例320,利用,DA,指令作十进制加法调整。两个用单字节压缩,BCD,码表示的十进制数相加,借位标志存入,C,累加器。设20,H、21H、22H,分别存放被加数、加数以及和。,解:,ORG 2000H,MOV A,20H ;(A),取被加数,ADD A ,21H ;(A),被加数+加数,DA A ;,进行调整,L1:MOV 22H,A ;,存结果,SJMP$,;,停机,END,关于rel,机器语言中:,rel,是-128,+127内的补码,汇编语言中:,rel,的书写形式,1、,jc,loop ;loop,使目标地址,2、,jc,$-5 ;$-5,也代表目标地址,3、,jc,-5 ;,是相对偏移量,4、,jc,+5 ;,5、,jc,85H ;,第三章结束,
展开阅读全文