陕西科技大学单片机第4章MCS51指令系统_第1页
陕西科技大学单片机第4章MCS51指令系统_第2页
陕西科技大学单片机第4章MCS51指令系统_第3页
陕西科技大学单片机第4章MCS51指令系统_第4页
陕西科技大学单片机第4章MCS51指令系统_第5页
已阅读5页,还剩138页未读 继续免费阅读

下载本文档

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

文档简介

4MCS-51单片机指令系统,教学目标:介绍MCS51系列单片机的寻址方式介绍MCS51系列单片机的指令系统学习要求:掌握MCS51系列单片机6种寻址方式的定义与表达方式掌握MCS51系列单片机各指令的格式、功能、简单应用,4.1MCS51单片机汇编语言与指令格式,4.1.1汇编语言,程序设计语言:机器语言、汇编语言和高级语言。机器语言:CPU唯一能直接识别的语言,是机器指令的集合,二进制代码书写。特点:程序简洁,占用存储空间小,执行速度快,控制功能强。缺点:不易辨识、记忆和书写。用机器语言描述的程序通常称为目标程序。用汇编语言和高级语言编制的程序称之为源程序,都要转换成机器语言程序后才能为计算机直接执行。,汇编语言:用助记符来表示机器指令的一种程序设计语言。其每条语句对应相应的机器指令。汇编语言与机器的指令系统密切相关,不同的机型其指令系统不同,汇编语言程序不具备高级语言的通用性;用汇编语言编写的程序要经过汇编程序(也可以手译)翻译成机器语言程序后才能为计算机所识别。特点:占用的内存小、执行速度快。高级语言的特点是通用性强,可以在不同的机器上运行。用高级语言编写的程序要用编译程序或解释程序翻译成机器语言程序方能执行。,一台计算机具有的所有指令的集合称为该计算机的指令系统。MCS51系列单片机的指令系统共有111条指令,在储存空间与执行时间上都有较高的效率,还含有丰富的位操作指令。按其功能可分为数据传送、算术运算、逻辑运算、程序转移、位操作等5个大类。按指令执行时间:单机器周期指令64条,双机器周期指令45条,乘、除2条指令的执行时间为4个机器周期。,4.1.251单片机指令系统概述,1)单字节指令单字节指令格式由8位二进制编码表示,例如:CLRAE4H2)双字节指令双字节指令格式由两个字节组成,操作码和操作数,例如:MOVA,10H74H10H,3)三字节指令三字节指令格式中,第一个字节为操作码,后两个字节为操作数,例如:MOV40H,30H75H40H30H,按指令长度:单字节指令49条、双字节指令46条、三字节指令只有16条。,MCS-51单片机指令系统有如下特点:(1)指令执行时间快。(2)指令短,约有一半的指令为单字节指令。(3)用一条指令即可实现2个一字节的相乘或相除。(4)具有丰富的位操作指令。(5)可直接用传送指令实现端口的输入输出操作。,一条汇编语言指令中最多包含5个区段,如下所示:标号:操作码目的操作数,源操作数;注释LOOP:ADDA,#10H;(A)(A)+10H5个区段之间要用分隔符分开:标号与操作码之间用“:”隔开,操作码与操作数之间用空格隔开,操作数与注释之间用“;”隔开,如果操作数有两个以上,则在操作数之间要用逗号“,”隔开(乘法指令和除法指令除外)。,4.1.3MCS51单片机汇编语言指令格式,Rn当前选定的寄存器区中的8个工作寄存器R0R7,即n=07。Ri当前选定的寄存器区中的2个寄存器R0、R1,i=0、1。direct表示直接寻址的地址;8位内部RAM单元的地址:内部数据区RAM单元(00H7FH)或特殊功能寄存器地址(80H0FFH)。data指令中的8位常数,表示立即数。data16指令中的16位常数。,4.1.4MCS-51单片机汇编指令常用符号,addr1616位的目的地址,用于LJMP,LCALL指令,可指向64KB程序存储器地址空间。addr1111位的目的地址,用于AJMP,ACALL指令。目的地址必须与下一条指令的第一个字节在同一个2KB程序存储器地址空间范围之内。rel相对地址,8位带符号的偏移量字节,用于SJMP和所有条件转移指令中。偏移量相对于下一条指令的第一个字节计算,在128+127范围内取值。,bit内部数据RAM或特殊功能寄存器中的可直接寻址位。DPTR数据指针,可用作16位的地址寄存器。A累加器。B寄存器,用于MUL和DIV指令中。C进位标志或进位位。间接寻址寄存器或基址寄存器的前缀,如Ri,DPTR。/位操作数的前缀,表示对该位取反,但不影响该位原值。(X)X中的内容。(X)由X寻址的单元中的内容。箭头左边的内容被箭头右边的内容所代替。,4.2寻址方式,寻址方式:寻找操作数地址的方式.在用汇编语言编程时,数据的存放、传送、运算都要通过指令来完成。编程者必须自始至终都要十分清楚操作数的位置,以及如何将它们传送到适当的寄存器去参与运算。每一种计算机都具有多种寻址方式。寻址方式的多少是反映指令系统优劣的主要指标之一。,在MCS-51单片机指令系统中,有以下7种寻址方式:(1)立即寻址;(2)直接寻址;(3)寄存器寻址;(4)寄存器间接寻址;(5)基址寄存器加变址寄存器间接寻址;(6)相对寻址;(7)位寻址。,1)立即寻址立即寻址方式是指操作数包含在指令字节中。跟在指令操作码后面的数就是参加运算的数,该操作数称为立即数。立即数有一字节和二字节两种可能,例如指令:MOVA,3AH将立即数3AH送累加器A中,MOVDPTR,0DFFFH功能:将立即数0DFFFH送数据指针DPTR中。0DFHDPH,0FFHDPL上述两条指令均为立即寻址方式。立即寻址方式主要用来给寄存器或存储单元赋初值,只能用于源操作数,不能用于目的操作数。立即寻址方式源操作数位于程序存储器中,2)直接寻址在指令中直接给出操作数的地址,这种寻址方式就属于直接寻址方式。在这种方式中,指令的操作数部分直接是操作数的地址。MOVA,40H;(A)(40H)数据存储器E5H40H,MCS-51单片机指令系统中,直接寻址方式中可以访问:(1)内部数据存储器的低128个字节单元(00H7FH)。(2)特殊功能寄存器。特殊功能寄存器只能用直接寻址方式进行访问。(3)位地址空间。(4)程序存储器。长转移与绝对转移指令,3)寄存器寻址在该寻址方式中,参加操作的数存放在寄存器里。寄存器包括8个工作寄存器R0R7,累加器A,寄存器B、数据指针DPTR和布尔处理器的位累加器CY。MOVA,R0;(A)(R0)机器码:E8H机器码低3位组合:000R0001R1010R2MOVA,R1机器码:E9H,4)寄存器间接寻址在这种寻址方式中,寄存器的内容为操作数的地址。寄存器间接寻址符号为“”,例如:MOVA,R1;(A)(R1)机器码E7H,a)寄存器间接寻址只能使用寄存器R0、R1作为地址指针b)寻址内部RAM区(00HFFH,256个单元)的数据c)不能访问特殊功能寄存器d)当访问外部RAM时,可使用R0、R1或DPTR作为地址指针。,寄存器间接寻址,5)变址寻址这种寻址方式用于访问程序存储器中的数据表格,它以数据指针DPTR或程序计算器PC的内容为基本地址,加上变址寄存器A的内容作为操作数的地址。MOVCA,A+DPTR;(A)(A)+(DPTR)机器码93HJMPA+DPTRMOVCA,PC+A,MOVCA,A+DPTR16位程序存储器地址,6)相对寻址在MCS-51指令系统中设有转移指令,分为直接转移和相对转移指令,在相对转移指令中采用相对寻址方式。这种寻址方式是以当前PC的内容为基本地址,加上指令中给定的偏移量作为转移地址,用于访问程序存储器。指令中给出的偏移量是一个8位带符号的常数,可正可负,其范围为128+127。,a)当前PC值:转移指令所在地址加上该指令字节数例如:JZrel功能:累加器A为零时就转移的双字节指令。若该指令地址为2050H,则执行该指令时当前PC的值是:2052H,b)偏移量rel:有符号的单字节数,以补码表示。负数:从当前地址向上转移;正数:从当前地址向下转移;目的地址当前值PC+rel源地址转移指令字节数rel,例如:JZ08H;假设累加器A为0,源地址:2050H,例如:JZ0F4H;假设累加器A为0,源地址:2050H,7)位寻址该种寻址方式中,操作数是内部RAM单元中某一位(128个)和SFR中的93位的信息。例如:SETBPSW.3;(PSW.3)1双字节指令:D2HD3H指令的第二个字节直接给出位地址:D3H,总结:7中寻址方式及使用空间,4.3指令系统,指令分类,按指令的功能,MCS-51指令系统可分为下列5类:(1)数据传送;(2)算术运算;(3)逻辑运算;(4)位操作;(5)控制转移。,4.3.1数据传送类指令(29条),MCS-51传送指令示意图,1)内部数据存储器间数据传送指令(16条),a)立即寻址(源操作数)MOVA,#data;(A)#data,74dataMOVdirect,#data;(direct)#data;75directdata例如:将立即数40H传送到30H和P1口(90H)MOV30H,#40H753040MOVP1,#40H759040MOV90H,#40H759040,(30H)=40H,(P1)=40H,MOVRn,#data;(Rn)#data,787FdataMOVR0,#40H7840MOVR1,#40H7940,rrr:000001110111R0R1R6R7,(R0)=40H,(R1)=40H,MOVRi,#data;(Ri)#dataRi:8bit,指向内部数据存储器Ri:R0R1MOVR0,#data76dataMOVR1,#data77data例如:将立即数40H传送到RAM的30H、40H单元中MOVR0,#30H7830MOVR1,#40H7930MOVR0,#40H7640MOVR1,#40H7740,MOVDPTR,#data16DPTR地址指针,16位(DPTR)#data,90data158data70MOVDPTR,#1234HDPH,#12HDPL,#34H,901234,b)寄存器寻址MOVdirect,A;(direct)(A),F5directMOVRi,A;(Ri)(A),F6F7MOVRn,A;(Rn)(A),F8FFMOVA,Rn;(A)(Rn),E8EFdataMOVdirect,Rn;(direct)(Rn),888Fdirect不能用这类指令在内部工作寄存器之间直接传送。不存在MOVR,R2这样的指令,c)直接寻址MOVA,direct;(A)(direct),E5directMOVRn,direct;(Rn)(direct),A8AFdirectMOVRi,direct;(Ri)(direct),A6A7directMOVdirect1,direct2;(direct2)(directl),85directdirect2这组指令的功能是:将直接地址所规定的内部RAM单元(内容)传送到累加器A、寄存器Ri,并能实现内部数据寄存器RAM之间、特殊功能寄存器SFR之间或SFR与内部RAM之间的直接数据传递。,内部RAM单元(片内RAM的00H7FH,SFR的80HFFH单元),例如:MOVP2,P1;(P2)(P1),该指令的功能是不通过其它寄存器,直接把P1口(口地址90H)的内容传送到P2口(口地址A0H)输出,提高了效率。该指令为三字节指令,机器代码为85H90HA0H,d)寄存器间接寻址MOVA,Ri;(A)(Ri),E6E7MOVdirect,Ri;(direct)(Ri),8687direct这组指令把以Ri的内容作为地址进行寻址所得到单元的内容,传送到累加器A或direct指定的片内RAM区单元。间接寻址可访问片内数据存储器的低128个单元(00H7FH)和高128个单元(80HFFH,对52子系列),但不能用于寻址特殊功能寄存器SFR。,例:设内部RAM单元(30H)40H,(40H)10H,(l0H)=00H,端口(P1)=CAH,分析一下程序执行后各个单元及寄存器、P2口的内容MOVR0,#30H;(R0)30H,7830MOVA,R0;(A)(R0),E6MOVR1,A;(R1)(A),F9MOVB,R1;(B)(R1),87F0MOVR1,P1;(Rl)(P1),A790MOVP2,P1;(P2)(P1),8590A0MOV10H,#20H;(l0H)20H,751020执行上述指令后结果为:(R0)=30H(R1)=(A)=40H(B)=l0H(40H)=(P1)=(P2)=CAH,(l0H)=20H,2)外部数据存储器数据传送指令MCS-51单片机CPU对片外扩展的数据存储器RAM或I/0口进行数据传送,必须采用寄存器间接寻址的方法,通过累加器A来完成。一般数据的传送是通过P0口和P2口完成的:片外RAM地址总线低8位由P0口送出,高8位由P2口送出;数据总线(8位)也由P0口传送(双向),但与低8位地址总线是分时传送的。这类数据传送指令共有以下4条单字节指令。指令操作码助记符标志为MOVX。,MOVXA,DPTR;(A)(DPTR),E0MOVXA,Ri;(A)(Ri),E2E3.MOVXDPTR,A;(DPTR)(A),F0MOVXRi,A;(Ri)A),F2F31执行输入指令时,在P3口的第7位引脚(P3.7)上输出RD读有效信号,用作外部数据存储器RAM的读选通信号。执行输出指令时,在P3口的第6位引脚(P3.6)上输出WR写有效信号,用作外部RAM的写选通信号。当扩展外部RAM容量不大时,用R0或R1以寄存器间址的方法访问外部RAM(或I/0口)的00HFFH共256个单元中的任一个单元。用16位数据存储地址指针DPTR,以寄存器间址的方法则能遍访0000HFFFFH64KB的片外RAM(或扩展I/O)的任何单元。,例:设外部RAM(0203H)=FFH,分析以下指令执行后结果。MOVDPTR,#0203H;(DPTR)0203H900203MOVXA,DPTR;(A)(DPTR),E0MOV30H,A;(30H)(A),F530MOVA,#0FH;(A)0FH,740FMOVXDPTR,A;(DPTR)(A),F0执行结果为(DPTR)=0203H(30H)=FFH(0203H)=(A)=0FH,3)程序存储器向累加器A传送数据指令(查表指令)采用变址寻址方式,把程序存储器数据传送给A。操作码助记符为MOVCMOVCA,A+DPTR;(A)(A)+(DPTR),(PC)(PC)+1,93MOVCA,A+PC;(PC)(PC)+1,(A)(A)+(PC),83,例:在外部ROM/EPROM中,从2000H单元开始依次存放09的平方值:0、1、4、9、81,要求依据累加器A中的值(09)来查找所对应的平方值,分析下述程序的结果。MOVDPTR,#2000H;(DPTR)2000H,902000MOVA,#09H;(A)09H,7409MOVCA,A+DPTR;(A)(A)十(DPTR),93执行结果:(DPTR)=2000H,(A)=51H(81的十六进制数)。,例:以上例外部ROM/EPROM2000H单元开始存放09的平方值,以PC作为基址寄存器进行查表。解:设MOVC指令所在地址(PC)=1FF0H,则偏移量=表首地址(MOVC指令所在地址+1)偏移量=2000H-(1FF0H+1)=0FH相应的程序如下:MOVA,#09H;(A)09H,7409ADDA,#0FH;地址调整,240FMOVCA,A+PC;(A)(A)+(PC)+1),83执行结果为:(PC)=1FF1H,(A)51H(81的十六进制数),4)字节交换指令XCHA,Rn(A)(Rn),C8CFXCHA,Ri(A)(Ri),C6C7XCHA,direct(A)(direct),C5directXCHDA,Ri(A30)(Ri)30),D6D7SWAPA(A74)(A30),C4前三条指令是将累加器A的内容和源操作数内容相互交换;后两条指令是半字节交换指令,最后一条指令是将累加器A的高4位与低4位之间进行交换,而另外一条指令是将累加器A的低4位内容和(Ri)所指出的内部RAM单元的低4位内容相互交换。,例设(R0)=30H,(30H)=4AH,(A)=28H,则:XCHA,R0结果为:(A)=4AH,(30H)=28HXCHDA,R0结果为:(A)=2AH,(30H)=48HSWAPA结果为:(A)=82H,5)堆栈操作指令PUSHdirect;C0direct,(SP)(SP)+1(SP)(direct)POPdirect;D0direct,(direct)(SP)(SP)(SP)-1进栈指令的功能是:首先将堆栈指针SP的内容加1,然后将直接地址所指出的内容送入SP指出的内部RAM单元;出栈指令的功能是:将SP所指出的内部RAM单元的内容送入由直接地址所指出的字节单元,接着将堆栈指针SP的内容减1。,例:若在外部ROM/EPROM中2000H单元开始依次存放09的平方值,数据指针(DPTR)=3A00H,用查表指令取出2003H单元的数据后,要求保持DPTR中的内容不变。完成以上功能的程序如下:MOVA,#03H;(A)03H,7403PUSHDPH;C083PUSHDPL;C082MOVDPTR,#2000H;(DPTR)2000H,902000MOVCA,A+DPTR;(A)(2000H+03H),93POPDPL;D082POPDPH;D083执行结果:(A)=09H,(DPTR)=3A00H。,例:进入中断服务子程序时,把程序状态寄存器PSW、累加器A、数据指针DPTR进栈保护。设当前SP为60H。则程序段PUSHPSWPUSHACCPUSHDPLPUSHDPH执行后,SP内容修改为64H,而61H、62H、63H、64H单元中依次栈入PSW、A、DPL、DPH的内容。当中断服务程序结束之前,如下程序段(SP保持64H不变),POPDPHPOPDPLPOPACCPOPPSW执行之后,SP内容修改为60H,而64H、63H、62H、61H单元中的内容依次弹出到DPH、DPL、A、PSW中。MCS-51提供一个向上升的堆栈,因此SP设置初值时要充分考虑堆栈的深度,要留出适当的单元空间,满足堆栈的使用。,4.3.2算术运算类指令,算术运算指令,影响标志位的指令,影响标志位的指令,1)加法指令,a)普通加法指令ADDA,Rn;(A)(A)+(Rn),282FADDA,direct;(A)(A)+(direct),25directADDA,Ri;(A)(A)+(Ri),2627ADDA,data;(A)(A)+#data,24data8位数可当作无符号数(0255),也可以当作带符号数(-128+127),例:对于二进制数11010011,无符号数211,带符号数-45。计算机在作加法运算时,总按以下规定进行:(1)在求和时,总是把操作数直接相加,而无须任何变换。例如,若A=11010011B,R1=11101000B,ADDA,R1时,其算式表达为:相加后(A)=10111011B。若认为是无符号相加,则A的值代表十进制数187;若认为是带符号补码数相加,则A的值为十进制负数69。,(2)CY:总是把两个操作数作为无符号数直接相加而得出进位。若为无符号数相加CY代表十进制数256,但若是两个带符号数相加,CY没有意义。(3)OV:计算机总是把操作数当作带符号数来对待。D7、D6位产生进位的情况,经过异或电路进行确定的。产生溢出时OV=1,否则OV=0。,例如:120和100之和为220,显然大于127,相加时,符号位(最高位)由0变1,两个正数相加结果变负,实际上它是和数的最高位,符号位移入了进位标志,此时位6有进位而位7无进位,置位溢出标志OV,结果溢出。,同样,120和100相加,结果应为220,显然小于128,相加时,10001000-12010011100-100,+,100100100-220,符号位由1变为0,两个负数相加结果变为正数,这是因为符号位移入进位标志,位6无进位而位7有进位,置位溢出标志OV,由此可判断结果溢出。,(4)加法指令还会影响半进位标志和奇偶标志P。由于D3相加对D4没有进位,所以AC=0,而由于运算结果A中1的数目为偶数,故P=0。,例如设(A)=49H,(R0)=6BH,执行指令ADDA,R0;(A)(A)+(R0),28结果为:(A)=B4H,OV=1,CY=0,AC=1,P=0。该结果说明:若为两个无符号数相加,运算结果正确;若为带符号正数相加,则运算结果出错。因此,使用加法指令是进行有符号数还是无符号数相加,以及相加后结果是否正确,均要由用户来定义和判断。,b)带进位加法指令ADDCA,Rn;(A)(A)+(CY)+(Rn),383FADDCA,direct;(A)(A)+(CY)+(direct),35directADDCA,Ri;(A)(A)+(CY)+(Ri),3637ADDCA,data;(A)(A)+(CY)+#data,34data这组指令的功能与普通加法指令类似,唯一的不同之处是,在执行加法时,还要将上一次进位标志Cy的内容也一起加进去,对于标志位的影响也与普通加法指令相同。,例如:设(A)=C3H,数据指针低位(DPL)=ABH,CY=1执行指令:ADDCA,DPL;(A)(A)+(CY)+(DPL),3582结果为:(A)=6FH,CY=1,OV=1,AC=0,P=0。,例1:双字节无符号数加法(R0R1)+(R2R3)(R4R5);R0、R2、R4存放16位数的高字节,R1、R3、R5存放低字节。假设其和不超过16位,其编程如下。,MOVA,R1;取被加数低字节,E91EADDA,R3;低字节相加,2BREMOVR5,A;保存和低字节,FDMOVA,R0;取高字节被加数;E811ADDCA,R2;两高字节之和加低位进位,MOVR4,A;保存和高字节,2)带进位减法指令SUBBA,Rn;(A)(A)-(CY)-(Rn),989FSUBBA,direct;(A)(A)-(CY)-(direct),95directSUBBA,Ri;(A)(A)-(CY)-(Ri),9697SUBBA,data;(A)(A)-(CY)-#data,94data功能:从累加器A中减去源操作数所指出的内容及进位标志CY的值,结果保留在A中。,减法指令影响CY、OV、AC和P标志CY表示两无符号数相减时,最高位是否有借位产生,若CY=1,表示有借位,CY=0则表示无借位;OV表示两个带符号数相减时是否产生溢出,OV=1表示从一个正数中减一个负数得出一个负数或从一个负数中减去一个正数时得出一个正数的错误情况,和加法类似。该标志是由运算时差值的D7、D6位状态异或而得的,OV=0则表示无溢出;AC=1表示差值的D3向D4有借位,AC=0则表示无半借位。,不带借位位的减法操作,需先清借位位,即置CY=0。CLRC;(CY)0,C3例如:设(A)=52H,(R0)=B4H执行指令:CLRC;(CY)0,C3SUBBA,R0;(A)(A)-(CY)-(R0),98结果为:(A)=9EH,CY=1,AC=1,OV=1,P=1。,例双字节无符号数相减(R0R1)-(R2R3)(R4R5)。R0、R2、R4存放16位数的高字节,R1、R3、R5存放低字节,先减低8位,后减高8位和低位减借位。由于低位开始减时没有借位,所以要先清零。其编程如下:MOVA,R1;取被减数低字节,E9CLRC;清借位位,C3SUBBA,R3;低字节相减,9BMOVR5,A;保存差低字节,FDMOVA,R0;取被减数高字节,E8SUBBA,R2;两高字节差减低位借位,9AMOVR4,A;保存差高字节,FC,3)增量指令INCA;(A)(A)+1,04INCRn;(Rn)(Rn)+1,080FINCdirect;(direct)(direct)+1,05directINCRi;(Ri)(Ri)+1,0607INCDPTR;(DPTR)(DPTR)+1,A3若原来的内容为0FFH,则加1后将产生溢出,使操作数的内容变成00H,但不影响任何标志。最后一条指令是对16位的数据指针寄存器DPTR执行加1操作,指令执行时,先对低8位指针DPL的内容加1,当产生溢出时就对高8位指针DPH加1,但不影响任何标志。,4)减1指令DECA;(A)(A)-1,14DECRn;(Rn)(Rn)-1,181FDECdirect;(direct)(direct)-1,15directDECRi;(Ri)(Ri)-1,1617这组指令的功能是:将指出的操作数内容减1。如果原来的操作数为00H,则减1后将产生下溢出,使操作数变成0FFH,但不影响任何标志。,加(减)1指令中,若指令的操作数为直接地址端口P0P3时,具有“读改写的功能。例如:设(R0)=7EH,(7EH)=FFH,(7FH)=38H,(DPTR)=l0FEH,分析逐条执行下列指令后各单元的内容。INCR0;使7EH单元内容由FFH变为00HINCR0;使R0的内容由7EH变为7FHINCR0;使7FH单元内容由38H变为39HINCDPTR;使DPL为FFH,DPH不变INCDPTR;使DPL为00H,DPH为11HINCDPTR;使DPL为0lH,DPH不变,5)乘法指令(4周期指令)乘法指令完成单字节的乘法,只有一条指令:MULAB(B)(A)(B)815,(A)(A)(B)07(CY)0这条指令的功能是:将累加器A的内容与寄存器B的内容相乘,乘积的低8位存放在累加器A中,高8位存放于寄存器B中。如果乘积超过0FFH,则溢出标志OV置“1”,否则清“0”。进位标志Cy总是被清“0”。,例如:若(A)=4EH(78),(B)=5DH(93)执行指令:MULAB结果为:积为:(BA)=lC56H,7254255,(A)=56H,(B)=lCH,OV=1,CY=0,P=0。,例3:利用单字节乘法指令进行双字节数乘以单字节数运算。若被乘数为16位无符号数,地址为M1和M1+1(低位先、高位后),乘数为8位无符号数,地址为M2,积存入R2、R3和R4三个寄存器中。算法:将16位被乘数分为高8位和低8位,首先由低8位与8位乘数相乘,所得积的低8位存入R4,积的高8位暂存于R3。再用16位被乘数的高8位乘以乘数,所得积的低8位应与R3中暂存的内容相加,存入R3作为积结果的中间字节,而积的高8位还要与低位进位CY相加才能存入R2,作为积的高8位。最后的积存于R2、R3、R4中,共24位二进制数。,MOVR0,#M1;被乘数地址存于R0MOVA,R0;取16位数低8位MOVB,M2;取乘数MULAB;(M)(M2)MOVR4,A;存积低8位MOVR3,B;暂存(M1)(M2)高8位INCR0;指向16位数高8位MOVA,R0;取被乘数高8位MOVB,M2;取乘数,MULAB;(Ml+1)(M2)ADDA,R3;(A)+(R3)得(积)158MOVR3A;(积)158存R3MOVA,B;积最高8位送AADDCA,#00H;积最高8位+CY得(积)231MOVR2,A;(积)2316存入R2若上述程序执行前:(M1+1)=ABH,(M1)=CDH,(M2)=64H,则执行后(R2)=43H,(R3)=lCH,(R4)=14H。,6)除法指令(4周期指令)除法指令完成单字节的除法,只有一条指令:DIVAB这条指令的功能是:将累加器A中的内容除以寄存器B中的8位无符号整数,所得商的整数部分存放在累加器A中,余数部分存放在寄存器B中,清“0”进位标志Cy和溢出标志OV。若原来B中的内容为0,则执行该指令后A与B中的内容不定,并将溢出标志OV置“1”,在任何情况下,进位标志Cy总是被清“0”。,例:利用除法指令把累加器A中的8位二进制数转换为3位BCD数,并以压缩形式存放在地址M1、M2单元中。解:累加器A中的8位二进制数,先对其除以100(64H),商数即为十进制的百位数;余数部分再除以10(0AH),所得商数和余数分别为十进制十位数和个位数,即得到3位BCD数。百位数放在M1中,十位、个位数压缩BCD数放在M2中,十位与个位数的压缩BCD数的存放是通过SWAP和ADD指令实现的。,MOVB,#64H;除数100送BDIVAB;得百位数MOVM1,A;百位数存于M1中MOVA,#0AH;取除数10XCHA,B;上述余数与除数交换DIVAB;得十位数和个位数SWAPA;十位数存于A的高4位ADDA,B;组成压缩BCD数MOVM2,A;十、个位压缩BCD数存M2若上述程序执行前:(A)=A8H(168),则执行后(M1)=(01)BCD,(M2)=(68)BCD,7)十进制调整指令DAA这条指令对累加器A参与的BCD码加法运算所获得的8位结果进行十进制调整,使累加器A中的内容调整为二位压缩型BCD码的数。使用时必须注意,它只能跟在加法指令之后,不能对减法指令的结果进行调整,且其结果不影响溢出标志位。两个BCD数36与45相加,结果应为BCD码81,程序如下:,MOVA,36HADDA,45HDAA,这段程序中,第一条指令将立即数36H(BCD码36)送入累加器A;第二条指令进行如下加法:,00110110360100010145,011110117B0000011006,+,+,1000000181,得结果7BH;第三条指令对累加器A进行十进制调整,低4位(为0BH)大于9,因此要加6,得调整的BCD码81。,例:双字节压缩BCD码加法。解:设R5(高)、R4(低)为被加数;R3(高)、R2(低)为加数,相加和的结果存入R6(万)、R5(千、百)、R4(十、个)。参考程序如下:MOVA,R4;被加数十位、个位送入AADDA,R2;十位、个位相加DAA;和的十位、个位调整MOVR4,A;和的十位、个位存入R4MOVA,R5;被加数千位、百位送入AADDCA,R3;千位、百位的和加低位进位,DAA;和的千位、百位调整MOVR5,A;和的千位、百位存入R5MOVA,#00H;A清零ADDCA,#00H;求和的万位值MOVR6,A;和的万位存入R6若程序执行前:(R5)=(98)BCD(R4)=(76)BCD,(R3)=(54)BCD,(R2)=(32)BCD,则执行后:(R6)=(01)BCD,(R5)=(53)BCD,(R4)=(08)BCD。,例:利用十进制加法调整指令DA作十进制减法调整。解:由于DA指令不能直接对减法进行十进制调整,为了进行十进制减法运算,只能用加减数的补数来进行。两位十进制数是对100取补的,如60-30=30,也可改为补数相加;60+(l00-30)=l30丢掉进位(模100)后,就得到正确的结果。在实际运算时,由于CPU为8位,不可能用9位二进制数表示十进制数100,但可用8位二进制数10011010(9AH)代替,因为这个二进制数经过十进制调整后就是100000000。,这样十进制无符号数的减法运算可按以下步骤进行:(l)求减数的补数(9AH减数);(2)被减数与减数的补数相加;(3)经DA指令调整后就得到所求的十进制减法运算结果。这里用补数而不是补码是为了和带符号位的补码加以区别。由于现在操作数都是正数,没有必要再加符号位,故称补数更为合适一些。,设M1、M2、M3分别为被减数、减数和差的符号地址,相应的十进制减法运算程序如下:CLRC;CY清0MOVA,#9AH;(A)#9AHSUBBA,M2;求减数的补数ADDA,M1;加补数完成减法DAA;十进制调整MOVM3,A;差存入M3单元若程序执行前:(M1)=(91)BCD,(M2)=(36)BCD则程序执行后(M3)=(55)BCD(M1)(M2),4.3.3逻辑运算类指令,1)逻辑与指令ANLA,Rn;(A)(A)AND(Rn),585FANLA,direct;(A)(A)AND(direct),55directANLA,Ri;(A)(A)AND(Ri),5657ANLA,data;(A)(A)AND#data,54dataANLdirect,A;(direc)(direct)AND(A),52directANLdirect,data;(direct)(direct)AND#data,53directdata功能:将两个操作数的内容按位进行逻辑与操作,并将结果送回目的操作数的单元中。,例如(A)=FAH=11111010B,(R1)=7FH=01111111BANLA,Rl;(A)11111010A01111111结果为:(A)=01111010B=7AH。逻辑“与”ANL指令常用于屏蔽(置位)字节中某些位。若清除某位,则用“0”和该位相与;若保留某位,则用“1”和该位相与。例如:(Pl)=C5H=11000101B,屏蔽P1口高4位ANLP1,#0FH;(Pl)(P0)AND00001111结果为:(P1)=05H=00000101B。,2)逻辑“或”指令ORLA,Rn;(A)(A)OR(Rn),484FORLA,direct;(A)(A)OR(direct),45directORLA,Ri;(A)(A)OR(Ri),4647ORLA,data;(A)(A)OR#data,44dataORLdirect,A;(direct)(direct)OR(A),42directORLdirect,data;(direct)(direc)OR#data,43directdata功能:将两个操作数的内容按位进行逻辑或操作,并将结果送回目的操作数的单元中。,例:若(A)=C0H,(R0)=3FH,(3F)=0FH执行指令:ORLA,R0;(A)(A)OR(R0)结果为:(A)=CFH。,例:根据累加器A中40位的状态,用逻辑与、或指令控制P1口40位的状态,Pl口的高3位保持不变。ANLA,#00011111B;屏蔽A的高3位ANLP1,#11100000B;保留P1的高3位。ORLP1A;若上述程序执行前:(A)=B5H=10110101B,(Pl)=6AH=01101010B,则执行程序后(A)=15H=00010101B,(Pl)=75H=01110101B,3)逻辑“异或”指令XRLA,Rn;(A)(A)XRL(Rn),686FXRLA,direct;(A)(A)XRL(direct),65directXRLA,Ri;(A)(A)XRL(Ri),6667XRLA,data;(A)(A)XRL#data,64dataXRLdirect,A;(direct)(direct)XRL(A),62directXRLdirect,data;(direct)(direct)XRL#data,63directdata功能:将两个操作数的内容按位进行逻辑异或操作,并将结果送回到目的操作数的单元中。,逻辑“异或”指令常用来对字节中某些位进行取反操作:欲某位取反则该位与“1”相异或;欲某位保留则该位与“0”相异或。对某单元自身异或,以实现清零操作。,例如:若(A)=B5H=10110101B,执行下列指令:XRLA,#0F0H;A的高4位取反,低4位保留MOV30H,A;(30H)(A)=45H,XRLA,30H;自身异或使A清零执行后结果:(A)=00H。,4)简单逻辑操作指令CLRA;对累加器A清“0”E4CPLA;对累加器A按位取反F4上例中用异或指令使累加器清零,需要两条双字节指令MOV30H,A和XRLA,30H共占用四字节存储空间。MOVA,#00H实现累加器清零,也需一条双字节指令不影响Cy,AC,OV等标志,例:双字节数求补码。解:对于一个16位数,R3存高8位,R2存低8位,求补结果仍存R3、R2求补的参考程序如下:MOVA,R2;低8位数送ACPLA;低8位数取反ADDA,#01H;加1得低8位数补码MOVR2,A;存补码低8位MOVA,R3;高8位数送ACPLA;高8位取反ADDCA,#00H;加低8位进位MOVR3,A;存补码高8位,RLA;(An+1)(An),(A0)(A7),23RLCA;(An+1)(An),(CY)(A7),(A0)(CY),33RRA;(An)(An+1),(A7)(A0),03RRCA;(An)(An+1),(CY)(A0),(A7)(CY),13如RLA:,例:设(A)=43H,(CY)=0,则执行指令:RLA;(A)=86H,(CY)=0RLCA;(A)=0CH,(CY)=1RRA;(A)=06H,(CY)=1RRCA;(A)=83H,(CY)=0使累加器A的各位逐位左移一位相当于原内容乘2,使A中各位逐位右移一位相当于原内容除2。由于MCS一51指令系统只有8位移位操作,若要对16位数进行移位操作,则需在以上移位指令的基础上,另编程序来完成。,例16位数的算术左移。16位数在内存中低8位存放在M1单元,高8位存放在M1+1单元。CLRC;进位CY清零MOVR1,#M1;操作数地址M1送RlMOVA,Rl;16位数低8位送ARLCA;低8位左移,最低位补0MOVR1,A;低8位左移后,回送Ml存放INCRl;指向16位高8位地址M1+1MOVA,R1;高8位送ARLCA;高8位带低8位进位左移MOVR1,A;高8位左移后回送M1+1存放,4.3.4控制转移指令由于MCS-51提供了较丰富的控制转移指令,因此在编程上相当灵活方便。这类指令用到的助记符共有10种:AJMP、LJMP、SJMP、JMP、ACALL、LCALL、JZ、JNZ、CJNE、DJNZ。,1)无条件转移指令,a)短跳转指令AJMPaddr11;(PC)(PC)+2,addr10800001addr70;(PC)100addr11,执行该指令时,先将PC+2,然后将addr11送入PC10PC0,而PC15PC11保持不变。这样得到跳转的目的地址。需要注意的是:目标地址与AJMP后面一条指令的第一个字节必须在同一个2KB区域的存储器区内(211)。这是2KB范围内的无条件跳转指令,PC高8位,PC低8位,例如:(PC)=2300H0010001100000000则AJMP跳转目标地址的范围:00100000000000000010011111111111AJMP0FFH;(PC)(PC)+2=2302H,0lFF(PC1511)=00100(PC100)=00011111111结果为:转移目的地址(PC)=20FFH,程序向前转向20FFH单元开始执行。又如:若AJMP指令地址(PC)=2FFFH。AJMP0FFH:转移目的地址(PC)=30FFH,b)短转移指令SJMPrel(PC)(PC)+2+rel,80rel执行该指令时,先将PC+2,再把指令中带符号的偏移量rel加到PC上,得到跳转的目标地址送入PC。程序可以无条件向前或向后转移,转移的范围:PC+2:-128+127为偏移量(256个单元).,例2100H:SJMP,5AHPC=2100H,rel=5AH(正数),则转移目的地址为215CH;例2100H:SJMP,F0H;rel=F0H(负数),则转移目的地址为20F2H(2100H+2H+F0H)。特点:当程序修改时,只要相对地址不发生改变,该指令就不需要做任何改动。,人工程序翻译rel的计算公式如下:向前转移:rel=FE-(源地址与目的地址差的绝对值)向后转移:rel=(源地址与目的地址差的绝对值)-2若rel值大于80H,程序向前转移;若rel值小于80H,则程序向后转移。,例:设(PC)=2100H,若转向215CH去执行程序,则:rel=(215CH-2100H)-2H=5AH例2210H:SJMPrel其指令的机器代码为:80rel且转向20F2H,则:rel=FE-(2100H-20F2H)=F0H若rel取值为FE,则目的地址=源地址。为什么?通常表示为:HERE:SJMPHERE;HERE:SJMP$;80FE,c)长跳转指令(三字节指令)LJMPaddr16(PC)addr16,02addr158addr70执行该指令时,将16位目标地址addr16装入PC,程序无条件转向指定的目标地址。转移的目标地址可以在64KB程序存储器地址空间的任何地方,不影响任何标志。执行时间长,字节多。,例如:在程序存储器0000H单元存放一条指令LJMP3000H;(PC)3000H,023000则上电复位后程序将跳到3000H单元去执行用户程序。,d)散转指令(单字节指令)JMPA+DPTR(PC)(A)十DPTR,73执行该指令时,把累加器A中的8位无符号数与数据指针中的16位数相加,结果作为下条指令的地址送入PC,不改变累加器A和数据指针DPTR的内容,也不影响标志。利用这条指令能实现程序的散转。,例:根据累加器A的数值,转不同处理程序的入口。MOVDPTR,#TABLE;表首址送DPTRJMPA+DPTR;依据A值转移TABLE:AJMPTAB1;(A)=0时转TABl执行AJMPTAB2;当(A)=2时转TAB2执行AJMPTAB3;当(A)=4时转TAB3执行以上程序,可依据A的内容进行多分支操作,由于AJMP是双字节指令,所以A的值必须是偶数。,e)条件转移指令(双字节)JZrel;若(A)=0,则(PC)(PC)+2+rel,60rel若(A)0,则(PC)(PC)+2,f)条件转移指令(双字节)JNZrel;若(A)0,则(PC)(PC)+2+rel,70rel若(A)=0,则(PC)(PC)+2转移的目标地址在以下一条指令的起始地址为中心的256个字节范围之内(128+127)。,例将外部数据RAM的一个数据块传送到内部数据RAM,两者的首址分别为DATA1和DATA2,遇到传送的数据为零时停止。解外部RAM向内部RAM的数据传送一定要以累加器A作为过渡,利用判零条件转移正好可以判别是否要继续传送或者终止。,MOVR0,#DATA1;外部数据块首址送R0MOVR1,#DATA2;内部数据块首址送R1LOOP:MOVXA,R0;取外部RAM数据入AHERE:JZHERE;数据为零则终止

温馨提示

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

评论

0/150

提交评论