《片机汇编程序设计》PPT课件.ppt

上传人:sh****n 文档编号:11510235 上传时间:2020-04-26 格式:PPT 页数:74 大小:254KB
返回 下载 相关 举报
《片机汇编程序设计》PPT课件.ppt_第1页
第1页 / 共74页
《片机汇编程序设计》PPT课件.ppt_第2页
第2页 / 共74页
《片机汇编程序设计》PPT课件.ppt_第3页
第3页 / 共74页
点击查看更多>>
资源描述
3.1MCS-51系列单片机汇编指令格式及标识,指令是使计算机完成基本操作的命令。一种计算机能够执行的全部指令的集合,称为这种计算机的指令系统。单片机的指令系统与微型计算机的指令系统不同,MCS-51系列单片机指令系统共有111条指令,42种指令助记符,其中有49条单字节指令,45条双字节指令和17条三字节指令;有64条为单机器周期指令,45条为双机器周期指令,只有乘、除法两条指令为四机器周期指令。在存储空间和运算速度上,效率都比较高。,MCS-51系列单片机指令系统功能强、指令短、执行快。从功能上可分成五大类:数据传送指令、算术运算指令、逻辑操作指令、控制转移指令和位操作指令。,3.1.1指令格式,标号:操作码助记符目的操作数,源操作数;注释,(1)操作码助记符表明指令的功能,不同的指令有不同的指令助记符,它一般用说明其功能的英文单词的缩写形式表示。,(2)操作数用于给指令的操作提供数据、数据的地址或指令的地址,操作数往往用相应的寻址方式指明。MCS-51单片机指令系统的指令按操作数的多少可分为无操作数、单操作数、双操作数和三操作数四种情况。,(3)标号是该指令的符号地址,后面须带冒号。它主要为转移指令提供转移的目的地址。,(4)注释是对该指令的解释,前面须带分号。它们是编程者根据需要加上去的,用于对指令进行说明,对于指令本身功能而言是可以不要的。,3.1.2指令中用到的标识符,为便于后面的学习,在这里先对指令中用到的一些符号的约定意义作以说明:(1)Ri和Rn:表示当前工作寄存器区中的工作寄存器,i取0或1,表示R0或R1。n取07,表示R0R7。(2)#data:表示包含在指令中的8位立即数。(3)#data16:表示包含在指令中的16位立即数。,(4)rel:以补码形式表示的8位相对偏移量,范围为-128127,主要用在相对寻址的指令中。(5)addr16和addr11:分别表示16位直接地址和11位直接地址。(6)direct:表示直接寻址的地址。(7)bit:表示可位寻址的直接位地址。(8)(X):表示X单元中的内容。(9)(X):表示以X单元的内容为地址的存储器单元内容,即(X)作地址,该地址单元的内容用(X)表示。(10)/和符号:“/”表示对该位操作数取反,但不影响该位的原值。“”表示操作流程,将箭尾一方的内容送入箭头所指一方的单元中去。,3.2MCS-51系列单片机寻址方式,MCS-51单片机的寻址方式按操作数的类型,可分为数的寻址和指令寻址,数的寻址有:常数寻址(立即寻址)、寄存器数寻址(寄存器寻址)、存储器数寻址(直接寻址方式、寄存器间接寻址方式、变址寻址方式)和位寻址,指令的寻址有绝对寻址和相对寻址,,3.2.1常数寻址(立即寻址),操作数是常数,使用时直接出现在指令中,紧跟在操作码的后面,作为指令的一部分。与操作码一起存放在程序存储器中,可以立即得到并执行,不需要经过别的途径去寻找。常数又称为立即数,故又称为立即寻址。在汇编指令中,立即数前面以“#”符号作前缀。在程序中通常用于给寄存器或存储器单元赋初值,例如:MOVA,#20H其功能是把立即数20H送给累加器A,其中源操作数20H就是立即数。指令执行后累加器A中的内容为20H。,3.2.2寄存器数寻址(寄存器寻址),操作数在寄存器中,使用时在指令中直接提供寄存器的名称,这种寻址方式称为寄存器寻址。在MCS-51系统中,这种寻址方式针对的寄存器只能是R0R78个通用寄存器和部分特殊功能寄存器(如累加器A、寄存器B、数据指针DPTR等)中的数据,对于其它的特殊功能寄存器中的内容的寻址方式不属于它。在汇编指令中,寄存器寻址在指令中直接提供寄存器的名称,如R0、R1、A、DPTR等。例如:MOVA,R0其功能是把R0寄存器中的数送给累加器A,在指令中,源操作数R0为寄存器寻址,传送的对象为R0中的数据。如指令执行前R0中的内容为20H,则指令执行后累加器A中的内容为20H。,3.2.3存储器数寻址,存储器数寻址针对的数据是存放在存储器单元中,对于存储器单元的内容通过提供存储器单元地址使用。根据存储器单元地址的提供方式,存储器数的寻址方式有:直接寻址、寄存器间接寻址、变址寻址。,一直接寻址,直接寻址是指数据在存储器单元中,在指令中直接提供存储器单元的地址。在MCS-51系统中,这种寻址方式针对的是片内数据存储器和特殊功能寄存器。在汇编指令中,指令中直接以地址数的形式提供存储器单元的地址。例如:MOVA,20H其功能是把片内数据存储器20H单元的内容送给累加器A。如指令执行前片内数据存储器20H单元的内容为30H,则指令执行后累加器A的内容为30H。指令中20H是地址数,它是片内数据存储单元的地址。在MCS-51中,数据前面不加“#”是存储单元地址而不是常数,常数前面要加符号“#”。,对于特殊功能寄存器,在指令中使用时往往通过特殊功能寄存器的名称使用,而特殊功能寄存器名称实际上是特殊功能寄存器单元的符号地址,因此它们是直接寻址。例如:MOVA,P0其功能是把P0口的内容送给累加器A。P0是特殊功能寄存器P0口的符号地址,该指令在翻译成机器码时,P0就转换成直接地址80H。,二寄存器间接寻址,寄存器间接寻址是指数据存放在存储单元中,而存储单元地址存放在寄存器中,在指令中通过提供存放存储单元地址的寄存器来使用对应的存储单元。形式为:寄存器名。例如:MOVA,R1该指令的功能是将以工作寄存器R1中的内容为地址的片内RAM单元的数据传送到累加器A中去。指令的源操作数是寄存器间接寻址。若R1中的内容为80H,片内RAM地址为80H的单元中的内容为20H,则执行该指令后,累加器A的内容为20H。寄存器间接寻址示意图如图所示。,在MCS-51单片机中,寄存器间接寻址用到的寄存器只能是通用寄存器R0、R1和数据指针寄存器DPTR,它能访问的数据是片内数据存储器和片外数据存储器。其中,片内数据存储器只能用R0和R1作指针间接访问;片外数据存储器,低端的256字节单元,既可以用两位十六进制地址以R0或R1作指针间接访问,也可用四位十六进制地址以DPTR作指针间接访问,而高端的字节单元则只能以DPTR作指针间接访问。对于片内RAM和片外RAM的低端256字节都可以用R0和R1作指针访问,它们之间用指令来区别。片内RAM访问用MOV指令,片外RAM访问用MOVX指令。,三变址寻址,变址寻址是指操作数的地址由基址寄存器的地址加上变址寄存器的地址得到。在MCS-51系统中,它是以数据指针寄存器DPTR或程序计数器PC为基址,累加器A为变址,两者相加得存储单元的地址,所访问的存储器为程序存储器。,例如:MOVCA,A+DPTR,其功能是将数据指针寄存器DPTR的内容和累加器A中的内容相加作为程序存储器的地址,从对应的单元中取出内容送累加器A中。指令中,源操作数的寻址方式为变址寻址,设指令执行前数据指针寄存器DPTR的值为2000H,累加器A的值为05H,程序存储器2005H单元的内容为30H,则指令执行后,累加器A中的内容为30H。示意图如图所示。,3.2.4位寻址,位寻址是指操作数是二进制位的寻址方式。在MCS-51单片机中有一个独立的位处理器,有多条位处理指令,能够进行各种位运算。在MCS-51系统中,位处理的操作对象是各种可位寻址位。对于它们的访问是通过提供相应的位地址来处理。在MCS-51系统中,位地址的表示可以用以下几种方式:1直接位地址(00H0FFH)。例如:20H2字节地址带位号。例如:20H.3表示20H单元的3位。3特殊功能寄存器名带位号。例如:P0.1表示P0口的1位。4位符号地址。例如:TR0是定时/计数器T0的启动位。,3.2.5指令寻址,一绝对寻址,绝对寻址是在指令的操作数中直接提供目的位置的地址或地址的一部份。在MCS-51系统中,长转移和长调用提供目的位置的16位地址,绝对转移和绝对调用提供目的位置的16位地址的低11位,它们都为绝对寻址。,二相对寻址,相对寻址是以当前程序计数器PC值加上指令中给出的偏移量rel得到目的位置的地址。在MCS-51系统中,相对转移指令的操作数属于相对寻址。在使用相对寻址时要注意以下两点:(1)当前PC值是指转移指令执行时的PC值,它等于转移指令的地址加上转移指令的字节数。实际上是转移指令的下一条指令的地址。例如:若转移指令的地址为2010H,转移指令的长度为2字节,则转移指令执行时的PC值为2012H。(2)偏移量rel是8位有符号数,以补码表示,它的取值范围为-128+127。当为负值时,向前转移,当为正数时向后转移。相对寻址的目的地址为:目的地址=当前PC+rel=转移指令的地址+转移指令的字节数+rel,3.3MCS-51系列单片机指令系统,3.3.1数据传送指令,数据传送指令有29条,是指令系统中数量最多、使用也最频繁的一类指令。这类指令可分为三组:普通传送指令、数据交换指令、堆栈操作指令。,一普通传送指令普通传送指令以助记符MOV为基础。分成片内数据存储器传送指令、片外数据存储器传送指令和程序存储器传送指令。1片内数据存储器传送指令MOV指令格式:MOV目的操作数,源操作数其中:源操作数可以为A、Rn、Ri、direct、#data,目的操作数可以为A、Rn、Ri、direct,组合起来总共16条,按目的操作数的寻址方式划分为五组:,(1)以A为目的操作数MOVA,Rn;ARnMOVA,direct;A(direct)MOVA,Ri;A(Ri)MOVA,#data;A#data(2)以Rn为目的操作数MOVRn,A;RnAMOVRn,direct;Rn(direct)MOVRn,#data;Rn#data(3)以直接地址direct为目的操作数MOVdirect,A;(direct)AMOVdirect,Rn;(direct)RnMOVdirect,direct;(direct)(direct)MOVdirect,Ri;(direct)(Ri)MOVdirect,#data;(direct)#data(4)以间接地址Ri为目的操作数MOVRi,A;(Ri)AMOVRi,direct;(Ri)(direct)MOVRi,#data;(Ri)#data(5)以DPTR为目的操作数MOVDPTR,#data16;DPTR#data16,注意,源操作数和目的操作数中的Rn和Ri不能相互配对。如不允许有“MOVRn,Rn”,“MOVRi,Rn”这样的指令,在MOV指令中,不允许在一条指令中同时出现工作寄存器,无论它是寄存器寻址还是寄存器间接寻址。,2片外数据存储器传送指令MOVX在MCS-51系统中只能通过累加器A与片外数据存储器进行数据传送,访问时,只能通过Ri和DPTR以间接寻址方式进行。MOVX指令共有四条:MOVXA,DPTR;A(DPTR)MOVXDPTR,A;(DPTR)AMOVXA,Ri;A(Ri)MOVXRi,A;(Ri)A其中前两条指令通过DPTR间接寻址,可以对整个64K片外数据存储器访问。后两条指令通过Ri间接寻址,只能对片外数据存储器的低端的256字节访问,访问时将低8位地址放于Ri中。,3程序存储器传送指令MOVC程序存储器传送指令只有两条,一条用DPTR基址变址寻址。一条用PC基址变址寻址。MOVCA,A+DPTR;A(A+DPTR)MOVCA,A+PC;A(A+PC)这两条指令通常用于访问表格数据,因此以称为查表指令。,例如:查表指令MOVCA,A+PC所在的地址为2000H,表格的起始单元地址为2035H,表格的第4个元素(位移量为03H)的内容为45H,则查表指令的处理过程如下:MOVA,#03H;表格元素相对于表首的位移量送累加器AADDA,34H;当前程序计数器PC相对于表首的差值加到累加器A中MOVCA,A+PC;查表,查得第4个元素内容45H送累加器A注意:查表指令的长度为1个字节,当前程序计数器PC的值应为查表指令的地址加1。,注意,源操作数和目的操作数中的Rn和Ri不能相互配对。如不允许有“MOVRn,Rn”,“MOVRi,Rn”这样的指令,在MOV指令中,不允许在一条指令中同时出现工作寄存器,无论它是寄存器寻址还是寄存器间接寻址。,2片外数据存储器传送指令MOVX在MCS-51系统中只能通过累加器A与片外数据存储器进行数据传送,访问时,只能通过Ri和DPTR以间接寻址方式进行。MOVX指令共有四条:MOVXA,DPTR;A(DPTR)MOVXDPTR,A;(DPTR)AMOVXA,Ri;A(Ri)MOVXRi,A;(Ri)A其中前两条指令通过DPTR间接寻址,可以对整个64K片外数据存储器访问。后两条指令通过Ri间接寻址,只能对片外数据存储器的低端的256字节访问,访问时将低8位地址放于Ri中。,【例3-1】写出完成下列功能的程序段。(1)将R0的内容送R6中程序为:MOVA,R0MOVR6,A(2)将片内RAM30H单元的内容送片外60H单元中程序为:MOVA,30HMOVR0,#60HMOVXR0,A(3)将片处RAM1000H单元的内容送片内20H单元中程序为:MOVDPTR,#1000HMOVA,DPTRMOV20H,A(4)将ROM2000H单元的内容送片内RAM的30H单元中程序为:MOVA,#0MOVDPTR,#1000HMOVCA,A+DPTRMOV30H,A,二数据交换指令普通传送指令实现将源操作数的数据传送到目的操作数,指令执行后源操作数不变,数据传送是单向的。数据交换指令数据作双向传送,传送后,前一个操作数原来的内容传送到后一个操作数中,后一个操作数原来的内容传送到前一个操作数中。数据交换指令要求第一个操作数须为累加器A,共有5条。XCHA,Rn;ARnXCHA,direct;A(direct)XCHA,Ri;A(Ri)XCHDA,Ri;A03(Ri)03SWAPA;A03A47【例3-2】若R0的内容为30H,片内RAM30H单元的内容为23H,累加器A的内容为45H,则执行XCHA,R0指令后片内RAM30H单元的内容为45H,累加器A中的内容为23H。若执行SWAPA指令,则累加器A的内容为54H。,三堆栈操作指令堆栈是在片内RAM中按“先进后出,后进先出”原则设置的专用存储区。数据的进栈和出栈由指针SP统一管理。在MCS-51系统中,堆栈操作指令有两条:PUSHdirect;SP(SP+1),(SP)(direct)POPdirect;(direct)(SP),(SP)(SP-1)其中PUSH指令入栈,POP指令出栈。操作时以字节为单位。入栈时SP指针先加1,再入栈。出栈时内容先出栈,SP指针再减1。用堆栈保存数据时,先入栈的内容后出栈;后入栈的内容先出栈。【例3-3】若入栈保存时入栈的顺序为:PUSHAPUSHB则出栈的顺序为:POPBPOPA,3.3.2算术运算指令,一加法指令,1一般的加法指令ADDADDA,Rn;AA+RnADDA,direct;AA+(direct)ADDA,Ri;AA+(Ri)ADDA,#data;AA+#data2带进位加指令ADDCADDCA,Rn;AA+Rn+CADDCA,direct;AA+(direct)+CADDCA,Ri;AA+(Ri)+CADDCA,#data;AA+#data+C3加1指令INCA;AA+1INCRn;RnRn+1INCdirect;(direct)(direct)+1INCRi;(Ri)(Ri)+1INCDPTR;DPTRDPTR+1,其中,ADD和ADDC指令在执行时要影响CY、AC、OV和P标志位。而INC指令除了INCA要影响P标志位外,对其它标志位都没有影响。在MCS-51单片机中,常用ADD和ADDC配合使用实现多字节加法运算。,【例3-4】试把存放在R1R2和R3R4中的两个16位数相加,结果存于R5R6中。处理时,R2和R4用一般的加法指令ADD,结果放于R6中,R1和R3用带进位的加法指令ADDC,结果放于R5中,程序如下:MOVA,R2ADDA,R4MOVR6,AMOVA,R1ADDCA,R3MOVR5,A,二减法指令,1带借位减法指令SUBBSUBBA,Rn;AA-Rn-CSUBBA,direct;AA-(direct)-CSUBBA,Ri;AA-(Ri)-CSUBBA,#data;AA-#dataC2减1指令DECDECA;AA-1DECRn;RnRn-1DECdirect;direct(direct)-1DECRi;(Ri)(Ri)-1,在MCS-51单片机中,只提供了一种带借位的减法指令,没有提供一般的减法指令,一般的减法操作可以通过先对CY标志清零,然后再执行带借位的减法来实现。其中,SUBB指令在执行时要影响CY、AC、OV和P标志位。而DEC指令除了DECA要影响P标志位外,对其它标志位都没有影响。,【例3-5】求R3R2-R1。程序为:MOVA,R2CLRCSUBBA,R1MOVR3,A,3乘法指令MUL在MCS-51单片机中,乘法指令只有一条:MULAB该指令执行时将对存放于累加器A中的无符号被乘数和放于B寄存器中的无符号乘数相乘,积的高字节存于B寄存器中,低字节存于累加器A中。指令执行后将影响CY和OV标志,CY复位,对于OV:当积大于255时(即B中不为0),OV为1;否则,OV为0。,4除法指令DIV在MCS-51单片机中,除法指令也只有一条:DIVAB该指令执行时将用存放在累加器A中的无符号被除数与存放在B寄存器中的无符号除数相除,除得的结果,商的存于累加器A中,余数存于B寄存器中。指令执行后将影响CY和OV标志,一般情况CY和OV都清0,只有当B寄存器中的除数为0时,CY和OV才被置1。,5十进制调整指令在MCS-51单片机中,十进制调整指令只有一条:DAA它只能用在ADD或ADDC指令后面,用来对两个二位的压缩的BCD码数通过用ADD或ADDC指令相加后存于累加器A中的结果进行调整,使得它得到正确的十进制结果。通过该指令可实现两位十进制BCD码数的加法运算。,它的调整过程为:(1)若累加器A的低四位为十六进制的AF或辅助进位标志AC为1,则累加器A中的内容作加06H调整。(2)若累加器A的高四位为十六进制的AF或进位标志CY为1,则累加器A中的内容作加60H调整。【例3-6】在R3中有十进制数67,在R2中有十进制数85,用十进制运算,运算的结果放于R5中。程序为:MOVA,R3ADDA,R2DAAMOVR5,A程序中DA指令对ADD指令运算出来的放于累加器A中的结果进行调整,调整后,累加器A中的内容为52H,CY为1,则结果为152,最后放于R5中的内容为52H(十进制数52)。,3.3.3逻辑操作指令,一逻辑与指令ANLANLA,RnAARnANLA,directAA(direct)ANLA,RiAA(Ri)ANLA,#dataAAdataANLdirect,A(direct)(direct)AANLdirect,#data(direct)(direct)data二逻辑或指令ORLORLA,RnAARnORLA,directAA(direct)ORLA,RiAA(Ri)ORLA,#dataAAdataORLdirect,A(direct)(direct)AORLdirect,#data(direct)(direct)data,三逻辑异或指令XRLXRLA,RnAARnXRLA,directAA(direct)XRLA,RiAA(Ri)XRLA,#dataAAdataXRLdirect,A(direct)(direct)AXRLdirect,#data(direct)(direct)data在使用中,逻辑与用于实现对指定位清0,其余位不变;逻辑或用于实现对指定位置1,其余位不变;逻辑异或用于实现指定位取反,其余位不变。【例3-7】写出完成下列功能的指令段。1对累加器A中的1、3、5位清0,其余位不变ANLA,#11010101B2对累加器A中的2、4、6位置1,其余位不变ORLA,#01010100B3对累加器A中的0、1位取反,其余位不变XRLA,#00000011B,四清零和求反指令1清零指令:CLRAA02求反指令:CPLAA在MCS-51系统中,只能对累加器A中的内容进行清零和求反,如要对其它的寄存器或存储单元进行清零和求反,则须放在累加器A进行,运算后再放回原位置。【例3-8】写出对R0寄存器内容求反的程序段。程序为:MOVA,R0CPLAMOVR0,A,五循环移位指令MCS-51系统有四条对累加器A的循环移位指令,前两条只在累加器A中进行循环移位,后两条还要带进位标志CY进行循环移位。每一次移一位。分别如下:1累加器A循环左移RLA2累加器A循环右移RRA,3带进位的循环左移RLCA4带进位的循环右移RRCA【例3-9】若累加器A中的内容为10001011B,CY=0,则执行RLCA指令后累加器A中的内容为00010110,CY=1。,3.3.4控制转移指令,共有17条,包括无条件转移指令、条件转移指令、子程序调用及返回指令。,一无条件转移指令无条件转移指令是指当执行该指令后,程序将无条件地转移到指令指定的地方去。无条件转移指令包括长转移指令、绝对转移指令、相对转移指令和间接转移指令。1长转移指令LJMP指令格式:LJMPaddr16;PCaddr16指令后面带目的位置的16位地址,执行时直接将该16位地址送给程序指针PC,程序无条件地转到16位目标地址指明的位置去。指令中提供的是16位目标地址,所以可以转移到64KB程序存储器的任意位置,故得名为“长转移”。该指令不影响标志位,使用方便。缺点是:执行时间长,字节数多。,2绝对转移指令指令格式:AJMPaddr11;PC100addr11AJMP指令后带的是目的位置的低11位直接地址,执行时,先将程序指针PC的值加2(该指令长度为2字节),然后把指令中的11位地址addr11送给程序指针PC的低11位,而程序指针的高5位不变,执行后转移到PC指针指向的新位置。由于11位地址addr11的范围是0000000000011111111111,即2KB范围,而目的地址的高5位不变,所以程序转移的位置只能是和当前PC位置(AJMP指令地址加2)在同一2KB范围内。转移可以向前也可以向后,指令执行后不影响状态标志位。【例3-10】若AJMP指令地址为3000H。AJMP后面带的11位地址addr11为123H,则执行指令AJMPaddr11后转移的目的位置是多少?AJMP指令的PC值加2=3000H+2=3002H=0011000000000010B指令中的addr11=123H=00100100011B转移的目的地址为0011000100100101B=3125H,3相对转移指令指令格式:SJMPrel;PCPC+2+relSJMP指令后面的操作数rel是8位带符号补码数,执行时,先将程序指针PC的值加2(该指令长度为2字节),然后再将程序指针PC的值与指令中的位移量rel相加得转移的目的地址。即:转移的目的地址=SJMP指令所在地址+2+rel因为8位补码的取值范围为-128+127,所以该指令的转移范围是:相对PC当前值向前128字节,向后127字节。,【例3-11】在2100H单元有SJMP指令,若rel=5AH(正数),则转移目的地址为215CH(向后转);若rel=F0H(负数),则转移目的地址为20F2H(向前转)。用汇编语言编程时,指令中的相对地址rel往往用目的位置的标号(符号地址)表示。机器汇编时,能自动算出相对地址值;但手工汇编时,需自己计算相对地址值rel。rel的计算方法如下:rel=目的地址(SJMP指令地址)如目的地址等于2013H,SJMP指令的地址为2000H,则相对地址rel为11H。,注意:在单片机程序设计中,通常用到一条SJMP指令:SJMP$该指令的功能是在自己本身上循环,进入等待状态。其中符号$表示转移到本身,它的机器码为80FEH。在程序设计中,程序的最后一条指令通常用它,使程序不再向后执行以避免执行后面的内容而出错。,4间接转移指令指令格式:JMPA+DPTR;PCA+DPTR它MCS-51系统中唯一一条间接转移指令,转移的目的地址是由数据指针DPTR的内容与累加器A中的内容相加得到,指令执行后不会改变DPTR及A中原来的内容。数据指针DPTR的内容一般为基址,累加器A的内容为相对偏移量,在64KB范围内无条件转移。该指令的特点是转移地址可以在程序运行中加以改变。DPTR一般为确定值,根据累加器A的值来实现转移到不同的分支。在使用时往往与一个转移指令表一起来实现多分支转移。,【例3-12】下面的程序能根据累加器A的值0、2、4、6转移到相应的TAB0TA6分支去执行。MOVDPTR,#TABLE;表首地址送DPTRJMPA+DPTR;根据A值转移TABLE:AJMPTAB0;当(A)=0时转TAB0执行AJMPTAB2;当(A)=2时转TAB2执行AJMPTAB4;当(A)=4时转TAB4执行AJMPTAB6;当(A)=6时转TAB6执行,二条件转移指令条件转移指令是指当条件满足时,程序转移到指定位置,条件不满足时,程序将继续顺次执行。在MCS-51系统中,条件转移指令有三种:累加器A判零条件转移指令、比较转移指令、减1不为零转移指令。1累加器A判零条件转移指令判0指令:JZrel;若A=0,则PCPC+2+rel,否则,PCPC+2判非0指令:JNZrel;若A0,则PCPC+2+rel,否则,PCPC+2,【例3-13】把片外RAM的30H单元开始的数据块传送到片内RAM的40H开始的位置,直到出现零为止。片内、片外数据传送以累加器A过渡。每次传送一个字节,通过循环处理,直到处理到传送的内容为0结束。程序如下:MOVR0,#30HMOVR1,#40HLOOP:MOVXA,R0MOVR1,AINCR1INCR0JNZLOOPSJMP$,2比较转移指令比较转移指令用于对两个数作比较,并根据比较情况进行转移,比较转移指令有四条:CJNEA,#data,rel;若A=data,则PCPC+3,不转移,继续执行若Adata,则C=0,PCPC+3+rel,转移若Adata,则C=0,PCPC+3+rel,转移若(Rn)data,则C=0,PCPC+3+rel,转移若(Ri)direct,则C=0,PCPC+3+rel,转移若Adirect,则C=1,PCPC+3+rel,转移,3减1不为零转移指令这种指令是先减1后判断,若不为零则转移。指令有两条:DJNZRn,rel;先Rn中的内容减1,再判断Rn中的内容是否等于零,若不为零,则转移。DJNZdirect,rel;先(direct)中的内容减1,再判断(direct)中的内容是否等于零,若不为零,则转移。在MCS-51系统中,通常用DJNZ指令来构造循环结构,实现重复处理。,【例3-14】统计片内RAM中30H单元开始的20个数据中0个数,放于R7中。用R2作循环变量,最开始置初值为20;作R7作计数器,最开始置初值为0;用R0作指针访问片内RAM单元,最开始置初值为30H;用DJNZ指令对R2减1转移进行循环控制,在循环体中用指针R0依次取出片内RAM中的数据,判断,如为0,则R7中的内容加1。程序:MOVR0,#30HMOVR2,#20MOVR7,#0LOOP:MOVA,R0CJNEA,#0,NEXTINCR7NEXT:INCR0DJNZR2,LOOP,三子程序调用及返回指令这类指令有四条。两条子程序调用指令,两条返回指令。1长调用指令指令格式:LCALLaddr16执行过程:(PC)(PC)+3(SP)(SP)+1(SP)(PC)70(SP)(SP)+1(SP)(PC)158(PC)addr16该指令执行时,先将当前的PC(指令的PC加指令的字节数3)值压入堆栈保存,入栈时先低字节,后高字节。然后转移到指令中addr16所指定的地方执行。由于后面带16位地址,因而可以转移到程序存储空间的任一位置。,2绝对调用指令指令格式:ACALLaddr11执行过程:(PC)(PC)+2(SP)(SP)+1(SP)(PC)70(SP)(SP)+1(SP)(PC)158(PC)100addr11该指令执行过程与LCALL指令类似,只是该指令与AJMP一样只能实现2KB范围内转移,执行的最后是将指令中的addr11送给PC指针的低11位。对于LCALL和ACALL两条子程序调用指令,在汇编程序中,指令后面通常带转移位置的标号,用LCALL指令调用,转移位置可以是程序存储空间的任一位置,用ACALL指令调用,转移位置与ACALL指令的下一条指令必须在同一个2KB内,即它们的高5位地址相同。,3子程序返回指令指令格式:RET执行过程:(PC)158(SP)(SP)(SP)-1(PC)70(SP)(SP)(SP)-1执行时将子程序调用指令压入堆栈的地址出栈,第一次出栈的内容送PC的高8位,第二次出栈的内容送PC的低8位。执行完后,程序转移到新的PC位置执行指令。由于子程序调用指令执行时压入的内容是调用指令的下一条指令的地址,因而RET指令执行后,程序将返回到调用指令的下一条指令执行。该指令通常放于子程序的最后一条指令位置,用于实现返回到主程序。另外,在MCS-51程序设计中,也常用RET指令来实现程序转移,处理时先将转移位置的地址用两条PUSH指令入栈,低字节在前,高字节在后,然后执行RET指令,执行后程序转移到相应的位置去执行。,4中断返回指令指令格式:RETI执行过程:(PC)158(SP)(SP)(SP)-1(PC)70(SP)(SP)(SP)-1该指令的执行过程与RET基本相同,只是RETI在执行后,在转移之前将先清除中断的优先级触发器。该指令用于中断服务子程序后面,作为中断服务子程序的最后一条指令,它的功能是返回主程序中断的断点位置,继续执行断点位置后面的指令。在MCS-51系统中,中断都是硬件中断,没有软件中断调用指令,硬件中断时,由一条长转移指令使程序转移到中断服务程序的入口位置,在转移之前,由硬件将当前的断点地址压入堆栈保存,以便于以后通过中断返回指令返回到断点位置后继续执行。,3.3.5位操作指令,在MCS-51系统中,有17条位处理指令,可以实现位传送、位逻辑运算、位控制转移等操作。一位传送指令位传送指令有两条,用于实现位运算器C与一般位之间的相互传送。MOVC,bit;C(bit)MOVbit,C;(bit)C指令在使用时必须有位运算器C参与,不能直接实现两位之间的传送。如果进行两位之间的传送,可以通过位运算器C来传送。【例3-15】把片内RAM中位寻址区的20H位的内容传送到30H位。程序:MOVC,20HMOV30H,C,二位逻辑操作指令位逻辑操作指令包括位清0、置1、取反、位与和位或,总共10位指令。1位清0CLRC;C0CLRbit;(bit)02位置1SETBC;C1SETBbit;(bit)13位取反CPLC;CCPLbit;(bit)(bit)4位与ANLC,bit;CC(bit)ANLC,/bit;CC(/bit)5位或ORLC,bit;CC(bit)ORLC,/bit;CC(/bit),利用位逻辑运算指令可以实现各种各样的逻辑功能。【例3-16】利用位逻辑运算指令编程实现下面硬件逻辑电路的功能。,程序:MOVC,P1.0ANLC,P1.1CPLCORLC,/P1.2MOV0F0H,CMOVC,P1.3ORLC,P1.4ANLC,0F0HMOVP1.5,C,三位转移指令位转移指令有以C为条件的位转移指令和以bit为条件的位转移指令,共5条。1以C条件的位转移指令JCrel;若C=1,则转移,PCPC+2+rel;否则程序继续执行JNCrel;若C=0,则转移,PCPC+2+rel;否则程序继续执行,2以bit为条件的位转移指令JBbit,rel;若(bit)=1,则转移,PCPC+3+rel;否则程序继续执行JNBbit,rel;若(bit)=0,则转移,PCPC+3+rel;否则程序继续执行JBCbit,rel;若(bit)=1,则转移,PCPC+3+rel,且(bit)0;否则程序继续执行利用位转移指令可进行各种测试。【例3-17】从片外RAM中30H单元开始有100个数据,统计当中正数、0、和负数的个数,分别放于R5、R6、R7中。设用R2作计数器,用DJNZ指令对R2减1转移进行循环控制,在循环体外设置R0指针,指向片外RAM30H单元,对R5、R6、R7清零,在循环体中用指针R0依次取出片外RAM中的100个数据,判断,如大于0,则R5中的内容加1;如等于0,则R6中的内容加1;如小于0,则R7中的内容加1。,程序:MOVR2,#100MOVR0,#30HMOVR5,#0MOVR6,#0MOVR7,#0LOOP:MOVXA,R0CJNEA,#0,NEXT1INCR6SJMPNEXT3NEXT1:CLRCSUBBA,#0JNCNEXT2INCR5SJMPNEXT3NEXT2:INCR7NEXT3:DJNZR2,LOOPSJMP$,四空操作指令NOP;PCPC+1这是一条单字节指令。执行时,不作任何操作(即空操作),仅将程序计数器PC的内容加1,使CPU指向下一条指令继续执行程序。它要占用一个机器周期,常用来产生时间延迟,构造延时程序。,3.4MCS-51系列单片机汇编程序常用伪指令,伪指令是放在汇编语言源程序中用于指示汇编程序如何对源程序进行汇编的指令,它不同于指令系统中的指令,指令系统中的指令在汇编程序汇编时能够产生相应的指令代码,而伪指令在汇编程序汇编时不会产生代码,只是对汇编过程进行相应的控制和说明。伪指令通常在汇编语言源程序中用于定义数据、分配存储空间、控制程序的输入输出等。MCS-51汇编语言源程序相对于一般的微型计算机汇编语言源程序结构简单,伪指令数目少,常用的伪指令只有几条。,1ORG伪指令格式:ORG地址(十六进制表示)这条伪指令放于一段源程序或数据的前面,汇编时用于指明程序或数据从程序存储空间什么位置开始存放。ORG伪指令后的地址是程序或数据的起始地址。【例3-18】ORG1000HSTART:MOVA,#7FH指明后面的程序从程序存储器的1000H单元开始存放。,2DB伪指令格式:标号:DB项或项表DB伪指令用于定义字节数据,可以定义一个字节,也可定义多个字节,字义多个字节时,两两之间用逗号间隔,定义的多个字节在存储器中是连续存放的。定义的字节可以是一般常数,也可以为字符,还可以是字符串,字符和字符串以引号括起来,字符数据在存储器中以ASCII码形式存放。在定义时前面可以带标号,定义的标号在程序中是起始单元的地址。【例3-19】ORG3000HTAB1:DB12H,34HDB5,A,abc汇编后,各个数据在存储单元中的存放情况如下:,3DW伪指令格式:标号:DW项或项表这条指令与DB相似,但用于定义字数据。项或项表指所定义的一个字在存储器中占两个字节。汇编时,机器自动按低字节在前,高字节在后,即低字节存放在低地址单元,高字节存放在高地址单元。【例3-20】ORG3000HTAB2:DW1234H,5678H汇编后,各个数据在存储单元中的存放情况如下:,4DS伪指令格式:标号:DS数值表达式该伪指令用在存储器中保留一定数量的字节单元。保留存贮空间主要为以后存放数据。保留的字节单元数由表达式的值决定。【例3-21】ORG3000HTAB1:DB12H,34HDS4HDB5汇编后,存储单元中的分配情况如下:,5EQU伪指令格式:符号EQU项该伪指令的功能是将指令中的项的值赋予EQU前面的符号。项可以是常数、地址标号或表达式。以后可以通过使用该符号使用相应的项。【例3-22】TAB1EQU1000HTAB2EQU2000H汇编后TAB1、TAB2分别等于1000H、2000H。程序后面使用1000H、2000H的地方就可以用符号TAB1、TAB2替换。用EQU伪指令对某标号赋值后,该符号的值在整个程序中不能再改变。,6bit伪指令格式:符号bit位地址bit该伪指令用于给位地址赋予符号,经赋值后可用该符号代替bit后面的位地址。【例3-23】PLGbitF0AIbitP1.0定义后,在程序中位地址F0、P1.0就可以通过FLG和AI来使用。,7END伪指令格式:END该指令放于程序最后位置,用于指明汇编语言源程序的结束位置,当汇编程序汇编到END伪指令时,汇编结束。END后面的指令,汇编程序都不予处理。一个源程序只能有一个END命令,否则就有一部分指令不能被汇编。,3.5MCS-51系列单片机汇编程序设计,3.5.1运算程序,【例3-24】多字节无符号数加法,设从片内RAM30H单元和40H单元有两个16字节数,把它们相加,结果放于30H单元开始的位置处(设结果不溢出)。处理过程:用R0作指针指向30H单元,用R1作指针指向40H单元,用R2为循环变量,初值为16,在循环体中用ADDC指令把R0指针指向的单元与R1指针指向的单元相加,加得的结果放回R0指向的单元,改变R0、R1指针指向下一个单元,循环16次,在第一次循环前应先将CY清零。程序流程图和程序如下:,程序:ORG1000HMOVR0,#30HMOVR1,#40HMOVR2,#16CLRCLOOP:MOVA,R0ADDCA,R1MOVR0,AINCR0INCR1DJNZR2,LOOPEND,【例3-26】两字节无符号数乘法,设被乘数的高字节放在R7中,低字节放于R6中;乘数的高字节放于R5中,低字节放于R4中。乘得的积有4个字节,按由低字节到高字节的次序存于片内RAM中以ADDR为首址的区域中。由于MCS-51单片机只有一条单字节无符号数乘法指令MUL,而且要求参加运算的两个字节须放于累加器A和B寄存器中,而乘得的结果高字节放于B寄存器中,低字节放于累加器A中。因而两字节乘法须用四次乘法指令来实现,即R6R4、R7R4、R6R5和R7R5,设R6R4的结果为B1A1,R7R4结果为B2A1,R6R5的结果为B3A3,R7R5的结果为B4A4,乘得的结果须按下面的关系加起来。,即乘积的最低字节C1只由A1这部分得到,乘积的第二字节C2由B1、A2和A3相加得到,乘积的第三字节C3由B2、B3、A4以及C2部分的进位相加得到,乘积的第四字节C4由B4和低字节的进位相加得到。由于在计算机内部不能同时实现多个数相加,因而我们用累加的方法来计算C2、C3和C4部分,用R3寄存器来累加C2部分,用R2寄存器来累加C3部分,用R1寄存器来累加C4部分,另外用R0作指针来依次存放C1、C2、C3、C4入存储器。程序如下:,ORG0100HMOVR0,#ADDRMUL1:MOVA,R6MOVB,R4MULAB;R6R4,结果的低字节直接存入积的第一字节单元MOVR0,A;结果的高字节存入R3中暂存起来MOVR3,BMUL2:MOVA,R7MOVB,R4MULAB;R7R4,结果的低字节与R3相加后,再存入R3中ADDA,R3MOVR3,A,MOVA,B;结果的高字节加上进位位后存入R2中暂存起来ADDCA,#00MOVR2,AMUL3:MOVA,R6MOVB,R5MULAB;R6R5,结果的低字节与R3相加存入积的第二字节单元ADDA,R3INCR0MOVR0,AMOVA,R2ADDCA,B;结果的高字节加R2再加进位位后,再存入R2中MOVR2,AMOVA,#00ADDCA,#00;相加的进位位存入R1中MOVR1,A,MUL4:MOVA,R7MOVB,R5MULAB;R7R5,结果的低字节与R2相加存入积的第三字节单元ADDA,R2INCR0MOVR0,AMOVA,BADDCA,R1;结果的高字节加R1再加进位位后存入积的第四字节单元INCR0MOVR0,AEND,【例3-27】多字节求补运算设在片内RAM30H单元开始有一个8字节数据,对该数据求补,结果放回原位置。在MCS-51系统中没有求补指令,只有通过取反未位加1得到。而当未位加1时,可能向高字节产生进位。因而在处理时,最低字节采用取反加1,其余字节采用取反加进位,通过循环来实现。,程序:ORG0100HMOVR2,#08HMOVR0,#30HMOVA,R0CPLAADDA,#01MOVR0,ADECR2LOOP:INCR0MOVA,R0CPLAADDCA,#00MOVR0,ADJNZR2,LOOPEND,3.5.2数据的拼拆和转换,【例3-28】设在30H和31H单元中各有一个8位数据:(30H)=x7x6xx4xx2x1x0(3lH)=y7y6yy4yy2y1y0现在要从30H单元中取出低5位,并从31H单元中取出低3位完成拼装,拼装结果送40H单元保存,并且规定:(40H)=y2y1y0 x4xx2x1x0利用逻辑指令ANL、ORL、RL等来完成数据的拼拆,处理过程:将30H单元的内容高3位屏蔽;31H单元内容的低5位屏蔽,高低四位交换,左移一位;然后与30H单元的内容相或,拼装后放到40H单元。,程序如下:ORG0100HMOVA,30HANLA,#00011111BMOV30H,AMOVA,31HANLA,#00000111BSWAPA,RLAORLA,40HMOV40H,AEND,【例3-29】设片内RAM的20H单元的内容为:(20H)=x7x6xx4xx2x1x0把该单元内容反序后放回20H单元,即为:(20H)=x0 x1x2x3x4x5x6x7可以通过先把原内容右移一位,低位移入CF中,然后左移一位,CF中的内容移入,通过8次处理即可,由于8次过程相同,可以通过循环完成,移位过程当中必须通过累加器来处理。设20H单元原来的内容先通过R3暂存,结果先通过R4暂存,R2作循环变量。,程序如下:ORG0200HMOVR3,20HMOVR4,#0MOVR2,#8LOOP:MOVA,R3RRCAMOVR3,AMOVA,R4RLCAMOVR4,ADJNZR2,LOOPMOV20H,R4END另外,由于片内RAM的20H单元在位寻址区,这一问题还可以通过位处理方式来实现,这种方法留给读者自己完成。,【例3-29】一位十六进制数转换成ASC1I码。一位十六进制数有十六个符号09、A、B、C、D、E、F。其中,09的ASCII码为30H39H,AF的ASCII码为41H46H,转换时,只要判断十六进制数是在09之间还是在AF之间,如在09之间,加30H,如在AF之间,加37H,就可得到ASCII码。设十六进制数放于R2中,转换的结果放于R2中。,程序如下:ORG0200HMOVA,R2CLRCSUBBA,#0AH;减去0AH,判断在09之间,还是在AF之间MOVA,R2JCADD30;如在09之间,直接加30HADDA,#07H;如在AF之间,先加07H,再加30HADD30:ADDA,#30HMOVR2,AEND,【例3-31】一位十六进制数转换8段式数码管显示码。一位十六进制数09、A、B、C、D、E、F的8段式数码管的共阴极显示码为3FH、06H、5BH、4FH、66H、6DH、7DH、07H、7FH、67H、77H、7CH、39H、5EH、79H、71H。由于数与显示码没有规律,不能通过运算得到,只能通过查表方式得到。设数放在R2中,查得的显示码也放于R2中,用MOVCA,A+DPTR查表。程序如下:ORG0200HCONVERT:MOVDPTR,#TAB;DPTR指向表首址MOVA,R2;转换的数放于MOVCA,A+DPTR;查表指令转换MOVR2,ARETTAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,67H,77H,7CH,39H,5EH,79H,71H;显示码表在这个例子中,编码是一个字节,只通过一次查表指令就可实现转换,如编码是两个字节,则需要用两次查表指令才能查得编码,第一次取得低位,第二次取得高位。,【例3-32】在一温度控制系统中,温度0100C每一个温度值都已经通过温度传感器测得一个两字节的标准电压值。现在R2中给出一个0100C的温度值,取得它的标准电压值放于R3、R4中,低字节放在R3中,高字节放在R4中。通过用MOVCA,A+DPTR查表,两个字节分两次取得,由DPTR指向表首,由放于R2中的温度值得到所查的电压值相对于表首位置的位移量放于累加器A中,由于每一个电压值为两个字节,位移量须用R2中的温度值乘以2得到。第一次取得低字节,第二次位移量加1后查表取得高字节,分别放于R3、R4中。,程序如下:ORG0300HCHECK:MOVDPTR,#TAB;指向表首MOVA,R2;温度值送ARLA;乘2得位移量MOVR1,A;位移量暂存于R1中MOVCA,A+DPTRMOVR3,A;第一次查得内容送R3MOVA,R1;取出暂存的位移量送A,INCA;指向高字节MOVCA,A+DPTRMOVR4,A;第二次查得内容送R4RETTAB:DW0056H,0059H,0067H,0076H;电压值表,3.5.3多分支转移(散转)程序,一用多分支转移指令JMPA+DPTR实现的多分支转移程序,【例3-33】现有128路分支,分支号分别为0127,要求根据R2中的分支信息转向各个分支的程序。即当(R2)=0,转向OPR0(R2)=1,转向OPRl(R2)=127,转向OPR127,先用无条件转移指令(“AJMP”或“LJMP”)按顺序构造一个转移指令表,执行转移指令表中的第n条指令,就可以转移到第n个分支,将转移指令表的首地址装入DPTR中,将R2中的分支信息装入累加器A形成变址值。然后执行多分支转移指令JMPA+DPTR实现转移。程序清单如下:MOVA,R2RLA;分支信息乘2MOVDPTR,#TAB;DPTR指向转移指令表首址JMPA+DPTR;转向形成的散转地址TAB:AJMPOPR0;转移指令表AJMPOPR1AJMPOPR127,转移指令表中的转移指令是由LJMP指令构成,程序如下:ORG0200HMOVDPTR,#TAB;DPTR指向转移指令表首址MOVA,R2;分支信息放累加器A中MOVB,#3MULAB;分支信息乘3XCHA,BADDA,DPH;高字节调整到DPH中MOVDPH,AXCHA,BJMPA+DPTR;转向形成的散转地址TAB:LJMPOPR0;转移指令表LJMPOPR1LJMPOPR2LJMPOPR127,转移指令表中的转移指令是由AJMP指令构成,如果分支数大于128个,如分支数有256个,ORG0200HMOVDPTR,#TAB;DPTR指向转移指令表首址MOVA,R2;分支信息放累加器A中RLA;分支信息乘2JNCNEXTINCDPH;高字节调整到DPH中NEXT:JMPA+DPTR;转向形成的散转地址TAB:LJMPOPR0;转移指令表LJMPOPR1LJMPOPR2LJMPOPR127,二采RET指令实现的多分支程序,用RET指令实现多分
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!