《MCS51单片机的指令与程序设计.ppt》由会员分享,可在线阅读,更多相关《MCS51单片机的指令与程序设计.ppt(94页珍藏版)》请在三一办公上搜索。
1、第七章 MCS-51单片机的指令与程序设计,本章教学基本要求1掌握MCS-51单片机汇编语言的特点和格式。2掌握MCS-51单片机汇编指令的7种寻址方式和111条指令的使用方法。3掌握MCS-51单片机汇编程序的设计方法。4掌握MCS-51单片机C语言程序设计方法。重点与难点汇编指令的寻址方式与指令的使用方法。汇编程序和C程序的结构设计。,7.1 MCS-51汇编指令格式和寻址方式,AT89C51单片机的基本指令共111条,按指令在程序存储器所占的字节来分,可分为以下3种:(1)单字节指令49条;(2)双字节指令45条;(3)三字节指令17条。按指令的执行时间来分,可分为以下3种:(1)1个机
2、器周期(12个时钟振荡周期)的指令64条;(2)2个机器周期(24个时钟振荡周期)的指令45条;(3)只有乘、除两条指令的执行时间为4个机器周期(48个时钟振荡周期)。,MCS-51单片机的指令格式与8086类似,一条指令通常由两部分组成:操作码和操作数。AT89C51单片机的汇编语言指令的书写格式如下:标号:操作码 操作数;注释例如,一条数据传送指令:MOV A,4CH;将4CH存储单元的内容送到累加器A中,其中:MOV是操作码,A和3AH是操作数,“;”的后面是注释。需要注意是在汇编程序中使用的注释符号“;”,“:”和“,”为英文下的分号,冒号和逗号,而非中文下的“;”,“:”和“,”。,
3、一、指令格式,1操作码操作码是由助记符表示的字符串,它规定了指令的操作功能。操作码是指令的核心,不可或缺。2操作数操作数是指参加操作的数据或数据的地址。MCS-51单片机的指令系统中指令的操作数可以是03个。不同功能的指令,操作数的个数和作用有所不同。例如,传送类指令多数有两个操作数。紧跟在操作码后面的第一操作数称为目的操作数,表示操作结果存放的地址;后面的第二操作数称为源操作数,给出操作数或操作数的来源地址。,3标号标号用符号代表其后面的指令的首地址。标号由18个字符组成,第一个字符必须是字母,其余字符可以是字母、数字或其他特定符号,标号放在操作码前面,与操作码之间必须用“:”号隔开。标号起
4、标记作用,在指令中是可选项,一般用在一段功能程序的第一条指令前面。4注释 注释是为了便于阅读该条指令所作的说明,注释项是可选项,即可有可无。但为提高程序可读性,多数程序需要进行适当注释。5其他由指令格式可见,操作码与操作数之间必须用空格分隔;操作数与操作数之间必须用逗号“,”分开;注释与指令之间必须用“;”号分开。操作码和操作数有对应的二进制代码,指令代码由若干字节组成。不同的指令字节数不一定相同,51单片机的指令系统中有单字节、双字节和3字节指令。,寻址方式就是在指令中说明操作数所在地址的方法。AT89C51单片机的指令系统有以下7种寻址方式,下面分别予以介绍。寄存器寻址方式寄存器寻址方式就
5、是操作数在寄存器中,因此指定了寄存器就能得到操作数。例如,指令MOV A,Rn;(Rn)A,n=07表示把寄存器Rn的内容传送到累加器A中,由于操作数在Rn中,因此在指令中指定了从寄存器Rn中取得源操作数,所以称为寄存器寻址方式。寄存器寻址方式的寻址范围包括:(1)4组通用工作寄存器区,共32个工作寄存器。但只能寻址当前工作寄存器区的8个工作寄存器,因此指令中的寄存器名称只能是R0R7。(2)部分特殊功能寄存器,如累加器A、寄存器B以及数据指针寄存器DPTR等。,二、寻址方式,2直接寻址方式在直接寻址方式中,指令中直接以单元地址的形式给出操作数。该单元地址中的内容就是操作数。例如,指令MOV
6、A,26H表示把内部RAM的26H字节单元的内容传送到寄存器A。源操作数采用的是直接寻址方式。需要区分8086直接寻址指令格式中直接地址要加“”,如8086指令:MOV AX,1000H。直接寻址的操作数在指令中以存储单元的形式出现,因为直接寻址方式只能使用8位二进制表示的地址,因此,直接寻址方式的寻址范围只限于:(1)内部RAM的128个单元。(2)特殊功能寄存器。特殊功能寄存器除了以单元地址的形式给出外,还可以用寄存器符号的形式给出。,例如,指令MOV A,90H表示把P1口(字节地址为90H)的内容传送给A。也可写为MOV A,P1这也表示把P1口(地址为90H)的内容传送给A,两条指令
7、是等价的。应当说明的是,直接寻址方式是能对所有特殊功能寄存器读写的唯一寻址方式。,3寄存器间接寻址方式 前述的寄存器寻址方式,在寄存器中存放的是操作数,而寄存器间接寻址方式,在寄存器中存放的是操作数的地址,即先从寄存器中找到操作数的地址,再按该地址找到操作数。由于操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。为了区别寄存器寻址和寄存器间接寻址,在寄存器间接寻址方式中,应在寄存器名称前面加前缀标志“”。例如,指令 MOV A,Ri;i=0或1其中,Ri中的内容为26H,即从Ri中找到源操作数所在单元的地址26H,把该地址中的内容传送给A,即把内部RAM中26H单元的内容送到A。,4立即寻
8、址方式 立即寻址方式就是直接在指令中给出操作数。出现在指令中的操作数也称立即数。为了与直接寻址指令中的直接地址加以区别,需在操作数前面加前缀标志“#”。例如,指令 MOV A,#55H 表示把立即数55H送给A,55H这个常数是指令代码的一部分。采用立即寻址方式的指令是双字节的。第一个字节是操作码,第二个字节是立即数。因此,立即数就是放在程序存储器内的常数。在8086的直接寻址中,源操作数前面没有“#”,如8086指令:MOV AX,7A3BH。,5基址寄存器加变址寄存器间接寻址方式基址寄存器加变址寄存器间接寻址方式用于读出程序存储器中的数据到累加器中。该寻址方式是以DPTR或PC作为基址寄存
9、器,以累加器A作为变址寄存器,并以两者内容相加形成的16位地址作为操作数的地址,以达到访问数据表格的目的。例如,指令 MOVC A,A+DPTR假设A的原有内容为10H,DPTR的内容为0210H,该指令执行的结果是把程序存储器0220H单元的内容传送给A。,下面对该寻址方式做如下说明。(1)该寻址方式只能对程序存储器进行寻址,寻址范围可达到64KB。(2)该寻址方式的指令只有3条:MOVC A,A+DPTRMOVC A,A+PCJMP A,A+DPTR其中,前两条指令是读程序存储器指令,最后一条指令是无条件转移指令。,6位寻址方式AT89C51单片机具有位处理功能,可以对数据位进行操作,因此
10、就有相应的位寻址方式,而8086指令系统不具备该寻址功能。位寻址指令中可以直接使用位地址,例如,指令MOV C,55H其功能是把位地址为55H的值送到进位位C。位寻址的寻址范围包括如下两种情况。,(1)内部RAM中的位寻址区单元地址为20H2FH,共16个单元,128位,位地址是00H7FH,对这128个位的寻址使用直接地址表示。寻址位有两种表示方法,一种是位地址,如55H;另一种是单元地址加上位,如(2AH).5,它指的是2AH单元中的第五位。位地址55H与位(2AH).5是同一个位,二者是等价的。,(2)特殊功能寄存器中的可寻址位可供位寻址的特殊功能寄存器有11个,共有88位,其中有5位没
11、有定义,所以有可寻址位83位。这些可寻址位在指令中有如下4种表示方法。直接使用位地址。例如,PSW寄存器位5的位地址为0D5H。位名称的表示方法。例如,PSW寄存器位5是F0标志位,则可使用F0表示该位。单元地址加位数的表示方法。例如,0D0H单元(即PSW寄存器)位5,表示为(0D0H).5。特殊功能寄存器符号加位数的表示方法。例如,PSW寄存器的位5表示为PSW.5。,7相对寻址方式相对寻址方式是为解决程序转移而专门设置的,为转移指令所采用。在相对寻址的转移指令中,给出了地址偏移量,以“Rel”表示,即PC的当前值加上偏移量就构成了程序转移的目的地址。但这里的PC当前值是紧接在转移指令后的
12、下一条指令的PC值,即转移指令的PC值加上它的字节数。因此,转移的目的地址可用下式表示:目的地址=转移指令所在的地址+转移指令的字节数+Rel其中,偏移量Rel是一个带符号的8位二进制数补码数,它所能表示的数的范围是128+127。因此,相对转移是以转移指令的下一条指令所在地址为基点,向地址增加方向最大可转移127个单元地址,向地址减少方向最大可转移128个单元地址。,AT89C51单片机指令系统的7种寻址方式统计如表7-1所示。,7.2 MCS-51指令介绍,在汇编程序指令编写和程序注释过程中,会用到一些特殊符号,具体含义介绍如下。Rn:当前工作寄存器组中的任一寄存器(n=07)。Ri:当前
13、工作寄存器组中的R0和R1(i=0,1),Ri常用作间接寻址寄存器。:寄存器间接寻址或变址寻址符号。(Ri):由Ri间接寻址指向的地址单元。(用SP和DPTR间接寻址时,表示方法相同)(Ri):由Ri间接寻址指向的地址单元中的内容。(用SP和DPTR间址时,表示相同)(XXH):某片内RAM单元中的内容。,Direct:片内RAM单元(包括SFR区)的直接地址(也有的写成dir)。#Data:8位数据。#Data16:16位数据。Addr16:16位地址。Addr11:11位地址。Rel:由8位补码数构成的相对偏移量。Bit:位地址,内部RAM和特殊功能寄存器的直接寻址位。:数据流向指示。,7
14、.2.1 数据传送指令,数据传送指令共有29条,是指令系统中数量最多、使用非常频繁的指令。一、以累加器A为目的操作数的指令(4条)MOV A,Rn;工作寄存器 Rn(R0R7)的内容 AMOV A,Direct;直接地址 Direct 中的内容(Direct)AMOV A,Ri;间接地址 Ri 中的内容(Ri)A,Ri=R0,R1MOV A,#Data;立即数#Data A,【例7.1】已知 R0=25H,(25H)=0AAH,下面指令执行后的结果分析如下。MOV A,25H;(25H)A,(A)=0AAHMOV A,#30H;#30HA,(A)=33HMOV A,R0;R0A,(A)=25H
15、MOV A,R0;(R0)A即(25H)A,(A)=AAH,二、以寄存器Rn为目的操作数的指令(3条)MOV Rn,A;累加器A中内容RnMOV Rn,Direct;直接地址Direct中的内容RnMOV Rn,#Data;立即数#DataRn【例7.2】已知A=26H,R5=75H,(62H)=0ACH,下面指令执行后其结果分析如下。MOV R5,A;AR5,R5=26HMOV R5,62H;(62H)R5,R5=0ACHMOV R5,#30H;30HR5,R5=30H 注意:当操作数中出现16进制数据的高8位为AF等字母时,需要在前面加上数字“0”如ACH时,需要在前面加上0,写为:0AC
16、H,否则出错。,三、以直接地址 Direct 为目的操作数的指令(5条)MOV Direct,A;ADirectMOV Direct,Rn;RnDirect MOV Direct,Direct;(源Direct)目的Direct MOV Direct,Ri;(Ri)Direct MOV Direct,#Data;#DataDirect【例7.3】设A=36H,(40H)=19H,(25H)=11H,R0=24H,(24H)=62H。下来指令执行后,其结果分析如下。MOV 25H,#22H;#22H25H,(25H)=22HMOV 25H,40H;(40H)25H,(25H)=19HMOV 25
17、H,A;A25H,(25H)=36HMOV 25H,R0;R025H,(25H)=24HMOV 25H,R0;(R0)25H,(25H)=62H,四、以间接地址 Ri 为目的操作数的指令(3条)MOV Ri,A;A(Ri),Ri=R0,R1 MOV Ri,Direct;(Direct)(Ri),Ri=R0,R1MOV Ri,#Data;#Data(Ri),Ri=R0,R1五、16位数据传送指令(1条)MOV DPTR,#Data16;DataHDPH,DataLDPL指令执行的操作是将16位的立即数#Data传送到16位寄存器DPTR中。其中高8位的数据DataH送入DPH,低8位的数据Dat
18、aL送入DPL。例如:MOV DPTR,#12BAH;DPH=12H,DPL=0BAH,六、片外数据传送指令(4条)在 MCS-51单片机指令系统中,下面4条指令操作用于单片机对片外RAM或者片外I/O接口的数据传送。MOVX A,Ri;(Ri)A,读操作,Ri=R0,R1 MOVX A,DPTR;(DPTR)A,读操作MOVX Ri,A;A(Ri),写操作,Ri=R0,R1 MOVX DPTR,A;A(DPTR),写操作上述四条指令中采用了两种指针对片外RAM或I/O接口进行间接寻址:8位的工作寄存器Ri和16位的数据指针DPTR,Ri寻址片外RAM的00H0FFH单元共256个字节单元;D
19、PTR寻址片外RAM或I/O接口的0000H0FFFFH单元共64KB范围。,七、访问ROM的指令(2条)MOVC A,A+PC;先PC+1PC,后(A+PC)AMOVC A,A+DPTR;先PC+1PC,后(A+DPTR)A这两条指令也称为查表指令。编程时,预先在程序存储器ROM中建立起数据表格,以后程序运行时利用这两条指令查表。这两条指令都为单字节指令,不同的是,第一条指令的基本地址为程序计数器PC,偏移地址为A;而第二条指令中,16位数据指针DPTR和累加器A既可以作基本地址也可以作偏移地址,使用比较灵活。因此,可以看出第一条指令查找范围为256B;而第二条指令查找范围可达整个ROM的6
20、4KB。,八、数据交换指令(5条)XCH A,Rn;A与Rn内容交换,Rn=R0R7XCH A,Direct;A与Direct 内容交换XCH A,Ri;A与(Ri)内容交换XCHD A,Ri;A的低四位与(Ri)低四位内容交换SWAP A;A自身的低4位与高4位交换其中,进行的操作是累加器A与工作寄存器Ri(Ri=R0R7)、直接地址Direct 和间接地址Ri(Ri=R0、R1)所寻址的单元内容,以及自身半字节的内容进行互换。其中,前三条为字节的交换,而后面一条进行的是半字节的交换,XCHD完成低4位的交换而高4位不变,SWAP完成累加器A自身的低4位与高4位交换。,九、堆栈操作指令(2条
21、)PUSH Direct;先SP+1SP,后(Direct)(SP)POP Direct;先(SP)Direct,后SP-1SP上述两条指令中,PUSH为入栈指令,POP为出栈指令,用于保护和恢复现场。它们都是双字节指令,且都不影响标志位。,入栈操作时,栈指针SP首先上移一个单元,指向栈顶的上一个单元,接着将直接地址Direct单元内容压入当前SP指向的单元中。出栈操作时,首先将栈指针SP所指向的单元的内容弹出到直接地址Direct中,然后SP下移一个单元,指向新的栈顶。堆栈操作具体特殊性:堆栈指令仅用于片内RAM的128字节单元或专用寄存器的操作;堆栈操作必须遵循“先进后出”或者“后进先出”
22、的原则,否则堆栈中的数据会出现混乱。,7.2.2 算术运算指令,算术运算指令共有24条,包括执行加、减、乘、除法四则运算的指令和执行加1、减1、BCD码的运算和调整的指令。虽然MCS-51单片机的算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志C,可进行多字节无符号整数的运算。此外,利用溢出标志,还可以对带符号数进行补码运算。需要指出的是,除加1、减1指令外,其它指令的执行对程序状态字PSW有影响。,一、加法指令(4条)ADD A,Rn;A+RnA,Rn=R0R7ADD A,Direct;A+(Direct)AADD A,Ri;A+(Ri)AADD A,#Data;A+#Data
23、A加法指令执行是将工作寄存器Rn(R0R7)内容、直接地址Direct内容、间接地址Ri(Ri=R0、R1)的内容以及立即数#Data,与累加器A的内容相加,运算结果保存在累加器A中。上面4条指令的执行将影响标志位AC、CY、OV、P。当和的第3位或第7位有进位时,分别将AC、CY标志位置1,否则为0。溢出标志位只有带符号数运算时才有用。OV=1也可以理解为:由于进位破坏了符号位的正确性。,二、带进位加指令(4条)ADDC A,Rn;A+Rn+CYA,Rn=R0R7ADDC A,Direct;A+(Direct)+CYAADDC A,Ri;A+(Ri)+CYAADDC A,#Data;A+#D
24、ata+CYA这组指令完成的功能是将工作寄存器Rn内容、直接地址Direct内容、间接地址Ri的内容以及立即数#Data,连同进位标志位CY,与累加器A的内容相加,运算结果保存到累加器A。其他的功能与ADD指令相同。,三、带借位减法指令(4条)SUBB A,Rn;A-CY-RnA,Rn=R0R7SUBB A,Direct;A-CY-(Direct)ASUBB A,Ri;A-CY-(Ri)A,Ri=R0,R1SUBB A,#Data;A-CY-#Data A注意:没有不带借位标志的减法指令,所以当两个单字节或多字节最低位相减时,必须先清除借位CY。当两个不带符号位数相减时,溢出与否与OV状态无关
25、,而根据CY是否有借位判断处理。,四、十进制调整指令(1条)十进制调整指令用于对BCD码十进制数加法运算的结果的内容进行修正。其指令格式为 DA A 该指令的功能是对压缩的BCD码(一个字节存放2位BCD码)的加法结果进行十进制调整。两个BCD码按二进制相加之后,必须经本指令的调整才能得到正确的压缩BCD码。对于十进制数(BCD码)的加法运算,需借助于二进制加法指令。,五、增1指令(5条)INC A;(A)+1AINC Rn;(Rn)+1Rn,Rn=R0R7,INC Direct;(Direct)+1DirectINC Ri;(Ri)+1(Ri),Ri=R0,R1INC DPTR;(DPTR)
26、+1DPTR这5条指令将指令中所指出的变量增1,且不影响程序状态字PSW中的任何标志。若变量原来为0FFH,加1后将溢出为00H(前4条指令),标志也不会受到影响。第5条指令INC DPTR,是16位数增1指令。指令首先对低8位指针DPL的内容执行加1操作,当产生溢出时,就对DPH的内容进行加1操作,也不影响标志CY的状态。,六、减1指令(4条)DEC A;(A)-1ADEC Rn;(Rn)-1Rn,Rn=R0R7DEC Direct;(Direct)-1DirectDEC Ri;(Ri)-1(Ri),Ri=R0,R1这4条指令的功能是将指定的变量减1。若原来为00H,减1后下溢为0FFH,不
27、影响标志位(P标志除外)。,七、乘法指令(1条)MUL AB;ABBA 这条指令的功能是把累加器A和寄存器B中的无符号8位整数相乘,其16位积的低8位字节在累加器A中,高8位字节在B中。如果积大于255,则溢出标志位OV置“1”,否则OV清“0”。进位标志位Cy总是清“0”。八、除法指令(1条)DIV AB;A/B,商A,余数B 该指令的功能是用累加器A中8位无符号整数(被除数)除以B中8位无符号整数(除数),所得的商(为整数)存放在累加器A中,余数存放在寄存器B中,且CY和溢出标志位OV清“0”。如果B的内容为“0”(即除数为“0”),则存放结果的A、B中的内容不定,并溢出标志位OV置“1”
28、。,【例7.4】(A)=0FBH,(B)=12H,执行指令 DIV AB结果为(A)=0DH,(B)=11H,CY=0,OV=0。,移位与逻辑运算指令共有24条,有左/右移位、清零和取反、与、或、异或等逻辑操作。这类指令一般会影响奇偶标志位P,但循环指令会影响CY。一、移位操作(4条)RL ARR ARLC ARRC A,7.2.3 移位与逻辑运算指令,第一条指令的功能是累加器A的8位向左循环移位,位7循环移入位0,不影响标志位。第二条指令的功能是累加器A的内容向右循环移一位,位0移入到位7。第三条指令的功能是将累加器A的内容和进位标志位CY一起向左循环移一位,A的第7位移入进位位CY,CY移
29、入到A的0位,不影响其他标志位。第四条指令的功能是累加器A的内容和进位标志CY一起向右循环移一位,A的0位移入到CY,CY移入A的第7位。,二、清零和取反(2条)CLR ACPL A第一条指令的功能是累加器A清“0”。不影响CY、OV等标志位。第二条指令的功能是将累加器A的内容按位逻辑取反,不影响标志位。,三、逻辑与指令(6条)ANL A,Rn;(A)(Rn)A,Rn=R0R7 ANL A,Direct;(A)(Direct)A ANL A,#Data;(A)#Data A ANL A,Ri;(A)(Ri)A,Ri=R0,R1ANL Direct,A;(Direct)(A)Direct ANL
30、 Direct,#Data;(Direct)#Data Direct 这组指令的功能是在指定的变量之间以位为基础进行“逻辑与”操作,结果存放到目的变量所在的寄存器或存储器中。,四、逻辑或指令(6条)ORL A,Rn;(A)(Rn)A,n=07ORL A,Direct;(A)(Direct)AORL A,#Data;(A)#DataAORL A,Ri;(A)(Ri)A,i=0,1ORL Direct,A;(Direct)(A)DirectORL Direct,#Data;(Direct)#DataDirect这组指令的功能是在所指定的变量之间执行以位为基础的“逻辑或”操作,结果存到目的变量寄存器
31、或存储器中。,五、逻辑异或指令(6条)XRL A,Rn;(A)(Rn)A,Rn=R0R7XRL A,Direct;(A)(Direct)AXRL A,Ri;(A)(Ri)A,i=0,1XRL A,#Data;(A)#DataAXRL Direct,A;(Direct)(A)DirectXRL Direct,#Data;(Direct)#DataDirect这组指令的功能是在所指定的变量之间执行以位为基础的“逻辑异或”操作,结果存到目的变量寄存器或存储器中。,7.2.4 控制转移指令,控制转移类指令可以改变程序计数器PC的内容,从而改变程序运行的顺序,将程序跳转到某个指定的地址,再执行下去。程序
32、转移类指令共17条,分为无条件转移指令和条件转移指令两个小类。所有这些指令的目标地址都应在64KB的程序存储器地址范围内。除NOP指令执行时间为1个机器周期外,所有指令的执行时间都是2个机器周期。,一、无条件转移指令(1条)AJMP Addr11该条指令是代码在2KB范围内的无条件跳转指令。AJMP把AT89C51单片机的64KB程序存储器空间划分为32个区,每个区为2K字节范围,转移目标地址必须与AJMP下一条指令的第一个字节在同一2KB区范围内(即转移的目标地址必须与AJMP下一条指令地址的高5位地址码A15A11相同),否则将引起混乱。执行该指令时,先将PC加2(本指令为2B),然后把A
33、ddr11送入PC.10PC.0,PC.15PC.11保持不变,程序转移到目标地址。,二、相对转移指令(1条)SJMP Rel这是无条件转移指令,其中Rel为相对偏移量,是一个单字节的带符号8位二进制补码数,因此它所能实现的程序转移是双向的。Rel如为正,则向地址增大的方向转移;Rel如为负,则向地址减小的方向转移。执行该指令时,在PC加2(本指令为2B)之后,把指令的有符号的偏移量Rel加到PC上,并计算出目标地址,因此跳转的目标地址可以在与这条指令相邻的下一条指令的前128B到后127B(128+127)之间。用户在编写程序时,只需在相对转移指令中直接写上要转向的目标地址标号就可以了,相对
34、偏移量由汇编程序自动计算。例如:LOOP:MOV A,R6SJMP LOOP程序在汇编时,转移到LOOP处的偏移量由汇编程序自动计算和填入。,三、长跳转指令(1条)LJMP Addr16 这条指令执行时,把跳转的目标地址,即指令的第二和第三字节分别装入PC的高位和低位字节中,无条件地转向Addr16指定的目标地址。目标地址可以在64KB程序存储器地址空间的任何位置。四、间接跳转指令(1条)JMP A+DPTR这是一条单字节的转移指令,转移的目标地址由A中8位无符号数与DPTR的16位无符号数内容之和来确定。该指令以DPTR内容作为基址,A的内容作为变址。因此,只要DPTR的值固定,而给A赋予不
35、同的值,即可实现程序的多分支转移。,五、条件转移指令(2条)条件转移指令就是程序的转移是有条件的。执行条件转移指令时,如指令中规定的条件满足,则进行转移;条件不满足,则顺序执行下一条指令。转移的目标地址在以下一条指令地址为中心的256B范围内(128+127)。当条件满足时,PC装入下一条指令的第一个字节地址,再把带符号的相对偏移量Rel加到PC上,计算出要转向的目标地址,条件转移指令有2条。JZ Rel;如果累加器内容为“0”,则执行转移JNZ Rel;如果累加器内容非“0”,则执行转移,六、比较不相等转移指令(4条)CJNE A,Direct,RelCJNE A,#Data,RelCJNE
36、 Rn,#Data,RelCJNE Ri,#Data,Rel这组指令的功能是比较前面两个操作数的大小,如果它们的值不相等则转移,在PC加到下一条指令的起始地址后,把指令最后1个字节的有符号的相对偏移量加到PC上,并计算出转向的目标地址。如果第一操作数(无符号整数)小于第二操作数(无符号整数),则进位标志位CY置“1”,否则CY清“0”。该指令的执行不影响任何一个操作数的内容。,七、减1不为0转移指令(2条)这是一组把减1与条件转移两种功能结合在一起的指令。共有两条指令:DJNZ Rn,Rel;n=07DJNZ Direct,Rel 这组指令将源操作数(Rn或Direct)减1,结果回送到Rn寄
37、存器或Direct中。如果结果不为0则转移。本指令允许程序员把寄存器Rn或内部RAM的Direct单元用作程序循环计数器。这两条指令主要用于控制程序循环。如预先把寄存器Rn或内部RAM的Direct单元装入循环次数,则利用本指令,以减1后是否为“0”作为转移条件,即可实现按次数控制循环。,八、调用子程序指令(2条)调用子程序指令包括短调用指令(AJMP)和长调用指令(LCALL)。ACALL Addr11LCALL Addr16 AJMP指令也是2K字节范围内的调用子程序的指令。执行时先把PC加2(本指令为2个字节),获得下一条指令地址,把该地址压入堆栈中保护,即堆栈指针SP加1,PCL进栈,
38、SP再加1,PCH进栈。最后把PC的高5位和指令代码中的11位地址Addr11连接获得16位的子程序入口地址,并送入PC,转向执行子程序。所调用的子程序地址必须与ACALL指令下一条指令的第一个字节在同一个2K字节区域内,否则将引起程序转移混乱。如果ACALL指令正好落在区底的两个单元内,程序就转移到下一个区中了。因为在执行调用操作之前PC先加了2。,LCALL指令可以调用64K字节范围内程序存储器中的任何一个子程序。指令执行时,先把程序计数器加3获得下一条指令的地址(也就是断点地址),并把它压入堆栈(先低位字节,后高位字节),同时把堆栈指针加2。接着把指令的第二和第三字节(A15A8,A7A
39、0)分别装入PC的高位和低位字节中,然后从PC指定的地址开始执行程序。,九、子程序的返回指令RET执行本指令时(SP)PCH,然后(SP)-1SP(SP)PCL,然后(SP)-1SP其功能是从堆栈中退出PC的高8位和低8位字节,把堆栈指针减2,从PC值开始继续执行程序。十、中断返回指令RETI其功能和RET指令相似,两条指令的不同之处在于该指令清除了在中断响应时被置“1”的AT89C51单片机内部中断优先级寄存器的中断优先级状态,其他操作均与RET指令相同。,十一、空操作指令NOPCPU不进行任何实际操作,只消耗一个机器周期的时间,且只执行(PC)+1PC操作。NOP指令常用于程序中的等待或时
40、间延迟。,7.2.5 位操作指令,AT89C51单片机内部有一个位处理机,对位地址空间具有丰富的位操作指令,其位操作指令共17条。一、数据位传送指令(2条)MOV C,bitMOV bit,C这2条指令的功能是把由源操作数指定的位变量送到目的操作数指定的单元中。其中一个操作数必须为进位标志,另一个可以是任何直接寻址位。不影响其他寄存器或标志位。,二、位变量修改指令(6条)CLR C;CY位清“0”CLR bit;bit位清“0”CPL C;CY位求反CPL bit;bit位求反SETB C;CY位置“1”SETB bit;bit位置“1”这六指令实现对位累加器C或者某位地址bit中的内容进行清
41、零、取反或置位操作。这些指令不影响除C以外的其他标志位。,三、位变量逻辑与指令(2条)ANL C,bit;bitCY CYANL C,/bit;/bitCYCY这两条指令完成的是对位C与某位地址bit中的内容或该位内容的取反后进行逻辑“与”操作,结果返回C中。四、位变量逻辑或指令(2条)ORL C,bit;bitCY CYORL C,/bit;/bitCY CY这两条指令完成的是对位累加器C与某位地址bit中的内容或该位内容的取反后进行逻辑“或”操作,结果返回C中。,五、条件转移类指令(5条)JC RelJNC RelJB bit,RelJNB bit,RelJNC bit,Rel这五条指令中
42、,前面四条指令是根据位累加器C或者某一个位bit是否为“1”或“0”,满足条件跳转,但这些指令执行完毕后C或bit位本身不会改变;而第五条指令在执行完毕后,如果(bit)=1,程序跳转到Rel并将bit位的内容清零,即(bit)=0。,7.3 MCS-51汇编语言程序设计,7.3.1 MCS-51常用伪指令不同汇编程序允许的伪指令不尽相同。以下介绍的伪指令适用于MCS-51内核的单片机系统,MCS-51中常用的伪指令分为三类:(1)程序起始与结束伪指令:ORG、END;(2)符号定义伪指令:EQU、DATA、BIT;(3)数据表格存储格式定义伪指令:DB、DW、DS。除此之外,还有SET、BY
43、TE、WORD等伪指令,下面介绍一些MCS-51单片机常用的伪指令。,一、ORG起始地址伪指令功能:ORG指令用于指定其后的程序或程序段的起始地址格式:ORG 16位地址例:ORG 0000HSTART:MOV A,#33HADD A,#0AHMOV 20H,A“ORG 0000H”表示该伪指令下面第一条指令的起始地址是 0000H,即“MOV A,#33H”指令的首字节地址为0000H,或标号“START”代表的地址为0000H。,二、END伪指令功能:汇编操作结束标志格式:END在END以后所写的指令,汇编程序不再处理。一个源程序只能有一个END指令,必须放在所有指令的最后。源程序中若没有
44、END语句,汇编时将报告出错。,三、EQU伪指令功能:将某个特殊数据或某个存储单元赋予一个符号名称格式:符号EQU数据或汇编符伪指令EQU将其右边的“数据或汇编符”用左边的符号名称命名,或者说用EQU指令可以给符号名称赋值。符号名称必须先赋值后使用,符号名称被赋值后,在程序中可以作为一个8位或16位的数据、地址或汇编符使用。EQU伪指令要放在源程序的前面。,例如:Addr EQU 01FAHSamp EQU 37HRG1 EQU R5ORG 0000HJMP MAINMAIN:MOV DPTR,#Addr;DPTR=01FAHMOV A,#Samp;A=37HMOV RG1,#59H;RG1=
45、R5=59HMOV A,RG1;A=59HEND上述程序段中,Addr EQU 01FAH将数据01FAH赋予字符名称Addr;RG1 EQU R5 将工作寄存器R5赋予字符名称RG1。,四、DATA指令功能:将一个8位或16位的数据或地址单元赋予一个符号名称格式:符号DATA表达式数据/地址赋值伪指令DATA的功能与EQU类似,是将其右边“表达式”的值赋给左边的符号名称。“表达式”可以是一个8位或16位的数据或地址,也可以是已定义的符号名称,但不可以是一个汇编符号(如Rn等)。DATA伪指令定义的字符名称,不必先定义后使用。DATA伪指令可以用在源程序的开头或末尾。例如:InitData D
46、ATA 29H;表示用InitData代表29H,五、DB指令功能:从指定的地址单元开始,依次存放若干个8位格式的(字节)数据。格式:标号:DB8位数据表达式例如:ORG 0200HTAB:DB 14,25H,MY,3以上指令经汇编后,将对0200H开始的若干内存单元进行如下赋值:(0200H)=0EH,(0201H)=25H,(0202H)=4dH(M的ASCII码),(0203H)=59H(Y的ASCII码),(0204H)=33H(2的ASCII码)。,六、DW指令功能:从指定的地址单元开始,依次存放若干个16位格式的数据(字数据)。16位数据的高8位存入低地址,低8位存入高地址;不足1
47、6位的数据高位用0填充。格式:标号:DW16位数据表达式,7.3.2 MCS-51汇编语言程序的基本结构,MCS-51汇编程序基本结构与8086汇编程序相似,常用的结构有:顺序结构、分支结构、循环结构、子程序和中断服务程序。一、顺序结构顺序结构程序是一种最简单、最基本的程序。它是一种无分支的直线形程序,按照程序编写的顺序依次执行。,【例7.5】编写程序实现将片内RAM的70H、71H地址中的内容相加后,结果送片内RAM的72H地址和进位C中。SUM1:CLR CMOV R1,#70HMOV A,R1INC R1ADD A,R1INC R1MOV R1,ARETEND,二、分支程序设计分支程序的
48、特点是改变程序的执行顺序,跳过一些指令,去执行另外一些指令。每一个分支都要单独编写一段程序,每一分支的开始地址应该赋给一个确定的标号。在MCS-51系列单片机中可以直接用来判断分支条件的指令并不多,只有累加器为零(或不为零)、比较条件转移指令CJNE等,MCS-51单片机还提供了位条件转移指令,如JC,JB等。把这些指令结合在一起使用,就可以完成各种各样的条件判断。,【例7.6】AT89C51内部RAM的63H和64H单元中各有一无符号数,比较其大小,将大数存放于内部RAM的70H单元,小数存放于内部RAM的71H单元,如两数相等,则分别送往这2个单元。MOV A,63HMOV 71H,64H
49、CJNE A,64H,LOOP;(63H)!=(64H)LOOPAJMP LARGE;(63H)=(64H)LOOP:JNC LARGE;(63H)(64H)XCH A,71H;(63H)(64H)LARGE:MOV 70H,A SJMP$END,三、循环程序设计循环程序一般由4部分组成。1置循环初值。即设置循环过程中有关工作单元的初始值,如置循环次数、地址指针及工作单元清零等。2循环体。即循环的工作部分,完成主要的计算或操作任务,是重复执行的程序段。3循环修改。每循环一次,就要修改循环次数、数据及地址指针等。4循环控制。根据循环结束条件,判断是否结束循环。如果在循环程序的循环体中不再包含循环
50、程序,即为单重循环程序。如果在循环体中还包含有循环程序,那么这种现象就称为循环嵌套,这样的程序就称为二重循环程序或三重以至多重循环程序。在多重循环程序中,只允许外重循环嵌套内重循环程序,而不允许循环体互相交叉,也不允许从循环程序的外部跳入循环程序的内部。,【例7.7】将首地址为 0100H开始的连续100个外部 RAM 单元清零。START:MOV R0,#64H;设置计数器初值MOV DPTR,#0100H;设置地址指针初值CLR A;累加器 A 清零LOOP:MOVX DPTR,A;清外部 RAM 单元INC DPTR;修改地址指针DJNZ R0,LOOP;循环控制SJMP,四、子程序设计