微型计算机原理与接口技术-章3_单片机汇编程序设计_第1页
微型计算机原理与接口技术-章3_单片机汇编程序设计_第2页
微型计算机原理与接口技术-章3_单片机汇编程序设计_第3页
微型计算机原理与接口技术-章3_单片机汇编程序设计_第4页
微型计算机原理与接口技术-章3_单片机汇编程序设计_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

第3章 单片机汇编程序设计,3.1 MCS-51系列单片机汇编指令格式及标识,指令是使计算机完成基本操作的命令。一种计算机能够执行的全部指令的集合,称为这种计算机的指令系统。单片机的指令系统与微型计算机的指令系统不同,MCS-51系列单片机指令系统共有: 111条指令;42种指令助记符。,49条1字节指令;45条2字节指令;17条3字节指令。,64条为1机器周期指令;45条为2机器周期指令;2条为4机器周期指令(乘、除法)。,这些指令在存储空间和运算速度上,效率都比较高。,MCS-51系列单片机指令系统功能强、指令短、执行快。 从功能上可分成五大类:,1、数据传送指令; 2、算术运算指令; 3、逻辑操作指令; 4、控制转移指令; 5、位操作指令。,3.1.1 指令格式,标号: 操作码助记符 目的操作数,源操作数 ;注释,(1)操作码助记符表明指令的功能,不同的指令有不同的指令助记符,它一般用说明其功能的英文单词的缩写形式表示。,(2)操作数用于给指令的操作提供数据、数据的地址或指令的地址,操作数往往用相应的寻址方式指明。MCS-51单片机指令系统的指令按操作数的多少可分为无操作数、单操作数、双操作数和三操作数四种情况。,(3)标号是该指令的符号地址,后面须带冒号。它主要为转移指令提供转移的目的地址。,(4)注释是对该指令的解释,前面须带分号。它们是编程者根据需要加上去的,用于对指令进行说明,对于指令本身功能而言是可以不要的。,(1)Ri和Rn:表示当前工作寄存器区中的工作寄存器。 i取0或1,表示R0或R1。n取07,表示R0R7。(2)#data:表示包含在指令中的8位立即数。(3)#data16:表示包含在指令中的16位立即数。 (4)rel:以补码形式表示的8位相对偏移量,范围为-128+127,主要用在相对寻址的指令中。(5)addr16和addr11:分别表示16位直接地址和11位直接地址。(6)direct:表示直接寻址的地址。(7)bit:表示可位寻址的直接位地址。(8)(X):表示X单元中的内容。(9)(X):表示以X单元的内容为地址的存储器单元内容,即(X)作地址,该地址单元的内容用(X)表示。(10)/ 和符号:“/”表示对该位操作数取反,但不影响该位的原值。“”表示操作流程,将箭尾一方的内容送入箭头所指一方的单元中去。,3.1.2 指令中用到的标识符,为便于后面的学习,在这里先对指令中用到的一些符号的约定意义作以下说明:,3.2 MCS-51系列单片机寻址方式,MCS-51单片机的寻址方式按操作数的类型,可分为: 数的寻址; 指令寻址。数的寻址有:常数寻址(立即寻址);寄存器数寻址(寄存器寻址);存储器数寻址:直接寻址方式;寄存器间接寻址方式;变址寻址方式。位寻址。,指令的寻址有:绝对寻址;相对寻址。,3.2.1 常数寻址(立即寻址),常数又称为立即数,故又称为立即寻址。在汇编指令中,立即数前面以“#”符号作前缀。在程序中通常用于给寄存器或存储器单元赋初值,例如:MOV A,#20H 其功能是把立即数20H送给累加器A,其中源操作数20H就是立即数。指令执行后累加器A中的内容为20H。,3.2.2 寄存器数寻址(寄存器寻址),在MCS-51系统中,这种寻址方式针对的寄存器只能是R0R7 8个通用寄存器和部分特殊功能寄存器(如累加器A、寄存器B、数据指针DPTR等)中的数据,对于其它的特殊功能寄存器中的内容的寻址方式不属于它。在汇编指令中,寄存器寻址在指令中直接提供寄存器的名称,如R0、R1、A、DPTR等。例如:MOV A,R0 其功能是把R0寄存器中的数送给累加器A,在指令中,源操作数R0为寄存器寻址,传送的对象为R0中的数据。如指令执行前R0中的内容为20H,则指令执行后累加器A中的内容为20H。,3.2.3 存储器数寻址,存储器数寻址针对的数据是存放在存储器单元中,对于存储器单元的内容通过提供存储器单元地址使用。 根据存储器单元地址的提供方式,存储器数的寻址方式有: 1、直接寻址; 2、寄存器间接寻址; 3、变址寻址。,1直接寻址,在MCS-51系统中,这种寻址方式针对的是片内数据存储器和特殊功能寄存器。在汇编指令中,指令中直接以地址数的形式提供存储器单元的地址。例如:MOV A,20H 其功能是把片内数据存储器20H单元的内容送给累加器A。如指令执行前片内数据存储器20H单元的内容为30H,则指令执行后累加器A的内容为30H。指令中20H是地址数,它是片内数据存储单元的地址。在MCS-51中,数据前面不加“#”是存储单元地址而不是常数,常数前面要加符号“#”。,对于特殊功能寄存器,在指令中使用时往往通过特殊功能寄存器的名称使用,而特殊功能寄存器名称实际上是特殊功能寄存器单元的符号地址,因此它们是直接寻址。例如:MOV A,P0 其功能是把P0口的内容送给累加器A。P0是特殊功能寄存器P0口的符号地址,该指令在翻译成机器码时,P0就转换成直接地址80H。,2寄存器间接寻址,寄存器间接寻址是指数据存放在存储单元中,而存储单元地址存放在寄存器中,在指令中通过提供存放存储单元地址的寄存器来使用对应的存储单元。形式为:寄存器名。 例如:MOV A,R1 该指令的功能是将以工作寄存器R1中的内容为地址的片内RAM单元的数据传送到累加器A中去。指令的源操作数是寄存器间接寻址。,在MCS-51单片机中,寄存器间接寻址用到的寄存器只能是通用寄存器R0、R1和数据指针寄存器DPTR,它能访问的数据是片内数据存储器和片外数据存储器。其中,片内数据存储器只能用R0和R1作指针间接访问;片外数据存储器,低端的256字节单元,既可以用两位十六进制地址以R0或R1作指针间接访问,也可用四位十六进制地址以DPTR作指针间接访问,而高端的字节单元则只能以DPTR作指针间接访问。对于片内RAM和片外RAM的低端256字节都可以用R0和R1作指针访问,它们之间用指令来区别。片内RAM访问用MOV指令,片外RAM访问用MOVX指令。,若R1中的内容为80H,片内RAM地址为80H的单元中的内容为20H,则执行该指令后,累加器A的内容为20H。,例如:MOVC A,A+DPTR,其功能是将数据指针寄存器DPTR的内容和累加器A中的内容相加作为程序存储器的地址,从对应的单元中取出内容送累加器A中。指令中,源操作数的寻址方式为变址寻址,设指令执行前数据指针寄存器DPTR的值为2000H,累加器A的值为05H,程序存储器2005H单元的内容为30H,则指令执行后,累加器A中的内容为30H。示意图如左图所示。,3变址寻址,变址寻址是指操作数的地址由基址寄存器的地址加上变址寄存器的地址得到。在MCS-51系统中,它是以数据指针寄存器DPTR或程序计数器PC为基址,累加器A为变址,两者相加得存储单元的地址,所访问的存储器为程序存储器。,3.2.4 位寻址,位寻址是指操作数是二进制位的寻址方式。在MCS-51单片机中有一个独立的位处理器,有多条位处理指令,能够进行各种位运算。在MCS-51系统中,位处理的操作对象是各种可位寻址位。对于它们的访问是通过提供相应的位地址来处理。,指令给出位地址。一位数据在存储器位寻址区。 (1)内部RAM低128单元中的位寻址区: 位地址为00H07FH共128位(字节地址为20H2FH); (2)内部RAM高128单元中的专用寄存器的可寻址位: SFR中11个有位地址寄存器中的83位。,在MCS-51系统中,位地址的表示可以用以下几种方式:1直接使用位地址(00H07FH+83位)。例如:PSW的位6可表示为0D6H(位地址)。2字节地址带位号。例如:PSW的位6可表示为0D0H.6; 20H.3表示20H单元的3位。3特殊功能寄存器名带位号。例如: PSW的位6可表示为PSW.6 ; P0.1表示P0口的1位。4位符号地址。例如: PSW的位6可表示为AC; TR0是定时/计数器T0的启动位。,例: MOV C,40H;CY(位地址40H) 设指令执行前 CY=1,位地址40H存储器单元 如图,执行指令后,CY= ?,0,3.2.5 指令寻址,一、绝对寻址,绝对寻址是在指令的操作数中直接提供目的位置的地址或地址的一部分。 在MCS-51系统中:长转移和长调用提供目的位置的16位地址;绝对转移和绝对调用提供目的位置的16位地址的低11位。 它们都为绝对寻址。,二、相对寻址,相对寻址是以当前程序计数器PC值加上指令中给出的偏移量rel得到目的位置的地址。在MCS-51系统中,相对转移指令的操作数属于相对寻址。 在使用相对寻址时要注意以下两点:(1)当前PC值是指转移指令执行时的PC值,它等于转移指令的地址加上转移指令的字节数。实际上是转移指令的下一条指令的地址。例如:若转移指令的地址为2010H,转移指令的长度为2字节,则转移指令执行时的PC值为2012H。(2)偏移量rel是8位有符号数,以补码表示,它的取值范围为-128+127。当为负值时,向前转移,当为正数时向后转移。 相对寻址的目的地址为:目的地址=转移指令的地址+转移指令的字节数+rel =当前PC+rel,3.3 MCS-51系列单片机指令系统,3.3.1 数据传送指令,数据传送指令有29条,是指令系统中数量最多、使用也最频繁的一类指令。 这类指令可分为三组:,普通传送指令; 数据交换指令; 堆栈操作指令。,一、普通传送指令 普通传送指令以助记符MOV为基础。分成片内数据存储器传送指令(MOV)、片外数据存储器传送指令(MOVX)和程序存储器传送指令(MOVC)。1片内数据存储器传送指令MOV指令格式:MOV 目的操作数,源操作数 其中:源操作数可以为A、Rn、Ri、direct、#data,目的操作数可以为A、Rn、Ri、direct,组合起来总共16条。,(1)以A为目的操作数MOV A,Rn;ARnMOV A,direct;A(direct)MOV A,Ri;A(Ri)MOV A,#data;A #data(2)以Rn为目的操作数MOV Rn,A;RnAMOV Rn,direct;Rn(direct)MOV Rn,#data;Rn#data(3)以直接地址direct为目的操作数MOV direct,A;(direct)AMOV direct,Rn;(direct)RnMOV direct,direct;(direct)(direct)MOV direct,Ri;(direct)(Ri)MOV direct,#data;(direct) #data,按目的操作数的寻址方式划分为五组:,(4)以间接地址Ri为目的操作数MOV Ri,A;(Ri)AMOV Ri,direct;(Ri)(direct)MOV Ri,#data;(Ri) #data(5)以DPTR为目的操作数MOV DPTR,#data16 ;DPTR #data16,注意: 源操作数和目的操作数中的Rn和Ri不能相互配对。如不允许有“MOV Rn,Rn”,“MOV Ri,Rn”这样的指令,在MOV指令中,不允许在一条指令中同时出现工作寄存器,无论它是寄存器寻址还是寄存器间接寻址。,例:,MOV A,#30HMOV 4FH,AMOV R0,#20HMOV R0,4FHMOV 21H,20H,练习题:用两种寻址方式实现,将片内RAM 60H单元的数据传送给累加器A。,解: MOV A,#60H(),MOV R0,#60H() MOV A,R0,;A=30H;(4FH)=30H;R0=20H;(20H)=30H;(21H)=30H,MOV R0,60H MOV A,R0 (),解: MOV A,60H () 结果A=32H,顺序执行下列指令序列,求每一步执行结果。,说 明:,1、一条指令中不能同时出现两个工作寄存器。非法指令:MOV R1,R2MOV R2,R0,2、间址寄存器只能使用 R0、R1和DPTR。 非法指令: MOV A,R2,3、 SFR区只能直接寻址,不能用寄存器间接寻址。非法指令: MOV R0,#80H MOV A,R0,2片外数据存储器传送指令MOVX 在MCS-51系统中只能通过累加器A与片外数据存储器进行数据传送,访问时,只能通过Ri和DPTR以间接寻址方式进行。MOVX指令共有四条:DPTR作16位数据指针,寻址64KB片外RAM空间: MOVX A,DPTR;A(DPTR) (读)MOVX DPTR,A;(DPTR)A (写) Ri作8位数据指针,寻址256B片外RAM空间(页内寻址):MOVXA,Ri;A(P2Ri) (读)MOVXRi,A ;(P2Ri)A (写) 其中前两条指令通过DPTR间接寻址,可以对整个64KB片外数据存储器访问。后两条指令通过Ri间接寻址,只能对片外数据存储器的低端的256字节访问,访问时将低8位地址放于Ri中。,例:实现片外数据存储器数据传送(2000H) (2100H)。,MOV DPTR,#2000HMOVX A,DPTRMOV DPTR,#2100HMOVX DPTR,A,;DPTR=2000H;A=X;DPTR=2100H;(2100H)=X,片外数据存储器不能直接寻址。下列为非法指令: MOVX A,2000H MOVX 2100H,2000H,3程序存储器传送指令MOVC 程序存储器传送指令只有两条,一条用DPTR基址变址寻址。一条用PC基址变址寻址。这两条指令通常用于访问表格数据,因此以称为查表指令。, DPTR为基址寄存器:MOVCA,A+DPTR ;A(A+DPTR) (读) 查表范围为 64KB 程序存储器任意空间, 称为远程查表指令。 PC为基址寄存器:MOVCA,A+PC;A(A+PC) (读) 常数表只能在查表指令后256B范围内, 称为近程查表指令。,特点: MOVC A,A+DPTR指令可访问整个ROM的64KB空间,表格可放在ROM 的任何位置,与MOVC指令无必然的关系。 MOVC A,A+PC指令优点:不改变PC的状态,根据A的内容取表格常数。缺点:(1)表格只能存放在查表指令以下的256个单元内。 (2)当表格首地址与本指令间有其它指令时,需要调整偏移量,调整量为下 一条指令的起始地址到表格首址之间的字节数。,【例3-1】写出完成下列功能的程序段。(1)将R0的内容送R6中程序为:MOV A,R0MOV R6,A(2)将片内RAM 30H单元的内容送片外60H单元中程序为:MOV A,30HMOV R0,#60HMOVX R0,A(3)将片外RAM 1000H单元的内容送片内20H单元中程序为:MOV DPTR,#1000HMOV A,DPTRMOV 20H,A(4)将ROM 2000H单元的内容送片内RAM的30H单元中程序为:MOV A,#0MOV DPTR,#2000HMOVC A,A+DPTRMOV 30H,A,二、数据交换指令 数据交换指令数据作双向传送,传送后,前一个操作数原来的内容传送到后一个操作数中,后一个操作数原来的内容传送到前一个操作数中。 数据交换指令要求第一个操作数须为累加器A,共有5条。XCH A,Rn;ARnXCH A ,direct;A(direct)XCH A,Ri;A(Ri)XCHD A,Ri;A03(Ri)03SWAP A;A03A47,【例3-2】若R0的内容为30H,片内RAM 30H单元的内容为23H,累加器A的内容为45H,则执行XCH A,R0 指令后片内RAM 30H单元的内容为45H,累加器A中的内容为23H。 若执行SWAP A指令,则累加器A的内容为54H。,习题:将片内RAM60H单元与61H单元的数据交换。,例:设A=29H,执行指令 XCH A,2AH后, A= ? ,(2AH)= ?,38H,29H,XCH 60H,61H; 对吗?,不对!,29H,三、堆栈操作指令 堆栈是在片内RAM中按“先进后出,后进先出”原则设置的专用存储区。数据的进栈和出栈由指针SP统一管理。在MCS-51系统中,堆栈操作指令有两条:PUSH direct;SP(SP+1),(SP)(direct)POP direct;(direct)(SP),(SP)(SP-1) 其中PUSH指令入栈,POP指令出栈。操作时以字节为单位。入栈时SP指针先加1,再入栈。出栈时内容先出栈,SP指针再减1。用堆栈保存数据时,先入栈的内容后出栈;后入栈的内容先出栈。 【例3-3】若入栈保存时入栈的顺序为:PUSH APUSH B则出栈的顺序为:POP BPOP A,例:设 A=02H,B=56H,执行下列指令后, SP= ? ,A= ? ,B= ? 。,SBR:MOV SP,#30H ;设栈底 PUSH APUSH BMOV A,#00HMOV B,#01H POPBPOP A,02H,56H,30H,入栈指令:PUSH direct ;SPSP+1,(SP)(direct)出栈指令:POP direct ;(direct)(SP),SPSP-1 “先加后压” “先弹后减”,练习:,说明程序执行过程中,SP的内容及堆栈中内容的改变过程。 程序如下: MOV SP,#30H MOV A,#20H MOV B,#30H PUSH A PUSH B POP A POP B,;SP=30H;A=20H;B=30H;SP=31H (31H)=20H ;SP=32H (32H)=30H ;A=30H SP=31H ;B=20H SP=30H,习题:找出指令错误并改正:,1MOV A,#1000H ;A1000H(A装1个字节数)2MOVX A,1000H ;A(1000H)片外RAM(DPTR、Ri)3MOVC A,1000H ;A(1000H)片外ROM(DPTR、PC)4MOVX 60H,A ;片外RAM(60H)A(应为MOV)5MOV R0,60H ;片内RAM:(61H)(60H) MOV 61H,R0 (片内RAM可直接寻址) 6. XCH R1,R2 ;R1 R2(必须有A参加)7. MOVX DPTR,#2000H ;DPTR2000H(应为MOV)8. MOVX 60H,DPTR ;片内RAM片外RAM (必须有A参加),3.3.2 算术运算指令,一加法指令,1一般的加法指令ADDADD A,Rn;AA + RnADD A,direct;AA +(direct)ADD A,Ri;AA +(Ri)ADD A,#data;AA + #data2带进位加指令ADDCADDC A,Rn;AA+Rn+CADDC A,direct;AA +(direct)+ CADDC A,Ri;AA +(Ri)+ CADDC A,#data;AA + #data + C3加1指令INC A;AA+1INC Rn;RnRn+1INC direct;(direct)(direct)+ 1INC Ri;(Ri)(Ri)+ 1INC DPTR;DPTRDPTR+1,其中,ADD和ADDC指令在执行时要影响CY、AC、OV和P标志位。而INC指令除了INC A要影响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,二减法指令,1带借位减法指令SUBBSUBB A,Rn;AA - Rn - CSUBB A,direct;AA -(direct)- CSUBB A,Ri;AA -(Ri)- CSUBB A,#data;AA - #data - C2减1指令DECDEC A;AA - 1DEC Rn;RnRn - 1DEC direct;direct(direct)- 1DEC Ri;(Ri)(Ri)- 1,在MCS-51单片机中,只提供了一种带借位的减法指令,没有提供一般的减法指令,一般的减法操作可以通过先对CY标志清零,然后再执行带借位的减法来实现。其中,SUBB指令在执行时要影响CY、AC、OV和P标志位。而DEC指令除了DEC A要影响P标志位外,对其它标志位都没有影响。,【例3-5】求R3R2 - R1。程序为:MOV A,R2CLR CSUBB A,R1MOV R3,A,3乘法指令MUL 在MCS-51单片机中,乘法指令只有一条:MUL AB 该指令执行时将对存放于累加器A中的无符号被乘数和放于B寄存器中的无符号乘数相乘,积的高字节存于B寄存器中,低字节存于累加器A中。 指令执行后将影响CY和OV标志,CY复位,对于OV:当积大于255时(即B中不为0),OV为1;否则,OV为0。,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码数的加法运算。,它的调整过程为:(1)若累加器A的低四位为十六进制的AF或辅助进位标志AC为1,则累加器A中的内容作加06H调整。(2)若累加器A的高四位为十六进制的AF或进位标志CY为1,则累加器A中的内容作加60H调整。,例如:求BCD码48+69=?117 0100 1000 B + 0110 1001 B 1011 0001 B +0110 0110 B 加6修正 1 0001 0111 B低4位向高4位进位,表明低位和大于9,需加6修正;高位由于获得进位而出现非法码,因此也需要加6修正。 修正后,结果为117,正确。 思考:BCD码减法,如何修正?(求减数对9A的补码) 9A的原码为1 110 0110 B=66H。,【例3-6】在R3中有十进制数67,在R2中有十进制数85,用十进制运算,运算的结果放于R5中。程序为:MOV A,R3;(R3)=67ADD A,R2;(R2)=85,(A)=0ECHDA A;(A) =52HMOV R5,A;(R5)=52H 程序中DA指令对ADD指令运算出来的放于累加器A中的结果进行调整,调整后,累加器A中的内容为52H,CY为1,则结果为152,最后放于R5中的内容为52H(十进制数52)。,跳过或进入6个无效编码区,结果就会出错。,(R3)=67=0110 0111 B(R2)=85=1000 0101 B + (A)=1110 1100 B=ECH,52H=(A),1=(C),ECH=1110 1100B 0110 0110B + 1 0101 0010B,3.3.3 逻辑操作指令,一逻辑与指令ANLANL A,Rn ;AA RnANL A,direct ;AA (direct)ANL A,Ri ;AA (Ri)ANL A,#data ; AA dataANL direct,A ;(direct)(direct) AANL direct,#data ;(direct)(direct) data二逻辑或指令ORLORL A,Rn ;AA RnORL A,direct ;AA (direct)ORL A,Ri ;AA (Ri)ORL A,#data ;AA dataORL direct,A ;(direct)(direct) AORL direct,#data ;(direct)(direct) data,三逻辑异或指令XRLXRL A,Rn ;A A RnXRL A,direct ;A A (direct)XRL A,Ri ; A A (Ri)XRL 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,四清零和求反指令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)8位循环指令:RL A ;A循环左移一位RR A ;A循环右移一位,2)9位循环指令:RLC A ;带CY循环左移一位RRC A ;带CY循环右移一位,CLR CMOV A,R5RLC AMOV R5,AMOV A,R6RLC AMOV R6,A,;CY=0,设 R6=55H,R5=0AAH,;R6=01010101B,R5=10101010B,CY=0,;R6=01010101B,R5=01010100B,CY=1,;R6=10101011B,R5=01010100B,CY=0,思考题:如何将寄存器R6R5中的双字节数X右移一位。,用9位循环指令实现多字节移位:例:编程将寄存器 R6R5中的双字节数X左移一位。,【例3-9】若累加器A中的内容为10001011B,CY=0,则执行RLC A指令后累加器A中的内容为00010110,CY=1。,;R5=01010100B,CY=1,3.3.4 控制转移指令,共有17条,包括: 无条件转移指令; 条件转移指令; 子程序调用及返回指令。,一、无条件转移指令 无条件转移指令是指当执行该指令后,程序将无条件地转移到指令指定的地方去。无条件转移指令包括长转移指令、绝对转移指令、相对转移指令和间接转移指令。,一、无条件转移指令,指令:LJMP,AJMP,SJMP,JMP4条,LJMP addr16 长跳转指令 可在64KB范围内跳转,AJMP addr11 绝对跳转指令 可在指令所在的2KB范围内跳转,SJMP rel 相对跳转指令 可在当前PC-128与+127范围内跳转,JMP A+DPTR 间接长跳转指令 可在以DPTR为基址+A为偏移量之 和所指向的64KB程序范围内跳转,1长转移指令LJMP 指令格式:LJMP addr16 ;PCaddr16 指令后面带目的位置的16位地址,执行时直接将该16位地址送给程序指针PC,程序无条件地转到16位目标地址指明的位置去。指令中提供的是16位目标地址,所以可以转移到64KB程序存储器的任意位置,故得名为“长转移”。该指令不影响标志位,使用方便。 缺点是:执行时间长,字节数多。,2绝对转移指令指令格式:AJMP addr11;PC100 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 转移的目的地址为 00110 001 00100011B=3123H,3相对转移指令指令格式:SJMP rel;PC PC+2+rel SJMP指令后面的操作数rel是8位带符号补码数,执行时,先将程序指针PC的值加2(该指令长度为2字节),然后再将程序指针PC的值与指令中的位移量rel相加得转移的目的地址。即: 转移的目的地址= SJMP指令所在地址+2+rel 因为8位补码的取值范围为-128+127,所以该指令的转移范围是: 相对PC当前值向前128字节,向后127字节。,注意:在单片机程序设计中,通常用到一条SJMP指令:SJMP $ 该指令的功能是在自己本身上循环,进入等待状态。其中符号 $ 表示转移到本身,它的机器码为80 FEH。在程序设计中,程序的最后一条指令通常用它,使程序不再向后执行以避免执行后面的内容而出错。,例:求原地踏步指令的指令代码: HERE:SJMP HERE(或SJMP ),相对偏移量=2000H-(2000H+2)补=FEH, rel=FEH 求出指令代码为:80 FEH,4间接转移指令 指令格式:JMP A+DPTR;PC A+DPTR 它MCS-51系统中唯一一条间接转移指令,转移的目的地址是由数据指针DPTR的内容与累加器A中的内容相加得到,指令执行后不会改变DPTR及A中原来的内容。数据指针DPTR的内容一般为基址,累加器A的内容为相对偏移量,在64 KB范围内无条件转移。 该指令的特点是转移地址可以在程序运行中加以改变。DPTR一般为确定值,根据累加器A的值来实现转移到不同的分支。在使用时往往与一个转移指令表一起来实现多分支转移。,【例3-12】下面的程序能根据累加器A的值0、2、4、6转移到相应的TAB0TA6分支去执行。 MOV DPTR,#TABLE ;表首地址送DPTR JMP 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,则PCPC+2+rel,否则,PCPC+2 判非0指令:JNZ rel ;若A0,则PCPC+2+rel,否则,PCPC+2,【例3-13】把片外RAM的30H单元开始的数据块传送到片内RAM的40H开始的位置,直到出现零为止。 片内、片外数据传送以累加器A过渡。每次传送一个字节,通过循环处理,直到处理到传送的内容为0结束。 程序如下:MOV R0,#30HMOV R1,#40HLOOP:MOVX A,R0MOV R1,AINC R1INC R0JNZ LOOPSJMP $,2比较转移指令 比较转移指令用于对两个数作比较,并根据比较情况进行转移,比较转移指令有四条:CJNE A,#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,转移若A(direct),则C=1,PCPC+3+rel,转移,3减1不为零转移指令 这种指令是先减1后判断,若不为零则转移。指令有两条:DJNZ Rn,rel (2字节指令,2周期指令);先Rn中的内容减1, 再判断Rn中的内容是否等于零, 若不为零,则转移。DJNZ direct,rel ( 3字节指令,2周期指令);先(direct)中的内容减1, 再判断(direct)中的内容是否等于零,若不为零,则转移。,【例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,三、子程序调用及返回指令,这类指令有四条。两条子程序调用指令,两条返回指令。1长调用指令指令格式:LCALL addr16执行过程:(PC)(PC)+ 3(SP)(SP)+ 1(SP)(PC)70(SP)(SP)+ 1(SP)(PC)158(PC) addr16 该指令执行时,先将当前的PC(指令的PC加指令的字节数3)值压入堆栈保存,入栈时先低字节,后高字节。然后转移到指令中addr16所指定的地方执行。由于后面带16位地址,因而可以转移到程序存储空间的任一位置(64KB)。,2绝对调用指令指令格式:ACALL addr11执行过程: (PC)(PC)+ 2(SP)(SP)+ 1(SP)(PC)70(SP)(SP)+ 1(SP)(PC)158(PC)100 addr11 该指令执行过程与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与一般位之间的相互传送。MOV C,bit;C(bit)MOV bit,C;(bit)C指令在使用时必须有位运算器C参与,不能直接实现两位之间的传送。如果进行两位之间的传送,可以通过位运算器C来传送。【例3-15】把片内RAM中位寻址区的20H位的内容传送到30H位。程序:MOV C,20H MOV 30H,C,二位逻

温馨提示

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

评论

0/150

提交评论