1、本章学习目标 : 了解指令及指令系统常识 熟悉指令中常用符号 在理解的基础上牢记7种寻址方式 熟悉各类指令的功能及应用范围 能使用指令完成各种常规任务,第2章 单片机的指令系统,第二章 80C51系列单片机指令系统,2.1指令系统概述,1指令分类一台计算机的CPU所能执行的全部指令的集合称为这个CPU的指令系统。指令系统是开发和生产厂商定义的,如要使用其单片机,用户就必须了解和遵循这些指令标准,要掌握某种(类)单片机,指令系统的学习是必须的。80C51共有111条指令:按照字节分:单字节指令49条,双字节指令45条,三字节指令17条;按照指令执行时间分类:单机器周期指令64条,双机器周期指令4
2、5条,4机器周期指令2条,80C51指令系统还有极为丰富的位操作指令,充分体现了单片机面向控制的特点。,2指令格式 标号: 操作码 操作数1,操作数2,操作数3;注释NEXT: MOV A, R0 ;A(R0) 标号是一个名字,用来标明指令的地址,由16个字符组成 MOV是操作码,它表示指令的性质和功能,此处其功能是将R0中的内容送到累加器A中 A是数据传送的目的地,称为目的操作数 R0是数据的来源,称为源操作数,2.1指令系统概述,3指令系统中常用符号说明,2.1指令系统概述,执行指令需要操作数,寻址方式即指找到操作数的方法;寻址空间即指操作数所在的存储空间。80C51系列单片机合计七种寻址
3、方式,分别为: 立即寻址 寄存器寻址 直接寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址对于双字节指令,两个操作数均有寻址方式。下面要介绍的均是源操作数寻址方式。,2.寻址方式和寻址空间,1立即数寻址在指令中直接给出参与操作的数据,这种寻址方式称为立即数寻址。这一直接给出的数据称为立即数,立即数前要加上“#”符号,例如:MOV A,#0EH ;A0EHMOV DPTR,#2100H ;DPTR2100H,2.寻址方式和寻址空间,2寄存器寻址 参与操作的数据由寄存器给出,这种寻址方式称为寄存器寻址。由于寄存器在CPU的内部,所以采用该寻址方式可以获得较高的运算速度,可用于该寻址方式的寄存器有R
4、0R7、DPTR、A、B。如:MOV A,R1 ;A (R1)该指令将R1内的数据传送到累加器A中,源操作数R1和目的操作数均采用了寄存器寻址。再比如:INC DPTR ;DPTR(DPTR)+1,2.寻址方式和寻址空间,3直接寻址 在指令中直接给出操作数的地址的寻址方式称为直接寻址。 在该寻址方式中,操作数存放在片内数据存储器中,地址长度为8位。 这种寻址方式可以访问:内部数据RAM低128B(该空间还可以采用寄存器间接寻址)和特殊功能寄存器SFR(该空间只能采用直接寻址)。,例如:在片内RAM60H单元存放一个8位二进制数3CH,执行指令MOV A,60H后,结果为(A)=3CH。如图2-
5、1所示。,2.寻址方式和寻址空间,4寄存器间接寻址 在指令中以指定寄存器的内容作为操作数地址的寻址方式称为寄存器间接寻址。 这种方式可用于访问内部RAM和外部数据存储器。 能够用于寄存器间接寻址方式的寄存器有:R0、R1、DPTR和SP。 在间接寻址寄存器前加“”表示间接寻址。 例如:MOV A,R0 ;A(R0),假定R0中的内容为50H,50H单元内容为45H,图2-2给出了寄存器间接寻址方式的执行过程。,2.寻址方式和寻址空间,寄存器间接寻址的寻址范围: (1)片内128B的RAM,用R0,R1作间址寄存器,如MOV A,R0; (2)片外64KB的数据存储器,用DPTR作间址寄存器,如
6、MOVX A,DPTR; (3)堆栈区域,用SP作间址寄存器,如PUSH ACC; (4)片外256B数据存储器,用R0,R1作间址寄存器,如MOVX A,R0;,2.寻址方式和寻址空间,5变址寻址 基址寄存器(DPTR或PC)的内容与变址寄存器(累加器A)的内容相加,其和形成16位地址作为操作数的地址的寻址方式称为变址寻址。 该类寻址方式用于程序存储器的访问,多用于查表程序。例如: MOVC A,A+DPTR ;A (A)+(DPTR)设(A)=12H,(DPTR)=02E3H,(02F5H)=1EH,则结果为(A)=1EH,执行情况见图2-3所示。,变址寻址指令只有3条,另外两条是:MOV
7、C A,A+PCJMP A+DPTR,2.寻址方式和寻址空间,6相对寻址 相对寻址是以程序计数器PC的当前值(是指当前跳转指令的下一条指令的地址)为基准,加上指令中给出的相对偏移量rel以得到程序执行地址的寻址方式。 这种寻址方式的目的是修改PC的值,从而实现程序的转移。转移的目的地址可参见如下表达式:目的地址=转移指令地址+转移指令字节数+rel值得注意的是,偏移量rel有正负之分,其取值范围是-128+127。,2.寻址方式和寻址空间,其中,操作码80H存放在3000H单元中,54H是设定的相对偏移量rel,存放在3001H单元。指令的执行过程如图2-4所示。,例如:有双字节相对转移指令,
8、指令地址 操作码 操作数 指令 注释 3000H 80 54H SJMP rel ;PC (PC)+2+rel,2.寻址方式和寻址空间,7位寻址位寻址是将8位二进制数中的某一位作为操作数,在指令中给出的是位地址,一般用bit表示。例如: CLR P0 ;将P口的第位清零位寻址的范围为:,片内RAM区的HF的个单元中的位,如 MOV C,30H 字节地址能被整除的SFR,如 SETB P1.0,2.寻址方式和寻址空间,表 寻址方式及寻址空间,2.寻址方式和寻址空间,2.3 指令系统,2.3.1数据传送指令(通用传送类),通用传送指令的助记符为MOV(Move),格式如下: MOV , 此类指令的
9、功能是把源操作数指定的数据传送到目的操作数(目的地址)所指定的存储单元中。MOV指令的传送关系如图2-5所示。,图2-5,Mov direct, direct Mov direct, Ri Mov direct, Rn Mov direct, A Mov direct, #data,2.3 指令系统,2.3.1 数据传送指令(通用传送类),例1 设内部RAM中(50H)=40H,(40H)=10H,P1口作输入口,(P1)=0ABH,问程序执行后各存储器中的数据是什么? MOV R0,#50H ;立即数50H送R0中,(R0)=50H MOV A,R0 ;R0间接寻址,将50H单元内容送A,(
10、A)=40H MOV R1,A ;A送R1,(R1)=40H MOV B,R1 ;R1间接寻址,将40H单元内容送B,(B)=10H MOV R1,P1 ;将P1内容送40H单元,(40H)=0ABH MOV P2,P1 ;将P1内容送P2 ,(P2)=0ABH 执行结果: (R0)=50H,(A)=40H,(R1)=40H (B)=10H,(P1)=0ABH,(40H)=0ABH (P2)=0ABH 任何不符合格式要求的“指令”都是不合法的。,2.3 指令系统,2.3.1 数据传送指令(特殊传送类),这类指令用于访问片外RAM或扩展的I/O口。 1读写片外RAM指令MOVX (1)用DPTR
11、进行间接寻址的指令 读: MOVX A, DPTR ; A (DPTR) 写: MOVX DPTR, A ; (DPTR) A (2)用Ri进行间接寻址的指令 读:MOVX A, Ri ; (A)(Ri) 写:MOVX Ri, A ; (Ri) A,2.3 指令系统,2.3.1 数据传送指令(特殊传送类),例2 把片外RAM的36H单元中的数据送到片外RAM的1200H单元。 分析(36H)(1200H) 程序如下: MOV R1,#36H MOVX A ,R1 MOV DPTR,#1200H MOVX DPTR, A 下面的程序可以实现吗? MOV DPTR, #1200H MOV R1,#
12、36H MOV DPTR,R1 注意:片外RAM之间不能直接传送数据,必须经过累加器A,2.3 指令系统,2.3.1 数据传送指令(特殊传送类),2.查表指令MOVC MOVC A,A+DPTR ;A(A)+(DPTR) MOVC A,A+PC ;A(A)+(PC) 这两条指令主要用于查表,可以完成从程序存储器中取得数据并送入累加器A的功能。 (1) 第一条指令以DPTR为基址寄存器,查表时DPTR用于存放表格的起始地址。表格起始地址可以设置在64KB程序存储器中的任何位置。 (2)第二条指令以PC为基址寄存器,因A为8位无符号数,故该指令的查找范围是从PC当前值开始的255个地址单元内。 若
13、(DPTR)=3000H,(A)=60H,执行指令“MOVC A,A+DPTR”后,将程序存储器3060H单元的内容送A。,2.3 指令系统,2.3.1 数据传送指令(特殊传送类),例3 已知累加器A中有一个09范围内的数,请用查表法编程求出该数的平方值。设平方表表头地址为1000H。 方法1以DPTR为基址寄存器 MOV DPTR,#1000H ;表头地址 MOVC A,A+DPTR ;查表求出平方值送A 若原(A)=3,查表后(A)=9。 方法2以PC为基址寄存器 ORG 0FFBH 0FFBH ADD A,#data ;加修正量,此例data=02H 0FFDH MOVC A,A+PC
14、;查表 0FFEH SJMP $ ;暂停 1000H DB 0 1001H DB 1 1002H DB 4 1009H DB 81 END 修正量=表头地址PC当前值=1000H0FFEH=02H 所以data=02H(SJMP指令2字节)。 查表指令和被查表格通常在同一页内(页内地址00H0FFH即0255),2.3 指令系统,2.3.1 数据传送指令(特殊传送类),3.数据交换指令 交换类指令完成的传送是双向的,是两个字节间或两个半字节间的双向交换。 特点是只能与累加器A进行交换。 字节交换 XCH A,Rn ;(A)(Rn) XCH A,direct ;(A)(direct) XCH A
15、,Ri ;(A)(Ri) 功能:字节数据交换,实现3种寻址操作数内容与A中内容的互换。例如:若(R1)=16H,(A)=28H,执行“XCH A,R1”后, (A)=16H,(R1)=28H,2.3 指令系统,2.3.1 数据传送指令(特殊传送类),半字节交换 XCHD A,Ri ;(A30)(Ri)30) SWAP A ;(A30)(A74) 例如:若(R1)=50H,(50H)=74H,(A)=26H, 执行指令“XCHD A,R1”后,(A)=24H,(50)=76H。 再如:若(A)=38H,执行指令“SWAP A”后,(A)=83H。,2.3 指令系统,2.3.1 数据传送指令(特殊
16、传送类),4.堆栈操作指令(PUSH 、POP) 堆栈操作指令只有两条: 入栈指令用于保护片内某个单元的内容, 出栈指令用于恢复片内某个单元的内容。 通常入栈指令和出栈指令是成对出现的。 入栈: PUSH direct ;SPSP+1,(SP) (direct) 出栈: POP direct ;direct (SP),SP (SP)1 入栈操作:首先SP+1,然后写入数据; 出栈操作:首先读出数据,然后SP1。 单片机复位操作后,SP的值被初始化为07H。,2.3 指令系统,2.3.1 数据传送指令(特殊传送类),如图2-6所示,在堆栈的原始状态下执行一条“PUSH ACC”后,堆栈的变化过程
17、如图2-6(b);在堆栈的原始状态下执行一条“POP ACC”后,堆栈的变化过程如图2-6 (c),图2- 6 堆栈存入/取出数据的操作,2.3 指令系统,2.3.1 数据传送指令(特殊传送类),例4 设(60H)=X,(70H)=Y,试用堆栈指令实现60H和70H单元内容的互换。 MOV SP,#50H ;设栈底 PUSH 60H ;51H(60H),X压入51H单元 PUSH 70H ;52H(70H),Y压入52H单元 POP 60H ;60H(52H),Y弹出进入60H单元 POP 70H ;70H(51H),X弹出进入70H单元 想一想 用数据交换指令如何实现60H和70H单元内容的
18、互换?,2.3 指令系统,2.3.2 算术运算指令,算术运算指令可以完成加、减、乘、除四则运算以及加1、减1和二-十进制调整操作。 这类指令多与累加器A有关,A常作为目的操作数,即指令运算结果存放在A中。同时它也能充当源操作数。 这类指令大多影响标志位,因而分析指令运算结果和对标志位的影响是本小节的重点。具体影响见表2-3,2.3 指令系统,2.3.2 算术运算指令,表2-3 算术运算指令对标志位的影响,说明:1 .“”表示对应的指令操作影响该标志位;“0”表示相应的指令操作对该标志位清0;“”表示相应的指令操作不影响该标志。2. 累加器加1(INC A)和减1(DEC A)指令仅影响P标志。
19、,2.3 指令系统,2.3.2 算术运算指令,1.不带CY位的加法指令 格式: ADD A,Rn ;A(A)+(Rn) ADD A,direct ;A(A)+(direct) ADD A,Ri ;A(A)+((Ri)) ADD A,#data ;A(A)+ data 功能: 把源操作数与A中内容相加后再送入A中。 在上述4条指令中,参与运算的操作数都是8位二进制数,且其中一个操作数必须是累加器A。 编程人员可以将参与运算的两个操作数视为无符号数(0255),也可以把它们看作是有符号数。若看作是有符号数,则通常采用补码形式(-128+127)。,2.3.2.1 加法指令,2.3 指令系统,2.3
20、.2 算术运算指令,计算机总是把操作数当作有符号数(补码形式)看待并影响PSW的相关标志位。影响情况如下: 进位/借位标志CY: 两数和的D7位有进位时,(CY)=1,否则,(CY)=0。 半进位/借位标志AC: 两数和的D3位有进位时,(AC)=1,否则,(AC)=0。 溢出标志OV: 两数和的D7,D6位只有一位有进位时,(OV)=1;否则,(OV)=0,即OV=C6C7。 奇偶标志P: 当累加器A中“1”的个数为奇数时,(P)=1;为偶数时(P)=0。,2.3.2.1 加法指令,2.3 指令系统,2.3.2 算术运算指令,例5 试分析80C51单片机执行下述指令后,累加器A和PSW各标志
21、位的变化。 MOV A,#0A5H ADD A,#0CFH 解: (A)=10100101B + Data=11001111B CY 01110100B C7 C6 AC (CY)=C7=1;(AC)=1;溢出标志(OV)=C7C6=10=1,有溢出;(P)=0。执行结果:(A)=74H。 若为无符号数运算, (CY)=1,表示结果超出(0255)范围。若为带符号数运算,因(-49)+(-91)=-140,超出了(-128+127)的范围,所以OV=1溢出。,2.3.2.1 加法指令,2.3 指令系统,2.3.2 算术运算指令,2.带CY位加法指令 带CY位加法指令常用于多字节加法运算,格式如
22、下: ADDC A,Rn ;A(A)+(Rn)+(CY) ADDC A,direct ;A(A)+(direct)+(CY) ADDC A,Ri ;A(A)+((Ri))+(CY) ADDC A,#data ;A(A)+ data +(CY) 功能:把源操作数与A中内容相加后再加上标志位CY的当前值,将和送入A中。 这组指令的操作影响PSW的CY、AC、OV和P标志。 假设当前(CY)=1,(A)=85H,(R0)=97H,执行指令“ADDC A,R0”后,则使(A)=1DH,(CY)=1,(AC)=0,(OV)=1,(P)=0。,2.3.2.1 加法指令,2.3 指令系统,2.3.2 算术运
23、算指令,3.加1指令 格式: INC A ;A(A)+ 1 INC direct ;direct(direct)+ 1 INC Rn ;Rn(Rn)+ 1 INC Ri ;(Ri)((Ri))+ 1 功能: 把源操作数的内容加1,结果再送回原来的单元。 这些指令仅“INC A”影响奇偶标志P,其余指令都不影响标志位的状态。,2.3.2.1 加法指令,2.3 指令系统,2.3.2 算术运算指令,4.十进制调整指令 格式: DA A ;若AC=1或A3A09,则A(A)+06H ;若CY=1或A7A49,则A(A)+60H 功能: 通常跟在BCD码加法运算之后,用来对累加器A中刚刚进行的两个BCD
24、码的相加结果进行十进制调整。,2.3.2.1 加法指令,2.3 指令系统,2.3.2 算术运算指令,1.带CY位减法指令 与加法指令不同,减法运算中只有带CY位的减法指令,其格式如下: SUBB A,Rn ;A(A)-(Rn)-(CY) SUBB A,direct ;A(A)-(direct)-(CY) SUBB A,Ri ;A(A)-((Ri))-(CY) SUBB A,#data ;A(A)- data -(CY) 功能: 把累加器A中内容减去指令指定的单元的内容,再减去标志位CY的值,将结果再送回累加器A中。 SUBB指令对PSW中标志位的影响类似于ADDC加法指令。,2.3.2.2 减
25、法指令,2.3 指令系统,2.3.2 算术运算指令,例7 已知(A)=78H,(CY)=1,问执行完“SUBB A,#0C5H”后A和各标志位的状态。 解:列竖式为: (A)= 01111000B data= 11000101B 1 10110011B 1 减CY 1 10110010B 则(A)=0B2H,(OV)=C7C6=10=1,有溢出,(P)=0,(AC)=0。,2.3.2.2 减法指令,2.3 指令系统,2.3.2 算术运算指令,2减1指令 格式: DEC A ;A(A)- 1 DEC direct ;direct(direct)- 1 DEC Rn ;Rn(Rn)- 1 DEC
26、Ri ;(Ri)((Ri))- 1 DEC DPTR ;DPTR(DPTR)- 1 功能: 把源操作数的内容减1,结果再送回原来的单元。 这组指令仅“DEC A”影响奇偶标志P,其余指令都不影响标志位的状态。,2.3.2.2 减法指令,2.3 指令系统,2.3.2 算术运算指令,格式: MUL AB ;累加器A与B寄存器相乘 功能: 将累加器A与寄存器B中的2个无符号8位二进制数相乘,乘积的低8位留在累加器A中,高8位存放在寄存器B中。 运算结果将对OV、CY、P标志位产生影响: 当乘积大于0FFH,即255(B中内容不为0)时,溢出标志位(OV)=1;否则(OV)=0; 标志位CY总是被清0
27、; P的状态由A中的内容决定。 例如:(A)=36H,(B)=03H,执行指令“MUL AB”之后,(A)=0A2H,(B)=00H,(CY)=0,(OV)=0,(P)=1。,2.3.2.3 乘法指令,2.3 指令系统,2.3.2 算术运算指令,格式: DIV AB ;累加器A除以寄存器B 功能:累加器A中的位无符号数除以寄存器B中的位无符号数,所得的商存在A中,余数存在B中。 对标志位的影响: 对CY和P标志位的影响与乘法相同; 当除数为0时,除法没有意义,(OV)=1,否则(OV)=0。 例如:(A)=0FBH(十进制是251),(B)=12H(十进制是18),执行指令“DIV AB”之后
28、,(A)=0DH,(B)=11H,(OV)=0,(CY)=0。,2.3.2.4 除法指令,2.3 指令系统,2.3.3 逻辑运算与循环指令,逻辑运算指令可以完成与、或、异或、取反、清0操作; 循环指令是对累加器A进行循环移位操作,包括向左、向右以及带CY位的移位操作。,2.3 指令系统,2.3.3 逻辑运算与循环指令,格式1: ANL direct,A ;direct(direct)A ANL direct,#data ;direct(direct)data 功能:源操作数与直接地址指示的单元内容相与,结果送入直接地址指示的单元。 格式2: ANL A, #data ;A(A)data ANL
29、 A, direct ;A(A)(direct) ANL A, Rn ;A(A)(Rn) ANL A, Ri ;A(A)(Ri) 功能: 源操作数与A相与,结果送入A中。 例如:(A)=8CH,(R1)=0ABH,执行指令“ANL A,R1”后,(A)=88H,(R1)=0ABH。,2.3.3.1 逻辑“与运算”指令,2.3 指令系统,2.3.3 逻辑运算与循环指令,格式1: ORL direct,A ;direct(direct)A ORL direct,#data ;direct(direct)data 功能:源操作数与直接地址指示的单元内容相或,结果送入直接地址指示的单元。 格式2: O
30、RL A,#data ;A(A)data ORL A,direct ;A(A)(direct) ORL A,Rn ;A(A)(Rn) ORL A,Ri ;A(A)(Ri) 功能: 源操作数与A相或,结果送入A中。 例如:(A)=0C5H,(R2)=67H,执行指令“ORL A,R2”后,(A)=0E7H。,2.3.3.2 逻辑“或运算”指令,2.3 指令系统,2.3.3 逻辑运算与循环指令,格式1: XRL direct,A ;direct(direct)A XRL direct,#data ;direct(direct)data 功能: 源操作数与直接地址指示的单元内容相异或,结果送入直接地
31、址指示的单元。 格式2: XRL A,#data ;A(A)data XRL A,direct ;A(A)(direct) XRL A,Rn ;A(A)(Rn) XRL A,Ri ;A(A)(Ri) 功能:源操作数与A相异或,结果送入A中。,2.3.3.3 逻辑“异或运算”指令,2.3 指令系统,2.3.3 逻辑运算与循环指令,格式: CLR A ;A 0 CPL A ;A 功能: 分别对A中内容清0和取反,结果仍存入A中。 例如:(A)=7FH,执行指令“CLR A”和“CPL A”后,A中内容分别为00H和80H。,2.3.3.4 累加器清零和取反指令,2.3 指令系统,2.3.3 逻辑运
32、算与循环指令,逻辑运算指令除了可以进行逻辑运算外,还能完成一些特殊的操作。例如: 1清0 “CLR A”只能对A清0,若要对某一单元如60H单元清0可以有以下几种方法: 方法1 MOV 60H,#00H 方法2 MOV A,60H XRL A,A MOV 60H,A 方法3 ANL 60H,#00H,2.3.3.5 逻辑运算指令的典型应用,2.3 指令系统,2.3.3 逻辑运算与循环指令,2.屏蔽 将某一存储单元的某几位清0,其它位保持不变,称为屏蔽。被屏蔽的位,原来的数值将被取消,被0取代。屏蔽通常用ANL操作实现。 例8 编程实现将P1口低4位的值存入30H单元,屏蔽高4位。 MOV A,
33、P1 ANL A,#0FH MOV 30H,A 3.置1 将某一存储单元的某几位变为高电平1,其它位保持不变。通常用ORL操作实现。,2.3.3.5 逻辑运算指令的典型应用,2.3 指令系统,2.3.3 逻辑运算与循环指令,例9 编程实现将P1口低4位的值保持不变,而高4位置1。结果存入30H单元。 MOV A,P1 ORL A,#0F0H MOV 30H,A 4.求反 CPL A只能对A的所有位取反,如果需要对某一寄存器的某些位取反,则通常是利用异或指令来实现。 例10 编程实现将P1口的高4位取反,而低4位保持不变,结果存入40H单元。 MOV A,P1 XRL A,#0F0H MOV 4
34、0H,A,2.3.3.5 逻辑运算指令的典型应用,2.3 指令系统,2.3.3 逻辑运算与循环指令,2.3.3.6 累加器循环移位指令,格式:RL A ;累加器左环移RLC A ;带CY的累加器左环移RR A ;累加器右环移RRC A ;带CY的累加器右环移 每条指令的操作过程如图2-7 所示。,图2-7 移位操作示意图,2.3 指令系统,2.3.3 逻辑运算与循环指令,累加器每左移一位相当于乘以2。同理,累加器右移一位相当于除以2,大家可以自己验证。 例11 已知(A)=0ACH=10101100B,(CY)=0,问执行以下程序后(A)=?,(CY)=?。 RL A ;左移A01011001
35、B RRC A ;带CY右移A00101100B,CY=1 则(A)=2CH,(CY)=1 说明: 1.所有对A操作的指令都对标志位P有影响。 2.逻辑运算指令不影响CY、OV、AC。 3“RLC A”和“RRC A”指令对CY和A都有影响。,2.3.3.6 累加器循环移位指令,2.3 指令系统,2.3.4 控制转移指令,程序的顺序执行是由PC自动加1实现的,要改变程序的执行顺序,实现分支转向,应通过强迫改变PC值的方法来实现,这就是控制转移类指令的基本功能。 80C51的控制转移指令有无条件转移、条件转移及子程序调用与返回等。,2.3 指令系统,2.3.4 控制转移指令,不规定条件的程序转移
36、称之为无条件转移。这类指令共4条: 1.长转移 LJMP addr16 ;PCaddr16 这是一条3字节指令,指令执行后能把16位地址(addr16)送PC,从而实现程序转移。因转移范围大,可达64KB,因此称之为“长转移”。 例如“LJMP 2600H”就表示程序要转移到2600H单元去。 在修改或调试程序时,常常要插入或删除部分指令或对当前指令所处的位置进行调整,因此,在实际编写程序时通常采用符号地址。如“LJMP NEXT”。,2.3.4.1 无条件转移指令,2.3 指令系统,2.3.4 控制转移指令,2.短转移 AJMP addr11;PC(PC)+2, PC100addr11 这是
37、一条2字节指令,指令执行时,先将PC的内容加2(这时PC指向的是AJMP的下一条指令),然后把指令中的11位地址码传送到PC100,保持PC1511原来的内容不变。 由于转移的地址是11位(211=2K),故AJMP指令的转移范围是包含AJMP下一条指令在内的2K空间。 与LJMP指令类似,AJMP指令后面最好也用符号地址,但必须保证该符号所处的地址在2KB的寻址范围内。,2.3.4.1 无条件转移指令,2.3 指令系统,2.3.4 控制转移指令,3.相对转移 SJMP rel ;PC(PC)+2,PC(PC)+rel 这是一条2字节指令,其功能是先计算目的地址,并按计算得到的目的地址实现程序
38、的相对转移。计算公式为: 目的地址=(PC)+2+rel 其中rel为相对偏移量,它本身是一个带符号的8位二进制数的补码形式,取值范围为-128+127(00H7FH对应0+127,80HFFH对应表示-128-1)。因此所能实现的转移是双向的: 如果rel为正数表示正向转移;如果rel为负数则表示反向转移。 例如: LOOP: MOV R1,60H SJMP NEXT ;rel0 NEXT: MOV A,#30H SJMP LOOP ;rel0 ,2.3.4.1 无条件转移指令,2.3 指令系统,2.3.4 控制转移指令,4.散转移 JMP A+DPTR ; PC(A)+(DPTR) 这是一
39、条1字节转移指令,指令的目的地址由A的内容和DPTR内容之和来确定,即目的地址=(A)+(DPTR)。 例如:有一段程序如下: MOV DPTR,#TABLE JMP A+DPTR TABLE:AJMP NEXT0 AJMP NEXT1 AJMP NEXT2 AJMP NEXT3 当(A)=00H时,程序将转到NEXT0处执行;当(A)=02H时,程序将转到NEXT1处执行;其余类推。,2.3.4.1 无条件转移指令,2.3 指令系统,2.3.4 控制转移指令,条件转移就是说程序的转移是有条件的。执行条件转移指令时,如果指令中规定的条件满足,则进行程序转移,否则程序顺序执行。条件转移有如下形式
40、: 1. 累加器判0转移 JZ rel ;若(A) =0,则PC(PC+2)+rel JNZ rel ;若(A)0,则PC(PC+2)+rel 功能: 对累加器A的内容是否为0进行判断并转移。如图2-9所示。,2.3.4.2 条件转移指令,2.3 指令系统,2.3.4 控制转移指令,指令中目标地址的计算与SJMP指令相同,且最好以地址符号形式出现,指令执行时对标志位无影响。 例如:若累加器的原始内容为00H,则: JNZ LOOP1 ;由于(A)=0,所以程序往下执行 INC A ;(A)=1 JNZ LOOP2 ;由于(A)0,所以程序转向LOOP2处执行,2.3.4.2 条件转移指令,图2
41、-9 累加器判0转移流程图,2.3 指令系统,2.3.4 控制转移指令,2.数值比较转移 数值比较转移指令把两个操作数进行比较,比较结果作为条件来控制程序是否转移。共有4种形式: CJNE A,direct,rel ;若(A)(direct),则PC(PC)+3+rel CJNE A,#data,rel ;若(A)data,则PC(PC)+3+rel CJNE Rn,#data,rel ;若(Rn)data,则PC(PC)+3+rel CJNE Ri,#data,rel ;若((Ri))data,则PC(PC)+3+rel 数值比较指令是3字节指令,这是80C51指令系统中仅有的4条3个操作数
42、的指令,在程序设计中非常有用。,2.3.4.2 条件转移指令,2.3 指令系统,2.3.4 控制转移指令,(1)指令功能程序转移 若左操作数=右操作数,则 程序顺序执行 PC(PC)+3 进位标志清0 CY0 若左操作数右操作数,则 程序转移 PC(PC)+3+rel 进位标志清0 CY0 若左操作数右操作数,则 程序转移 PC(PC)+3+rel 进位标志置1 CY1,2.3.4.2 条件转移指令,2.3 指令系统,2.3.4 控制转移指令,(2)指令应用数值比较 在80C51中没有专门的数值比较指令,两个数的数值比较可以利用这4条指令来实现,如: 程序顺序执行,则 左操作数=右操作数 程序
43、转移且(CY)=0,则 左操作数右操作数 程序转移且(CY)=1,则 左操作数右操作数 例如:若(R5)=68H,执行指令“CJNE R5,#60H,L1”后,程序将转移到标号L1处。,2.3.4.2 条件转移指令,2.3 指令系统,2.3.4 控制转移指令,3.减1不为0转移 这是一组把减1与条件转移两种功能结合在一起的指令,共2条: (1)寄存器减1不为0转移 DJNZ Rn,rel 这是一条2字节指令,非常有用。其功能如下: 寄存器内容先减1,如所得结果为0,则程序顺序执行;如减1结果不为0,则程序转移。具体表示如下: Rn(Rn)-1 ;若(Rn)0,则PC(PC)+2+rel ;若(
44、Rn)=0,则PC(PC)+2,2.3.4.2 条件转移指令,2.3 指令系统,2.3.4 控制转移指令,(2)直接寻址单元减1条件转移 DJNZ direct,rel 这是一条3字节指令,其功能为: 直接寻址单元内容减1,如所得结果为0,则程序顺序执行;如减1结果不为0,则程序转移。具体表示如下: Direct(Direct)-1 ;若(Direct)0,则PC(PC)+3+rel ;若(Direct)=0,则PC(PC)+3 这两条指令主要用于控制程序循环。如预先把寄存器或内部RAM单元赋值循环次数,利用减1条件转移指令,以减1后结果是否为0作为转移条件,即可实现按次数控制循环。,2.3.
45、4.2 条件转移指令,2.3 指令系统,2.3.4 控制转移指令,例 分析以下程序的功能 MOV 50H,#10 CLR A LOOP:ADD A,50H DJNZ 50H,LOOP SJMP $ 解: 该程序执行结果为 (A)=10+9+8+7+6+5+4+3+2+1=37H,2.3.4.2 条件转移指令,2.3 指令系统,2.3.4 控制转移指令,1.调用 (1)长调用 LCALL addr16 这是一条3字节指令,调用地址在指令中直接给出,通常以标号形式出现。指令执行后,断点进栈保存,以addr16作地址调用子程序。因此本指令的操作内容可表示为: PC(PC)+3 SP(SP)+1,(S
46、P)(PC)70 SP(SP)+1,(SP)(PC)158 PC addr16,2.3.4.3 调用与返回指令,2.3 指令系统,2.3.4 控制转移指令,LCALL指令的子程序调用范围是64KB。addr16就是被调用子程序的入口地址,使用比较方便,但3字节指令较长,占用存储空间较多。 例如:(SP)=50H,标号地址START为0203H,标号MM为6000H,执行指令“START:LCALL MM”后(SP)=52H,(51H)=03H,(52H)=02H,(PC)=6000H (2)短调用 ACALL addr11 这是一条2字节指令,被调用子程序的首地址必须设在包含ACALL下一条指令的第一个字节在内的2KB范围内的片内ROM中。,2.3.4.3 调用与返回指令,