资源预览内容
第1页 / 共74页
第2页 / 共74页
第3页 / 共74页
第4页 / 共74页
第5页 / 共74页
第6页 / 共74页
第7页 / 共74页
第8页 / 共74页
第9页 / 共74页
第10页 / 共74页
亲,该文档总共74页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.1 MCS-51系列单片机汇编指令格式及标识系列单片机汇编指令格式及标识MCS-51系列单片机指令系统功能强、指令短、执行快。从功能上可分成五大类:数据传送指令、算术运算指令、逻辑操作指令、控制转移指令和位操作指令。3.1.1 指令格式指令格式标号:标号: 操作码助记符操作码助记符 目的操作数目的操作数,源操作数,源操作数 ;注释;注释1操作码助记符阐明指令的功能,不同的指令有不同的指令助记符,它普通用阐明其功能的英文单词的缩写方式表示。2操作数用于给指令的操作提供数据、数据的地址或指令的地址,操作数往往用相应的寻址方式指明。3标号是该指令的符号地址,后面须带冒号。4注释是对该指令的解释,前面须带分号。第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.1.2 指令中用到的标识符指令中用到的标识符为便于后面的学习,在这里先对指令中用到的一些符号的商定意义作以阐明:1Ri和Rn:表示当前任务存放器区中的任务存放器,i取0或1,表示R0或R1。n取07,表示R0R7。2#data:表示包含在指令中的8位立刻数。3#data16:表示包含在指令中的16位立刻数。4rel:以补码方式表示的8位相对偏移量,范围为-128127,主要用在相对寻址的指令中。5addr16和addr11:分别表示16位直接地址和11位直接地址。6direct:表示直接寻址的地址。7bit:表示可位寻址的直接位地址。第第3 3章章 单片机汇编程序设计单片机汇编程序设计8X:表示X单元中的内容。9X:表示以X单元的内容为地址的存储器单元内容,即X作地址,该地址单元的内容用X表示。10/和符号:“/表示对该位操作数取反,但不影响该位的原值。“表示操作流程,将箭尾一方的内容送入箭头所指一方的单元中去。第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.2 MCS-51系列单片机寻址方式系列单片机寻址方式MCS-51单片机的寻址方式按操作数的类型,可分为数的寻址和指令寻址,数的寻址有:常数寻址立刻寻址、存放器数寻址存放器寻址、存储器数寻址直接寻址方式、存放器间接寻址方式、变址寻址方式和位寻址,指令的寻址有绝对寻址和相对寻址,3.2.1 常数寻址立刻寻址常数寻址立刻寻址操作数是常数,常数又称为立刻数,运用时直接出如今指令中,紧跟在操作码的后面,作为指令的一部分。在汇编指令中,立刻数前面以“#符号作前缀。在程序中通常用于给存放器或存储器单元赋初值,例如:MOVA,#20H其功能是把立刻数20H送给累加器A,其中源操作数20H就是立刻数。指令执行后累加器A中的内容为20H。第第3 3章章 单片机汇编程序设计单片机汇编程序设计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 存储器数寻址存储器数寻址存储器数寻址针对的数据是存放在存储器单元中,对于存储器单元的内容经过提供存储器单元地址运用。根据存储器单元地址的提供方式,存储器数的寻址方式有:直接寻址、存放器间接寻址、变址寻址。第第3 3章章 单片机汇编程序设计单片机汇编程序设计一直接寻址一直接寻址直接寻址是指数据在存储器单元中,在指令中直接提供存储器单元的地址。在MCS-51系统中,这种寻址方式针对的是片内数据存储器和特殊功能存放器。在汇编指令中,指令中直接以地址数的方式提供存储器单元的地址。例如:MOVA,20H其功能是把片内数据存储器20H单元的内容送给累加器A。如指令执行前片内数据存储器20H单元的内容为30H,那么指令执行后累加器A的内容为30H。指令中20H是地址数,它是片内数据存储单元的地址。在MCS-51中,数据前面不加“#是存储单元地址而不是常数,常数前面要加符号“#。对于特殊功能存放器,在指令中运用时往往经过特殊功能存放器的称号运用,而特殊功能存放器称号实践上是特殊功能存放器单元的符号地址,因此它们是直接寻址。例如:MOVA,P0其功能是把P0口的内容送给累加器A。P0是特殊功能存放器P0口的符号地址,该指令在翻译成机器码时,P0就转换成直接地址80H。第第3 3章章 单片机汇编程序设计单片机汇编程序设计二存放器间接寻址二存放器间接寻址存放器间接寻址是指数据存放在存储单元中,而存储单元地址存放在存放器中,在指令中经过提供存放存储单元地址的存放器来运用对应的存储单元。方式为:存放器名。例如:MOVA,R1该指令的功能是将以任务存放器R1中的内容为地址的片内RAM单元的数据传送到累加器A中去。指令的源操作数是存放器间接寻址。假设R1中的内容为80H,片内RAM地址为80H的单元中的内容为20H,那么执行该指令后,累加器A的内容为20H。存放器间接寻址表示图如以下图。80H20H20HA80HR1第第3 3章章 单片机汇编程序设计单片机汇编程序设计在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为变址,两者相加得存储单元的地址,所访问的存储器为程序存储器。第第3 3章章 单片机汇编程序设计单片机汇编程序设计例如:MOVCA,A+DPTR其功能是将数据指针存放器DPTR的内容和累加器A中的内容相加作为程序存储器的地址,从对应的单元中取出内容送累加器A中。指令中,源操作数的寻址方式为变址寻址,设指令执行前数据指针存放器DPTR的值为2000H,累加器A的值为05H,程序存储器2005H单元的内容为30H,那么指令执行后,累加器A中的内容为30H。表示图如以下图。2000H30H30HDPTRA2005H05HA+第第3 3章章 单片机汇编程序设计单片机汇编程序设计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位,它们都为绝对寻址。第第3 3章章 单片机汇编程序设计单片机汇编程序设计二相对寻址二相对寻址相对寻址是以当前程序计数器PC值加上指令中给出的偏移量rel得到目的位置的地址。在MCS-51系统中,相对转移指令的操作数属于相对寻址。在运用相对寻址时要留意以下两点:1当前PC值是指转移指令执行时的PC值,它等于转移指令的地址加上转移指令的字节数。实践上是转移指令的下一条指令的地址。例如:假设转移指令的地址为2020H,转移指令的长度为2字节,那么转移指令执行时的PC值为2021H。2偏移量rel是8位有符号数,以补码表示,它的取值范围为-128+127。当为负值时,向前转移,当为正数时向后转移。相对寻址的目的地址为:目的地址=当前PC+rel=转移指令的地址+转移指令的字节数+rel第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.3 MCS-51系列单片机指令系统系列单片机指令系统3.3.1 数据传送指令数据传送指令数据传送指令有29条,是指令系统中数量最多、运用也最频繁的一类指令。这类指令可分为三组:普通传送指令、数据交换指令、堆栈操作指令。一普通传送指令一普通传送指令 普通传送指令以助记符普通传送指令以助记符MOV为根底。分成片内数据存储器传为根底。分成片内数据存储器传送指令、片外数据存储器传送指令和程序存储器传送指令。送指令、片外数据存储器传送指令和程序存储器传送指令。1片内数据存储器传送指令片内数据存储器传送指令MOV指令格式:指令格式:MOV 目的操作数,源操作数目的操作数,源操作数其中:源操作数可以为其中:源操作数可以为A、Rn、Ri、direct、#data,目的操作,目的操作数可以为数可以为A、Rn、Ri、direct,组合起来总共,组合起来总共16条,按目的操作数条,按目的操作数的寻址方式划分为五组:的寻址方式划分为五组:第第3 3章章 单片机汇编程序设计单片机汇编程序设计1以A为目的操作数MOVA,Rn;ARnMOVA,direct ;AdirectMOVA,Ri;ARiMOVA,#data ;A#data2以Rn为目的操作数MOVRn,A;RnAMOVRn,direct;RndirectMOVRn,#data;Rn#data3以直接地址direct为目的操作数MOVdirect,A ;directAMOVdirect,Rn;directRnMOVdirect,direct;directdirectMOVdirect,Ri;directRiMOVdirect,#data;direct#data4以间接地址Ri为目的操作数MOVRi,A ;RiAMOVRi,direct;RidirectMOVRi,#data;Ri#data5以DPTR为目的操作数MOVDPTR,#data16;DPTR#data16第第3 3章章 单片机汇编程序设计单片机汇编程序设计留意,源操作数和目的操作数中的Rn和Ri不能相互配对。如不允许有“MOVRn,Rn,“MOVRi,Rn这样的指令,在MOV指令中,不允许在一条指令中同时出现任务存放器,无论它是存放器寻址还是存放器间接寻址。2片外数据存片外数据存储器器传送指令送指令MOVX 在在MCS-51系系统中只能中只能经过累加器累加器A与片外数据存与片外数据存储器器进展数据展数据传送,送,访问时,只能,只能经过Ri和和DPTR以以间接接寻址方式址方式进展。展。MOVX指指令共有四条:令共有四条:MOVX A,DPTR;A DPTRMOVX DPTR,A;DPTR AMOVX A,Ri;A RiMOVX Ri,A;Ri A 其中前两条指令其中前两条指令经过DPTR间接接寻址,可以址,可以对整个整个64K片外数据存片外数据存储器器访问。后两条指令。后两条指令经过Ri间接接寻址,只能址,只能对片外数据存片外数据存储器的低器的低端的端的256字字节访问,访问时将低将低8位地址放于位地址放于Ri中。中。第第3 3章章 单片机汇编程序设计单片机汇编程序设计3程序存程序存储器器传送指令送指令MOVC 程序存程序存储器器传送指令只需两条,一条用送指令只需两条,一条用DPTR基址基址变址址寻址。一址。一条用条用PC基址基址变址址寻址。址。MOVC A,A+DPTR ;A A+DPTRMOVC A,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。第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-1】写出完成以下功能的程序段。】写出完成以下功能的程序段。1将将R0的内容送的内容送R6中中程序为:程序为:MOV A,R0MOV R6,A2将片内将片内RAM 30H单元的内容送片外单元的内容送片外60H单元中单元中程序为:程序为:MOV A,30HMOV R0,#60HMOVX R0,A3将片处将片处RAM 1000H单元的内容送片内单元的内容送片内20H单元中单元中程序为:程序为:MOV DPTR,#1000HMOV A,DPTRMOV 20H,A4将将ROM 2000H单元的内容送片内单元的内容送片内RAM的的30H单元中单元中程序为:程序为:MOV A,#0MOV DPTR,#2000HMOVC A,A+DPTRMOV 30H,A第第3 3章章 单片机汇编程序设计单片机汇编程序设计二数据交换指令二数据交换指令 普通传送指令实现将源操作数的数据传送到目的操作数,指令普通传送指令实现将源操作数的数据传送到目的操作数,指令执行后源操作数不变,数据传送是单向的。数据交换指令数据作双向执行后源操作数不变,数据传送是单向的。数据交换指令数据作双向传送,传送后,前一个操作数原来的内容传送到后一个操作数中,后传送,传送后,前一个操作数原来的内容传送到后一个操作数中,后一个操作数原来的内容传送到前一个操作数中。一个操作数原来的内容传送到前一个操作数中。 数据交换指令要求第一个操作数须为累加器数据交换指令要求第一个操作数须为累加器A,共有,共有5条。条。XCH A,Rn;A RnXCH A ,direct;AdirectXCH A,Ri;ARiXCHD A,Ri;A03Ri03SWAP A;A03A47【例【例3-2】假设】假设R0的内容为的内容为30H,片内,片内RAM 30H单元的内容为单元的内容为23H,累加器,累加器A的内容为的内容为45H,那么执行,那么执行XCH A,R0指令后片内指令后片内RAM 30H单元的内容为单元的内容为45H,累加器,累加器A中的内容为中的内容为23H。假设执行假设执行SWAP A指令,那么累加器指令,那么累加器A的内容为的内容为54H。第第3 3章章 单片机汇编程序设计单片机汇编程序设计三堆三堆栈操作指令操作指令 堆堆栈是在片内是在片内RAM中按中按“先先进后出,后后出,后进先出原那么先出原那么设置的公置的公用存用存储区。数据的区。数据的进栈和出和出栈由指由指针SP一致管理。在一致管理。在MCS-51系系统中,中,堆堆栈操作指令有两条:操作指令有两条:PUSH direct;SPSP+1,SPdirectPOP direct;directSP,SP SP-1 其中其中PUSH指令入指令入栈,POP指令出指令出栈。操作。操作时以字以字节为单位。入位。入栈时SP指指针先加先加1,再入,再入栈。出。出栈时内容先出内容先出栈,SP指指针再减再减1。用堆。用堆栈保管数据保管数据时,先入,先入栈的内容后出的内容后出栈;后入;后入栈的内容先出的内容先出栈。 【例【例3-3】假】假设入入栈保管保管时入入栈的的顺序序为:PUSH APUSH B那么出那么出栈的的顺序序为:POP BPOP A第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.3.2 算术运算指令算术运算指令一加法指令一加法指令1普通的加法指令普通的加法指令ADDADD A,Rn ;A A + RnADD A,direct;A A +directADD A,Ri;A A +RiADD A,#data;A A + #data2带进位加指令位加指令ADDCADDC A,Rn;A A + Rn + CADDC A,direct;A A +direct+ CADDC A,Ri;A A +Ri+ CADDC A,#data;A A + #data + C3加加1指令指令INC A;A A + 1INC Rn;Rn Rn + 1INC direct;direct direct+ 1INC Ri;RiRi+ 1INC DPTR;DPTR DPTR + 1第第3 3章章 单片机汇编程序设计单片机汇编程序设计其中,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中,程序如下:中,程序如下:MOV A,R2ADD A,R4MOV R6,AMOV A,R1ADDC A,R3MOV R5,A第第3 3章章 单片机汇编程序设计单片机汇编程序设计二减法指令二减法指令1带借位减法指令借位减法指令SUBBSUBB A,Rn;A A - Rn - CSUBB A,direct;A A -direct- CSUBB A,Ri;A A -Ri- CSUBB A,#data;A A - #data C2减减1指令指令DECDEC A;A A - 1DEC Rn;Rn Rn - 1DEC direct ;direct direct- 1DEC Ri;RiRi- 1在MCS-51单片机中,只提供了一种带借位的减法指令,没有提供普通的减法指令,普通的减法操作可以经过先对CY标志清零,然后再执行带借位的减法来实现。其中,SUBB指令在执行时要影响CY、AC、OV和P标志位。而DEC指令除了DECA要影响P标志位外,对其它标志位都没有影响。第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-5】求】求R3 R2 - R1。程序程序为:MOV A,R2CLR CSUBB A,R1MOV R3,A3乘法指令乘法指令MUL 在在MCS-51单片机中,乘法指令只需一条:单片机中,乘法指令只需一条:MUL AB 该指令执行时将对存放于累加器该指令执行时将对存放于累加器A中的无符号被乘数和放于中的无符号被乘数和放于B存存放器中的无符号乘数相乘,积的高字节存于放器中的无符号乘数相乘,积的高字节存于B存放器中,低字节存于存放器中,低字节存于累加器累加器A中。中。 指令执行后将影响指令执行后将影响CY和和OV标志,标志,CY复位,对于复位,对于OV:当积大于:当积大于255时即时即B中不为中不为0,OV为为1;否那么,;否那么,OV为为0。第第3 3章章 单片机汇编程序设计单片机汇编程序设计4除法指令除法指令DIV 在在MCS-51单片机中,除法指令也只需一条:单片机中,除法指令也只需一条:DIV AB 该指令执行时将用存放在累加器该指令执行时将用存放在累加器A中的无符号被除数与存放在中的无符号被除数与存放在B存放器中的无符号除数相除,除得的结果,商的存于累加器存放器中的无符号除数相除,除得的结果,商的存于累加器A中,中,余数存于余数存于B存放器中。存放器中。 指令执行后将影响指令执行后将影响CY和和OV标志,普通情况标志,普通情况CY和和OV都清都清0,只需当只需当B存放器中的除数为存放器中的除数为0时,时,CY和和OV才被置才被置1。5十进制调整指令十进制调整指令 在在MCS-51单片机中,十进制调整指令只需一条:单片机中,十进制调整指令只需一条:DA A 它只能用在它只能用在ADD或或ADDC指令后面,用来对两个二位的紧缩指令后面,用来对两个二位的紧缩的的BCD码数经过用码数经过用ADD或或ADDC指令相加后存于累加器指令相加后存于累加器A中的结果中的结果进展调整,使得它得到正确的十进制结果。经过该指令可实现两位进展调整,使得它得到正确的十进制结果。经过该指令可实现两位十进制十进制BCD码数的加法运算。码数的加法运算。第第3 3章章 单片机汇编程序设计单片机汇编程序设计它的调整过程为: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.3.3 逻辑操作指令逻辑操作指令一一逻辑与指令与指令ANLANL A,Rn A A RnANL A,direct A A directANL A,Ri A A RiANL A,#data A A dataANL direct,A direct direct AANL direct,#data direct direct data二二逻辑或指令或指令ORLORL A,Rn A A RnORL A,direct A A directORL A,Ri A A RiORL A,#data A A dataORL direct,A direct direct AORL direct,#data direct direct data第第3 3章章 单片机汇编程序设计单片机汇编程序设计三三逻辑异或指令异或指令XRLXRL A,Rn A A RnXRL A,direct A A directXRL A,Ri A A RiXRL A,#data A A dataXRL direct,A direct direct AXRL direct,#data direct direct data 在运用中,在运用中,逻辑与用于与用于实现对指定位清指定位清0,其他位不,其他位不变;逻辑或或用于用于实现对指定位置指定位置1,其他位不,其他位不变;逻辑异或用于异或用于实现指定位取反,指定位取反,其他位不其他位不变。【例【例3-7】写出完成以下功能的指令段。】写出完成以下功能的指令段。1对累加器累加器A中的中的1、3、5位清位清0,其他位不,其他位不变ANL A,#11010101B2对累加器累加器A中的中的2、4、6位置位置1,其他位不,其他位不变ORL A,#01010100B3对累加器累加器A中的中的0、1位取反,其他位不位取反,其他位不变XRL A,#00000011B第第3 3章章 单片机汇编程序设计单片机汇编程序设计四清零和求反指令四清零和求反指令1清零指令:清零指令:CLR A A 02求反指令:求反指令:CPL A A 在在MCS-51系系统中,只能中,只能对累加器累加器A中的内容中的内容进展清零和求反,展清零和求反,如要如要对其它的存放器或存其它的存放器或存储单元元进展清零和求反,那么展清零和求反,那么须放在累加器放在累加器A进展,运算后再放回原位置。展,运算后再放回原位置。【例【例3-8】写出】写出对R0存放器内容求反的程序段。存放器内容求反的程序段。程序程序为:MOV A,R0CPL AMOV R0,A五循环移位指令五循环移位指令 MCS-51系统有四条对累加器系统有四条对累加器A的循环移位指令,前两条只在累的循环移位指令,前两条只在累加器加器A中进展循环移位,后两条还要带进位标志中进展循环移位,后两条还要带进位标志CY进展循环移位。每进展循环移位。每一次移一位。分别如下:一次移一位。分别如下:1累加器累加器A循环左移循环左移RL A2累加器累加器A循环右移循环右移RR A第第3 3章章 单片机汇编程序设计单片机汇编程序设计3带进位的循环左移RLCA4带进位的循环右移RRCA【例3-9】假设累加器A中的内容为10001011B,CY=0,那么执行RLCA指令后累加器A中的内容为00010110,CY=1。第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.3.4 控制转移指令控制转移指令共有17条,包括无条件转移指令、条件转移指令、子程序调用及前往指令。一无条件一无条件转移指令移指令 无条件无条件转移指令是指当移指令是指当执行行该指令后,程序将无条件地指令后,程序将无条件地转移到移到指令指定的地方去。无条件指令指定的地方去。无条件转移指令包括移指令包括长转移指令、移指令、绝对转移指移指令、相令、相对转移指令和移指令和间接接转移指令。移指令。1长转移指令移指令LJMP 指令格式:指令格式:LJMP addr16 ;PC addr16 指令后面指令后面带目的位置的目的位置的16位地址,位地址,执行行时直接将直接将该16位地址送位地址送给程序指程序指针PC,程序无条件地,程序无条件地转到到16位目的地址指明的位置去。指位目的地址指明的位置去。指令中提供的是令中提供的是16位目的地址,所以可以位目的地址,所以可以转移到移到64KB程序存程序存储器的恣器的恣意位置,故得名意位置,故得名为“长转移。移。该指令不影响指令不影响标志位,运用方便。缺志位,运用方便。缺陷是:陷是:执行行时间长,字,字节数多。数多。第第3 3章章 单片机汇编程序设计单片机汇编程序设计2绝对转移指令移指令指令格式:指令格式:AJMP addr11;PC 100 addr11 AJMP指令后指令后带的是目的位置的低的是目的位置的低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,那么,那么执行指令行指令AJMP addr11后后转移的目的位置是多移的目的位置是多少?少? AJMP指令的指令的PC值加加2=3000H+2=3002H=00110 000 00000010B 指令中的指令中的addr11=123H=001 00100011B 转移的目的地址移的目的地址为0011 0001 0010 0011B=3123H第第3 3章章 单片机汇编程序设计单片机汇编程序设计3相相对转移指令移指令指令格式:指令格式:SJMP rel ;PC PC + 2 + rel SJMP指令后面的操作数指令后面的操作数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指令地址指令地址 如目的地址等于如目的地址等于2021H,SJMP指令的地址为指令的地址为2000H,那么相对地,那么相对地址址rel为为11H。第第3 3章章 单片机汇编程序设计单片机汇编程序设计留意:在单片机程序设计中,通常用到一条SJMP指令:SJMP$该指令的功能是在本人本身上循环,进入等待形状。其中符号$表示转移到本身,它的机器码为80FEH。在程序设计中,程序的最后一条指令通常用它,使程序不再向后执行以防止执行后面的内容而出错。4间接接转移指令移指令 指令格式:指令格式:JMP A+DPTR;PC A + DPTR 它它MCS-51系系统中独一一条中独一一条间接接转移指令,移指令,转移的目的地址是移的目的地址是由数据指由数据指针DPTR的内容与累加器的内容与累加器A中的内容相加得到,指令中的内容相加得到,指令执行后行后不会改不会改动DPTR及及A中原来的内容。数据指中原来的内容。数据指针DPTR的内容普通的内容普通为基基址,累加器址,累加器A的内容的内容为相相对偏移量,在偏移量,在64 KB范范围内无条件内无条件转移。移。 该指令的特点是指令的特点是转移地址可以在程序运移地址可以在程序运转中加以改中加以改动。DPTR普通普通为确定确定值,根据累加器,根据累加器A的的值来来实现转移到不同的分支。在运用移到不同的分支。在运用时往往与一个往往与一个转移指令表一同来移指令表一同来实现多分支多分支转移。移。第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-12】下面的程序能根据累加器】下面的程序能根据累加器A的值的值0、2、4、6转移到相应转移到相应的的TAB0TA6分支去执行。分支去执行。MOV DPTR,#TABLE ;表首地址送;表首地址送DPTRJMP A+DPTR ;根据;根据A值转移值转移TABLE:AJMP TAB0 ;当;当A=0时转时转TAB0执行执行AJMP TAB2 ;当;当A=2时转时转TAB2执行执行AJMP TAB4 ;当;当A=4时转时转TAB4执行执行AJMP TAB6 ;当;当A=6时转时转TAB6执行执行二条件二条件转移指令移指令 条件条件转移指令是指当条件移指令是指当条件满足足时,程序,程序转移到指定位置,条件不移到指定位置,条件不满足足时,程序将,程序将继续依次依次执行。在行。在MCS-51系系统中,条件中,条件转移指令有三种:移指令有三种:累加器累加器A判零条件判零条件转移指令、比移指令、比较转移指令、减移指令、减1不不为零零转移指令。移指令。1累加器累加器A判零条件判零条件转移指令移指令判判0指令:指令:JZ rel ;假;假设A=0,那么,那么PC PC + 2 + rel,否那么,否那么,PC PC + 2判非判非0指令:指令:JNZ rel ;假;假设A0,那么,那么PC PC + 2 + rel,否那,否那么,么,PC PC + 2 第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-13】把片外】把片外RAM的的30H单元开场的数据块传单元开场的数据块传送到片内送到片内RAM的的40H开场的位置,直到出现零为止。开场的位置,直到出现零为止。 片内、片外数据传送以累加器片内、片外数据传送以累加器A过渡。每次传送过渡。每次传送一个字节,经过循环处置,直四处置到传送的内容为一个字节,经过循环处置,直四处置到传送的内容为0终终了。了。程序如下:程序如下:MOV R0,#30HMOV R1,#40HLOOP:MOVX A,R0MOV R1,AINC R1INC R0JNZ LOOPSJMP $第第3 3章章 单片机汇编程序设计单片机汇编程序设计2比比较转移指令移指令比比较转移指令用于移指令用于对两个数作比两个数作比较,并根据比,并根据比较情况情况进展展转移,比移,比较转移指移指令有四条:令有四条:CJNE A,#data,rel ;假;假设A=data,那么,那么PC PC + 3,不,不转移,移,继续执行行假假设Adata,那么,那么C=0,PC PC + 3 + rel,转移移假假设Adata,那么,那么C=0,PC PC + 3 + rel,转移移假假设Rndata,那么,那么C=0,PC PC + 3 + rel,转移移假假设Ridirect,那么,那么C=0,PC PC + 3 + rel,转移移假假设Adirect,那么,那么C=1,PC PC + 3 + rel,转移移第第3 3章章 单片机汇编程序设计单片机汇编程序设计3减减1不为零转移指令不为零转移指令这种指令是先减这种指令是先减1后判别,假设不为零那么转移。指令有两条:后判别,假设不为零那么转移。指令有两条:DJNZ Rn,rel ;先;先Rn中的内容减中的内容减1,再判别,再判别Rn中的内容能否中的内容能否等于零,假设不为零,那么转移。等于零,假设不为零,那么转移。DJNZ direct,rel ;先;先direct中的内容减中的内容减1,再判别,再判别direct中的内容能否等于零,假设不为零,那么转移。中的内容能否等于零,假设不为零,那么转移。在在MCS-51系统中,通常用系统中,通常用DJNZ指令来构造循环构造,实现反复指令来构造循环构造,实现反复处置。处置。第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-14】统计片内】统计片内RAM中中30H单元开场的单元开场的20个数据中个数据中0个数,个数,放于放于R7中。中。 用用R2作循环变量,最开场置初值为作循环变量,最开场置初值为20;作;作R7作计数器,最作计数器,最开场置初值为开场置初值为0;用;用R0作指针访问片内作指针访问片内RAM单元,最开场置初值为单元,最开场置初值为30H;用;用DJNZ指令对指令对R2减减1转移进展循环控制,在循环体中用指针转移进展循环控制,在循环体中用指针R0依次取出片内依次取出片内RAM中的数据,判别,如为中的数据,判别,如为0,那么,那么R7中的内容加中的内容加1。程序:程序:MOV R0,#30HMOV R2,#20MOV R7,#0LOOP:MOV A,R0CJNE A,#0,NEXTINC R7NEXT:INC R0DJNZ R2,LOOP第第3 3章章 单片机汇编程序设计单片机汇编程序设计三子程序三子程序调用及前往指令用及前往指令这类指令有四条。两条子程序指令有四条。两条子程序调用指令,两条前往指令。用指令,两条前往指令。1长调用指令用指令指令格式:指令格式:LCALL addr16执行行过程:程:PCPC+3SPSP+1SPPC70SPSP+1SPPC158PCaddr16 该指令指令执行行时,先将当前的,先将当前的PC指令的指令的PC加指令的字加指令的字节数数3值压入堆入堆栈保管,入保管,入栈时先低字先低字节,后高字,后高字节。然后。然后转移到移到指令中指令中addr16所指定的地方所指定的地方执行。由于后面行。由于后面带16位地址,因此可位地址,因此可以以转移到程序存移到程序存储空空间的任一位置。的任一位置。第第3 3章章 单片机汇编程序设计单片机汇编程序设计2绝对调用指令用指令指令格式:指令格式:ACALL addr11执行行过程:程:PCPC+2SPSP+1SPPC70SPSP+1SPPC158PC100addr11 该指令指令执行行过程与程与LCALL指令指令类似,只是似,只是该指令与指令与AJMP一一样只能只能实现2KB范范围内内转移,移,执行的最后是将指令中的行的最后是将指令中的addr11送送给PC指指针的低的低11位。位。 对于于LCALL和和ACALL两条子程序两条子程序调用指令,在用指令,在汇编程序中,程序中,指令后面通常指令后面通常带转移位置的移位置的标号,用号,用LCALL指令指令调用,用,转移位置可移位置可以是程序存以是程序存储空空间的任一位置,用的任一位置,用ACALL指令指令调用,用,转移位置与移位置与ACALL指令的下一条指令必需在同一个指令的下一条指令必需在同一个2KB内,即它内,即它们的高的高5位地址位地址一一样。第第3 3章章 单片机汇编程序设计单片机汇编程序设计3子程序前往指令子程序前往指令指令格式:指令格式:RET执行行过程:程:PC158SPSPSP-1PC70SPSPSP-1 执行行时将子程序将子程序调用指令用指令压入堆入堆栈的地址出的地址出栈,第一次出,第一次出栈的内容送的内容送PC的高的高8位,第二次出位,第二次出栈的内容送的内容送PC的低的低8位。位。执行完后,行完后,程序程序转移到新的移到新的PC位置位置执行指令。由于子程序行指令。由于子程序调用指令用指令执行行时压入的内容是入的内容是调用指令的下一条指令的地址,因此用指令的下一条指令的地址,因此RET指令指令执行后,行后,程序将前往到程序将前往到调用指令的下一条指令用指令的下一条指令执行。行。 该指令通常放于子程序的最后一条指令位置,用于指令通常放于子程序的最后一条指令位置,用于实现前往前往到主程序。另外,在到主程序。另外,在MCS-51程序程序设计中,也常用中,也常用RET指令来指令来实现程序程序转移,移,处置置时先将先将转移位置的地址用两条移位置的地址用两条PUSH指令入指令入栈,低,低字字节在前,高字在前,高字节在后,然后在后,然后执行行RET指令,指令,执行后程序行后程序转移到相移到相应的位置去的位置去执行。行。第第3 3章章 单片机汇编程序设计单片机汇编程序设计4中断前往指令中断前往指令指令格式:指令格式:RETI执行行过程:程:PC158SPSPSP-1PC70SPSPSP-1 该指令的指令的执行行过程与程与RET根本一根本一样,只是,只是RETI在在执行后,在行后,在转移移之前将先去除中断的之前将先去除中断的优先先级触触发器。器。该指令用于中断效力子程序后面,指令用于中断效力子程序后面,作作为中断效力子程序的最后一条指令,它的功能是前往主程序中断的断中断效力子程序的最后一条指令,它的功能是前往主程序中断的断点位置,点位置,继续执行断点位置后面的指令。行断点位置后面的指令。 在在MCS-51系系统中,中断都是硬件中断,没有中,中断都是硬件中断,没有软件中断件中断调用指令,用指令,硬件中断硬件中断时,由一条,由一条长转移指令使程序移指令使程序转移到中断效力程序的入口位置,移到中断效力程序的入口位置,在在转移之前,由硬件将当前的断点地址移之前,由硬件将当前的断点地址压入堆入堆栈保管,以便于以后保管,以便于以后经过中断前往指令前往到断点位置后中断前往指令前往到断点位置后继续执行。行。第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.3.5 位操作指令位操作指令在MCS-51系统中,有17条位处置指令,可以实现位传送、位逻辑运算、位控制转移等操作。一位传送指令位传送指令有两条,用于实现位运算器C与普通位之间的相互传送。MOVC,bit;CbitMOVbit,C;bitC指令在运用时必需有位运算器C参与,不能直接实现两位之间的传送。假设进展两位之间的传送,可以经过位运算器C来传送。【例3-15】把片内RAM中位寻址区的20H位的内容传送到30H位。程序:MOVC,20HMOV30H,C第第3 3章章 单片机汇编程序设计单片机汇编程序设计二位二位逻辑操作指令操作指令位位逻辑操作指令包括位清操作指令包括位清0、置、置1、取反、位与和位或,、取反、位与和位或,总共共10位指令。位指令。1位清位清0CLR C;C0CLR bit;bit02位置位置1SETB C;C1SETB bit;bit13位取反位取反CPL C;C/CCPL bit;bitbit4位与位与ANL C,bit;CCbitANL C,/bit;CC/bit5位或位或ORL C,bit;CCbitORL C,/bit;CC/bit第第3 3章章 单片机汇编程序设计单片机汇编程序设计利用位逻辑运算指令可以实现各种各样的逻辑功能。【例3-16】利用位逻辑运算指令编程实现下面硬件逻辑电路的功能。与或或与P1.0P1.1P1.2P1.3P1.4P1.5第第3 3章章 单片机汇编程序设计单片机汇编程序设计程序:MOV C,P1.0ANL C,P1.1CPL CORL C,/P1.2MOV F0,CMOV C,P1.3ORL C,P1.4ANL C,F0CPL CMOV P1.5,C三位三位转移指令移指令位位转移指令有以移指令有以C为条件的位条件的位转移指令和以移指令和以bit为条件的位条件的位转移指令,移指令,共共5条。条。1以以C条件的位条件的位转移指令移指令JC rel; 假假设C=1,那么,那么转移,移,PCPC+2+rel;否那么程序;否那么程序继续执行行JNC rel; 假假设C=0,那么,那么转移,移,PCPC+2+rel;否那么程序;否那么程序继续执行行第第3 3章章 单片机汇编程序设计单片机汇编程序设计2以以bit为条件的位条件的位转移指令移指令JB bit,rel; 假假设bit=1,那么,那么转移,移,PCPC+3+rel;否那;否那么程序么程序继续执行行JNB bit,rel; 假假设bit=0,那么,那么转移,移,PCPC+3+rel;否那;否那么程序么程序继续执行行JBC bit,rel; 假假设bit=1,那么,那么转移,移,PCPC+3+rel,且,且bit0;否那么程序;否那么程序继续执行行利用位利用位转移指令可移指令可进展各种展各种测试。【例【例3-17】从片外】从片外RAM中中30H单元开元开场有有100个数据,个数据,统计当中正当中正数、数、0、和、和负数的个数,分数的个数,分别放于放于R5、R6、R7中。中。 设用用R2作作计数器,用数器,用DJNZ指令指令对R2减减1转移移进展循展循环控制,在控制,在循循环体外体外设置置R0指指针,指向片外,指向片外RAM 30H单元,元,对R5、R6、R7清零,清零,在循在循环体中用指体中用指针R0依次取出片外依次取出片外RAM中的中的100个数据,判个数据,判别,如大,如大于于0,那么,那么R5中的内容加中的内容加1;如等于;如等于0,那么,那么R6中的内容加中的内容加1;如小于;如小于0,那么,那么R7中的内容加中的内容加1。第第3 3章章 单片机汇编程序设计单片机汇编程序设计程序:MOVR2,#100MOVR0,#30HMOVR5,#0MOVR6,#0MOVR7,#0LOOP:MOVXA,R0CJNEA,#0,NEXT1INCR6SJMPNEXT3NEXT1:CLRCSUBBA,#0JNCNEXT2INCR5SJMPNEXT3NEXT2:INCR7NEXT3:INCR0DJNZR2,LOOPSJMP$第第3 3章章 单片机汇编程序设计单片机汇编程序设计四空操作指令四空操作指令NOP ;PC PC+1 这是一条是一条单字字节指令。指令。执行行时,不作任何操作即空操作,不作任何操作即空操作,仅将程序将程序计数器数器PC的内容加的内容加1,使,使CPU指向下一条指令指向下一条指令继续执行程序。它要占用一个机器周期,常用来行程序。它要占用一个机器周期,常用来产生生时间延延迟,构造,构造延延时程序。程序。第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.4 MCS-51系列单片机汇编程序常用伪指令系列单片机汇编程序常用伪指令1ORG伪指令指令格式:格式:ORG 地址十六地址十六进制表示制表示这条条伪指令放于一段源程序或数据的前面,指令放于一段源程序或数据的前面,汇编时用于指明程序用于指明程序或数据从程序存或数据从程序存储空空间什么位置开什么位置开场存放。存放。ORG伪指令后的地址是指令后的地址是程序或数据的起始地址。程序或数据的起始地址。【例【例3-18】 ORG 1000HSTART:MOV A,#7FH 指明后面的程序从程序存指明后面的程序从程序存储器的器的1000H单元开元开场存放。存放。第第3 3章章 单片机汇编程序设计单片机汇编程序设计2DB伪指令伪指令格式:格式:标号:标号: DB 项或项表项或项表 DB伪指令用于定义字节数据,可以定义伪指令用于定义字节数据,可以定义一个字节,也可定义多个字节,字义多个字节一个字节,也可定义多个字节,字义多个字节时,两两之间用逗号间隔,定义的多个字节在时,两两之间用逗号间隔,定义的多个字节在存储器中是延续存放的。定义的字节可以是普存储器中是延续存放的。定义的字节可以是普通常数,也可以为字符,还可以是字符串,字通常数,也可以为字符,还可以是字符串,字符和字符串以引号括起来,字符数据在存储器符和字符串以引号括起来,字符数据在存储器中以中以ASCII码方式存放。码方式存放。在定义时前面可以带标号,定义的标号在程在定义时前面可以带标号,定义的标号在程序中是起始单元的地址。序中是起始单元的地址。【例【例3-19】 ORG 3000HTAB1: DB 12H,34HDB 5,A,abc汇编后,各个数据在存储单元中的存放情况汇编后,各个数据在存储单元中的存放情况如下:如下:12H34H35H41H61H62H63H3000H3001H3002H3003H3004H3005H3006H第第3 3章章 单片机汇编程序设计单片机汇编程序设计3DW伪指令伪指令格式:格式:标号:标号: DW 项或项表项或项表 这条指令与这条指令与DB类似,但用于定义字数类似,但用于定义字数据。项或项表指所定义的一个字在存储器中据。项或项表指所定义的一个字在存储器中占两个字节。汇编时,机器自动按高字节在占两个字节。汇编时,机器自动按高字节在前低字节在后存放。前低字节在后存放。【例【例3-20】 ORG 3000HTAB2:DW 1234H,5678H汇编后,各个数据在存储单元中的存放情汇编后,各个数据在存储单元中的存放情况如下:况如下:12H 34H56H78H3000H3001H3002H3003H第第3 3章章 单片机汇编程序设计单片机汇编程序设计4DS伪指令伪指令格式:格式:标号:标号: DS 数值表达式数值表达式 该伪指令用在存储器中保管一定该伪指令用在存储器中保管一定数量的字节单元。保管存贮空间主要为数量的字节单元。保管存贮空间主要为以后存放数据。保管的字节单元数由表以后存放数据。保管的字节单元数由表达式的值决议。达式的值决议。【例【例3-21】 ORG 2000HTAB1: DB 12H,34HDS 4HDB 5汇编后,存储单元中的分配情况如下:汇编后,存储单元中的分配情况如下:12H34H-35H3000H3001H3002H3003H3004H3005H3006H第第3 3章章 单片机汇编程序设计单片机汇编程序设计5EQU伪指令伪指令格式:符号格式:符号 EQU 项项 该伪指令的功能是将指令中的项的值赋予该伪指令的功能是将指令中的项的值赋予EQU前面的符号。前面的符号。项可以是常数、地址标号或表达式。以后可以经过运用该符号运用项可以是常数、地址标号或表达式。以后可以经过运用该符号运用相应的项。相应的项。【例【例3-22】 TAB1 EQU 1000HTAB2 EQU 2000H汇编后汇编后TAB1、TAB2分别等于分别等于1000H、2000H。程序后面运用。程序后面运用1000H、2000H的地方就可以用符号的地方就可以用符号TAB1、TAB2交换。交换。用用EQU伪指令对某标号赋值后,该符号的值在整个程序中不能伪指令对某标号赋值后,该符号的值在整个程序中不能再改动。再改动。6bit伪指令伪指令格式:符号格式:符号 bit 位地址位地址bit该伪指令用于给位地址赋予符号,经赋值后可用该符号替代该伪指令用于给位地址赋予符号,经赋值后可用该符号替代bit后后面的位地址。面的位地址。【例【例3-23】 PLG bit F0AI bitP1.0定义后,在程序中位地址定义后,在程序中位地址F0、P1.0就可以经过就可以经过FLG和和AI来运用。来运用。第第3 3章章 单片机汇编程序设计单片机汇编程序设计7.DATA伪指令格式:符号DATA直接字节地址该伪指令用于给片内RAM字节单元地址赋予DATA前面的符号,赋值后可用该符号替代DATA后面的片内RAM字节单元地址。【例3-23】RESULTDATA60HMOVRESULT,A汇编后,RESULT就表示片内RAM的60H单元,程序后面用片内RAM的60H单元的地方就可以用RESULT。8.XDATA伪指令格式:符号XDATA直接字节地址该伪指令与DATA伪指令根本一样,只是它针对的是片外RAM字节单元。【例3-24】PORT1XDATA2000HMOVDPTR,PORT1MOVXDPTR,A汇编后,符号PORT1就表示片外RAM的2000H单元地址,程序后面可经过符号PORT1表示片外RAM的2000H单元地址。第第3 3章章 单片机汇编程序设计单片机汇编程序设计9END伪指令伪指令格式:格式:END 该指令放于程序最后位置,用于指明汇编言语源程序的终了位置,该指令放于程序最后位置,用于指明汇编言语源程序的终了位置,当汇编程序汇编到当汇编程序汇编到END伪指令时,汇编终了。伪指令时,汇编终了。END后面的指令,汇编程后面的指令,汇编程序都不予处置。一个源程序只能有一个序都不予处置。一个源程序只能有一个END命令,否那么就有一部分指命令,否那么就有一部分指令不能被汇编。令不能被汇编。第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.5 MCS-51系列单片机汇编程序设计系列单片机汇编程序设计3.5.1运算程序【例【例3-24】多字节无符号数加法】多字节无符号数加法设从片内RAM30H单元和40H单元有两个16字节数,把它们相加,结果放于30H单元开场的位置处设结果不溢出。处置过程:用R0作指针指向30H单元,用R1作指针指向40H单元,用R2为循环变量,初值为16,在循环体中用ADDC指令把R0指针指向的单元与R1指针指向的单元相加,加得的结果放回R0指向的单元,改动R0、R1指针指向下一个单元,循环16次,在第一次循环前应先将CY清零。程序流程图和程序如下:第第3 3章章 单片机汇编程序设计单片机汇编程序设计程序:ORG1000HMOVR0,#30HMOVR1,#40HMOVR2,#16CLRCLOOP:MOVA,R0ADDCA,R1MOVR0,AINCR0INCR1DJNZR2,LOOPEND开场#30HR0#40HR1#16R20 CR0+R1R0R0+1R0R1+1R1R2-1R2R2=0?终了否是第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例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,乘得的结果须按下面的关系加起来。R7R6R5R4B1A1B2A2B3A3B4A4C2C1C4C3+第第3 3章章 单片机汇编程序设计单片机汇编程序设计即乘积的最低字节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第第3 3章章 单片机汇编程序设计单片机汇编程序设计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第第3 3章章 单片机汇编程序设计单片机汇编程序设计MUL4:MOVA,R7MOVB,R5MULAB;R7R5,结果的低字节与R2相加存入积的第三字节单元ADDA,R2INCR0MOVR0,AMOVA,BADDCA,R1;结果的高字节加R1再加进位位后存入积的第四字节单元INCR0MOVR0,AEND第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-27】多字节求补运算】多字节求补运算 设在片内设在片内RAM 30H单元开单元开场有一个场有一个8字节数据,对该数据字节数据,对该数据求补,结果放回原位置。求补,结果放回原位置。 在在MCS-51系统中没有求系统中没有求补指令,只需经过取反末位加补指令,只需经过取反末位加1得到。而当末位加得到。而当末位加1时,能够向时,能够向高字节产生进位。因此在处置高字节产生进位。因此在处置时,最低字节采用取反加时,最低字节采用取反加1,其,其他字节采用取反加进位,经过他字节采用取反加进位,经过循环来实现。循环来实现。程序:ORG0100HMOVR2,#08HMOVR0,#30HMOVA,R0CPLAADDA,#01MOVR0,ADECR2LOOP:INCR0MOVA,R0CPLAADDCA,#00MOVR0,ADJNZR2,LOOPEND第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.5.2 数据的拼拆和转换数据的拼拆和转换【例【例3-28】设在】设在30H和和31H单元中各有一个单元中各有一个8位数据位数据:30H=x7x6xx4xx2x1x0 3lH=y7y6yy4yy2y1y0如今要从如今要从30H单元中取出低单元中取出低5位,并从位,并从31H单元中取出低单元中取出低3位完成拼装,位完成拼装,拼装结果送拼装结果送40H单元保管,并且规定单元保管,并且规定:40H=y2y1y0x4xx2x1x0 利用逻辑指令利用逻辑指令ANL、ORL、RL等来完成数据的拼拆,处置过程:等来完成数据的拼拆,处置过程:将将30H单元的内容高单元的内容高3位屏蔽;位屏蔽;31H单元内容的低单元内容的低5位屏蔽,上下四位交位屏蔽,上下四位交换,左移一位;然后与换,左移一位;然后与30H单元的内容相或,拼装后放到单元的内容相或,拼装后放到40H单元。单元。程序如下:ORG0100HMOVA,30HANLA,#00011111BMOV30H,AMOVA,31HANLA,#00000111BSWAPA第第3 3章章 单片机汇编程序设计单片机汇编程序设计RLAORLA,40HMOV40H,AEND【例【例3-29】设片内】设片内RAM的的20H单元的内容为:单元的内容为:20H=x7x6xx4xx2x1x0 把该单元内容反序后放回把该单元内容反序后放回20H单元,即为:单元,即为:20H=x0x1x2x3x4x5x6x7 可以经过先把原内容右移一位,低位移入可以经过先把原内容右移一位,低位移入CF中,然后左移一中,然后左移一位,位,CF中的内容移入,经过中的内容移入,经过8次处置即可,由于次处置即可,由于8次过程一样,可以次过程一样,可以经过循环完成,移位过程当中必需经过累加器来处置。设经过循环完成,移位过程当中必需经过累加器来处置。设20H单元单元原来的内容先经过原来的内容先经过R3暂存,结果先经过暂存,结果先经过R4暂存,暂存,R2作循环变量。作循环变量。第第3 3章章 单片机汇编程序设计单片机汇编程序设计程序如下:ORG0200HMOVR3,20HMOVR4,#0MOVR2,#8LOOP:MOVA,R3RRCAMOVR3,AMOVA,R4RLCAMOVR4,ADJNZR2,LOOPMOV20H,R4END另外,由于片内RAM的20H单元在位寻址区,这一问题还可以经过位处置方式来实现,这种方法留给读者本人完成。第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例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 3章章 单片机汇编程序设计单片机汇编程序设计【例3-30】一位十六进制数转换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 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-31】在一温度控制系统中,温度】在一温度控制系统中,温度0100C每一个温度值都曾经每一个温度值都曾经经过温度传感器测得一个两字节的规范电压值。如今经过温度传感器测得一个两字节的规范电压值。如今R2中给出一个中给出一个0100C的温度值,获得它的规范电压值放于的温度值,获得它的规范电压值放于R3、R4中,低字节放在中,低字节放在R3中,高字节放在中,高字节放在R4中。中。 经过用经过用MOVC A,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第第3 3章章 单片机汇编程序设计单片机汇编程序设计INCA;指向高字节MOVCA,A+DPTRMOVR4,A;第二次查得内容送R4RETTAB:DW0056H,0059H,0067H,0076H;电压值表3.5.3 多分支转移散转程序多分支转移散转程序一用多分支转移指令一用多分支转移指令JMP A+DPTR实现的多分支转移程序实现的多分支转移程序【例【例3-32】现有有128路分支,分支号分路分支,分支号分别为0127,要求根据,要求根据R2中的中的分支信息分支信息转向各个分支的程序。即当向各个分支的程序。即当R2=0,转向向OPR0R2=1,转向向OPRlR2=127,转向向OPR127第第3 3章章 单片机汇编程序设计单片机汇编程序设计先用无条件转移指令“AJMP或“LJMP按顺序构造一个转移指令表,执行转移指令表中的第n条指令,就可以转移到第n个分支,将转移指令表的首地址装入DPTR中,将R2中的分支信息装入累加器A构成变址值。然后执行多分支转移指令JMPA+DPTR实现转移。程序清单如下:MOVA,R2RLA;分支信息乘2MOVDPTR,#TAB;DPTR指向转移指令表首址JMPA+DPTR;转向构成的散转地址TAB:AJMPOPR0;转移指令表AJMPOPR1AJMPOPR127转移指令表中的转移指令是由转移指令表中的转移指令是由LJMP指令构成指令构成 第第3 3章章 单片机汇编程序设计单片机汇编程序设计程序如下:ORG0200HMOVDPTR,#TAB;DPTR指向转移指令表首址MOVA,R2;分支信息放累加器A中MOVB,#3MULAB;分支信息乘3XCHA,BADDA,DPH;高字节调整到DPH中MOVDPH,AXCHA,BJMPA+DPTR;转向构成的散转地址TAB:LJMPOPR0;转移指令表LJMPOPR1LJMPOPR2LJMPOPR127第第3 3章章 单片机汇编程序设计单片机汇编程序设计转移指令表中的转移指令是由AJMP指令构成,假设分支数大于128个,如分支数有256个ORG0200HMOVDPTR,#TAB;DPTR指向转移指令表首址MOVA,R2;分支信息放累加器A中RLA;分支信息乘2JNCNEXTINCDPH;高字节调整到DPH中NEXT:JMPA+DPTR;转向构成的散转地址TAB:AJMPOPR0;转移指令表AJMPOPR1AJMPOPR2AJMPOPR255第第3 3章章 单片机汇编程序设计单片机汇编程序设计二采二采RET指令实现的多分支程序指令实现的多分支程序用RET指令实现多分支程序的方法是:先把各个分支的目的地址按顺序组织成一张地址表,在程序中用分支信息去查表,获得对应分支的目的地址,按先低字节,后高字节的顺序压入堆栈,然后执行RET指令,执行后那么转到对应的目的位置。【例【例3-33】用】用RET指令指令实现根据根据R2中的分支信息中的分支信息转到各个分支程序的多到各个分支程序的多分支分支转移程序。移程序。 设各分支的目的地址分各分支的目的地址分别为addr00、addr01、addr02、addrFF。程序如下:程序如下:MOV DPTR,#TAB3 ;DPTR指向目的地址表指向目的地址表MOV A,R2 ;分支信息放累加器;分支信息放累加器A中中RL A ;分支信息乘;分支信息乘2JNC NEXTINC DPH ;高字;高字节调整到整到DPH中中NEXT: MOV R3,A ;变址放于址放于R3中中暂存存MOVC A,A+DPTR ;取目的地址低;取目的地址低8位位PUSH ACC ;低;低8位地址入位地址入栈第第3 3章章 单片机汇编程序设计单片机汇编程序设计MOVA,R3;取出R3中变址到累加器AINCA;加1得到目的地址高8位单元的变址MOVCA,A+DPTR;取转向地址低8位PUSHACC;高8位地址入栈RET;转向目的地址TAB3:DWaddr00;目的地址表DWaddrD0lDWaddrFF上述程序执行后,将根据R2中的分支信息转移到对应的分支程序。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号