第3章80C51系列单片机指令系统本章要点80C51指令的基本格式80C51指令功能分类指令系统中的常用符号80C51指令系统的七种寻址方式数据传送类指令算术运算类指令逻辑运算及移位指令位操作类指令控制转移类指令51系列单片机指令集含有111条指令每条指令在执行时要花去一定的时间,以机器周期为单位。按指令执行时间分类:单周期(64条);双周期(45条);4周期(2条)按指令的功能分类,可分为5大类:数据传送类(29条);算术运算类(24条)逻辑运算及移位类(24);控制转移类(17条)位操作类(17条)每条指令在程序存储器ROM中占据一定的空间,以字节为单位。按指令所占字节数分类:单字节(49条);双字节(46条);3字节(16条)§3-1指令系统基本概念标号:操作码操作数;注释3.1.1指令基本格式方括符[]表示可选项标号代表指令所在地址,1-8个字母/数字,“:”结尾[标号:]操作码[目的操作数][,源操作数][;注释]START:MOVA,#30H;将立即数30H传送至A中MOVDPTR,#5678H;将立即数5678H传送至DPTR⑴标号:指令的符号地址。①用于一段功能程序的识别标记或控制转移地址。②指令前的标号代表该指令的地址,是用符号表示的地址。③一般用英文字母和数字组成。④标号必须用冒号“:”与操作码分隔。⑵操作码:表示指令的操作功能。①操作码用助记符表示,它代表了指令的操作功能。②操作码是指令的必需部分,是指令的核心,不可缺少。⑶操作数:参加操作的数据或数据地址。⑤操作数与操作码之间用空格分隔,操作数与操作数之间用逗号“,”分隔。①操作数可以是数据,也可以是数据的地址、数据地址的地址或操作数的其他信息。②操作数可分为目的操作数和源操作数。③操作数可用二进制数、十进制数或十六进制数表示。④操作数的个数可以是0~3个。⑷注释:指令功能说明。①注释属于非必需项,是为便于阅读,对指令功能作的说明和注解。②注释必须以“;”开始。3.1.2指令分类⑶按指令功能分类:可分为数据传送类、算术运算类、逻辑运算类、位操作类和控制转移类等5大类指令。80C51共有111条指令。⑴按指令长度分类:可分为1字节、2字节和3字节指令。⑵按指令执行时间分类:可分为1机周、2机周和4机周指令。3.1.3指令系统中的常用符号⑹bit:位地址。SETBACC.7代表片内RAM中的可寻址位00H~7FH及SFR中的可寻址位。⑴#:立即数符。MOVA,#30H#data:8位立即数;#data16:16位立即数。⑵direct:8位直接地址MOVA,3AH代表内RAM00H~7FH或SFR的80H~FFH。⑶@:间接寻址符。MOVA,@R0如@Ri,@DPTR,@A+PC,@A+DPTR。⑷addr11:11位目的地址。addr16:16位目的地址。⑸rel:带符号的8位偏移地址。SJMPrel用于转移指令,其范围是相对于下一条指令第1字节地址的-128~+127个字节。3.1.4寻址方式寻址就是寻找操作数的地址。七种寻址方式,一条指令可能含多种寻址方式立即寻址直接寻址寄存器寻址寄存器间接寻址变址寻址(基址寄存器+变址寄存器间接寻址)相对寻址位寻址【例】⒈立即寻址立即寻址是直接给出操作数,操作数前有立即数符“#”。MOVA,#30H;将立即数30H传送至A中MOVDPTR,#5678H;将立即数5678H传送至DPTRADDA,#05H;(A)←(A)+立即数05H注意:符号“#”表明其后跟的是立即数,立即数——就是数字量本身。⒉直接寻址MOVA,3AH;将内RAM3AH单元中的数据传送至A中MOVA,P0;将特殊功能寄存器P0口中的数据传送至A中说明:3AH和P0是以direct形式出现的直接地址访问特殊功能寄存器SFR只能采用直接寻址方式。直接寻址是给出操作数的直接地址。直接寻址范围为内RAM128B和特殊功能寄存器。【例】⒊寄存器寻址MOVA,R0;将R0中的数据传送至A中INCAMULAB从寄存器中读取操作数或存放操作数进寄存器寄存器寻址的操作数在规定的寄存器中。规定的寄存器有:①工作寄存器R0~R7②累加器A③双字节AB④数据指针DPTR⑤位累加器Cy这些被寻址寄存器中的内容就是操作数【例】⒋寄存器间接寻址MOVA,@R0;将以R0中内容为地址的存储单元中的数据传送至A中MOVXA,@DPTR;将外RAMDPTR所指存储单元中的数据传送至A中PUSHPSW;将PSW中数据传送至堆栈指针SP所指的存储单元中MOV@R1,#0FH;(30H)←立即数0FH寄存器中的内容是一个地址,由该地址单元寻址到所需的操作数。间接寻址用间址符“@”作为前缀。【例】注意:1)“间接”表示某寄存器中的“内容”只是一个“单元地址”,这个地址单元中存放的数据才是要找的“操作数”。2)符号“@”表示“在…”,其含义与读音皆同“at”。⒌变址寻址MOVCA,@A+DPTR【例】在变址寻址中,操作数地址=基址+变址用于读ROM数据操作。;将A的内容与DPTR内容相加,得到一个新地址,从该地址ROM中读取数据送入A中。以16位的地址指针寄存器DPTR或16位的PC寄存器为基址寄存器,以累加器A为变址寄存器,两者中的“内容”形成一个16位的“地址”,该“地址”所指的存储单元中的内容才是操作数。MOVCA,@A+PC;A(A+PC)当前PC值加上指令中规定的偏移量rel,构成实际的操作数地址例:SJMPrel操作:跳转到的目的地址=当前16位PC值+rel⒍相对寻址注意:1)“当前PC值”指程序中下一条指令所在的首地址,是一个16位数;2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128—+127(80H—7FH)在实际编程中,“rel”通常用标号代替在实际编程中,“rel”通常用标号代替例:SJMPLOOP1例:2000H:SJMP08H;原PC值为2000H;执行这条指令后的当前PC值为2002H,rel为08H。2002H+08H=200AH,转移目的地址为200AH,程序就跳转至200AH去执行了。右图为SJMP08H相对寻址示意图。;将位地址07H(字节地址20H中最高位)中的数据传送至进位位Cy。⒎位寻址位寻址是对内RAM和特殊功能寄存器中的可寻址位进行操作的寻址方式。MOVC,07H指令中直接给出了操作数所在的位地址。例:CLRP1.0;(P1.0)←0SETBACC.7;(ACC.7)←1CPLC;(C)←NOT(C)注意:1)位地址里的数据只可能是一个0或12)有的位地址十分明确,如P1.0,ACC.7等,有的位地址则“不太明确”,如:MOVA,17H;(A)←(17H),17H是字节地址MOVACC.0,17H;(ACC.0)←(17H),这里ACC.0是位地址所以该指令中的17H是22H单元的第7位§3-2指令系统功能分五类,共111条指令数据传送类指令算术运算类指令逻辑运算及移位指令位操作类指令控制转移类指令①MOVA,Rn;Rn→A,n=0~7②MOVA,@Ri;(Ri)→A,i=0、1③MOVA,direct;(direct)→A④MOVA,#data;data→A3.2.1数据传送类指令⒈内RAM数据传送指令⑴以累加器A为目的字节的传送指令(4条)【例3-1】若R0=40H,(30H)=60H,(40H)=50HMOVA,R0;将工作寄存器R0中的数据传送至A中,A=40HMOVA,@R0;将以R0中内容为地址的存储单元中的数据送至A中A=50HMOVA,30H;将直接地址30H存储单元中的数据传送至A中,A=60HMOVA,#30H;将立即数#30H送入A中,A=30H①MOVRn,A;A→Rn,n=0~7②MOVRn,direct;(direct)→Rn,n=0~7③MOVRn,#data;data→Rn,n=0~7⑵以工作寄存器Rn为目的字节的传送指令(3条)⑶以直接地址为目的字节的传送指令(5条)①MOVdirect,A;A→(direct)②MOVdirect,Rn;Rn→(direct),n=0~7③MOVdirect,@Ri;(Ri)→(direct),i=0、1④MOVdirect1,direct2;(direct2)→(direct1)⑤MOVdirect,#data;data→(direct)⑷以寄存器间址为目的字节的传送指令(3条)①MOV@Ri,A;A→(Ri),i=0、1②MOV@Ri,direct;(direct)→(Ri),i=0、1③MOV@Ri,#data;data→(Ri),i=0、1⒉16位数据传送指令MOVDPTR,#data16;data16→DPTR【例】MOVDPTR,#1234H;DPTR=1234H该指令也可以用两条8位数据传送指令实现:MOVDPH,#12H;DPH=12HMOVDPL,#34H;DPL=34H,DPTR=1234H①MOVXA,@Ri;(Ri)→A,i=0、1②MOVXA,@DPTR;(DPTR)→A③MOVX@Ri,A;A→(Ri),i=0、1④MOVX@DATR,A;A→(DATR)⒊外RAM传送指令(4条)⒋读ROM指令(2条)内RAM(包括特殊功能寄存器):用MOV指令传送;外RAM:用MOVX指令传送;ROM:用MOVC指令传送。①MOVCA,@A+DPTR;(A+DPTR)→A②MOVCA,@A+PC;PC+1→PC,(A+PC)→A三个不同的存储空间用三种不同的指令传送:【例3-9】按下列要求传送数据:设ROM(2000H)=ABH(1)ROM2000H单元数据送内RAM10H单元;(2)R0M2000H单元数据送外RAM80H单元;(3)ROM2000H单元数据送外RAM1000H单元;解(1):MOVDPTR,#2000H;置基址2000H,DPTR=2000HMOVA,#00H;置变址0,A=00HMOVCA,@A+DPTR;读ROM2000H,A=ABHMOV10H,A;存内RAM10H单元,(10H)=ABH解(2):MOVDPTR,#1FFFH;置基址1FFFH,DPTR=1FFFHMOVA,#01H;置变址01H,A=01HMOVCA,@A+DPTR;读ROM2000H,A=ABHNOVR0,#80H;置外RAN间址,R0=80HMOVX@R0,A;写外RAM80H,外RAM(80H)=ABH解(3):MOVDPTR,#2000H;置基址2000H,DPTR=2000HMOVA,#00H;置变址0,A=00HMOVCA,@A+DPTR;读ROM2000H,A=ABHMOVDPH,1OH;修改外RAN地址,DPTR=1000HMOVX@DPTR,A;写外RAM1000H,外RAM(1000H)=ABH【例3.10】已知ROM中存有0~9的平方表,首地址为2000H,试根据累加器A中的数值查找对应的平方值,存入内RAM30H。(设A=3)解:若用DPTR作为基址寄存器,可编程如下:1000H:MOVDPTR,#2000H;置ROM平方表首地址MOVCA,@A+DPTR;A+2000H=2003H(设A=3),;A=(2003H)=09HMOV30H,A;平方值存入内RAM30H中…………2000H:00H;平方表:02=02001H:01H;12=12002H:04H;22=42003H:09H;32=92004H:10H;42=16,16=10H…………2009H:51H;92=81,81=51H①PUSHdirect;SP+1→SP,(direct)→(SP)②POPdirect;(SP)→(direct),SP-1→SP⒌堆栈操作指令(2条)⑴PUSH为入栈指令例PUSH30H;(30H)=2BH,具体操作是:①先将堆栈指针SP的内容(0FH)加1,指向堆栈顶的一个空单元,此时SP=10H;②然后将指令指定的直接寻址单元30H中的数据(2BH)送到该空单元中。⑵POP为出栈指