1、1,指令概述寻址方式数据传送类指令算术运算类指令逻辑操作类指令控制转移类指令位操作指令,第3章 80C51的指令系统,本章内容,2,3.1 指令系统简介,1) 指令概述一台微机所具有的所有指令的集合,就构成了指令系统。指令系统越丰富,说明CPU的功能越强。,2)机器指令一台微机能执行什么样的操作,是在微机设计时确定的。一条指令对应着一种基本操作。由于计算机只能识别二进制数,所以指令也必须用二进制形式来表示,称为指令的机器码或机器指令。MCS-51单片机指令系统共有33种功能,42种助记符,111条指令。,3,1、二进制的表示形式:(以“累加器的内容+08H”为例)00100100B 操作码 O
2、P (加法)00001000B 操作数DATA(08H)特点: 能被CPU直接识别、运行的形式。也称机器码、汇编语言的目标代码。 缺点:不便于阅读、记忆和调试修改。,3) 指令表示,4,2、十六进制表示方式:它是对二进制形式的一种简化。00100100B 24H 00001000B 08H,二进制表示的形式 十六进制表示的形式,在实验室等少数环境下,可以将这种形式作为输入程序的一种辅助手段。但是,这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的“机器码”后存入程序存储器并运行。,5,3、指令的“助记符”方式(也称“汇编格式”):00100100B 24H00001000B 08H A
3、DD A,#08H,二进制表示形式 十六进制表示 汇编格式,返回,1)这是一种由英文单词或字母、数字来表征指令功能的形式。是一种便于阅读、书写和交流的表示形式。 2) “汇编”格式的指令必须 “翻译”为二进制形式 “机器码”后才能为CPU所识别和执行。 3)三种不同的表示方法适用于不同的场合。,6,指令格式:既指令的结构形式。,操作码,操作数或操作数地址,由操作码和操作数(或操作数地址)构成指令的结构。,举例:MOV A,#0FFHADD 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 10100011BINC A 00000100B【特点】:操作数隐含在操作码中。含有操作数寄存器名称的单字节指令:如:MOV A,R0 11101000BMOV 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,MOV P1,#55H ;将立即数55H送P1口MOV 20H,#55 ;将立即数55H送20H 单元MOV A,#0F0H ;将立即数0F0H送累加器AMOV R4
8、,#0FH ;将立即数0FH送寄存器R4中MOV R0,#20H ;将立即数20H送寄存器R0口 AND A,#0FH ;A的内容与立即数0FH与操作 ORL A,#0F0H ;A的内容与立即数0F0H或操作 MOV A,#01H ;将立即数01H送累加器A中 MOV A,#55H ;将立即数55H送累加器A中,注意:1)#;2)不能作为目的;3)注意#0F0H的意义,17,MOV A, 3AH 直接寻址是指把存放操作数的内存单元的地址直接写在指令中。在MCS-51单片机中,可以直接寻址的存储器主要有内部RAM区和特殊功能寄存器SFR区。(参见P37),2) 直接寻址,18,3) 寄存器寻址,
9、MOV R1, A寄存器寻址是指将操作数存放于寄存器中,寄存器包括工作寄存器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)间接寻址的标志
10、2)R0,R1,SP,DPTR,4) 寄存器间接寻址,20,寻址比较,MOV P1,R0,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,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址
11、,MOVC A, A+DPTR MOVC A, A+PC JMP A+DPTR,目的地,寄存器,操作数,内部RAM,3AH,65H,3AH,基址寄存器 12H,变址寄存器 34H,内部RAM,46H,65H,A,DPTRPC,46H,5) 变址寻址,25,26,目的地,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,XXH,位寻址,操作数,ORG 2000H SJMP 54H SJMP 2056H 出现的格式!,PC,+,54H,PC,2002H,2002H =2056H,PC,2056H,6) 相对寻址,27,设指令SJMP 54H的机器码80H 54H存放在2000H
12、处,当执行到该指令时,先从2000H和2001H单元取出指令,PC自动变为2002H;再把PC的内容与操作数54H相加,形成目标地址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
13、 0 0 0,1,0,位地址的表示方式: ?,31,3.3 数据传送指令,按功能, MCS -51 指令系统可分为下列 5 类: 数据传送指令(29条) 算术运算指令(24条) 逻辑运算指令(24条) 控制转移指令(17条) 位操作指令 (17条),32,数据传送类指令共29条, 它是指令系统中最活跃、 使用最多的一类指令。 一般的操作是把源操作数传送到目的操作数, 即指令执行后目的操作数改为源操作数, 而源操作数保持不变。 若要求在进行数据传送时, 不丢失目的操作数, 则可以用交换型传送指令。,指令通式:MOV ,目的地址 源地址,数 据,20H,A,33,数据传送类指令不影响进位标志CY、
14、 半进位标志AC和溢出标志OV, 但当传送或交换数据后影响累加器A的值时, 奇偶标志P的值则按A的值重新设定。 按数据传送类指令的操作方式, 又可把传送类指令分为3种类型: 数据传送、 数据交换和堆栈操作, 并使用8种助记符: MOV、 MOVX、 MOVC、 XCH、 XCHD、 SWAP、 PUSH及POP。,34,1. 数据传送到累加器A的指令MOV A, RnMOV A, directMOV A, RiMOV A, data这组指令的功能是:把源操作数的内容送入累加器A。例如: MOV A, 10H, 该指令执行时将立即数 10H送入累加器A中。,3.3.1 内部RAM传送指令,35,
15、例3.3.1 已知(A)=20H,(R0)=50H,内部RAM中(40H)=30H,(50H)=10H,指出下列指令执行后相应单元内容的变化情况。MOV A , #40HMOV A , 40HMOV A , R0MOV A , R0,36,2. 数据传送到工作寄存器Rn的指令MOV Rn, AMOV Rn, directMOV Rn, data这组指令的功能是: 把源操作数的内容送入当前工作寄存器区的R0R7中的某一个寄存器。指令中Rn在内部数据存储器中的地址由当前的工作寄存器区选择位RS1、RS0 确定, 可以是 00H07H、08H0FH、10H17H、18H1FH。 例如: MOV R0
16、, A, 若当前RS1、RS0 设置为 00 (即工作寄存器 0 区), 执行该指令时,将累加器A中的数据传送至工作寄存器R0(内部RAM 00H)单元中。,37,3. 数据传送到内部RAM单元(直接地址)MOV direct, AMOV direct, RnMOV direct, directMOV direct, RiMOV direct, data 4. 数据传送到内部RAM单元(间接地址)MOV Ri, AMOV Ri, directMOV Ri, data,38,5. 16位数传送指令,MCS-51指令系统中唯一的一条16位数据传送类指令。MOV DPTR,#data16DPTR是单
17、片机内部SFR中的两个寄存器DPH、DPL组合而成。其中DPH为高八位,DPL为低八位。DPTR是一个专门用于访问外部存储器的间址寄存器。寻址能力为 64K (065535)。,39,例3.3.2 已知(R0)=50H,(R1)=66H, (R6)=30H 内部RAM中(50H)=60H,(66H)=45H, (70H)=40H 指出下列指令执行后相应单元内容的变化情况。MOV A , R6MOV R7 , 70HMOV 70H , 50HMOV 40H , R0MOV R1 , #88H,40,实现外部RAM和累加器A之间的数据传送。只有寄存器间接寻址的指令。MOVX A,Ri 使用Ri寄存
18、器间址寻址范围0255hMOVX Ri,A 在硬件电路中P0口输出8位地址数据。 MOVX A,DPTR 使用DPTR间址,寻址范围065535h MOVX DPTR,A 在硬件电路中,使用P0口输出低8位,P2口输出高8位外部RAM地址。,3.3.2 外部RAM传送指令,41,外部RAM的字节传送指令举例,已知外部RAM的88H单元有一个数x,试编程将x送外部RAM的1818H单元。 【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次 MOVX 指令完成此操作。ORG 2000H MOV R0,#88H ;为8位指针赋值MOV DPTR,#1818H ;为16位指针赋值MOVX A
19、,R0 ;取 x 到累加器AMOVX DPTR,A ;x 送RAM的1818h单元SJMP $ ;停机END,返回,42,3.3.3 数据交换指令,为提供一种方便的累加器和寄存器或RAM之间的数据交换。避免了使用一般MOV传送指令完成交换时的不便。 格式:XCH A,Rn ;A RnXCH A,direct ;A (direct)XCH A,Ri ;A (Ri)XCHD A,Ri ;A30(Ri)30SWAP A ;A30 A47,43,数据交换指令举例,已知,片外RAM 20h单元、内部RAM 20h单元分别有数x和y,试编程互将两数相交换。MOV R1,#20h ;指针赋初值MOVX A,
20、R1 ;xaXCH A,R1 ;交换 a(20h),yaMOVX R1,A ;y(20h)片外RAM,(y) x,20h,20h,累加器A,1,2,3,44,3.3.4 ROM的字节传送指令(查表指令),这类指令有两条,都属于变址寻址指令。MOVC A,A+DPTR ;A (A+DPTR)MOVC A,A+PC ;PC PC+1, A (A+PC) 该指令也称为“查表”指令。在ROM中建立一个数据表,可以使用DPTR、PC作为数据表格的基地址。在第一条指令中:用DPTR作为基地址。使用前,先将数据表的首地址送入DPTR中,累加器A作为偏移量。由两者数据相加得到待查的表中数据地址并取出。(远程查
21、表指令)第二条指令是以程序计数器PC为基地址。由于PC的内容与该指令在ROM中的位置有关,所以一旦该指令在程序中的位置确定,其PC的值也就确定。(近程查表指令)(P62),45,ROM的字节传送指令举例,已知累加器A中存有09范围内的数,试用查表指令编写出查找出该数平方的程序。 采用DPTR作基址寄存器:设平方表的首地址为2000h,累加器A中的内容恰好是查表的偏移量。首先将表的起始地址2000h送入DPTR中。MOV DPTR,#2000H ;指针赋值MOVC A,A+DPTR ;平方值送A,2000h,2009h,2008h,2007h,2006h,2005h,2004h,2003h,20
22、02h,2001h,46,3.3.5 堆栈操作指令,堆栈操作是一种特殊的数据传送指令。 堆栈:一个用来保存程序断点、数据的特殊的存储区域。在MCS-51单片机中,栈区是占用片内RAM的存储空间,具体栈位置由指针SP来确定(系统上电时,SP=07H)。(1)进栈操作: PUSH direct ;SP+1SP,(direct)(SP)(2)出栈操作: POP direct ;(SP)(direct),SP -1SP 【注意】: 寻址方式为直接寻址,所以 PUSH A 是错误的,应当是PUSH ACC或PUSH 0E0H,同理:PUSH R0也是错误的。 进栈是堆栈向上“生长”的过程,即SP+1;出
23、栈则相反。 系统上电时,SP=07h。SP的值可以根据需要进行修改,以适应具体编程的需要。在确定栈区位置时要考虑对数据区的影响,以避免数据区与栈区冲突。,47,堆栈操作指令举例(一),下面是一个BCD码转换为二进制的子程序BCDB中有关堆栈操作的例子。在这里,进栈操作是为了保护主程序中相关寄存器中的数据,因为子程序要使用这些寄存器。org 0800hbcdb: push PSWpush ACCpush B:pop Bpop ACCpop PSWRET,SP,48,堆栈操作指令举例(二),堆栈操作指令除了可以在子程序的设计中,对主程序的数据进行保护。还可以根据堆栈操作的特点完成一些特殊的操作。
24、【举例】:设片内RAM的30h单元存有x,40h单元存有y。试将两个单元内容互换。push 30hpush 40hpop 30hpop 40h,SP=07h,40h,30h,49,内部RAM前128字节,SFR之间可以相互传送,但最多只允许1个操作数使用寄存器间接寻址。MOV R0 , R1 是错误的。 访问SFR必须使用直接寻址,不能采用寄存器间接寻址。MOV A , P0 或 MOV A, 80H 正确MOV R0 , #80H 和 MOV A , R0 错误 8051没有提供B寄存器的寻址方式(乘法除法除外)。MOV A , B 直接寻址 注意 A 和 ACC 的区别:MOV 3FH ,
25、 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 ; DIV AB ),51,3.4.1 加法指令,1、不带进位的加法指令 格式: ADD A,Rn ;A+RnAADD A,direct ;A+(direct)AADD A,Ri ;
26、A+(Ri)AADD A,#data ;A+dataA 【注意】: 1,参加运算的数据都应当是8位的,结果也是8位并影响PSW。 2,根据编程者的需要,8位数据可以是无符号数(0255),也可以是有符号数(-128+127)。,52,不带进位的加法指令举例(一),试分析执行下列指令后累加器A和PSW中各标志的变化。MOV A,#19H Cy=0;ADD A,#66H AC=0 OV=C7C6=025 A = 0 0 0 1 1 0 0 1 B P=1 + 102 data= 0 1 1 0 0 1 1 0 B127 0 0 1 1 1 1 1 1 1 B1,若两数都是无符号数,则因Cy=0无进
27、位,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=190 A= 0 1 0 1 1 0 1 0 B P=0+ 107 data=0 1 1 0 1 0 1 1 B197 0 1 1 0 0 0 1 0 1 B C7 C6 AC1,若两数是无符号数,因Cy=0无进位:90+107=197 2,若两数是有符号数,因OV=1,故有溢出,两个正数相加后变为负数,很明显结果是不正确
28、的。,54,2、带进位的加法指令格式: ADDC A,Rn ;A+Rn+CyAADDC A,direct ;A+(direct) +CyAADDC A,Ri ;A+(Ri) +CyAADDC A,#data ;A+data+CyA【注意】:这里的Cy是指令执行前的Cy;对PSW的影响同ADD指令。,55,3、加1指令 格式: INC A ;累加器A加一INC Rn ;Rn+1RnINC direct ;内存单元数据加一INC Ri ;内存单元数据加一INC DPTR ;dptr+1dptr 【注意】:1,除了第一条对PSW的P有影响外,其余对PSW均无影响。2,由于上面的原因,INC指令不能作
29、为一般的数据算术运算使用,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 ;取x1低8位送A ADD A,R1 ;x1与x2低8位相加 MOV R0,A ;低8位和送m1单元 INC R0 INC R1 ;修改指针 MOV A,R0 ;取x1的高8位送A ADDC A,R1 ;x1与x2的高
30、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 ASUBB A,Ri ;A (Ri) Cy ASUBB A,#data ;A data Cy A,58,使用减法指令要注意的问题,在MCS-51的指令系统中没有不带Cy的减法,所以在使用SUBB指令前必须使用一条清除Cy的指令:CLR C。,59,减法指
31、令应用举例,试分析执行下列指令后累加器A和PSW中各标志的变化。CLR CMOV A,#C9HSUBB A,#054H201 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 ;内存单元数据减一【注意】:1,除了第一条对PSW的P有影响外,其余对PSW均无影响。2,由于上面的原因,DEC指令一般不作为数据算术运算使用(因为不能对PSW的OV等位产生影响,它主要用
32、于修改数据指针在控制、循环语句中使用)。,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加法运算:试写出完成85+59的BCD码的加法程序。MOV A,#85HADD A,#59HDA ASJMP $85 a= 1 0 0 0 0 1 0 1B + 59
33、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 0B1 1 1 0 0 1 0 0B 高4位9,所以加60h0 1 1 0 0 0 0 0B1 0 1 0 0 0 1 0 0B 结果为144h(1包含在Cy)【注意】: 144H是用16进制数来表示十进制,既BCD码。,63,3.4.4 乘法和除法指令,这是MCS-51单片机唯一的一类单字节4周期指令,它相当于4条加法指令的运行时间。格式:MUL AB ;ab=b,a (b存高8位,a存低8位)DIV AB ;ab=ab (a存商,b存余数)【注意】:
34、指令对标志的影响:1,在乘法指令中对PSW的影响有Cy、OV、和P。具体如下:Cy0;P取决于A中“1”的个数;OV表明积的大小。当积超过255(B0)时,OV=1。2,在除法指令中,Cy、P与乘法相同。在执行除法指令时,若B=0时OV=1,表示除数=0除法无意义,其余情况下OV被复位。,64,3.5 逻辑运算指令,功能:对2个8位二进制数进行逻辑与、或、非和异或操作; 特点:除了以累加器A为目标寄存器的指令影响PSW的P位外,其余指令对PSW均无影响。1,逻辑与运算指令 ( ANL )2,逻辑或运算指令 ( ORL )3,逻辑异或指令 ( XRL )4,累加器清零和取反指令 ( CLR &
35、CPL ),65,1、逻辑与运算指令,格式: ANL A,Rn ;A R n AANL A,direct ; A (direct) AANL A,Ri ; A ( Ri) AANL A,#data ; A data AANL direct,A ; (direct) A directANL direct,# data ; (direct) data direct上面的指令也可以分为两类:1,以累加器A为目标寄存器的逻辑运算指令;2,以内存单元为目标的逻辑运算指令。,66,应用举例(一),已知R0=30H和(30H)=0AAH,试问执行下列指令后累加器A和30H单元中的内容是什么?1, MOV A
36、,#0FFH 2, MOV A,#0FH ANL 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操作可以从某个存储单元中取出某几位,而把其它的位清零。,67,2、逻辑或运算指令,格式: ORL A,Rn ;A R n AORL A,direct ; A (direct) AOR A,Ri ; A ( R I ) AORL A,#data ; A data AO
37、RL direct,A ; (direct) A directORL direct,# data ; (direct) data direct同与运算一样,上面的指令也可以分为两类:1,以累加器A为目标寄存器的逻辑运算指令;2,以内存单元为目标的逻辑运算指令。,68,应用举例,设累加器A=0AAH,P1口=0FFH。试编程将累加器A中的低四位送P1口的低四位,而P1口的高四位不变。解: MOV R0,A ;累加器A中的数据暂存ANL A,#0FH ;屏蔽A的高4位ANL P1,#0F0H ;屏蔽P1口的低4位ORL P1,A ;在P1口组装MOV A,R0 ;恢复累加器A的数据【小结】: 与运
38、算可以 “清零” 某些位;或运算可以 “置位” 某些位。,69,3、逻辑异或运算指令,格式: XRL A,Rn ; A R n AXRL A,direct ; A (direct) AXR A,Ri ; A ( R I ) AXRL A,#data ; A data AXRL direct,A ; (direct) A directXRL direct,# data; (direct) data direct特点:按位运算,相同时为0,不同时为1。使用异或可以实现将某个字节的数据或将数据的某几位取反。,70,举例,已知:外部RAM的30H单元中有一个数AAH,现要将其高4位不变,低4位取反,试
39、编程。 解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,71,4、累加器清零和取反指令,用传送指令可以实现对累加器A的清零和取反操作,但是它们都是双字节指令。在MCS-51的指令系统中专门设计了单字节、单周期对累加器清零和取反的指令。 格式: CLR A ;累加器清零CPL A ;累加器取反取反指令可以方便的实
40、现求补操作。 举例:已知30H单元中有一个数x,写出对它求补的程序。MOV A,30HCPL AINC AMOV 30H,A,72,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、循环移位指令,73,循环指令可以实现数据各位的循环移位、循环检测,也可以对数据乘2、除2操作。MOV A , 02HCLR CRLC A ; A*2MOV A , 06HCLR CRRC A ; A/2,74,3.6 控制转移指令,1、无条件转移指令2、条件转移指令3、子程序调用和返回4、
41、空操作指令,75,3.6.1 无条件转移指令,格式:LJMP addr16 ;长转移指令,寻址范围65535AJMP addr11 ;短转移,寻址范围2K SJMP rel ;相对转移,转移范围(+127-128)JMP A+DPTR ;间接转移,寻址范围65535,LJMP指令 (三字节),AJMP指令 (双字节),SJMP指令 (双字节),JMP指令 (单字节),76,1、长转移指令:(三字节双周期指令),指令执行时,将指令码中的addr16送入PC中,使程序无条件的转向addr16所指向的新地址执行程序。 【举例】:已知某单片机的监控程序地址为A080H,试问用什么方法使单片机开机后自动
42、的转向该监控程序? 【解】:因为单片机上电时,PC=0000H,所以在0000H单元存放一条 LJMP 0A080H 的指令即可。,ROM,0000H 0001H 0002H 0003H,77,2、短转移指令:,双字节、双周期指令。 将AJMP指令中的11位转移地址替换掉原来PC中16位地址中的低11位地址。指令中的11位地址,确定了地址的转移范围在2K以内,所以AJMP也称“页内转移”指令。,A10 a9 a8 操作码 a7 a0,AJMP指令,PC程序计数器,78,MCS-51的ROM系统是以2K为一页来划分程序存储器,这样对于4K的片内ROM存储器可以分为2页;片外64K的ROM可以分为
43、32页。在执行AJMP指令时,PC的高5位决定了ROM中的页地址;而AJMP 指令的低11位地址用来选择页内地址。在一般情况下,AJMP指令应当与目标地址在同一页内。更具体的说:目标地址应当与AJMP指令取出后的PC值(PC=PC+2) 在同一页内。否则转移将会出现错误。,79,ROM的64K存储空间的页面(部分)划分表,80,ROM的64K存储空间的页面示意图,: : AAA:MOV A,R0MOV R1,A:AJMP AAA,0100H,07FEH,000001111111 11111110,PC值,000010000000 00000000,PC+2值,000010010000 0000
44、0000,AJMP指令中的11位地址,原本AJMP指令要转到本 页的 0100H 单元但是由 于 PC 的高5位页面地址 发生了变化使AJMP指令 实际转到下一页 0900H 单元。,最后PC值,发生跨页错误,81,AJMP转一指令是用来做页内2K范围的转移,如果使用不当,会发生错误的“跨页”操作。产生跨页的原因是AJMP指令处于每一页的最后两个单元的结果,所以避免这种现象的方法就是不要在每一页的最后两个单元使用AJMP指令。如果目标地址与AJMP地址不再同一页内,建议使用LJMP指令替代AJMP。使用AJMP指令时,11位的绝对地址可以用符号地址取代,正确使用AJMP转移指令,82,3、相对
45、转移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,83,4、间接转移指令(散转指令),格式:JMP A+DPTR 单字节操作码为73H 特点:转移地址由累加器A的内容与DPTR相加形成
46、。 用途:用来制作一个多分支的转移结构。【举例】: MOV DPTR,#TABLE ;指针赋表头地址JMP A, A+DPTR ;转移地址由A+DPTR产生TABLE: AJMP ROUT0 ;多分支转移表AJMP ROUT1AJMP ROUT1AJMP ROUT2: :,84,3.6.2 条件转移指令,1、累加器A判零转移指令(双字节指令)JZ rel ;若A=0,则PC=PC+2+rel;若A0,则PC=PC+2JNZ rel ;若A0,则PC=PC+2+rel;若A=0,则PC=PC+2,85,2、比较不相等转移指令(3字节) a=data时:PC+3PC,Cy=0CJNE A, #data,rel adata时:PC+3+rel,Cy=0CJNE Rn,#data,rel a=Y;Cy=1 则 XY 。,