《单片机的指令系统课件.ppt》由会员分享,可在线阅读,更多相关《单片机的指令系统课件.ppt(105页珍藏版)》请在三一办公上搜索。
1、1,指令概述 寻址方式 数据传送类指令 算术运算类指令 逻辑操作类指令 控制转移类指令 位操作指令,第3章 80C51的指令系统,本章内容,2,3.1指令系统简介,1)指令概述 一台微机所具有的所有指令的集合,就构成了指令系统。指令系统越丰富,说明CPU的功能越强。,2)机器指令 一台微机能执行什么样的操作,是在微机设计时确定的。一条指令对应着一种基本操作。由于计算机只能识别二进制数,所以指令也必须用二进制形式来表示,称为指令的机器码或机器指令。MCS-51单片机指令系统共有33种功能,42种助记符,111条指令。,3,1、二进制的表示形式:(以“累加器的内容+08H”为例)00100100B
2、 操作码 OP(加法)00001000B 操作数DATA(08H)特点:能被CPU直接识别、运行的形式。也称机器码、汇编语言的目标代码。缺点:不便于阅读、记忆和调试修改。,3)指令表示,4,2、十六进制表示方式:它是对二进制形式的一种简化。00100100B 24H 00001000B 08H,二进制表示的形式 十六进制表示的形式,在实验室等少数环境下,可以将这种形式作为输入程序的一种辅助手段。但是,这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的“机器码”后存入程序存储器并运行。,5,3、指令的“助记符”方式(也称“汇编格式”):00100100B 24H 00001000B 08
3、H ADD A,#08H,二进制表示形式 十六进制表示 汇编格式,返回,1)这是一种由英文单词或字母、数字来表征指令功能的形式。是一种便于阅读、书写和交流的表示形式。2)“汇编”格式的指令必须“翻译”为二进制形式“机器码”后才能为CPU所识别和执行。3)三种不同的表示方法适用于不同的场合。,6,指令格式:既指令的结构形式。,操作码,操作数或操作数地址,由操作码和操作数(或操作数地址)构成指令的结构。,举例:MOV A,#0FFH ADD A,R0,返回,4)指令格式,7,采用助记符表示的汇编语言指令格式如下:,标号是程序员根据编程需要给指令设定的符号地址,可有可无;标号由18个字符组成,第一个
4、字符必须是英文字,不能是数字或其它符号;标号后必须用冒号。,4)指令格式,8,操作码表示指令的操作种类,如MOV表示数据传送操作,ADD表示加法操作等。操作数或操作数地址表示参加运算的数据或数据的有效地址。操作数一般有以下几种形式:没有操作数项,操作数隐含在操作码中,如RET指令;只有一个操作数,如CPL A指令;有两个操作数,如MOV A,#00H指令,操作数之间以逗号相隔;有三个操作数,如CJNE A,#00H,NEXT指令,操作数之间也以逗号相隔。注释是对指令的解释说明,用以提高程序的可读性;注释前必须加分号。,4)指令格式,9,在MCS-51单片机的指令系统中,因指令操作码和操作数的不
5、同,指令(在存储器中)长度也各不相同。分为单字节、双字节和三字节。单字节指令(49条):分无操作数、有操作数两种。无操作数:如 INC DPTR 10100011B INC A 00000100B【特点】:操作数隐含在操作码中。含有操作数寄存器名称的单字节指令:如:MOV A,R0 11101000B MOV A,R1 11101001B【特点】:寄存器名以三位数代码的形式在指令的后三位。,5)指令长度与执行时间,5)指令长度与执行时间,10,双字节指令(46条):指令的操作码和操作数各占一个字节。如:MOV A,#data 01110100B data 很明显:8位的操作数本身占据一个字节。
6、,n,n+1,MOV A,#data,双字节指令在程序存储器的存放示意图,5)指令长度与执行时间,11,三字节指令(16条):指令中的操作数为双字节。如:MOV DPTR,#data16 1001000B,data15-8,data7-0 或者:指令中分别包含1个字节的操作数和1个字节的操作数地址。如:MOV direct,#data 举例:MOV 20H,#0FFH,MOV DPTR,#data16,MOV direct,#data,三字节指令在存储器中存放的方式示意图,5)指令长度与执行时间,12,指令的字节多是否意味着指令周期就长?,从表中可见,指令的字节数与指令周期不是对等的关系,返回
7、,5)指令长度与执行时间,5)指令长度与执行时间,13,6)符号说明,参见P51说明,14,3.2 寻址方式,找到参与运算的数据或数据所在的地址的方式,称为寻址方式。寻址方式主要是指源操作数的寻址。,15,目的地,#XXH,操作数,MOV P1,#55H,MOV A,#01H,#55H,目的地,信,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,1)立即数寻址,16,MOVP1,#55H;将立即数55H送P1口 MOV20H,#55;将立即数55H送20H 单元 MOVA,#0F0H;将立即数0F0H送累加器A MOVR4,#0FH;将立即数0FH送寄存器R4中
8、MOVR0,#20H;将立即数20H送寄存器R0口AND A,#0FH;A的内容与立即数0FH与操作OR A,#0F0H;A的内容与立即数0F0H或操作MOVA,#01H;将立即数01H送累加器A中MOV A,#55H;将立即数55H送累加器A中,注意:1)#;2)不能作为目的;3)注意#0F0H的意义,17,MOV A,3AH 直接寻址是指把存放操作数的内存单元的地址直接写在指令中。在MCS-51单片机中,可以直接寻址的存储器主要有内部RAM区和特殊功能寄存器SFR区。(参见P37),2)直接寻址,18,3)寄存器寻址,MOV R1,A寄存器寻址是指将操作数存放于寄存器中,寄存器包括工作寄存
9、器R0R7、累加器A、通用寄存器B、地址寄存器DPTR等。例如,指令MOV R1,A的操作是把累加器A中的数据传送到寄存器R1中,其操作数存放在累加器A中,所以寻址方式为寄存器寻址。,19,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,设R0=3AH,内部RAM 3AH中的值是65H,则指令MOV A,R0的执行结果是累加器A的值为65H。,目的地,寄存器,操作数,3AH,内部RAM,3AH,65H,3AH,R0R1DPTR,目的地,2号,信在2号箱子里,1号,注意:1)间接寻址的标志2)R0,R1,DPTR,4)寄存器间接寻址,20,寻址比较,MOV P1,R
10、0,MOV P1,R0,MOV P1,20H,MOV P1,#20H,MOV P1,R0,21,MOV P1,R0,MOV P1,R0,MOV P1,20H,MOV P1,#20H,MOV P1,R0,22,MOV P1,R0,MOV P1,R0,MOV P1,20H,MOV P1,#20H,MOV P1,20H,23,MOV P1,R0,MOV P1,R0,MOV P1,20H,MOV P1,#20H,MOV P1,#20H,24,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,MOVC A,A+DPTRMOVC A,A+PCJMP A+DPTR,目的地,寄存器
11、,操作数,内部RAM,3AH,65H,3AH,基址寄存器12H,变址寄存器34H,内部RAM,46H,65H,A,DPTRPC,46H,5)变址寻址,25,26,目的地,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,XXH,位寻址,操作数,ORG 2000HSJMP 54HSJMP 2056H出现的格式!,PC,+,54H,PC,2002H,2002H=2056H,PC,2056H,6)相对寻址,27,设指令SJMP 54H的机器码80H 54H存放在2000H处,当执行到该指令时,先从2000H和2001H单元取出指令,PC自动变为2002H;再把PC的内容与操作数5
12、4H相加,形成目标地址2056H,再送回PC,使得程序跳转到2056H单元继续执行。,28,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,1,0 0 0 0 0 0 0 0,想一想:如果想使27H单元的第3位置1,该怎么办呢?,7)位寻址,29,位寻址地址表,例:SETB 3DH,3D,3C,3B,3F,3E,3A,39,38,27H,30,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,SETB 3DH,0 0 0 0 0 0 0,1,0,位地址的表示方式:?,31,3.3 数据传送指令,按功能,MCS-51 指令系统可分为下列
13、5 类:数据传送指令(29条)算术运算指令(24条)逻辑运算指令(24条)控制转移指令(17条)位操作指令(17条),32,数据传送类指令共29条,它是指令系统中最活跃、使用最多的一类指令。一般的操作是把源操作数传送到目的操作数,即指令执行后目的操作数改为源操作数,而源操作数保持不变。若要求在进行数据传送时,不丢失目的操作数,则可以用交换型传送指令。,指令通式:MOV,目的地址 源地址,数 据,20H,A,33,数据传送类指令不影响进位标志CY、半进位标志AC和溢出标志OV,但当传送或交换数据后影响累加器A的值时,奇偶标志P的值则按A的值重新设定。按数据传送类指令的操作方式,又可把传送类指令分
14、为3种类型:数据传送、数据交换和堆栈操作,并使用8种助记符:MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH及POP。,34,1.数据传送到累加器A的指令 MOV A,Rn MOV A,direct MOV A,Ri MOV A,data 这组指令的功能是:把源操作数的内容送入累加器A。例如:MOV A,10H,该指令执行时将立即数 10H送入累加器A中。,3.3.1 内部RAM传送指令,35,例3.3.1 已知(A)=20H,(R0)=50H,内部RAM中(40H)=30H,(50H)=10H,指出下列指令执行后相应单元内容的变化情况。MOV A,#40H MOV A,40H
15、 MOV A,R0 MOV A,R0,36,2.数据传送到工作寄存器Rn的指令 MOV Rn,A MOV Rn,direct MOV Rn,data 这组指令的功能是:把源操作数的内容送入当前工作寄存器区的R0R7中的某一个寄存器。指令中Rn在内部数据存储器中的地址由当前的工作寄存器区选择位RS1、RS0 确定,可以是 00H07H、08H0FH、10H17H、18H1FH。例如:MOV R0,A,若当前RS1、RS0 设置为 00(即工作寄存器 0 区),执行该指令时,将累加器A中的数据传送至工作寄存器R0(内部RAM 00H)单元中。,37,3.数据传送到内部RAM单元(直接地址)MOV
16、direct,A MOV direct,Rn MOV direct,direct MOV direct,Ri MOV direct,data4.数据传送到内部RAM单元(间接地址)MOV Ri,A MOV Ri,direct MOV Ri,data,38,5.16位数传送指令,MCS-51指令系统中唯一的一条16位数据传送类指令。MOV DPTR,#data16 DPTR是单片机内部SFR中的两个寄存器DPH、DPL组合而成。其中DPH为高八位,DPL为低八位。DPTR是一个专门用于访问外部存储器的间址寄存器。寻址能力为 64K(065535)。,39,例3.3.2 已知(R0)=50H,(R
17、1)=66H,(R6)=30H内部RAM中(50H)=60H,(66H)=45H,(70H)=40H指出下列指令执行后相应单元内容的变化情况。MOV A,R6 MOV R7,70H MOV 70H,50H MOV 40H,R0 MOV R1,#88H,40,实现外部RAM和累加器A之间的数据传送。只有寄存器间接寻址的指令。MOVX A,Ri 使用Ri寄存器间址寻址范围0255h MOVX Ri,A 在硬件电路中P0口输出8位地址数据。MOVX A,DPTR 使用DPTR间址,寻址范围065535hMOVX DPTR,A 在硬件电路中,使用P0口输出低8位,P2口输出高8位外部RAM地址。,3.
18、3.2 外部RAM传送指令,41,外部RAM的字节传送指令举例,已知外部RAM的88H单元有一个数x,试编程将x送外部RAM的1818H单元。【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次 MOVX 指令完成此操作。ORG 2000HMOV R0,#88H;为8位指针赋值MOV DPTR,#1818H;为16位指针赋值MOVX A,R0;取 x 到累加器AMOVX DPTR,A;x 送RAM的1818h单元SJMP$;停机END,返回,42,3.3.3 数据交换指令,为提供一种方便的累加器和寄存器或RAM之间的数据交换。避免了使用一般MOV传送指令完成交换时的不便。格式:XCH
19、A,Rn;A Rn XCH A,direct;A(direct)XCH A,Ri;A(Ri)XCHD A,Ri;A30(Ri)30 SWAP A;A30 A47,43,数据交换指令举例,已知,片外RAM 20h单元、内部RAM 20h单元分别有数x和y,试编程互将两数相交换。MOV R1,#20h;指针赋初值MOVX A,R1;xaXCH A,R1;交换 a(20h),ya MOVX R1,A;y(20h)片外RAM,(y)x,20h,20h,累加器A,1,2,3,44,3.3.4 ROM的字节传送指令(查表指令),这类指令有两条,都属于变址寻址指令。MOVC A,A+DPTR;A(A+DPT
20、R)MOVC A,A+PC;PC PC+1,A(A+PC)该指令也称为“查表”指令。在ROM中建立一个数据表,可以使用DPTR、PC作为数据表格的基地址。在第一条指令中:用DPTR作为基地址。使用前,先将数据表的首地址送入DPTR中,累加器A作为偏移量。由两者数据相加得到待查的表中数据地址并取出。(远程查表指令)第二条指令是以程序计数器PC为基地址。由于PC的内容与该指令在ROM中的位置有关,所以一旦该指令在程序中的位置确定,其PC的值也就确定。(近程查表指令)(P62),45,ROM的字节传送指令举例,已知累加器A中存有09范围内的数,试用查表指令编写出查找出该数平方的程序。采用DPTR作基
21、址寄存器:设平方表的首地址为2000h,累加器A中的内容恰好是查表的偏移量。首先将表的起始地址2000h送入DPTR中。MOV DPTR,#2000H;指针赋值 MOVC A,A+DPTR;平方值送A,2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001h,46,3.3.5 堆栈操作指令,堆栈操作是一种特殊的数据传送指令。堆栈:一个用来保存程序断点、数据的特殊的存储区域。在MCS-51单片机中,栈区是占用片内RAM的存储空间,具体栈位置由指针SP来确定(系统上电时,SP=07H)。(1)进栈操作:PUSH direct;SP+1S
22、P,(direct)(SP)(2)出栈操作:POP direct;(SP)(direct),SP-1SP【注意】:寻址方式为直接寻址,所以 PUSH A 是错误的,应当是PUSH ACC或PUSH 0E0H,同理:PUSH R0也是错误的。进栈是堆栈向上“生长”的过程,即SP+1;出栈则相反。系统上电时,SP=07h。SP的值可以根据需要进行修改,以适应具体编程的需要。在确定栈区位置时要考虑对数据区的影响,以避免数据区与栈区冲突。,47,堆栈操作指令举例(一),下面是一个BCD码转换为二进制的子程序BCDB中有关堆栈操作的例子。在这里,进栈操作是为了保护主程序中相关寄存器中的数据,因为子程序要
23、使用这些寄存器。org 0800hbcdb:push PSWpush ACCpush B:pop Bpop ACCpop PSWRET,SP,48,堆栈操作指令举例(二),堆栈操作指令除了可以在子程序的设计中,对主程序的数据进行保护。还可以根据堆栈操作的特点完成一些特殊的操作。【举例】:设片内RAM的30h单元存有x,40h单元存有y。试将两个单元内容互换。push 30hpush 40hpop 30hpop 40h,SP=07h,40h,30h,49,内部RAM前128字节,SFR之间可以相互传送,但最多只允许1个操作数使用寄存器间接寻址。MOV R0,R1 是错误的。访问SFR必须使用直接
24、寻址,不能采用寄存器间接寻址。MOV A,P0 或 MOV A,80H 正确 MOV R0,#80H 和 MOV A,R0 错误8051没有提供B寄存器的寻址方式(乘法除法除外)。MOV A,B 直接寻址注意 A 和 ACC 的区别:MOV 3FH,A;寄存器寻址(2字节指令)MOV 3FH,ACC;直接寻址(3字节指令),8051数据传送指令的几点说明:,50,3.4 算术运算指令,不带进位的加法指令(ADD)1、加法指令:带进位的加法指令(ADC)加1指令(INC)2、减法指令:带进位的减法指令(SUBB)减1指令(DEC)3、十进制调整指令:(DA A)4、乘法和除法指令:(MUL AB
25、;DIV AB),51,3.4.1 加法指令,1、不带进位的加法指令格式:ADD A,Rn;A+RnAADD A,direct;A+(direct)AADD A,Ri;A+(Ri)AADD A,#data;A+dataA【注意】:1,参加运算的数据都应当是8位的,结果也是8位并影响PSW。2,根据编程者的需要,8位数据可以是无符号数(0255),也可以是有符号数(-128+127)。3,不论编程者使用的数据是有符号数还是无符号数,CPU都将它们视为有符号数(补码)进行运算并影响PSW。,52,不带进位的加法指令举例(一),试分析执行下列指令后累加器A和PSW中各标志的变化。MOV A,#19H
26、 Cy=0;ADD A,#66H AC=0 OV=C7C6=0 25 A=0 0 0 1 1 0 0 1 B P=1+102 data=0 1 1 0 0 1 1 0 B 127 0 0 1 1 1 1 1 1 1 B 1,若两数都是无符号数,则因Cy=0无进位,25+102=127。2,若两个数是有符号数,则因OV=0无溢出。,cy,0 0 0 C7 C6 AC,53,不带进位的加法指令举例(二),试分析执行下列指令后累加器A和PSW中各标志的变化。MOV A,#5AH Cy=0;ADD A,#6BH AC=1;OV=C7C6=1 90 A=0 1 0 1 1 0 1 0 B P=0+107
27、 data=0 1 1 0 1 0 1 1 B 197 0 1 1 0 0 0 1 0 1 B C7 C6 AC1,若两数是无符号数,因Cy=0无进位:90+107=1972,若两数是有符号数,因OV=1,故有溢出,两个正数相加后变为负数,很明显结果是不正确的。,54,2、带进位的加法指令格式:ADDC A,Rn;A+Rn+CyA ADDC A,direct;A+(direct)+CyA ADDC A,Ri;A+(Ri)+CyA ADDC A,#data;A+data+CyA【注意】:这里的Cy是指令执行前的Cy;对PSW的影响同ADD指令。,55,3、加1指令格式:INC A;累加器A加一I
28、NC Rn;Rn+1RnINC direct;内存单元数据加一INC Ri;内存单元数据加一INC DPTR;dptr+1dptr【注意】:1,除了第一条对PSW的P有影响外,其余对PSW均无影响。2,由于上面的原因,INC指令不能作为一般的数据算术运算使用,INC主要用于修改数据指针等控制、循环语句中使用。,56,编程举例,已知M1、M2单元中存有两个16位无符号数x1、x2(低位在前)。试写出x1+x2,并将结果放入M1、M1+1单元(低8位在M1单元)。设两数之和不会超过16位(65535)。【解】:MOV R0,#M1;x1指针赋初值MOV R1,#M2;x2指针赋初值MOV A,R0
29、;取x1低8位送AADD A,R1;x1与x2低8位相加MOV R0,A;低8位和送m1单元INC R0INC R1;修改指针MOV A,R0;取x1的高8位送AADDC A,R1;x1与x2的高8位和Cy相加MOV R0,A;结果送M1+1单元,M1,M1+1,M2,M2+1,57,3.4.2 减法指令(带进位的减法指令),在MCS-51单片机的指令系统中,只有:带进位的减法 SUBB 减一 DEC 两种指令。1、减法指令:格式:SUBB A,Rn;A Rn Cy A SUBB A,direct;A(direct)Cy A SUBB A,Ri;A(Ri)Cy A SUBB A,#data;A
30、 data Cy A,58,使用减法指令要注意的问题,在MCS-51的指令系统中没有不带Cy的减法,所以在使用SUBB指令前必须使用一条清除Cy的指令:CLR C。,59,减法指令应用举例,试分析执行下列指令后累加器A和PSW中各标志的变化。CLR CMOV A,#C9HSUBB A,#054H 201 a=1 1 0 0 1 0 0 1 84 data=0 1 0 1 0 1 0 0 117 0 0 1 1 1 0 1 0 1=117 手工计算,60,2、减一指令,格式:DEC A;累加器A减一DEC Rn;Rn-1RnDEC direct;内存单元数据减一DEC Ri;内存单元数据减一【注
31、意】:1,除了第一条对PSW的P有影响外,其余对PSW均无影响。2,由于上面的原因,DEC指令一般不作为数据算术运算使用(因为不能对PSW的OV等位产生影响,它主要用于修改数据指针在控制、循环语句中使用)。,61,3.4.3 十进制调整指令,在CPU进行BCD码运算时,必须在运算后进行十进制调整,这是因为,CPU在运算时,并不知道数据是二进制还是BCD码。格式:DA A;若AC=1或A30 9,则A+06hA;若Cy=1或A74 9,则A+60hA【注意】:1,DA A指令必须紧跟在加法指令之后;2,DA A指令只适用于加法指令的调整。,62,十进制调整指令应用举例(一),1、BCD加法运算:
32、试写出完成85+59的BCD码的加法程序。MOV A,#85HADD A,#59HDA ASJMP$85 a=1 0 0 0 0 1 0 1B+59 dtat=0 1 0 1 1 0 0 1B 144 1 1 0 1 1 1 1 0B 低4位9,所以加06h+0 0 0 0 0 1 1 0B 1 1 1 0 0 1 0 0B 高4位9,所以加60h 0 1 1 0 0 0 0 0B 1 0 1 0 0 0 1 0 0B 结果为144h(1包含在Cy)【注意】:144H是用16进制数来表示十进制,既BCD码。,63,十进制调整指令应用举例(二),2、BCD减法运算:由于DA A 指令只能对BCD
33、码的加法进行调整,所以遇到BCD码的减法时就要将其减法变为加法运算,然后再使用DA A指令进行调整。减法变加法就是使用BCD码的补码运算法则:将被减数-减数变为被减数+减数的补码。减数的补码=BCD码的模-减数 其中BCD码的模为100H=99H+01H=9AH(16进制),64,已知:在M1、M2中分别存有被减数91和减数36。试编程求91-36并将结果存入M3单元。【解】:1,算法:91-36=91+(100-36)=91+(9A-36)2,编程:CLR C;清除CyMOV A,#9AH;BCD码的模100送ASUBB A,M2;计算减数的补码(结果在A中)ADD A,M1;被减数+减数的
34、补码(结果在A中)DA A;十进制调整MOV M3,A;结果送M3单元CLR C;清除进位位(不要Cy),65,3.4.4 乘法和除法指令,这是MCS-51单片机唯一的一类单字节4周期指令,它相当于4条加法指令的运行时间。格式:MUL AB;ab=b,a(b存高8位,a存低8位)DIV AB;ab=ab(a存商,b存余数)【注意】:指令对标志的影响:1,在乘法指令中对PSW的影响有Cy、OV、和P。具体如下:Cy0;P取决于A中“1”的个数;OV表明积的大小。当积超过255(B0)时,OV=1。2,在除法指令中,Cy、P与乘法相同。在执行除法指令时,若B=0时OV=1,表示除数=0除法无意义,
35、其余情况下OV被复位。,66,3.5 逻辑运算指令,功能:对2个8位二进制数进行逻辑与、或、非和异或操作;特点:除了以累加器A为目标寄存器的指令影响PSW的P位外,其余指令对PSW均无影响。1,逻辑与运算指令(ANL)2,逻辑或运算指令(ORL)3,逻辑异或指令(XRL)4,累加器清零和取反指令(CLR&CPL),67,1、逻辑与运算指令,格式:ANL A,Rn;A R n A ANL A,direct;A(direct)A ANL A,Ri;A(Ri)A ANL A,#data;A data A ANL direct,A;(direct)A direct ANL direct,#data;(
36、direct)data direct上面的指令也可以分为两类:1,以累加器A为目标寄存器的逻辑运算指令;2,以内存单元为目标的逻辑运算指令。,68,应用举例(一),已知R0=30H和(30H)=0AAH,试问执行下列指令后累加器A和30H单元中的内容是什么?1,MOV A,#0FFH 2,MOV A,#0FHANL A,R0 ANL A,30H(A=30H,(30H)=0AAH)(A=0AH,(30H)=0AAH)3,MOV A,#0F0H 4,MOV A,#80HANL A,R0 ANL 30H,A(A=0A0H,(30H)=0AAH)(A=80H,(30H)=80H)很明显:ANL操作可以
37、从某个存储单元中取出某几位,而把其它的位清零。,69,2、逻辑或运算指令,格式:ORL A,Rn;A R n A ORL A,direct;A(direct)A OR A,Ri;A(R I)A ORL A,#data;A data A ORL direct,A;(direct)A direct ORL direct,#data;(direct)data direct同与运算一样,上面的指令也可以分为两类:1,以累加器A为目标寄存器的逻辑运算指令;2,以内存单元为目标的逻辑运算指令。,70,应用举例,设累加器A=0AAH,P1口=0FFH。试编程将累加器A中的低四位送P1口的低四位,而P1口的高
38、四位不变。解:MOV R0,A;累加器A中的数据暂存ANL A,#0FH;屏蔽A的高4位ANL P1,#0F0H;屏蔽P1口的低4位ORL P1,A;在P1口组装MOV A,R0;恢复累加器A的数据【小结】:与运算可以“清零”某些位;或运算可以“置位”某些位。,71,3、逻辑异或运算指令,格式:XRL A,Rn;A R n A XRL A,direct;A(direct)A XR A,Ri;A(R I)A XRL A,#data;A data A XRL direct,A;(direct)A direct XRL direct,#data;(direct)data direct特点:按位运算,
39、相同时为0,不同时为1。使用异或可以实现将某个字节的数据或将数据的某几位取反。,72,举例,已知:外部RAM的30H单元中有一个数AAH,现要将其高4位不变,低4位取反,试编程。解1,利用MOVX A,Ri指令:MOV R0,#30H 1 0 1 0 1 0 1 0MOVX A,R0 0 0 0 0 1 1 1 1XRL A,#0FH 1 0 1 0 0 1 0 1MOVX R0,A解2,利用MOVX A,DPTRMOV DPTR,#0030HMOVX A,DPTRXRL A,#0FHMOVX DPTR,A,73,4、累加器清零和取反指令,用传送指令可以实现对累加器A的清零和取反操作,但是它们
40、都是双字节指令。在MCS-51的指令系统中专门设计了单字节、单周期对累加器清零和取反的指令。格式:CLR A;累加器清零CPL A;累加器取反 取反指令可以方便的实现求补操作。举例:已知30H单元中有一个数x,写出对它求补的程序。MOV A,30HCPL AINC AMOV 30H,A,74,A.0,A.7,A.0,A.7,A.0,A.7,A.0,A.7,CY,CY,RL ARR ARLC ARRC A,注意:执行带进位的循环移位指令之前,必须给CY置位或清零。,5、循环移位指令,75,循环指令可以实现数据各位的循环移位、循环检测,也可以对数据乘2、除2操作。MOV A,02H CLR C R
41、LC A;A*2 MOV A,06H CLR C RRC A;A/2,76,3.6 控制转移指令,1、无条件转移指令 2、条件转移指令 3、子程序调用和返回 4、空操作指令,77,3.6.1 无条件转移指令,格式:LJMP addr16;长转移指令,寻址范围65535 AJMP addr11;短转移,寻址范围2K SJMP rel;相对转移,转移范围(+127-128)JMP A+DPTR;间接转移,寻址范围65535,LJMP指令(三字节),AJMP指令(双字节),SJMP指令(双字节),JMP指令(单字节),78,1、长转移指令:(三字节双周期指令),指令执行时,将指令码中的addr16送
42、入PC中,使程序无条件的转向addr16所指向的新地址执行程序。【举例】:已知某单片机的监控程序地址为A080H,试问用什么方法使单片机开机后自动的转向该监控程序?【解】:因为单片机上电时,PC=0000H,所以在0000H单元存放一条 LJMP 0A080H 的指令即可。,ROM,0000H0001H0002H0003H,79,2、短转移指令:,双字节、双周期指令。将AJMP指令中的11位转移地址替换掉原来PC中16位地址中的低11位地址。指令中的11位地址,确定了地址的转移范围在2K以内,所以AJMP也称“页内转移”指令。,A10 a9 a8 操作码 a7 a0,AJMP指令,PC程序计数
43、器,80,MCS-51的ROM系统是以2K为一页来划分程序存储器,这样对于4K的片内ROM存储器可以分为2页;片外64K的ROM可以分为32页。在执行AJMP指令时,PC的高5位决定了ROM中的页地址;而AJMP 指令的低11位地址用来选择页内地址。在一般情况下,AJMP指令应当与目标地址在同一页内。更具体的说:目标地址应当与AJMP指令取出后的PC值(PC=PC+2)在同一页内。否则转移将会出现错误。,81,ROM的64K存储空间的页面(部分)划分表,82,ROM的64K存储空间的页面示意图,:AAA:MOV A,R0 MOV R1,A:AJMP AAA,0100H,07FEH,000001
44、111111 11111110,PC值,000010000000 00000000,PC+2值,000010010000 00000000,AJMP指令中的11位地址,原本AJMP指令要转到本页的 0100H 单元但是由于 PC 的高5位页面地址发生了变化使AJMP指令实际转到下一页 0900H单元。,最后PC值,发生跨页错误,83,AJMP转一指令是用来做页内2K范围的转移,如果使用不当,会发生错误的“跨页”操作。产生跨页的原因是AJMP指令处于每一页的最后两个单元的结果,所以避免这种现象的方法就是不要在每一页的最后两个单元使用AJMP指令。如果目标地址与AJMP地址不再同一页内,建议使用L
45、JMP指令替代AJMP。使用AJMP指令时,11位的绝对地址可以用符号地址取代,正确使用AJMP转移指令,84,3、相对转移SJMP指令,格式:SJMP rel rel 为偏移量(+127-128)rel(偏移量)的计算公式:rel=目标地址 源地址 2(其中:2为SJMP指令的长度)【例1】:如图,要转到0116H时:rel=0116H-0110H-2=04H【例2】:要转到0109H时:rel=0109H-0110H-2=F7H(-9)实际编程时,使用符号地址取代rel以简化计算,在汇编时由汇编程序来计算rel。,PC,PC+2,0109H,0110H,0116H,85,4、间接转移指令(
46、散转指令),格式:JMP A+DPTR 单字节操作码为73H特点:转移地址由累加器A的内容与DPTR相加形成。用途:用来制作一个多分支的转移结构。【举例】:MOV DPTR,#TABLE;指针赋表头地址JMP A,A+DPTR;转移地址由A+DPTR产生TABLE:AJMP ROUT0;多分支转移表AJMP ROUT1AJMP ROUT1AJMP ROUT2:,86,3.6.2 条件转移指令,1、累加器A判零转移指令(双字节指令)JZ rel;若A=0,则PC=PC+2+rel;若A0,则PC=PC+2 JNZ rel;若A0,则PC=PC+2+rel;若A=0,则PC=PC+2,87,2、比
47、较不相等转移指令(3字节)a=data时:PC+3PC,Cy=0CJNE A,#data,rel adata时:PC+3+rel,Cy=0CJNE Rn,#data,rel aY;Cy=1 则 XY。,88,3、减一条件转移指令,1)DJNZ Rn,rel;Rn-1Rn,若Rn0则PC+2+relPC;若Rn=0则PC+2PC2)DJNZ direct,rel;(direct)-1direct,;若(direct)0则PC+3+relPC;若(direct)=0则PC+3PC注意:第一条指令为双字节,第二条指令为三字节。指令本身先做一个带回送的减一运算操作,然后 根据运算的结果是否为零作为转移
48、的条件,例如,有一段程序如下:MOV 23H,#0AH CLR ALOOPX:ADD A,23H DJNZ 23H,LOOPX SJMP$该程序执行后,(A)=10+9+8+7+6+5+4+3+2+1=37H,89,90,应用举例,令片内RAM中DATA为起始地址的数据块中连续10个无符号数相加,并把和送到SUN单元(设其和小于256)。ORG 1000HSTART:MOV R2,#0AH;数据块长度10送计数器R2MOV R0,#DATA;数据块起始地址送指针R0CLR A;累加器清零LOOP:ADD A,R0;累加部分和INC R0DJNZ R2,LOOP;若R2-10则转LOOP继续MO
49、V SUN,A;存累加和SJMP$;停机END这是一个循环结构的程序,DJNZ指令又是决定整个循环是否结束的控制语句。,91,3.6.3 子程序调用和返回指令,(一)子程序调用指令:1)短调用指令 ACALL addr11 2)长调用指令 LCALL addr16(二)返回指令:1)子程序返回 RET 2)中断返回 RETI,92,1、调用指令,1,短调用指令 ACALL addr11 PC+2PCSP+1SP,PC70(SP)SP+1SP,PC158(SP)addr11 PC100 2,长调用指令 LCALL addr16PC+3PCSP+1SP,PC70(SP)SP+1SP,PC158(S
50、P)addr16 PC,子程序的调用包含两部分内容:A)实现转入子程序的入口地址;这主要由调用语句中的addr11或addr16 实现。B)子程序完成后,能够自动的返回;这是由调用语句执行时依靠堆栈操作已经将返回地址压栈保存,带返回时弹出送PC实现的。,93,2、返回指令,格式:RET(子程序返回 操作码:22H)操作:(SP)PC158,SP-1SP(SP)PC 70,SP-1SP格式:RETI(中断子程序返回 操作码:32H)操作:(SP)PC158,SP-1SP(SP)PC 70,SP-1SP RETI与RET的区别在于返回主程序后,RETI还要清除相应的中断优先级状态位,使系统响应低优