




已阅读5页,还剩98页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,指令概述 寻址方式 数据传送类指令 算术运算类指令 逻辑操作类指令 控制转移类指令 位操作指令,第3章 80C51的指令系统,本章内容,2,3.1 指令系统简介,1) 指令概述 一台微机所具有的所有指令的集合,就构成了指令系统。指令系统越丰富,说明CPU的功能越强。,2)机器指令 一台微机能执行什么样的操作,是在微机设计时确定的。一条指令对应着一种基本操作。由于计算机只能识别二进制数,所以指令也必须用二进制形式来表示,称为指令的机器码或机器指令。 MCS-51单片机指令系统共有33种功能,42种助记符,111条指令。,3,1、二进制的表示形式:(以“累加器的内容+08H”为例) 00100100B 操作码 OP (加法) 00001000B 操作数DATA(08H) 特点: 能被CPU直接识别、运行的形式。也称机器码、汇编 语言的目标代码。 缺点:不便于阅读、记忆和调试修改。,3) 指令表示,4,2、十六进制表示方式: 它是对二进制形式的一种简化。 00100100B 24H 00001000B 08H,二进制表示的形式 十六进制表示的形式,在实验室等少数环境下,可以将这种形式作为输入程序的一种辅助手段。但是,这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的“机器码”后存入程序存储器并运行。,5,3、指令的“助记符”方式(也称“汇编格式”): 00100100B 24H 00001000B 08H ADD A,#08H,二进制表示形式 十六进制表示 汇编格式,返回,1)这是一种由英文单词或字母、数字来表征指令功能的形式。是一种便于阅读、书写和交流的表示形式。 2) “汇编”格式的指令必须 “翻译”为二进制形式 “机器码”后才能为CPU所识别和执行。 3)三种不同的表示方法适用于不同的场合。,6,指令格式:既指令的结构形式。,操作码,操作数或操作数地址,由操作码和操作数(或操作数地址)构成指令的结构。,举例:MOV A,#0FFH ADD A,R0,返回,4) 指令格式,7,采用助记符表示的汇编语言指令格式如下:,标号是程序员根据编程需要给指令设定的符号地址,可有可无;标号由18个字符组成,第一个字符必须是英文字,不能是数字或其它符号;标号后必须用冒号。,4) 指令格式,8,操作码表示指令的操作种类,如MOV表示数据传送操作,ADD表示加法操作等。 操作数或操作数地址表示参加运算的数据或数据的有效地址。操作数一般有以下几种形式:没有操作数项,操作数隐含在操作码中,如RET指令;只有一个操作数,如CPL A指令;有两个操作数,如MOV A,#00H指令,操作数之间以逗号相隔;有三个操作数,如CJNE A,#00H,NEXT指令,操作数之间也以逗号相隔。 注释是对指令的解释说明,用以提高程序的可读性;注释前必须加分号。,4) 指令格式,9,在MCS-51单片机的指令系统中,因指令操作码和操作数的不同,指令(在存储器中)长度也各不相同。 分为单字节、双字节和三字节。 单字节指令(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位的操作数本身占据一个字节。,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,指令的字节多是否意味着指令周期就长?,从表中可见,指令的字节数与指令周期不是对等的关系,返回,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送累加器A MOV R4,#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) 寄存器寻址,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,R0 R1 DPTR,目的地,2号,信在2号箱子里,1号,注意: 1)间接寻址的标志 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,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,MOVC A, A+DPTR MOVC A, A+PC JMP A+DPTR,目的地,寄存器,操作数,内部RAM,3AH,65H,3AH,基址寄存器 12H,变址寄存器 34H,内部RAM,46H,65H,A,DPTR PC,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处,当执行到该指令时,先从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 0 0 0,1,0,位地址的表示方式: ?,31,3.3 数据传送指令,按功能, MCS -51 指令系统可分为下列 5 类: 数据传送指令(29条) 算术运算指令(24条) 逻辑运算指令(24条) 控制转移指令(17条) 位操作指令 (17条),32,数据传送类指令共29条, 它是指令系统中最活跃、 使用最多的一类指令。 一般的操作是把源操作数传送到目的操作数, 即指令执行后目的操作数改为源操作数, 而源操作数保持不变。 若要求在进行数据传送时, 不丢失目的操作数, 则可以用交换型传送指令。,指令通式:MOV ,目的地址 源地址,数 据,20H,A,33,数据传送类指令不影响进位标志CY、 半进位标志AC和溢出标志OV, 但当传送或交换数据后影响累加器A的值时, 奇偶标志P的值则按A的值重新设定。 按数据传送类指令的操作方式, 又可把传送类指令分为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 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 direct, A MOV direct, Rn MOV direct, direct MOV direct, Ri MOV direct, data 4. 数据传送到内部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,(R1)=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间址,寻址范围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,R0 ;取 x 到累加器A MOVX DPTR,A ;x 送RAM的1818h单元 SJMP $ ;停机 END,返回,42,3.3.3 数据交换指令,为提供一种方便的累加器和寄存器或RAM之间的数据交换。避免了使用一般MOV传送指令完成交换时的不便。 格式: XCH 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 ;xa XCH 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+DPTR) 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作基址寄存器: 设平方表的首地址为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+1SP,(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中有关堆栈操作的例子。在这里,进栈操作是为了保护主程序中相关寄存器中的数据,因为子程序要使用这些寄存器。 org 0800h bcdb: push PSW push ACC push B : : pop B pop ACC pop PSW RET,SP,48,堆栈操作指令举例(二),堆栈操作指令除了可以在子程序的设计中,对主程序的数据进行保护。还可以根据堆栈操作的特点完成一些特殊的操作。 【举例】:设片内RAM的30h单元存有x,40h单元存有y。试将两个单元内容互换。 push 30h push 40h pop 30h pop 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 , 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+RnA ADD A,direct ;A+(direct)A ADD A,Ri ;A+(Ri)A ADD 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=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 data=0 1 1 0 1 0 1 1 B 197 0 1 1 0 0 0 1 0 1 B C7 C6 AC 1,若两数是无符号数,因Cy=0无进位:90+107=197 2,若两数是有符号数,因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加一 INC Rn ;Rn+1Rn INC 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 ;取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的高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 data Cy A,58,使用减法指令要注意的问题,在MCS-51的指令系统中没有不带Cy的减法,所以在使用SUBB指令前必须使用一条清除Cy的指令:CLR C。,59,减法指令应用举例,试分析执行下列指令后累加器A和PSW中各标志的变化。 CLR C MOV A,#C9H SUBB 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-1Rn DEC direct ;内存单元数据减一 DEC Ri ;内存单元数据减一 【注意】: 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加法运算:试写出完成85+59的BCD码的加法程序。 MOV A,#85H ADD A,#59H DA A SJMP $ 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,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除法无意义,其余情况下OV被复位。,64,3.5 逻辑运算指令,功能:对2个8位二进制数进行逻辑与、或、非和异或操作; 特点:除了以累加器A为目标寄存器的指令影响PSW的P位外,其余指令对PSW均无影响。 1,逻辑与运算指令 ( ANL ) 2,逻辑或运算指令 ( ORL ) 3,逻辑异或指令 ( XRL ) 4,累加器清零和取反指令 ( CLR & CPL ),65,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 ; (direct) data direct 上面的指令也可以分为两类: 1,以累加器A为目标寄存器的逻辑运算指令; 2,以内存单元为目标的逻辑运算指令。,66,应用举例(一),已知R0=30H和(30H)=0AAH,试问执行下列指令后累加器A和30H单元中的内容是什么? 1, MOV A,#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,#80H ANL A,R0 ANL 30H,A (A=0A0H,(30H)=0AAH)(A=80H,(30H)=80H) 很明显:ANL操作可以从某个存储单元中取出某几位,而把其它的位清零。,67,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,以内存单元为目标的逻辑运算指令。,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的数据 【小结】: 与运算可以 “清零” 某些位; 或运算可以 “置位” 某些位。,69,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 特点:按位运算,相同时为0,不同时为1。使用异或可以实现将某个字节的数据或将数据的某几位取反。,70,举例,已知:外部RAM的30H单元中有一个数AAH,现要将其高4位不变,低4位取反,试编程。 解1,利用MOVX A,Ri指令: MOV R0,#30H 1 0 1 0 1 0 1 0 MOVX A,R0 0 0 0 0 1 1 1 1 XRL A,#0FH 1 0 1 0 0 1 0 1 MOVX R0,A 解2,利用MOVX A,DPTR MOV DPTR,#0030H MOVX A,DPTR XRL A,#0FH MOVX DPTR,A,71,4、累加器清零和取反指令,用传送指令可以实现对累加器A的清零和取反操作,但是它们都是双字节指令。在MCS-51的指令系统中专门设计了单字节、单周期对累加器清零和取反的指令。 格式: CLR A ;累加器清零 CPL A ;累加器取反 取反指令可以方便的实现求补操作。 举例:已知30H单元中有一个数x,写出对它求补的程序。 MOV A,30H CPL A INC A MOV 30H,A,72,A.0,A.7,A.0,A.7,A.0,A.7,A.0,A.7,CY,CY,RL A RR A RLC A RRC A,注意:执行带进位的循环移位指令之前,必须给CY置位或清零。,5、循环移位指令,73,循环指令可以实现数据各位的循环移位、循环检测,也可以对数据乘2、除2操作。 MOV A , 02H CLR C RLC A ; A*2 MOV A , 06H CLR C RRC A ; A/2,74,3.6 控制转移指令,1、无条件转移指令 2、条件转移指令 3、子程序调用和返回 4、空操作指令,75,3.6.1 无条件转移指令,格式: LJMP addr16 ;长转移指令,寻址范围65535 AJMP addr11 ;短转移,寻址范围2K SJMP rel ;相对转移,转移范围(+127-128) JMP A+DPTR ;间接转移,寻址范围65535,LJMP指令 (三字节),AJMP指令 (双字节),SJMP指令 (双字节),JMP指令 (单字节),76,1、长转移指令:(三字节双周期指令),指令执行时,将指令码中的addr16送入PC中,使程序无条件的转向addr16所指向的新地址执行程序。 【举例】: 已知某单片机的监控程序地址为A080H,试问用什么方法使单片机开机后自动的转向该监控程序? 【解】: 因为单片机上电时,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可以分为32页。 在执行AJMP指令时,PC的高5位决定了ROM中的页地址;而AJMP 指令的低11位地址用来选择页内地址。 在一般情况下,AJMP指令应当与目标地址在同一页内。更具体的说:目标地址应当与AJMP指令取出后的PC值(PC=PC+2) 在同一页内。否则转移将会出现错误。,79,ROM的64K存储空间的页面(部分)划分表,80,ROM的64K存储空间的页面示意图,: : : : AAA:MOV A,R0 MOV R1,A : : AJMP AAA,0100H,07FEH,000001111111 11111110,PC值,000010000000 00000000,PC+2值,000010010000 00000000,AJMP指令中的11位地址,原本AJMP指令要转到本 页的 0100H 单元但是由 于 PC 的高5位页面地址 发生了变化使AJMP指令 实际转到下一页 0900H 单元。,最后PC值,发生跨页错误,81,AJMP转一指令是用来做页内2K范围的转移,如果使用不当,会发生错误的“跨页”操作。 产生跨页的原因是AJMP指令处于每一页的最后两个单元的结果,所以避免这种现象的方法就是不要在每一页的最后两个单元使用AJMP指令。 如果目标地址与AJMP地址不再同一页内,建议使用LJMP指令替代AJMP。 使用AJMP指令时,11位的绝对地址可以用符号地址取代,正确使用AJMP转移指令,82,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,83,4、间接转移指令(散转指令),格式:JMP A+DPTR 单字节操作码为73H 特点:转移地址由累加器A的内容与DPTR相加形成。 用途:用来制作一个多分支的转移结构。 【举例】: MOV DPTR,#TABLE ;指针赋表头地址 JMP A, A+DPTR ;转移地址由A+DPTR产生 TABLE: AJMP ROUT0 ;多分支转移表 AJMP ROUT1 AJMP ROUT1 AJMP ROUT2 : :,84,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,85,2、比较不相等转移指令(3字节) a=data时:PC+3PC,Cy=0 CJNE A, #data,rel adata时:PC+3+rel,Cy=0 CJNE Rn,#data,rel a=Y; Cy=1 则 XY 。,86,3、减一条件转移指令,1) DJNZ Rn,rel ;Rn-1Rn,若Rn0则PC+2+relPC ;若Rn=0则PC+2PC 2) DJNZ direct,rel ; (direct)-1direct, ;若(direct)0则PC+3+relPC ;若(direct)= 0则PC+3PC 注意:第一条指令为双字节,第二条指令为三字节。 指令本身先做一个带回送的减一运算操作,然后 根据运算的结果是否为零作为转移的条件,例如,有一段程序如下: MOV 23H,#0AH CLR A LOOPX:ADD A,23H DJNZ 23H,LOOPX SJMP $ 该程序执行后,(A)=10+9+8+7+6+5+4+3+2+1=37H,87,88,应用举例,令片内RAM中DATA为起始地址的数据块中连续10个无符号数相加,并把和送到SUM单元(设其和小于256)。 ORG 1000H START: MOV R2,#0AH ;数据块长度10送计数器R2 MOV R0,#DATA ;数据块起始地址送指针R0 CLR A ;累加器清零 LOOP: ADD A,R0 ;累加部分和 INC R0 DJNZ R2,LOOP ;若R2-10则转LOOP继续 MOV SUM,A ;存累加和 SJMP $ ;停机 END 这是一个循环结构的程序,DJNZ指令又是决定整个循环是否结束的控制语句。,89,3.6.3 子程序调用和返回指令,(一)子程序调用指令: 1)短调用指令 ACALL addr11 2)长调用指令 LCALL addr16 (二)返回指令: 1)子程序返回 RET 2) 中断返回 RETI,90,1、调用指令,1,短调用指令 ACALL addr11 PC+2PC SP+1SP, PC70(SP) SP+1SP, PC158(SP) addr11 PC100 2, 长调用指令 LCALL addr16 PC+3PC SP+1SP, PC70(SP) SP+1SP, PC158(SP) addr16 PC,子程序的调用包含两部分内容: A) 实现转入子程序的入口地址;这主要由调用语句中的addr11或addr16 实现。 B)子程序完成后,能够自动的返回;这是由调用语句执行时依靠堆栈操作已经将返回地址压栈保存,带返回时弹出送PC实现的。,91,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还要清除相应的中断优先级状态位,使系统响应低优先级的中断。,92,3.6.4 空操作指令,格式: NOP (单字节 操作码:00H) 功能:仅使程序计数器PC加一,消耗12个时钟周期,所以时常用作延时。,93,位操作特点:操作数不是字节,而是某一位。每位的取值只能是“0”或“1”,因而也称之为布尔变量操作。 布尔变量存在于片内RAM的位寻址区(20H2FH)、11个可以按位寻址的SFR。,3.7 位操作指令,主要内容: 1、位传送指令 2、位置位和位清零指令 3、位运算指令 4、位控制转移指令,94,3.7.1 位传送指令:,格式:MOV C , bit ;其中:C为PSW中的Cy MOV bit , C ; bit为布尔变量的位地址 举例:试将00H位和7FH位中的内容互换。 【解】:两个位互换必须找一个位作为缓冲位。 MOV C,00H MOV 01H,C MOV C,7FH MOV 00H,C MOV C,01H MOV 7FH,C,例如,若(CY)=1,(P3)=1100 0101B,(P1)=0011 0101B。执行以下指令: MOV P1.3,C MOV C,P3.3 MOV P1.2,C 结果为(CY)=0,P3 的内容未变,P1 的内容变为0011 1001B。,95,96,3.7.2 位置位和位清零指令:,格式: CLR C ;0Cy
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论