第3章 8051指令系统.ppt_第1页
第3章 8051指令系统.ppt_第2页
第3章 8051指令系统.ppt_第3页
第3章 8051指令系统.ppt_第4页
第3章 8051指令系统.ppt_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章MCS-51单片机指令系统,1学习目的(1)掌握指令格式及表示方法:助记符表示和机器码表示。(2)了解寻址方式的概念。(3)掌握常用指令的功能及应用。,2问题引入,MOVP1,#55H,MOVP1,55H,请比较以上两条指令执行后P1口的状况?为什么?,往P1口传送数据的指令中,数据的来源不尽相同。数据是指令的操作对象,叫做操作数。指令必须给出操作数所在的地方,才能进行数据传送。寻找操作数地址的方法,称为寻址方式。,寻找操作数到底有多少种方式呢?,第一节指令系统简介,指令按字节长度可以分为三种:,例如:MOVA,R0,例如:MOVA,30H,例如:MOVDPTR,#2010H,伪指令,伪指令:也称汇编命令,仅提供汇编控制信息,不产生机器语言指令。如ORG、END、EQU、DB、DW、DS、BIT、,指定其后面的程序或数据块存放的起始地址,位地址符号,功能是把BIT之后的位地址附给字符名。如A1BITP1.0,定义字。该命令把DW后的数据按16位从当前地址存放。,定义字节。该命令把DB后的数据按8位从当前地址存放。,例如:ORG1000HSTART:MOVA,12HORG伪指令通知汇编程序,从START开始的程序段,其起始地址由1000H开始。由于1000H是立即数型地址码,所以还隐含地指明该程序段是绝对地址段。,EQU(EQUate)赋值伪指令指令格式为:标号EQU表达式其作用是把表达式赋值于标号,这里的标号和表达式是必不可少的。例如:LOOPEQU2002H是向汇编程序表明,标号LOOP的值为2002H。又如:LOOP1EQULOOPLOOP已赋值为2002H,则相当于LOOP1LOOP,即LOOPI也为2002H,在程序中LOOP和LOOP1可以互换使用。用EQU语句给一个标号赋值以后,在整个源程序中该标号的值是固定的,不能更改。若需更改,需用伪指令DATA重新定义。,DATA定义标号值伪指令指令格式为:DATA其含义也是说明标号等值于表达式。同样,标号和表达式是必不可少的。例如;COUNTDATA3000H;定义标号COUNT的值为3000HCOUNTDATACOUNT十1;重新定义COUNT的值为;3000HlDATA和EQU的功能都是将表达式值赋予标号,但两者有差别:可用DATA语句在同一源程序中给同一标号赋予不同的值,即可更改已定义的标号值;而用EQU语句定义的标号,在整个源程序中不能更改。,DB(DefineByte)定义字节伪指令指令格式为:标号DB表达式或表达式表其含义是将表达式或表达式表所表示的数据或数据串存入从标号开始的连续存储单元中。标号为可选项,它表示数据存储单元地址。表达式或表达式表是指一个字节或用逗号分开的字节数据。可以是用引号括起来的字符串。字符串中的字符按ASCII码存于连续的ROM中。例如:ORG2000HTABLEDB73H,04,100,32,00,-2,”ABC”表示字节串数据存入由TABLE标号为起始地址的连续存储器单元中。即从2000H存储单元开始依次连续存放数据为:73H,04H,64H,20H,00H,FEH,41H,42H,43H。,DW(DefineWord)定义字伪指令其指令格式为:标号DW表达式或表达式表其含义是把字或字串值存入由标号开始的连续存储单元中,且把字的高字节数存入低地址单元,低字节数存入高地址单元。按顺序连续存放。DW100H,3456H,814表示按顺序存入01H,00H,34H,56H,03H,2EH注:DB和DW定义的数表,数的个数不得超过80个。若数据的数目较多时,可以使用多个定义命令。一般以DB来定义数据,以DW来定义地址。,DS(DefineStorage)定义存储区伪指令BASEDS100H通知汇编程序,从标号BASE开始,保留100H个存储单元,以备源程序另用。注意,对于51单片机,DB、DW、DS等伪指令只能应用于程序存储器,而不能对数据存储器使用。,BIT位定义伪指令用于给字符名称赋予位地址。命令格式为:BIT其中,位地址可以是绝对地址,也可以是符号地址。例:ABCBITP3.1把P3.1位地址赋值给ABC,在后面的编程中,ABC即可作为位地址P3.1使用。,表达式赋值可允许汇编语言程序的指令操作数域使用表达式,例如:“ADDA,#ALFA*BETA2”,其中ALFA和BETA是两个已定义的标号。条件汇编可使用户在汇编时根据需要对源程序进行汇编,这样有利于程序的调试。特别是为用户系统(或大的应用)程序的调试带来方便。宏汇编允许用户在编写源程序时使用宏指令。一条宏指令往往包括若干条汇编语言指令,这样在使用宏指令之后可使源程序缩短,简化程序设计。在使用宏指令之前,要先对相应的寄存器赋值,否则将会得出错误的结果。,例1.伪指令应用ORG8100HBUFFERDS10HDW“AB”DW100H,1ACH,-814说明:从8100H至810FH为缓冲区空间(8110H)=41H(A)(8111H)=42H(B)8112H单元起存放01H、00H、01H、ACH、FCH、D2H,第二节寻址方式(找信方式),我的信在他那!找信去!,注:找信是寻找信的“地址”!,你能说出第二封信的“地址”吗?,目的地,#XXH,操作数,MOVP1,#55H,MOVA,#01H;ROM中,#55H,目的地,信,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,目的地,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,内部RAM或SFR区,操作数,XXH,MOVP1,20H,20H,目的地,20H,注:寻址是寻操作数的“地址”!,直接给出地址20H直接寻址,目的地,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,寄存器,目的地,操作数,XXH,MOVP1,A,寄存器,R0-R7ABDPTR,你能说出为什么叫寄存器寻址吗?,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,MOVA,R0;若R0=3AH,目的地,寄存器,操作数,3AH,内部RAM,3AH,65H,3AH,R0R1DPTR,目的地,2号,信在2号箱子里,1号,你能说出1号箱子和2号箱子分别对应内存中哪一部分吗?,寻址比较,MOVP1,R0,MOVP1,R0,MOVP1,20H,MOVP1,#20H,MOVP1,R0,寻址比较,MOVP1,R0,MOVP1,R0,MOVP1,20H,MOVP1,#20H,MOVP1,R0,寻址比较,MOVP1,R0,MOVP1,R0,MOVP1,20H,MOVP1,#20H,MOVP1,20H,寻址比较,MOVP1,R0,MOVP1,R0,MOVP1,20H,MOVP1,#20H,MOVP1,#20H,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,MOVCA,A+DPTR,目的地,寄存器,操作数,内部RAM,3AH,65H,3AH,基址寄存器12H,变址寄存器34H,ROM,46H,65H,A,DPTRPC,MOVCA,A+PC,46H,目的地,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,XXH,位寻址,操作数,2000H:SJMP$+54H,PC,+,54H,PC,2002H,2002H=2056H,PC,2056H,80,54,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,1,00000000,想一想:如果想使27H单元的第5位置1,该怎么办呢?,位寻址地址表,例:SETB3DH,3D,3C,3B,3F,3E,3A,39,38,27H,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,SETB3DH,0000000,1,0,位寻址,位操作指令中的操作数是位地址。用“bit”示1、位寻址区域在片内RAM中:(1)20H2FH16个单元的128位(00H7FH)(2)字节地址能被8整除的11个SFR中的位(80HFFH)2、位地址的表示方法(1)直接用位地址如:00H、7FH(2)用特殊功能寄存器名加位数如:PSW.3P1.2(3)用位名如:TR0、EX0(4)用字节地址加位数如D0H.33、位寻址例子MOVC,00HSETBPSW.3JBP,NEXT2CLRD0H.7,片内RAM20H2FH,11个SFR,位寻址,ROM256字节范围内(PC+rel),相对寻址,ROM,变址寻址,片内RAM低128字节,片外RAM,寄存器间接寻址,R0R7、A、B、DPTR,寄存器寻址,片内RAM,直接寻址,ROM,立即数寻址,寻址空间,寻址方式,指令描述约定,第三节89C51的指令,3.1数据传送指令(29条)3.2算术运算指令(24条)3.3逻辑运算指令(24条)3.4控制转移指令(17条)3.5位操作指令(17条),目的地址源地址,数据,MOV,MOVA,#20H,,,MOV,20H,A,3.1数据传送指令(29条)8位数据传送指令(15条),Ri,direct,Rn,#data,A,传送指令在片内存储器的操作功能,3.1数据传送指令(29条)16位数据传送指令(1条),MOVDPTR,#data16,外部数据传送指令(4条),MOVX,,,MOVX,1)字节交换指令(3条),交换和查表类指令(9条),,,A,XCH,2)低半字节交换指令(1条),XCHDA,Ri,3)累加器A中高4位和低4位交换(1条),SWAPA,4)查表指令(2条),MOVCA,A+PC,MOVCA,A+DPTR,5)堆栈操作指令(2条),PUSHdirect,POPdirect,例1近程查表设程序中的数据表格为(Y=2X+1):ORG1010HDB01H,03H,05H,07H,09H,0BH,0DH,若X=4,求Y。执行程序:1000H:MOVA,#04H;自变量X1002H:ADDA,#0BH;加一个偏移量1004H:MOVCA,A+PC;(0FH+1005H)A1005H:MOVR0,A;(A)R01006H:,结果为:(A)=09H,(R0)=09H,(PC)=1006H,A=?R0=?PC=?,执行MOVCA,A+PC过程:,1014H,09,1004H83,1014H09,1005HF8,1013H07,当前PC,指令代码,例2远程查表设程序中的数据表格(y=2x)为:执行程序:1000H:MOVA,#4H;x=41002H:MOVDPTR,#TAB1005H:MOVCA,A+DPTR;(4+7010H)=8A1006H:,ORG7010HTABDB00H,02H,04H,06H,08H,0AH,0CH,0EH,结果为:(A)=08H,(PC)=1006H,(DPTR)=原值,A=?DPTR=?PC=?,1005H93,7014H08,1006H,DPH70,DPL10,DPTR=1010H,A=04H,执行MOVCAA+DPTR,7014H,08,指令代码,思考题,1MOVA,#1000H;A1000H2MOVXA,1000H;A(1000H)片外RAM3MOVCA,1000H;A(1000H)片外ROM4MOVX60H,A;片外RAM(60H)A5MOVR0,60H;片内RAM:(61H)(60H)MOV61H,R06.XCHR1,R2;R1R27.MOVXDPTR,#2000H;DPTR2000H8.MOVX60H,DPTR;片内RAM片外RAM,下列指令是否错误,如错请改正:,direct,3.2算术运算类指令(24条)加法指令(8条),A,,Rn,Ri,#data,ADD,direct,A,,Rn,Ri,#data,ADDC,ADDCA,R0;A+R0+CYA,例:,先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。然后再做10H+30H+CY,结果是41H,所以最终的结果是4107H。,1067H+30A0H,0001000001100111,0011000010100000,0100000100000111,1067H,30A0H,4107H,设:1067H存在R1R0中,30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。,MOVA,R0ADDA,R2;R0+R2A和CYMOVR4,AMOVA,R1ADDCA,R3;R1+R3+CYA和CYMOVR5,A,direct,A,,Rn,Ri,#data,SUBB,减法指令(4条),SUBBA,20H;A(20H)CYA,说明:只有带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。对带符号数,要注意OV标志。OV=1,出错。,BCD码:00110100,BCD码调整指令(1条),DAA,注意:DAA指令只能跟在ADD或ADDC加法指令后,不适用于减法指令。,00011000,00010110,BCD码,00101110,差6,例:85+59,MOVA,#85H;A=85HADDA,#59H;A=DEHDAA;A=44H,产生进位1,100001010101100111011110000001101110010001100000101000100,A30=11109,A74=11109,CY=1,BCD码减法:先求减数的补数(100-减数),再与被减数相加,最后用DAA指令调整。CLRCMOVA,#9AHSUBBA,#36H;A=64HADDA,91H;A=F5HDAA;A=55H,91-36=?,加1减1指令(9条),加1减1指令不影响CY、AC、OV标志位,比较:INCAADDA,#01H,都将A的内容加1,但INCA不影响CY、AC、OV位,只影响P位。而ADD指令影响以上四位。,乘法指令(1条),MULAB,除法指令(1条),DIVAB,无符号数相乘,高位存B,低位存A,无符号数相除,商存A,余数存B,A、B中都是无符号整数如果积大于255,OV1,否则OV0;进位标志总是清零Cy0,A、B中都是无符号整数如果除数B为“0”,OV1,否则OV0;进位标志总是清零Cy0,3.3逻辑及移位类指令逻辑与指令(6条),逻辑或指令(6条),逻辑异或指令(6条),累加器A清0和取反指令,逻辑操作类指令操作图,应用,ANLA,#00001111B;屏蔽某些位ORLA,#00001111B;置位某些位XRLA,#00001111B;取反某些位CPLA/INCA;求补码,例(A)=01B,表示随机状态,为1或0,执行下述一组指令执行后A的值如何?XRLA,#0C0H;将累加器A的内容D7、D6取反01ORLA,#03H;将累加器A的内容D1、D0置111000000ANLA,#0E7H;将累加器A的内容D4、D3清01000000011101111100111100011解:执行上述指令后,(A)=100011B。,思考题1:如何将累加器A中的数据高4位清0,低位不变?思考题2:如何将寄存器R2中的数据奇数位取反,偶数位不变?,A.0,A.7,A.0,A.7,A.0,A.7,A.0,A.7,CY,CY,RLARRARLCARRCA,注意:执行带进位的循环移位指令之前,必须给CY置位或清零。,循环移位指令,例:,若A=5CH,CY=1,执行RLCA后,,对RLC、RRC指令,在CY=0时RLC相当于乘以2RRC相当于除以2,结果:A=B9H,CY=0,P=1,综合举例:,ANLA,#0FH;屏蔽A的高4位,A=0000*SWAPA;A0-3A4-7,A=*0000ORLP1,A;P1口高4位输出*,低4位不变,把累加器A中的低4位状态,通过P1口的高4位输出,P1口的低4位状态不变。,3.4控制转移类指令只有比较转移指令CJNE影响标志。,无条件转移有条件转移子程序调用和返回空操作,AJMP、LJMP、SJMP、JMP,JZ、JNZ、CJNE、DJNZ,ACALLLCALL、RET、RETI,NOP,地址机器码源程序注释ORG0000H;整个程序起始地址0000020030LJMPMAIN;跳向主程序ORG0030H;主程序起始地址0030C3MAIN:CLRC;MAIN为程序标号0031E6LOOP:MOVA,R0003237ADDCA,R1003308INCR00034DAFBDJNZR1,LOOP;相对转移00368003SJMPNEXT00387803MOVR0,#03H003A18NEXT:DECR0003B80FESJMP$;HERE:SJMPHEREEND;汇编结束标记,程序中标号与地址之间的关系,1无条件转移类指令(4条),短转移类指令:AJMPaddr11长转移类指令:LJMPaddr16相对转移指令:SJMPrel间接转移指令:JMPA+DPTR,无条件转移指令(4条),1)长转移指令:LJMP0030H;PC+3PC,0030HPC,PC=0000H,PC=0030H,假设执行该指令前,PC的值为0000H。,注意:该指令可以转移到64KB程序存储器中的任意位置。,02,00,30,PC高5位(保持不变),PC低11位,操作码(第一字节),操作数(第二字节),11位转移地址的形成示意图,程序计数器PC,2)短转移指令,AJMPaddr11;PC+2PC,addr11PC.10PC.0,3)相对转移指令,例:SAC:SJMPBDC,目的地,XXH,操作数,0200H:SJMP0256H,PC,+,54H,PC,0200H0201H0202H,0202H=0256H,PC,0256H,80,54,跳转的范围不同。,短转移类指令:AJMPaddr11长转移类指令:LJMPaddr16相对转移指令:SJMPrel,转移范围:2KB64KB-128+127,指令构成不同。AJMP、LJMP后跟的是绝对地址,而SJMP后跟的是相对地址。,指令长度不同原则上,所有用SJMP或AJMP的地方都可以用LJMP来替代。,JMPA+DPTR;(A)+(DPTR)PC说明:具有多分枝转移功能,即散转功能,又叫散转指令;转移范围:是以DPTR为首地址的256B。,4)间接转移指令,间接转移指令:JMPA+DPTR,这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。转移地址由A+DPTR形成,并直接送入PC。指令对A、DPTR和标志位均无影响。本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。,与前三条指令相比有所不同,例:CLRCRLCA;A中健值乘2MOVDPTR,#TAB;将表格首址送入DPTRJMPA+DPTR;跳转TAB:AJMPROUT0;跳转ROUT0开始的程序段TAB+2:AJMPROUT1;跳转ROUT1开始的程序段TAB+4:AJMPROUT2;跳转ROUT2开始的程序段TAB+6:AJMPROUT3;跳转ROUT3开始的程序段.ROUT0:.ROUT1:.ROUT2:.ROUT3:,执行该段程序后,程序将根据A中的初始健值转移到不同的程序段去执行-散转。A=0,转ROUT0A=1,转ROUT1A=2,转ROUT2A=3,转ROUT3,条件转移指令(8条)1)累加器A判0指令(2条),2)减1非零转移指令(2条),CJNE(目的操作数),(源操作数),relCJNEA,direct,relCJNEA,#data,relCJNERn,#data,relCJNERi,#data,rel,3)比较转移指令(4条),执行取指后,PC=(PC)+3,若(目的操作数)(源操作数),则(PC)+relPC,且0CY;若(目的操作数)=(源操作数),则顺序执行,且0CY。,3)比较转移指令(4条),条件转移类指令范例,还有什么方法实现循环的终止?,MOVR0,#20HMOVR7,#10HCLRALOOP:MOVR0,AINCAINCR0DJNZR7,LOOPSJMP$,将00H0FH这16个数顺序地置入片内RAM20H2FH单元中。,方案一,方案二,MOVR0,#20HMOVR7,#10HCLRALOOP:MOVR0,AINCAINCR0CJNEA,#10H,LOOPSJMP$,方案三,MOVR0,#20HMOVA,#10HMOV30H,#00HLOOP:MOVR0,30HINC30HINCR0DECAJNZLOOPSJMP$,方案四,MOVR0,#20HMOVA,#10HMOV30H,#00HLOOP:MOVR0,30HINC30HINCR0DECASUBBA,#01HJNCLOOPSJMP$,调用和返回指令(8条)1)短调用指令(1条),2)长调用指令(1条),3)返回指令,4)空操作,3.5位操作类指令,RAM位寻址区位地址表,2.位置位和位清零指令,1.位传送指令,3.位运算指令,助记符格式,机器码(B),相应操作,指令说明,机器周期,ANLC,bit,10000010bit,CYCYbit,位与指令,2,ANLC,/bit,10110010bit,位与指令,2,ORLC,bit,01110010bit,CYCYbit,位或指令,2,ORLC,/bit,10100010bit,位或指令,2,CPLC,10110011,位取反指令,2,CPLbit,10110010bit,位取反指令,结果不影响CY,2,4.位转移指令,5.判CY标志指令,P3.2和P3.3上各接有一只开关,要求它们分别闭合时(P3.2=0或P3.3=0),分别使P1口为0或FFH。START:MOVP3,#0FFHL1:JNBP3.2,L2;JNBP3.3,L3;P3.2=1,P3.3=1,等待LJMPL1L2:MOVP1,#00H;P3.2=0,使P1口全为“0”LJMPL1L3:MOVP1,#0FFH;P3.3=0,使P1口全为“1”LJMPL1,举例:,练习,执行如下三条指令后,30H单元的内容是。MOVR1,#30HMOV40H,#0EHMOVR1,40HA40HBC30HDFFH,0EH,MCS51单片机在执行MOVXA,DPTR或MOVCA,A+DPTR指令时,其寻址单元的地址是由。AP0口送高8位,P1口送高8位CP0口送低8位,P1口送低8位DP0口送高8位,P2口送低8位下列指令能能使累加器A低4位不变,高4位置F的是。AANLA,#0FHBANLA,#0F0HDORLA,#0F0H下列指令能能使累加器A的最高位置1、其它位不变的是。AANLA,#7FHBANLA,#80H,BP0口送低8位,P2口送高8位,CORLA,#0FH,CSETBACC.7DORLA,#80H,在MCS51指令中,下列指令中是无条件转移指令。ALCALLaddr16BDJNZdirect,relCDACALLaddr11可以控制程序转向64K程序存贮器地址空间的任何单元的无条件转移指令是。A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论