1 / 73

第 3 章 MCS-51 指令系统 Instruction Set

第 3 章 MCS-51 指令系统 Instruction Set. 指令系统概述 MCS-51 指令的寻址方式 MCS-51 指令系统介绍. 3.1 指令系统概述. 指令 —— 计算机能够识别和执行的命令。 指令系统 —— 指令的集合或全体,因机器而异。. 指令的 三种表示形式 二进制形式 —— 直接为 CPU 执行 16 进制形式 —— 阅读和书写 汇编形式 —— 编写程序。. MCS-51 指令系统. 51 系列单片机指令集含有 111 条指令 按指令 所占字节数 分类:

lee-snider
Télécharger la présentation

第 3 章 MCS-51 指令系统 Instruction Set

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第3章 MCS-51 指令系统Instruction Set 指令系统概述 MCS-51 指令的寻址方式 MCS-51 指令系统介绍

  2. 3.1 指令系统概述 指令——计算机能够识别和执行的命令。 指令系统——指令的集合或全体,因机器而异。 指令的三种表示形式 二进制形式——直接为CPU执行 16进制形式——阅读和书写 汇编形式——编写程序。

  3. MCS-51指令系统 51系列单片机指令集含有111条指令 按指令所占字节数分类: 单字节(49条);双字节(46条);3字节(16条) 按指令执行时间分类: 单周期(64条);双周期(45条);4周期(2条) 按指令的功能分类: 数据传送类(29条);算术运算类(24条); 逻辑运算及移位类(24);控制转移类(17条); 位操作类(17条)

  4. MCS-51 指令格式 LOOP:MOV A, R0;将R0的内容送A [标号:]操作码 [目的操作数][,源操作数][;注释] 方括符[ ]表示可选项 标号代表指令所在地址,1-8个字母/数字,“:”结尾 操作码就是指令功能助记符,指令实体 目的操作数 源操作数 注释,以 “; ”开头

  5. MCS-51 指令中所用符号说明 • Rn ——R0~R7中的一个 • #data ——8位立即数 • #data16 ——16位立即数 • direct ——8位直接地址 • @Ri——R0或R1,可以间接寻址 • @DPTR ——可按DPTR中地址对外部存储器寻址 • bit ——8位位地址 • addr11 ——11位目标地址 • addr16 ——16位目标地址 • rel——8位地址偏移量 • $——当前指令的地址

  6. 3.2 MCS-51 指令的寻址方式 寻址方式:用何种方式寻找参与运算的操作数或操作数的真实地址。 MCS-51单片机有七种寻址方式: • 立即寻址 • 直接寻址 • 寄存器寻址 • 寄存器间接寻址 • 变址寻址(基址寄存器+变址寄存器间接寻址) • 相对寻址 • 位寻址

  7. 3.2.1 立即寻址Immediate Addressing 指令直接给出一个操作数,它紧跟在操作码后,通常称它为立即数(8位或16位)。 指令形式: 操作码 立即数 特点:指令码中含有操作数本身 例如: MOV A, #30H ;A ← #30H MOV DPTR, #8000H ;DPTR ← #8000H

  8. 3.2.2 直接寻址 指令直接给出操作数所在存储单元的地址,它紧跟在操作码后。 此方式是访问专用寄存器的唯一方式(80H ~ FFH) 也可访问内部RAM的低128(8052的256)字节 操作码 操作码 指令形式: 操作码 操作数地址 目的操作数地址 操作数地址 立即数 源操作数地址 特点:指令码中含有操作数地址,机器根据该地址寻找 操作数。 例如: MOV A, 30H ; A ←(30H) ANL 30H, #30H ;(30H)←(30H)∧#30H MOV 50H, 30H ;(50H)←((30H))

  9. 3.2.3 寄存器寻址 指令选定的寄存器内容就是实际操作数,寄存器可为: R0~R7,由RS1、RS2两位的值选定工作寄存器区 A、B、CY(位),DPTR 指令形式: 操作码 操作码 操作码 立即数 直接地址 特点:指令码中含有操作数地址所在的寄存器号,根据 该寄存器号可以找到操作数。 例如: MOV A, R3 ;A ←(R3) ANL A, #30H MOV R0, 30H

  10. 3.2.4 寄存器间接寻址 指令所选中的寄存器内容是实际操作数地址(而不是操作数) 寻址范围 内部RAM(00H-7FH/FFH)使用寄存器R0,R1,SP 外部数据存储器(0000H-FFFFH) 指令形式: 操作码 操作码 操作码 立即数 直接地址 特点:操作数所指定的寄存器中存放的不是操作数本身,而是操作数的地址。 例如: MOV A, @R0 ;A ← ((R0)) MOVX A, @DPTR ;A ← ((DPTR)) MOV @R0, #30H MOV @R0, 30H

  11. 3.2.5 变址寻址(基址寄存器+变址寄存器间接寻址) 此种寻址方式以DPTR或PC作基址寄存器,A作变址寄存器(存放8位无符号数),两者相加形成16位程序存储器地址作操作数地址。 指令形式: 操作码 此指令用于查表 特点: 操作数=基地址+地址偏移量 指令码内隐含存放基地址的寄存器(DPTR/PC)号 DPTR/PC中的基地址常常是表格的起始地址,累加器中存放偏移量rel。 例如: MOVC A, @A+DPTR MOVC A, @A+PC

  12. 程序存储区 A DPH 20 E0 2040H 93 DPL 00 2041H … …… ALU 20E0H 47 如:MOVC A,@A+DPTR 设DPTR=2000H,A=E0H 47 指令代码 20E0H

  13. 3.2.6 相对寻址 此种寻址方式以程序计数器PC的内容为基地址,加上指令中给出的偏移量rel,所得结果为转移目标地址,用于转移指令。 偏移量rel是一8位有符号补码数,范围128~+127。所以转移范围应在当前PC指针的128~+127之间某一程序存储器地址中。 指令形式: 操作码 操作码 操作码 rel 直接地址 立即数 rel rel 特点: 操作码中含有相对地址偏移量rel 目标地址=源地址+转移指令字节数rel 源地址=相对转移指令的始址 例如: JNZ rel ;累加器A不等于零则转移 JBBIT,rel CJNE A,#data,rel

  14. 程序存储区 1000H 40 1001H23 1002H 30 …… ALU 1024H 47 1025H 45 如:JC 23H 指令代码 1002H 23H 当前PC 1025H

  15. 3.2.7 位寻址 以访问触发器的方式对内部RAM、特殊功能寄存器SFR中的位地址空间进行访问称之为位寻址。可被寻址的位: 片内RAM的20H~2FH单元,位地址00H ~ 7FH; SFR中12个能被8整除的字节地址,位地址80H以上。 特点: 操作数是8位二进制数中的某位 指令码中含有位地址 位地址用bit表示 例如: MOV C,00H ;(C) ← (00H) ANL C,90H ;(C) ← (C)∧((90H))

  16. 方式 利用的变量 使用的空间 寄存器 R0~R7,A,B,CY,DPTR 片 内 直接寻址 direct 片内RAM低128字节 特殊功能寄存器SFR 寄存器间址 @R0,@R1,@SP @R0,@R1,@DPTR 片内RAM 片外RAM与I/O口 立即数 #data 程序存储器 基址加变址 @A+PC @A+DPTR 程序存储器 相对寻址 PC+rel 程序存储器 位寻址 bit 片内RAM的20H~2FH 部分SFR 总结 寻址方式与相应的寻址空间

  17. 3.3 MCS-51 指令系统介绍 • 数据传送类指令: (29条) • 算术运算类指令: (24条) • 逻辑运算及移位类指令: (24条) • 控制转移类指令: (17条) • 位操作(布尔操作)类指令:(17条)

  18. 3.3.1 数据传送指令(5种/29条) • 内部存储器间传送: (MOV — 16条) • 外部数据存储器与累加器间传送: (MOVX — 4条) • 程序存储器向累加器传送: (MOVC — 2条) • 数据交换: (XCH,XCHD,SWAP — 5条) • 堆栈操作: (PUSH,POP — 2条)

  19. Acc 累加器 @Ri 间接寻址 Direct 直接寻址 Rn 寄存器 #data 立即数 内部存储器间数据传送路径

  20. 内部数据传送指令(16条) 特点:源操作数在内部,目的操作数也在 内部。 分四类介绍如下 以累加器A为目的字节的传送指令(4条) 以Rn为目的字节的传送指令(3条) 以直接地址为目的字节的传送指令(5条) 以间接地址为目的字节的传送指令(4条)

  21. 以累加器A为目的字节的传送指令 (1)立即数送累加器 MOV A,#data ;A ←#data (2)寄存器内容送累加器 MOV A,Rn ;A ← (Rn) (n=0~7) (3)内部RAM或SFR内容送累加器 MOV A,direct ; A ← (direct) (4)内部RAM内容送累加器 MOV A,@Ri ;A ← ((Ri)) (i=0,1)

  22. 以Rn为目的字节的传送指令 (5)立即数送寄存器 MOV Rn,#data ; (Rn) ← #data (n=0~7) (6)累加器内容送寄存器 MOV Rn,A ;Rn ← (A) (n=0~7) (7)内部RAM或SFR内容送寄存器 MOV Rn,direct ;Rn ← (direct) (n=0~7)

  23. 以直接地址为目的字节的传送指令 (8)立即数送内部RAM或SFR MOV direct,#data ; direct ← #data (9)累加器内容送内部RAM或SFR MOV direct ,A ; direct ← (A) (10)寄存器内容送内部RAM或SFR MOV direct ,Rn ; direct ← (Rn) (n=0~7) (11)内部RAM或SFR之间直接传送 MOV direct1,direct2 ; direct1 ← (direct2) (12)内部RAM内容送内部RAM或SFR MOV direct,@Ri ; direct ← ((Ri)) (i=0,1)

  24. 以间接地址为目的字节的传送指令 (13)立即数送内部RAM MOV @Ri ,#data ; (Ri) ← #data(i=0,1) (14)累加器内容送内部RAM MOV @Ri ,A ; (Ri) ← (A)(i=0,1) (15)内部RAM或SFR内容送内部RAM MOV @Ri ,direct ; (Ri) ← (direct)(i=0,1) (16)16位立即数传送指令 MOV DPTR ,#data16 ; DPTR ← #data16 ; DPH ← #dataH ; DPL ← #dataL

  25. 外部数据存储器与累加器间传送指令(4条) 格式: MOVX A,@DPTR ;A ← ((DPTR)) MOVX @DPTR,A ; (DPTR) ← (A) MOVX A,@Ri ; A ← ((Ri)) (i=0,1) MOVX @Ri , A ; A ← ((Ri)) (i=0,1) 特点: 单字节指令 第1、2条指令可以在外部RAM 64K范围寻址; 第3、4条指令可以对外部RAM的第0页寻址; 寻址范围是0000H~00FFH。

  26. 说明: 1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。 在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。 比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。

  27. 2.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。 3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。 例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。 MOV DPTR,#0100H MOVX A,@DPTR MOV DPTR,#0200H MOVX @DPTR,A

  28. 程序存储器向累加器传送指令(2条) 格式: MOVC A,@A+DPTR ; A ← ((A)+(DPTR)) MOVC A,@A+PC ; PC ← (PC)+1 ; A ← ((A)+(PC)) 特点: 这两条指令为单字节查表指令 DPTR、PC中存放被查表的始址 功能: 根据A中项数,查得表中对应值送入累加器A中。

  29. DPH DPL 45H 34H 23H 12H R7 R1 R0 XX XX XX XX XX XX XX XX XX XX XX XX XX 30 34 XX XX 23 XX XX XX XX 30 34 34 12 23 67 12 34 34 30 34 34 12 23 67 12 34 34 30 67 34 12 12 应用举例 给出每条指令执行后的结果 ;(23H)=30H ;(12H)=34H ;R0=23H MOV 23H,#30H MOV 12H,#34H MOV R0,#23H MOV R7,12H MOV R1,#12H MOV A,@R0 MOV 34H,@R1 MOV 45H,34H MOV DPTR,#6712H MOV 12H,DPH MOV R0,DPL MOV A,@R0 ;R7=34H ;R1=12H ;A=30H ;(34H)=34H ;(45H)=34H ;DPTR=6712H ;(12H)=67H ;R0=12H ;A=67H 内部RAM

  30. P1.0 P1.1 P1.2 P1.3 5v P1.4 P1.5 P1.6 P1.7 应用举例1 MOV P1, #0FEH ; 11111110B可以使P1.0上的发光二极管点亮MOV P1, #0F0H ; 11110000B可以使P1口上的上面4个发光二极管点亮,8051的输入/输出口都是漏极开路输出,其中P1、P2和P3口内部有30K欧的上拉电阻,属于电压输出型。但是从外部流入10~20mA的电流是可以的。

  31. P1.0 a P1.1 b P1.2 c P1.3 d 5v P1.4 e P1.5 f P1.6 g P1.7 dp 8段数码管显示 MOV P1, #00H ; 显示 8. MOV P1, #0F8H ; 显示 7 MOV P1, #88H ; 显示 A

  32. 一位数码管轮流显示0-F实验 • 硬件连接如上页所示,实现一位数码管轮流显示0-F的程序如下: ORG 0000H AJMP START ORG 0030H • START: MOV SP,#60H ;

  33. 应用举例2 单片机的一个引脚输出的高低电平,可以通过“光电耦合器”控制继电器,从而以“弱电”控制“强电”。

  34. 数据交换指令(5条) 格式: XCH A,Rn ; (A)↔(Rn) (n=0~7) XCH A,direct ; (A) ↔(direct) XCH A,@Ri ; (A) ↔((Ri)) (i=0,1) XCHD A,@Ri ; (A3~0) ↔((Ri)3~0) (i=0,1) SWAP A ; (A3~0) ↔(A7~4) 特点: XCH是Exchange的缩写 前三条指令执行后会影响PSW中的P标志。 XCHD是Exchange Decimal的缩写, 使用该指令前应预先给Ri中置地址。

  35. 堆栈操作指令(2条) 格式: PUSH direct ; SP ← (SP)+1 ;(SP) ← (direct) POP direct ; direct ← ((SP)) ;SP ← (SP)1 特点: Rn和A不能直接用在本指令中,A必须用ACC(或E0H),Rn也要用它的物理地址。

  36. 3.3.2 算术运算指令(24条) 不带进位加: (ADD — 4条) 带进位加: (ADDC — 4条) 增量指令: (INC — 5条) 十进制调整指令: (DA — 1条) 减法指令: (SUBB — 4条) 减量指令: (DEC — 4条) 乘法指令: (MUL — 1条) 除法指令: (DIV — 1条)

  37. 不带进位加指令(4条) 格式: ADD A,#data ; A ← (A)+#data ADD A,Rn ; A ← (A)+(Rn) (n=0~7) ADD A,@Ri ; A ← (A)+((Ri)) (i=0,1) ADD A,direct ; A ← (A)+(direct) 特点: 两个操作数均为8位,其中之一是累加器A; 加法操作在ALU中完成,结果送回累加器,运算时产生的标志位在PSW中; 不论两操作数是否为带符号数,机器均按带符号数运算。

  38. 例 分析加法指令执行结果 例: 请分析如下指令执行后累加器A和PSW中内容是什么? MOV A,#5AH ADD A,#6BH 求解: A=0 1 0 1 1 0 1 0B + data=0 1 1 0 1 0 1 1B Cy 1 1 0 0 0 1 0 1B PSW:

  39. 带进位加指令(4条) 格式: ADDC A,#data ; A ← (A)+#data+Cy ADDC A,Rn ; A ← (A)+(Rn)+Cy (n=0~7) ADDC A,@Ri ; A ← (A)+((Ri))+Cy (i=0,1) ADDC A,direct ; A ← (A)+(direct)+Cy 特点: 注释中的Cy中内容为指令执行前Cy内容,指令执行后形成新的Cy保留在PSW中,其余和不带Cy的加法指令相同; 本类指令用于多字节加法程序中。

  40. 增量指令(5条) 格式: INC A ; A ← (A)+1 INC Rn ; Rn ← (Rn)+1 (n=0~7) INC direct ; direct ← (direct)+1 INC @Ri ; (Rn) ← ((Rn))+1 (n=0,1) INC DPTR ; DPTR ← (DPTR)+1 特点: INC是Increase的缩写; 本指令仅对PSW中P标志有影响。

  41. 十进制调整指令(1条) 格式: DA A 操作: 若累加器低4位大于9或BCD码加时有半进位AC=1, 则A ← (A)+06H  若累加器高4位大于9或BCD码加时有全进位CY=1, 则A ← (A)+60H。 特点: DA是Decimal Adjust的缩写; 紧跟加法指令后,对加法结果调整; 用于BCD加、BCD减运算。

  42. BCD加法 ALU只能进行二进制加法(即低4位向高4位逢16进1),为实现BCD加法,就必须对ALU的加法结果进行BCD调整,使其变成BCD数(BCD加法是逢10进1的)。 例:写出85+59=144BCD加法程序,并对加法过程和BCD调整进行分析。 求解:ORG 1000H MOV A,#85H ; A ← #85H ADD A,#59H ; A ← (A)+#59H DA A ; A ← #44H,Cy=1 SJMP $ END

  43. A=1 0 1 1 0 0 1 1 B 85 + data=0 1 1 1 0 1 0 1 B + 59 1 1 0 1 1 1 1 0 B 144 + 1 1 1 0 0 1 0 0 B + Cy=1 0 1 0 0 0 1 0 0 B BCD加法 上例加法操作及BCD调整过程: 0 0 0 0 0 1 1 0 B 加06H调整 加60H调整 0 1 1 0 0 0 0 0 B Cy中的进位1是百位BCD,累加器A中的高低4位分别是十位BCD和个位BCD(即44H)。

  44. BCD减法 DA A指令只能用在加法指令后,对二进制加法结果进行调整。BCD减法可以采用以下方法: 1、求减数的补码; 2、进行被减数+减数补数运算; 3、对所得两数之和进行BCD调整。 例:写出91-34=57的BCD减法程序。 求解: ORG 1000H CLR C ; C ← 0 MOV A,#9AH ; A ←#9AH SUBB A,#34H ; 求[-34]补 ADD A,#91H ;求91+[-34]补 DA A ; BCD调整 SJMP $ END

  45. BCD加法 上例减法操作及BCD调整过程: A=1 0 0 1 1 0 1 0 B 99 - [34]BCD=0 0 1 1 0 1 0 0 B - 34 [-34]补=0 1 1 0 0 1 1 0 B 57 + 91=1 0 0 1 0 0 0 1 B 1 1 1 1 0 1 1 1 B 加60H调整 0 1 1 0 0 0 0 0 B + Cy=1 0 1 0 1 0 1 1 1 B

  46. 减法指令(4条) 格式: SUBB A,#data ; A ← (A)#dataCy SUBB A,Rn ; A ← (A)(Rn)Cy (n=0~7) SUBB A,direct ; A ← (A)  (direct) Cy SUBB A, @Ri ; A ← (A)((Ri))Cy (n=0,1) 特点: SUBB是Subtraction Borrow的缩写; 本指令用于单字节、多字节减法程序; 机器按带符号数运算,并产生PSW中标志; 形成OV标志的规则为: 正数-正数 不会溢出,故OV=0; 负数-负数 不会溢出,故OV=0; 正数-负数 若差为负,则OV=1; 负数-正数 若差为正,则OV=1。

  47. 减量指令(4条) 格式: DEC A ; A ← (A)1 DEC Rn ; Rn ← (Rn)1 (n=0~7) DEC direct ; direct ← (direct)  1 DEC @Ri ; (Ri) ← ((Ri))1 (n=0,1) 特点: DEC是Decrease的缩写; DEC A指对PSW中P标志有影响。 功能: 使源地址所对应的RAM单元中内容减1。

  48. 乘、除法指令(2条) 格式: MUL AB ; B A ← (A)×(B) ; Cy←0 DIV A B ; A ← (A)/(B)的商; ; B ← (A)/(B)的余数; ; Cy ← 0,OV ← 0 特点: MUL是Multiply的缩写, DIV是Divide的缩写; 单字节指令,执行时间为48T(4机器周期); 操作数均为8位无符号数。

  49. 3.3.3 逻辑运算指令(24条) 逻辑与指令: (ANL — 6条) 逻辑或指令: (ORL — 6条) 逻辑异或指令: (XRL — 6条) 累加器清除与求反指令: (CLR、CPL — 2条) 移位指令: ( RL、RLC、RR、RRC — 4条)

  50. 逻辑与指令(6条) 格式: ANL A,#data ; A ← (A)∧#data ANL A,Rn ; A ← (A)∧(Rn) (n=0~7) ANL A,direct ; A ← (A)∧(direct) ANL A, @Ri ; A←(A)∧((Ri)) (n=0,1) ANL direct,A ; direct ← (direct)∧(A) ANL direct,#data ; direct ← (direct)∧#data 特点: ANL是AND Logical的缩写; 前四条指令执行后会对PSW中P标志产生影响。 用途: 可从某字节中取出某几位。

More Related