首页 第3章 MCS-51单片机指令系统

第3章 MCS-51单片机指令系统

举报
开通vip

第3章 MCS-51单片机指令系统nullnull第三章 MCS-51单片机指令系统第一节 MCS-51指令系统的分类、格式及一般说明 第二节 寻址方式 第三节 分类指令null 高级语言 如C++汇编语言 如MCS-51指令汇编目标文件按照语法格式编写源程序*.ASM *.C按照语法格式将源程序翻译成机器代码计算机识别的二进制代码*.OBJ第一节 MCS-51指令系统的分类、格式及一般说明一、111条 MCS-51指令的分类方法一、111条 MCS-51指令的分类方法按照每条指令执行时间划分: 1、单机...

第3章  MCS-51单片机指令系统
nullnull第三章 MCS-51单片机指令系统第一节 MCS-51指令系统的分类、格式及一般说明 第二节 寻址方式 第三节 分类指令null 高级语言 如C++汇编语言 如MCS-51指令汇编目标文件按照语法格式编写源程序*.ASM *.C按照语法格式将源程序翻译成机器代码计算机识别的二进制代码*.OBJ第一节 MCS-51指令系统的分类、格式及一般说明一、111条 MCS-51指令的分类方法一、111条 MCS-51指令的分类方法按照每条指令执行时间划分: 1、单机器周期(12个振荡周期)有64条 2、双机器周期(24个振荡周期)有45条 3、四机器周期(48个振荡周期)有2条 按照每条指令翻译成字节数划分: 1、单字节指令,有49条 2、双字节指令,有45条 3、三字节指令,有17条 按照指令功能划分: 数据传递与交换、算术运算、逻辑运算、程序转移、布尔处理操作、CPU控制等6类。 布尔处理操作类指令又称位操作指令。 null一般分为两部分:操作码和操作数 操作码 :规定指令进行什么操作 操作数:表示指令操作的对象,可以是数或是数据所在的地址,但最终对象都是数据。 汇编语言格式为:[标号:] 操作码助记符 [目的操作数,] [源操作数] [;注释] MAIN: MOV A , #20H ; #### 二、指令格式按指令的字节数(机器语言)不同,分为一字节指令,二字节指令,三字节指令 1. 一字节指令 8位编码,既包含操作码,又包含操作数 如果指令无操作数(如指令:NOP)或,操作数都在Rn,A,B, DPTR, C中,则该指令一定是一字节指令。null如 INC DPTR INC A 若是有工作寄存器,则指令码中的rrr三位的不同编码来指定该寄存器 MOV A,Rn 指令码为11101rrr (E8H~EFH) 二字节指令 16位编码,既包含操作码,又包含操作数 如果指令操作数只有一个8位直接地址或立即数,则该指令一定是二字节指令。ADD A,#22HADD A,22Hnull3. 三字节指令 24位编码,既包含操作码,又包含操作数 如果指令操作数有两个8位直接地址或是立即数,或是16位直接地址, 则该指令一定是三字节指令。null三、 指令描述符号介绍Rn——当前选中的寄存器组中的8个工作寄存器R0~R7(n=0~7)。 Ri——当前选中的寄存器组中的可作为间接寻址寄存器使用的2个工作寄存器R0、R1(i=0,1)。 direct—8位的内部数据存储器单元中的地址。可以是内部RAM单元地址或专用寄存器地址。 75H、 0A5H 、P1 #data——包含在指令中的8位立即数。 # 75H、 # 80H、 # 0A5H #data16——包含在指令中的16位立即数。 # 2480H、 # 0D256H addr16——16位目的地址。用于长转移指令中,能转移到64KB程序存储器地址空间的任何地方。 addr11——11位目的地址。目的地址应与下一条指令第一个字节在同一个2KB程序存储器的地址空间之内。 rel——8位带符号的偏移字节,简称偏移量。偏移量相对于下一条指令的第一个字节计算,在-128--+127范围内取值。null@——间址寄存器或基址寄存器的前缀, 如@Ri,@DPTR。 / ——位操作数的前缀,表示对该位操作数取反, 如/bit。 ×——片内RAM的直接地址或寄存器。 (×)——直接寻址方式中,表示直接地址X中的内容。注释用 ((×))——在间接寻址方式中,表示由间址寄存器X指出的地址单元中的内容。注释用 ——箭头左边的内容被箭头右边的内容所代替。注释用DPTR——数据指针,可用作16位地址寄存器。 bit——内部RAM或专用寄存器中的直接寻址位。 A——累加器。 ACC ——直接寻址方式的累加器。 B——专用寄存器,用于乘法和除法指令中。 CY——进位标志或进位位,或布尔处理机中的累加器。null第二节 寻址方式 1、寄存器寻址 2、 直接寻址 3、 寄存器间接寻址 4、 立即寻址 5、 变址寻址 6、 相对寻址 7、 位寻址返回本章首页寻址方式——找到存放数据的地址,提取操作数.null1.寄存器寻址方式 操作数给出形式为寄存器, 操作对象(数据)存放在寄存器当中 例如: MOV A ,R0 MOV R0 , A 寄存器:a.工作寄存器:Rn b.部分专用寄存器:A、B、DPTR、C 这里源操作数和目标操作数均采用寄存器寻址。 寄存器寻址示意图 如果程序状态寄存器PSW的RS1RS0=10(选中第二组工作寄存器,对应地址为10H~17H),设累加器A的内容为4AH,则执行MOV R1,A 指令后,内部RAM 11H单元的值就变为4AH,如寄存器寻址示意图所示。 寄存器寻址示意图 null2.直接寻址方式: 操作数给出形式为单元地址, 操作对象(数据)存放在单元地址当中 例如: MOV A ,5BH MOV 5BH , A 直接地址:a. 内部RAM低128字节区 b.专用寄存器区(直接寻址是访问SFR区的唯一方法) 既可用单元地址形式给出,也可用寄存器符号给出 MOV A ,P1 (二字节指令) MOV A ,90H (二字节指令)直接寻址示意图 直接寻址示意图 88H2BH内部 RAM88HA例如指令:MOV A,2BH 执行的操作是将内部RAM 中地址为2BH的单元内容传送到累加器A中,其操作数2BH就是存放数据的单元地址,因此该指令是直接寻址。 设内部RAM 2BH单元的内容是88H,那么指令MOV A,2BH的执行过程如立即数寻址示意图所示。null3.寄存器间接寻址方式: 寄存器寻址: 寄存器当中存放的是操作对象 寄存器间接寻址:寄存器当中存放的是操作对象(数据)的地址,而不是操作对象本身。 例如: MOV 30H, #20H MOV R0 , #30H MOV A ,R0 ;R0 A A=30H MOV A ,@R0 ; (R0) A A=20H 寄存器间接寻址范围: a.访问内部RAM(SFR 不能用于寄存器间接寻址) : 只能使用R0和R1来作为间接寄存器,用@Ri表示(i=0、1) MOV A,@Ri b.访问外部低256字节 :MOVX A,@Ri c.访问外部RAM所有64K字节: MOVX A,@DPTR d.访问内部RAM SP, SP隐含了 PUSH B 相当于 MOV @SP,B POP B 相当于 MOV B,@S 注意:SFR不能用间接寻址方式,只能用 直接寻址方式@null片内RAMR0A30H寄存器间接寻址示意图34H30H34H例如:MOV @R0,A ;内部RAM(R0)←A 其指令操作过程示意图如下图所示。null4 .立即寻址方式: # 操作数就是操作对象(数据)本身, 此时把指令中操作数称为立即数,用#data表示 例如: MOV A , # 3AH MOV DPTR,#3F00H MOV 30H, #30H 唯一一条16位立即寻址指令: MOV DPTR , #data16 例:MOV A,#2BH立即数寻址示意图 MOV DPTR , #3425H MOVX A,@DPTR 通常与MOVX A,@DPTR 类指令搭配使用,#data16中表示的是16位的地址null5.变址寻址方式: 变址寻址是指将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址。DPTR或PC是基址寄存器,累加器A是变址寄存器。该类寻址方式主要用于查表操作即访问程序存储器(ROM)中的数据表格,专门针对程序存储器的寻址方式。 例如,指令 MOVC A,@A+DPTR 执行的操作是将累加器A和基址寄存器DPTR的内容相加,相加结果作为操作数存放的地址,再将操作数取出来送到累加器A中。只有三条: MOVC A, @A+DPTR ; A←(A+DPTR) MOVC A, @A+PC ; A←(A+PC) JMP @A+DPTR ;程序跳转到以 A+DPTR 为地址的单元null变址寻址示意图10HA2010H2000HDPTR99HMOVC A,@A+DPTRnull6 .相对寻址方式: 相对寻址是指程序计数器PC的当前内容与指令中的操作数相加,其结果作为跳转指令的转移地址(也称目的地址)。相对寻址用于修改PC值,主要用于实现程序的分支转移(跳转)。相当于C语言中的goto语句。 例如:SJMP rel ;PC+rel→PC 注意两点: a. 当前PC值:执行完该条相对寻址指令后的PC值 所以有:目的地址=指令地址+指令长度+rel b. rel为8位补码:-128~+127,负数表示向后转移,正数表示向前转移 以指令地址为基点: 向地址增大方向,最大可转移(127+指令长度)个单元地址, 向地址减小方向,最大可转移(128-指令长度)个单元地址。只适用于程序存储器空间null例如,SJMP 06H ;PC←PC+2+06H 指令操作示意图如图3-5所示。 80H08H0300H0301H0302H转移指令地址PC当前PC值0308HPCrel(06H)七、 位寻址七、 位寻址 位寻址只能对有位地址的单元作位寻址操作。位寻址其实是一种直接寻址方式,不过其地址是位地址。在进行位操作时,用进位位C作为位累加器。位地址在指令中用bit表示。 MOV C,3AH MOV PSW.3 , C 寻址范围: a. 内部RAM中的位寻址区:16个字节单元 :20H~2FH 128位 :00H~7FH b.专用寄存器的可寻址位: 可供位寻址的专用寄存器11个,实际寻址位83个,即有些位不能寻址 表示方法: ·直接使用位地址:例如PSW第5位 :0D5H ·位名称 :F0 ·单元地址加位 : 0D0H.5 ·专用寄存器符号名加位 : PSW.5null※寻址方式小结:寄存器寻址: 工作寄存器R0—R7,A,B,DPTR 直接寻址: 片内RAM低128字节和专用寄存器区,这是SFR区的 唯一寻址方式。 寄存器间接寻址: 片内RAM (@R0, @R1,SP) 片外RAM (@R0, @R1,@DPTR) 变址寻址: 程序存储器(用于访问程序存储器中的数据表格) 相对寻址: 程序存储器256字节范围(解决在ROM内部程序的转移) null第三节 分类指令 按照指令的功能,可以把MSC-51的111条指令分成五类: l      数据传送类指令(29条) l       算术运算类指令(24条) l       逻辑操作类指令(24条) l       控制转移类指令(17条) l       位操作类指令 (17条) null数据传送类指令小节内部RAM间的数据传送指令(16条) 访问外部RAM的数据传送指令(4条) 访问ROM程序存储器的数据传送指令(2条) 交换类指令(5条) 堆栈指令(2条)一、 数据传送类指令一、 数据传送类指令 数据传送类指令共29条 内部RAM间的数据传送指令(16条) 访问外部RAM的数据传送指令(4条) 访问ROM程序存储器的数据传送指令(2条) 交换类指令(5条) 堆栈指令(2条)null通用格式为: MOV <目的操作数>,<源操作数> 传送指令的约定:从右向左传送数据,是将源操作数送到目的操作数。指令执行后,源操作数不变,目的操作数被源操作数取代。 数据传送类指令用到的助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP8种。 null<一>以A为目的操作数的指令(4条) MOV A,Rn ; A  (Rn) 如:MOV A,R2 MOV A,direct ; A  (direct) 如: MOV A,30H MOV A,0E3H MOV A,@Ri ; A  ((Ri)) 如: MOV A,@R0 MOV A,#data ; A  data 如:MOV A,#36H MOV A,#0D2Hnull<二>以Rn为目的操作数的指令(3条) MOV Rn ,A ; ( Rn )  (A) 如:MOV R0,A MOV Rn ,direct ; ( Rn ) (direct) 如: MOV R3,30H MOV Rn ,#data ; ( Rn)  data 如: MOV R7,#36H MOV R1,#30 MOV R6,#01101100Bnull<三>以直接地址为目的操作数的指令(5条) MOV direct,A ; direct  (A) 如:MOV 30H,A MOV direct,Rn ; direct ( Rn ) 如:MOV P1,R2 MOV direct1,direct2 ; (direct1)  (direct2 ) 如:MOV 38H,60H MOV direct,@Ri ; direct  (( Ri ) )如: MOV TL0,@R1 MOV direct,#data ; direct  data 如: MOV 58H,#36H null<四>以间接地址为目的操作数的指令(3条) MOV @Ri,A ; ((Ri))  ( A ) 如:MOV @R0,A MOV @Ri,direct ; ((Ri))  ( direct )如:MOV @R1,36H MOV @R0,SBUF MOV @Ri,#data ; ((Ri))  data 如: MOV @R1,#48 MOV @R0,#0D6Hnull不允许的操作有:@Ri@Ri RnRn @RiRn 注意:MOV Rn,Rn x MOV @Ri, @Ri x MOV Rn, @Ri x MOV #data, A x 等等指令是非法指令。MOV指令在片内RAM的允许操作图null<五>十六位数据传送指令(1条) MOV DPTR,#data16 ; (DPH)  dataH8 ,(DPL) dataL8 如:MOV DPTR,#2368H MOV DPH,#23H MOV DPL,#68H MOV DPTR,#35326 null举例:设内部RAM40H单元的内容为30H,30H单元的内容为20H,20H单元的内容为10H,端口P1的内容为AAH,试问结果如何? MOV R0, #40H MOV A ,@R0 MOV R1,A MOV B,@R1 MOV @R1,P1 MOV P2,P1 MOV 40H,#10H 问:R0=? R1=? B=? (40H)=? (30H)=? P2=? (20H)=?;A=30H ; R1=30H ; B=20H ; (30H)=AAH ; P2=AAH ; (40H)=10H改为MOV R0, 40H; A=20H ; R1=20H ; B=10H ; (20H)=AAH ; P2=AAH ; (40H)=10H null<六>程序存储器数据传送指令(查表指令)(2条) MOVC A,@A+DPTR ; A ((A)+(DPTR)) 一般DPTR放表的首地址,A放所查数据在表中的偏移;查表范围为64KB空间,称为远程查表。 MOVC A, @A+PC ; A ((A) + (PC)) PC的值为下条指令的地址, A放所查数据相对PC值的偏移;查表范围为最大为256B空间,称为近程查表。 注意:内外程序存储器在逻辑上连续统一,传送单向,只读。 这类指令用于访问程序存储器中的数据表格。 null例1:近程查表 地址 标号 语句 2000 HBA:INC A ;A=(00H--0FH) 2001 MOVC A,@A+PC ;查表 2002 RET TAB:DB 30H ;0的ASC码 DB 31H ;1的ASC码 。。。 DB 39H ;9的ASC码 DB 41H ;A的ASC码 。。。 DB 46H ;F的ASC码 例如A初值01H,查表得31H; A初值0FH,查表得46Hnull例2 远程查表 设程序中的数据表格为: 执行程序: 1000H:MOV A,#10H 1002H:PUSH DPH 1004H:PUSH DPL 1006H:MOV DPTR,#7000H 1009H:MOVC A,@A+DPTR ; 100AH: POP DPH 100CH:POP DPL 结果为:(A)= ,(PC)= ,(DPTR)=7010H:02H 7011H:04H 7012H:06H 7013H:08H02H 100EH 原值高低字节互换A (10H+7000H)null<七>累加器A与片外RAM的数据传送指令(4条) 用间址方式 MOVX A,@Ri ; A ((Ri)),且使/RD=0 MOVX A, @ DPTR ; A ((DPTR)),且使/RD=0 MOVX @Ri,A ; ((Ri))  (A) ,且使/WR=0 MOVX @ DPTR , A ; ((DPTR ))  (A) ,且使/WR=0 注意:1、外部数据的传送只能使用A 2、@ DPTR两条指令以DPTR为片外RAM16位地址指针,寻址范围为64KB空间;P2输出高8位地址,P0口输出低8位地址和数据,分时复用 3、 @Ri两条指令以R0或R1作低8位地址指针,由P0口送出,寻址范围为256B空间(P2口仍可作通用I/O口)。null例:将外部RAM中F5H单元中的内容送到0645H单元中 MOV DPTR,#0645H MOV R0,#0F5H MOVX A , @R0 MOVX @DPTR , AMOV R0,#0F5H MOVX A ,@R0例:将外部RAM中0F5H单元中的内容送到A单元中。null<八>交换指令(5条) 1、字节交换指令 XCH A,Rn ; (A)  ( Rn ) XCH A,direct ; (A)  ( direct ) XCH A,@Ri ; (A)  (( Ri )) 2、半字节交换指令 (1)低半字节交换指令 XCHD A,@Ri ; (A) 0 ~3  (( Ri ) ) 0~3 将A的低4位与Ri间址单元的低4位内容交换,高4位不变。null如:设( A ) =36H, ( R1 ) =65H, ( 65H ) =42H XCHD A,@R1 ; ( A ) =32H, ( 65H ) =46H(2)累加器A高、低半字节交换指令 SWAP A ; ( A ) 0~3 (A ) 4~7 如:设(A)=36H SWAP A ;(A)=63Hnull<九>堆栈操作指令(2条) 进栈:PUSH direct ;先(SP)+1SP,后 (direct )  (( SP )) 出栈:POP direct ;先(( SP))  direct,后(SP)-1SP 如:PUSH 0E0H ;实际是(SP)+1SP,( A )  (( SP )) POP 05H ;实际是(( SP )) R5 , (SP)-1SP 注意:其操作数为直接地址,不能用寄存器名。 POP ACC 正确 POP A 错误null例、进入中断服务程序,要将DPTR、PSW和A的内容保护起来。设DPTR=0123H,PSW=25H,A=10H,当前SP=30H,问执行下列入栈后结果如何? PUSH DPL ;SP=31H,(31H)=23H PUSH DPH ;SP= (32H)= PUSH PSW ;SP= (33H)= PUSH ACC ;SP= (34H)= POP DPL ;DPL=10H,SP=33H。 POP DPH ;DPH= SP= POP PSW ;PSW= SP= POP ACC ;ACC= SP=32H01H31H25H34H10H25H32H01H33H23H30Hnull三、算术运算指令 共24条指令,分成七个小类 不带进位加法指令(4条) 带进位加法指令(4条) 带借位减法指令(4条) 加1指令(5条) 减1指令(4条) 乘除法指令(2条) 进制数调整指令(1条) 主要是对8位无符号数进行算术运算。算术运算结果将影响PSW的有关位。null<一>、不带进位加法指令(4条) ADD A,Rn ;( A ) ( A ) + ( Rn ) ADD A,direct ; ( A ) ( A ) + ( direct ) ADD A,@Ri ; ( A ) ( A ) + (( Ri )) ADD A,#data ; ( A ) ( A ) +#data 注意:如果位3有进位,则半进位标志位AC置1,否则清零。 如果位7有进位,则进位标志位CY置1,否则清零。 如果两个数(看作有符号数时)相加溢出,则OV置1,否则清零。 如果两个同符号数相加的结果变号即溢出,则OV置1,否则清零。null例:(A)=0C3H,(R0)=0AAH 执行“ADD A,R0”的和为6DH,标志位CY= ,OV= ,AC= , P= 。 OV=C7 C6 对第6、第7位的进位位C7、C6异或。 例:(A)=0BAH,(R0)=88H 执行“ADD A,R0”的和为42H,标志位CY= ,OV= ,AC= , P= 。 OV=C7 C6 对第6、第7位的进位位C7、C6异或。1 1 0 11 1 1 0两个同符号数相加的结果变号,则OV置1,否则清零。null<二>带进位加法指令(4条) 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 C为来自PSW状态寄存器中的进位位C。 把源操作数指出的内容和进位标志CY都同累加器A的内容相加,结果放于A中。多用于多字节数的加法。null例:两个16位无符号数相加。设被加数在内部RAM中30H(低位)、31H中,加数存放在内部RAM中40H (低位) 、41H单元中,将相加的结果存放到30H、31H和32H单元中。 MOV R0,#30H ;被加数低8位地址 MOV R1,#40H ;加数低8位地址 CLR C ;清CY MOV A,@R0 ;取被加数低8位 ADD A,@R1 ;与加数低8位相加 MOV @R0,A ;和存入30H单元 INC R0 ;指向高8位地址 INC R1 MOV A,@R0 ;取被加数高8位 ADDC A,@R1 ;与加数高8位及进位位相加 MOV @R0,A ;结果存入31H单元 CLR A ;清A ADDC A,#00H ;处理进位 INC R0 ; MOV @R0,A ;进位存入32Hnull <三>、带借位减法指令(4条) SUBB A,Rn ; (A)(A) - CY - (Rn) SUBB A,direct ; (A)(A) - CY - (direct) SUBB A,@Ri ; (A)(A) - CY - ((Ri)) SUBB A,#data ; (A)(A) - CY - #data 注意: 如果位3有借位,则半进位标志位AC置1,否则清零。 如果位7有借位,则进位标志位CY置1,否则清零。 如果两个数(看作有符号数时)相减溢出,则OV置1,否则清零。 如果两个异号数相减的结果与被减数符号不同即溢出,OV置1,否则清零。 无不带借位减法指令,需要时,先执行一条CLR C指令既可。例:(A)=0D1H,(R0)=54H (CY)=1 执行“SUBB A,R0”的结果为 ,标志位CY= ,OV= , AC= ,P= 。 7CH 0 1 1 1 null<四>、加1指令(5条) INC A ; (A) (A)+1 INC Rn ; ( Rn )  ( Rn ) +1 INC direct ; (direct )  (direct ) +1 INC @Ri ; (( Ri ))  (( Ri )) +1 INC DPTR ; ( DPTR )  ( DPTR ) +1 说明:INC A 影响P外,不影响PSW其它位(即标志位CY、AC、OV)。 例:MOV A,#0FEH ;P=1 INC A ;P=0null <五>、减1指令(4条) DEC A ; (A) (A)-1 DEC Rn ; ( Rn )  ( Rn ) -1 DEC direct ; (direct )  (direct ) -1 DEC @Ri ; (( Ri ))  (( Ri )) -1 DEC DPTR ; 无此指令 说明:DEC A 影响P外,不影响PSW其它位(即 标志位CY、AC、OV)。 例:MOV A,#0FFH ;P=0 DEC A ;P=1null<六>、乘除法指令(2条,单字节四周期指令) 1、乘法指令 MUL AB ; (A) x (B)B15~8,A7~0 说明:(1)为无符号乘法; (2)若结果的B≠0 (乘积大于255) ,则OV=1,若B=0,则OV=0;CY总是清零,AC不影响,P影响。 2、除法指令 DIV AB ; (A)/ (B)的商A,余数B 说明:(1)为无符号除法; (2)若除数B=0 (除法无意义) ,则OV=1,若B≠ 0,则OV=0;CY总是清零,AC不影响,P影响。null <七>、十进制数调整指令(1条) DA A ;调整累加器内容为BCD码(二进制编码的十进制) 说明: (1)此指令跟在ADD或ADDC指令之后,将A中的和调整为BCD码,并且ADD或ADDC的两个操作数是BCD码,即两个BCD码相加必须经过DA A指令后,才能得到正确的BCD码的结果。 (2)调整方法: 若(A0~3 ) >9或AC=1,则(A0~3 ) +6 (A0~3 ) ; 若( A4~7 )>9或CY=1,则(A4~7 ) +6 (A4~7 ); 若( A4~7 ) ≥9且(A0~3 ) >9,则(A)+66H  (A); 二---十进制编码BCD码 二---十进制编码BCD码 例:求十进制数876的BCD码 [876]BCD =1000 0111 0110 876= 36CH =0011 0110 1100BBCD码(Binary Coded Decimal) 二进制代码表示的十进制数。8421 BCD码 BCD码运算BCD码运算十进制调整:计算机实际按二进制法则计算,加入 十进制调整操作,可计算BCD码。 例:计算BCD码 56+67=? 0101 0110 [56]BCD + 0110 0111 + [67]BCD 1011 1101 产生非BCD码和半进位 + 0110 0110 +66H调整 1 0010 0011 带进位结果: 123 null执行DA A后,CPU根据累加器的值,以及AC、CY的状态,来自动的对A进行修正,不需人为的干预。 注意: 1、DA指令不对减法进行修正 例:MOV A,#16 ADD A,#16 DA A A=? MOV A,#56H ADD A,#67H DA A A=? CY=? 20H 23H 1null四、逻辑运算指令 包括与、或、异或、清除、求反、移位等操作。这类指令一般不影响标志位CY、AC和OV。 共24条指令,分成五个小类。 <一>、逻辑“与”指令(6条)<二>、逻辑“或”指令(6条)<三>、逻辑“异或”指令(6条)<四>、累加器A清0与取反指令(2条) <五>、移位指令(4条)逻辑运算是按位进行的; 当需要只改变字节数据的某几位,而其余位不变时,不能使用直接传送方法,只能通过逻辑运算完成。null<一>、逻辑“与”,“或”,“异或”指令(18条) ANL(ORL,XRL) A,Rn ANL(ORL,XRL) A,direct ANL(ORL,XRL) A,@Ri ANL(ORL,XRL) A,#data ANL(ORL,XRL) direct,A ANL(ORL,XRL) direct,#data null说明: (1)目的操作数只能是A或者direct; 按位进行操作 (2)前4条指令仅影响标志位P;后两条不影响标志位; (3)“与”运算常用于使某些位清0;“或”或运算常用于使某些位置1;“异或”运算常用于使某些位取反或不变:用1异或使对应位取反,用0异或使对应位不变,例:试分析下列程序执行结果 MOV A,#0FFH ANL P1,#00H ORL P1,#55H XRL P1,A;(A)=0FFH;SFR中P1口清零;P1口内容为55H;P1口内容为0AAHnull<二>、累加器A清0与取反指令(2条) 1、累加器A清 0 指令 CLR A ; (A)  0 说明:只影响标志位P。 2、累加器A取反指令(按位取反) CPL A ;(A)  (/A) ,相当于0FFH - A  A 说明:不影响标志位。 如: (A)=56H CPL A ;结果为0A9Hnull <三>、移位指令(4条) 1、累加器A循环左移 RL A ; 2、累加器A循环右移 RR A ; 3、累加器A带进位位循环左移 RLC A ; 4、累加器A带进位位循环右移 RRC A ; 说明: (1)各条指令每次只移动一位; (2)左移一位相当于乘以2;右移一位相当于除以2; (3)带进位位移动的影响标志位CY和P。null RL A RR A RLC A RRC A0 0 1 1 1 1 0 1 3BH0 1 1 1 1 0 1 0 7AH0 0 1 1 1 1 0 1 3BH1 0 0 1 1 1 1 0 9EH0 0 1 1 1 1 0 1 3BH1 0 0 1 1 1 1 0 9EH0 0 1 1 1 1 0 1 3BH0 1 1 1 1 0 1 1 7BH1 0 1 1 null五、控制转移类指令 包括无条件转移、条件转移、子程序调用和返回指令等,共17条。 只有比较转移指令影响标志。 <一>、无条件转移指令(4条) <二>、条件转移指令(8条)<三>、子程序调用和返回指令(4条)<四>、空操作指令(1条)null1、长转移指令 LJMP addr16 ; (PC)  addr16 说明:转移范围:64KB全部程序空间任何单元。 如: LJMP NEXT(PC)<一>、无条件转移指令(4条)null2、绝对转移指令 AJMP addr11 ;先(PC) (PC)+2 ;再( PC10~0 )  addr11, ( PC15~11 )不变 说明: (1)两字节编码 (2)转移范围:含有下一条指令首地址的同一个2KB范围,即 高5位地址相同 ; 如: 2800H AJMP SUB 若SUB=543H 则PC=?(PC)2D43Hnull 3、短转移指令 SJMP rel ;先(PC)+2(PC),后(PC)+rel(PC) 说明:(1)两字节编码 (2)rel是补码形式存在,转移范围:-128~+127;对应rel值为:00H~7FH(0~+127)、80H~FFH(-128~-1); 如: HERE: SJMP HERE ;无限循环执行本指令,REL= ? SJMP $ ;与上条指令相同 例: 1100H SJMP 25H PC=? 1100H SJMP E7H PC=?FEH三种跳转对比三种跳转对比 AJMP addr11 LJMP addr16 SJMP rel 11位地址,跳转2K 16位地址,跳转64K 8位地址,跳转256 256 2K 64Knull 4、间接转移指令 JMP @A+DPTR ;(A)+(DPTR)(PC) 说明:(1)具有多分枝转移功能,即散转功能,又叫散转指令; (2)转移范围:是以DPTR为首地址的256B。 DPTR作为基址寄存器,A作为变址寄存器。转移范围64KB. null例 根据累加器A中的命令键键值,设计命令键操作程序入口跳转表。 CLR C RLC A MOV DPTR,JPTAB JMP @A+DPTR JPTAB: AJMP CCS0 AJMP CCS1 AJMP CCS2 AJMP CCS3 :1、本程序为典型的散转程序,非常适合类似根据键盘值跳转。 2、A必须取偶数的原因是:AJMP为双字节指令;如果全部改为 LJMP三字节指令,则A必须为0、3、6、9、12时,程序才能正 确散转。null<二>、条件转移指令(8条) 均为相对寻址方式。 1、累加器A为零(非零)转移指令(2条) JZ rel ;当A=0时,(PC)+2+rel(PC)转移; ;当A≠0时,顺序执行(PC)+2(PC) 。 JNZ rel ;当A≠0时, (PC)+2+rel(PC)转移; ;当A=0时,顺序执行(PC)+2(PC) 。null例 将外部RAM的一个数据块(首址为DATAl)传送到内部RAM(首址为DATA2),遇到传送的数据为零时停止。解: START:MOV R0,#DATA2 ; 置内部RAM数据指针 MOV DPTR,#DATAl ; 置外部RAM数据指针 LOOPl:MOVX A,@DPTR ; 外部RAM单元内容送A JZ LOOP2 ; 判传送数据是否为零,A为零则转移 MOV @R0,A ; 传送数据不为零,送内部RAM INC R0 修改地址指针 INC DPTR SJMP LOOP1 ; 继续传送 LOOP2:RET ; 结束传送,返回主程序null 2、比较转移指令(4条) 均为三字节指令。一般形式为: CJNE X1(目的操作数),X2(源操作数),rel 语句说明:CJNE X1 , X2,rel ;若X1 > X2 ,则(PC)+3+rel ( PC ) ,且0CY ; ;若X1 < X2 ,则(PC) +3 +rel ( PC ) ,且1CY ; ;若X1 = X2 ,则顺序执行(PC)+3 ( PC ) ,且0CY。 实质是进行一次减法操作。(目的操作数-源操作数),相减结果若为负,则借位标志CY置1。不影响两个操作数CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE @Ri,#data,relnullnullrel可以是转移目标地址的标号 例:设变量X存放在40H单元,要求编写按下式给Y赋值的程序,结果存入41H X>0,Y=2; X=0,Y=0 X<0,Y=-2 null解:参考程序如下 MOV A,40H ;取X JZ NEX2 ;X=0,转NEX2 JNB ACC.7,NEX1 ;X>0,转NEX1 MOV A,#FEH ;X<0,则A= -2 SJMP NEX2 NEX1:MOV A,#02H NEX2:MOV 41H,A SJMP $ null 3、减1非零条件转移指令(2条) DJNZ Rn,rel ;(Rn)-1Rn; ;若(Rn)≠0, 则(PC)+2+rel PC ; ;若(Rn) = 0, 则结束循环, 顺序执行(PC)+2 PC DJNZ direct,rel ;( direct )-1 direct ; ;若(direct)≠0,则(PC)+3+rel PC ; ;若(direct) = 0,则结束循环, 顺序执行(PC)+3 PC 说明: Rn、direct相当于控制循 环的计数器 。null例:将外部RAM地址1000H~10FFH的256个单元清零。 MOV R2,#0FFH MOV DPTR,#1000H CLR A LOOP: MOVX @DPTR,A INC DPTR DJNZ R2,LOO
本文档为【第3章 MCS-51单片机指令系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_075793
暂无简介~
格式:ppt
大小:4MB
软件:PowerPoint
页数:0
分类:工学
上传时间:2011-06-10
浏览量:38