资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,信息科学与工程学院自动化系,第三章,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及#10H为操作数,汇编语言指令,汇编语言指令格式,标号:操作码助记符,目的,操作数,,,源,操作数,;注释,例如: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,工作寄存器(00H1FH),RS1 RS0 寄存器组 片内RAM地址 寄存器,0 0 第0组 00H07H R0R7,0 1 第1组 08H0FH R0R7,1 0 第2组 10H17H R0R7,1 1 第3组 18H1FH R0R7,SETB RS0,MOV,R3,#56H,寄存器为,R0R7,,,A,,,DPTR,,,C,例如:MOV A,R3 ;机器码为,0EBH,指令功能是把当前R3中的操作数送累加器A。,指令执行示意图如图33所示。设(R3)=12H,直接寻址,指令中直接给出操作数的地址,功能最强,可访问,种地址空间,内部数据存储器地址空间():,MOV,A,00H,MOV 30H,20H,特殊功能寄存器地址空间,唯一方式,MOV A,90H,MOV A,B,位地址空间,MOV C,00H,例:MOV A ,30H;机器码为E530H,指令功能是把直接地址30H单元的内容送累加器A,即(30H)(A)如图31所示。,34H,34H,寄存器间接寻址,将指定的寄存器的内容为地址,由该地址所指定的单元内容作为操作数。,mov,A,R0,01,02,03,30H,31H,32H,(R0)=31H,(R0)=(31H),(A)=02H,指针,例如:MOV A,,R1;,机器码,E7H,设(R1)=60H,(60H)=50H,执行结果(A)=50H,该指令执行过程如图34所示。,立即寻址,在指令中直接给出操作数,例:MOV A,#,7Ah;747AH,把立即数7AH送累加器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,累加器内容相加形成操作码地址,3F51H,,,3F51H,中的内容,37H,送,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当前值,注:85H=10000101B(补码)其真值为-01111011B=-7BH,位寻址 bit,位寻址范围:,1、内部RAM的位寻址区,共16个单元的128位,字节地址为20H2FH,位地址为00H7FH。可用直接位地址或字节地址加位的,表示方法。,例如:MOV C,7AH,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,,2)位名称表示法 4)专用寄存器符号加位的表示法,MOV C,,AC,MOV C,,寻址方式,寻址空间,寄存器寻址,R0R7,A、AB、CY、DPTR,直接寻址,内部RAM 00H7FH,特殊功能寄存器,SFR,80H0FFH,内部RAM中20H2FH单元的128,个位地址,SFR中83个有效,位地址,80H0FFH,寄存器,间接寻址,内部RAM 00H7FH (R0、R1、SP),外部RAM或外部I/O口 0000H0FFFFH,(R0、R1、DPTR),立即寻址,程序存储器,基址+变址,寄间寻址,程序存储器(A+DPTR、A+PC),寻址方式与寻址空间,1、内部数据存储器的寻址方式,1),00H1FH,寄存器寻址 4组,R0 R7 Rn,直接寻址,direct,寄存器间接寻址,R0,R1,例,:(01H)(02H),MOV 02H,01H ;源寻址和目的寻址均为直接寻址,MOV,R2,01H ;源寻址为直接寻址,目的寻址为寄存器寻址,MOV,R0,#01H,MOV 02H,R0,;,源寻址为寄存器间接寻址,,目的寻址为直接寻址,内部数据存储器与内部I/O口统一编址,T1,2),20H 2FH 可位寻址区的寻址方式,字节寻址,方式:直接寻址 direct,寄存器间接寻址R0,R1,位寻址,:bit 直接寻址,例:MOV 26H,C;位寻址 (26H)1位,MOV 26H,A;字节寻址(26H)8位,3),30H 7FH 数据缓冲区的寻址方式,字节寻址,方式:直接寻址 direct,寄存器间接寻址R0,R1,例:MOV 56H,A;字节寻址(56H)8位,MOV R0,#66H,MOV R0,#56H,可以将用户堆栈设在该区内,堆栈指针SP,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指向的地址范围:00H7FH,片外数据存储区和外部扩展的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指向的地址范围:,00H0FFH,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指针指向07H,用户可将堆栈区设在,30H7FH,数据缓冲区内,,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和31H单元的内容是什么。,MOV A,#10H,MOV R4,#36H,MOV R0,#7AH,MOV 31H,#01H,解:8031执行上述指令后的结果为:,(A)=10H,(R4)=36H,(30H)=7AH,(31H)=01H,例32,设内部RAM中30H单元的内容为40H,40H单元的内容为10H,P1口作输入口,其输入数据为0CAH,程序及执行后的结果如下:,MOV R0,#30H ;单元地址30H送R0中,MOV A ,R0 ;R0 间址,将30H单元内容送A,MOV R1,A ;A送R1,MOV B,R1,;R1间址,将40H单元内容送B,MOV R1,P,1,;将P1内容送40H单元,MOV P2,P1 ;将P1内容送P2,执行结果:,(R0)=30H,(R1)=40H,(A)=40H,(B)=10H,(P1)=0CAH (40H)=0CAH,(P2)=0CAH,例33,已知,片外,RAM 的70H单元中的一个数X,需送到,片外,RAM的 1010H单元,试编写程序。,解:ORG 1000H,MOV R0,#70H,MOV DPTR,#1010H,MOVX,A,R0,MOVX,DPTR,A,SJMP$,END,外部RAM之间不能直接传送数据,必须通过累加器A传送,MOVX DPTR,R0,例35,设(30H)=X,(40H)=Y,试利用堆栈区域实现30H和40H单元中的数据交换。,解:堆栈区是片内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,已知片内50H单元中有一个09的数,,试编程把它变为相应的ASCII码的程序。,解:因为09的ASCII码为3039H,程序如下:MOV R0,#50H,MOV A ,#30H,XCHD,A,R0,MOV R0,A,SJMP$,END,0 8,3 0,3 8,50H,A,0 0,R0,例38,把01H单元内容送02H单元,有几种不同的实现方法。,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,加法指令,减法指令,乘/除指令,加法指令,不带进位的加法指令,带进位的加法指令,加 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$,Sub1,:inc A,ret,Sub2:dec A,ret,END,例315,设20H21H单元存放一个16位二进制数X1(高8位存于21H单元),30H31H单元存放另一个16位二进制数X2(高8位存于31H单元)。求X1+X2 ,和存于20H21H设两数之和不超过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位存于21H单元,,低8位存于20H单元。,(21H)(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累加器。设20H、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 ;,第三章结束,
展开阅读全文