1 / 67

第二讲:指令与编程

第二讲:指令与编程. 本讲重点: 寻址方式; MCS-51 指令集; 伪指令; 汇编语言与简单程序设计. 第三章 指令系统及程序设计 ( P.43 ). 51 系列单片机指令集含有 111 条指令. 每条指令在程序存储器 ROM 中占据一定的 空间 ,以字节为单位。按指令 所占字节数 分类: 单字节 (49 条 ); 双字节 (46 条 ); 3 字节 (16 条 ). 每条指令在执行时要花去一定的 时间 ,以机器周期为单位。按指令 执行时间 分类: 单周期 (64 条 ); 双周期 (45 条 ); 4 周期 (2 条 ).

Download Presentation

第二讲:指令与编程

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. 第二讲:指令与编程 本讲重点: 寻址方式; MCS-51指令集; 伪指令; 汇编语言与简单程序设计. 《单片微机原理及应用》教学课件

  2. 第三章指令系统及程序设计(P.43) 51系列单片机指令集含有111条指令 每条指令在程序存储器ROM中占据一定的空间,以字节为单位。按指令所占字节数分类: 单字节(49条);双字节(46条);3字节(16条) 每条指令在执行时要花去一定的时间,以机器周期为单位。按指令执行时间分类: 单周期(64条);双周期(45条);4周期(2条) 按指令的功能分类,可分为5大类: 数据传送类(29条);算术运算类(24条) 逻辑运算及移位类(24);控制转移类(17条) 位操作类(17条) 《单片微机原理及应用》教学课件

  3. ASM-51指令的格式(P.44) [标号:]操作码 [目的操作数][,源操作数][;注释] • 方括符[ ]表示可选项 • 标号代表指令所在地址,1-8个字母/数字,“:”结尾 • 操作码就是指令功能助记符,指令实体 • 目的操作数 • 源操作数 • 注释,以“;”开头 《单片微机原理及应用》教学课件

  4. 51单片机指令的寻址方式(P.45) 寻址方式:指令按地址获得操作数的方式 七种寻址方式,一条指令可能含多种寻址方式 • 寄存器寻址 • 立即寻址 • 寄存器间接寻址 • 直接寻址 • 变址寻址(基址寄存器+变址寄存器间接寻址) • 相对寻址 • 位寻址 《单片微机原理及应用》教学课件

  5. 寄存器寻址——(P.45) 从寄存器中读取操作数或存放操作数进寄存器 例:MOV A,B ; (A) ←(B) MOV 30H,R0;(30H)←(R0) MOV A,R1 ; (A) ←(R1) 《单片微机原理及应用》教学课件

  6. 立即寻址——(P.45) 操作数直接就出现在指令中 例:MOV A,#64H ;(A)← 立即数 64H ADD A,#05H;(A)←(A)+立即数 05H 注意:符号“#”表明其后跟的是立即数, 立即数——就是数字量本身。 《单片微机原理及应用》教学课件

  7. 寄存器间接寻址——(P.46) 寄存器中的内容是一个地址,由该地址单元 寻址到所需的操作数 例:[ MOV R1,#30H ;(R1)← 立即数30H] [ MOV R1,#30H ;(R1)← 立即数30H] MOV @R1,#0FH ;(30H)←立即数0FH MOV A,@R1 ;(A)←((30H))=#0FH 注意: 1)“间接”表示某寄存器中的“内容”只是一个“单元地址”,这个地址单元中存放的数据才是要找的“操作数”。 2)符号“@”表示“在…”,其含义与读音皆同“at”。 《单片微机原理及应用》教学课件

  8. 直接寻址——(P.46) 指令中直接给出了操作数所在单元的地址或名称 例:MOV R1,1FH;(R1) ←(1FH) MOV 30H,4AH;(30H)←(4AH) 在本单片机中规定:访问特殊功能寄存器SFR只能采用直接寻址方式。例如: MOV A, SP ; (A) ←(SP) MOV A, 81H ; (A) ←(SP)MOV P1, #5AH ; (P1)←(#5AH) MOV 90H,#5AH ; (P1)←(#5AH)MOV B, 30H ; (B) ←(30H) 相同 相同 SFR的地址见 P.33表 《单片微机原理及应用》教学课件

  9. 在本单片机中访问特殊功能寄存器SFR只能采用直接寻址方式的原因:SFR分布在80H~0FFH范围内,而52系列单片机有256字节的片内RAM,其中的80H~0FFH的RAM与SFR所占地址重叠。在本单片机中访问特殊功能寄存器SFR只能采用直接寻址方式的原因:SFR分布在80H~0FFH范围内,而52系列单片机有256字节的片内RAM,其中的80H~0FFH的RAM与SFR所占地址重叠。 于是规定: 80H~0FFH范围内的RAM只能用寄存器间接寻址方式,而SFR只能用直接寻址方式。从而解决了地址冲突的问题。例如: MOV A, 90H等效于 MOV A,P1 属直接寻址 MOV A, @R0;[事先已知 (R0) = #90H ]执行的操作:A ←(90H)属寄存器间接寻址, 随意写的指令如:MOV A, 85H则是非法的! 《单片微机原理及应用》教学课件

  10. 存储器配置(片内RAM) • 89C51片内RAM128字节(00H—7FH) • 89C52片内RAM256字节(00H—0FFH) 只能寄存器间接寻址 FFH FFH SFR分布在80H-FFH 其中92个位可位寻址 52子系列才有 的RAM区 80H 80H 89C52 256字节 7FH 普通RAM区 89C51 128字节 只能直接寻址 30H 2FH 位寻址区 20H 1FH 工作寄存器区 00H 《单片微机原理及应用》教学课件

  11. 变址寻址——(P.47) 也称为: 基址寄存器+变址寄存器间接寻址 以16位的地址指针寄存器DPTR或 16位的PC寄存器为基址寄存器,以累加器 A 为变址寄存器,两者中的“内容”形成一个16位的“地址”,该“地址”所指的存储单元中的内容才是操作数。 P47例:[设:A中已存有#A4H,DPTR中已存有#1234H] MOVC A,@A+DPTR;(A)←((A)+(DPTR)) 操作:将A4H+1234H=12D8H单元中的数放进累加器A 《单片微机原理及应用》教学课件

  12. 相对寻址——(P.47) 当前PC值加上指令中规定的偏移量 rel,构成实际的操作数地址 例: SJMP rel 操作:跳转到的目的地址=当前16位PC值 + rel 注意: 1)“当前PC值”指程序中下一条指令所在的首地址, 是一个16位数; 2)符号“rel”表示“偏移量”,是一个带符号的单字 节数,范围是:-128—+127(80H—7FH), 在实际编程中,“rel”通常用标号代替 《单片微机原理及应用》教学课件

  13. 位寻址——(P.48) 指令中直接给出了操作数所在的位地址。 例: CLR P1.0;(P1.0) ← 0 SETB ACC.7;(ACC.7)← 1 CPL C;( C )← NOT( C ) 注意: 1)位地址里的数据只可能是一个0或1 2)有的位地址十分明确,如P1.0, ACC.7等, 有的位地址则“不太明确”,如: [MOV A,17H ; (A)←(17H),17H是字节地址] MOV ACC.0,17H ;(ACC.0)←(17H),这里ACC.0 是位地址所以该指令中的17H是22H单元的第7位 《单片微机原理及应用》教学课件

  14. 片内RAM中有128个位可按位寻址的位,位地址:00H—7FH分布在:20H—2FH单元;片内RAM中有128个位可按位寻址的位,位地址:00H—7FH分布在:20H—2FH单元; • 另外,在SFR中还有92个位可按位寻址 D7 D6 D5 D4 D3 D2 D1 D0 7F 7E 7D 7C 7B 7A 79 78 2FH 位地址 47 46 45 44 43 42 41 40 28H 总共128个可按位寻址的位 FFH 3F 3E 3D 3C 3B 3A 39 38 27H 52子系列才有 的RAM区 37 36 35 34 33 32 31 30 26H 2F 2E 2D 2C 2B 2A 29 28 25H 80H 27 26 25 24 23 22 21 20 24H 7FH 1F 1E 1D 1C 1B 1A 19 18 23H 普通RAM区 17 17 16 15 14 13 12 11 10 22H 30H 2FH 0F 0E 0D 0C 0B 0A 09 08 位寻址区 21H 20H 1FH 工作寄存器区 07 06 05 04 03 02 01 00 20H 00H 单元地址 《单片微机原理及应用》教学课件

  15. 位寻址——(P.48) 指令中直接给出了操作数所在的位地址。 例: CLR P1.0;(P1.0) ← 0 SETB ACC.7;(ACC.7)← 1 CPL C;( C )← NOT( C ) 注意: 1)位地址里的数据只可能是一个0或1 2)有的位地址十分明确,如P1.0, ACC.7等, 有的位地址则“不太明确”,如: [MOV A,17H ; (A)←(17H),17H是字节地址] MOV ACC.0,17H ;(ACC.0)←(17H),这里ACC.0 是位地址所以该指令中的17H是22H单元的第7位 《单片微机原理及应用》教学课件

  16. MCS-51指令集 功能分五类,共111条指令 《单片微机原理及应用》教学课件

  17. MCS-51指令集(五大类功能)P.49页 数据传送类指令: (29条) 算术运算类指令: (24条) 逻辑运算及移位类指令: (24条) 控制转移类指令: (17条) 位操作(布尔操作)类指令:(17条) 《单片微机原理及应用》教学课件

  18. (一)数据传送类指令(5种/29条)P.49 内部存储器间传送: (MOV——16条) 外部数据存储器与累加器间传送: (MOVX——4条) 程序存储器向累加器传送: (MOVC——2条) 数据交换:(XCH,XCHD,SWAP——5条) 堆栈操作: (PUSH,POP——2条) ——见P.49的表3-2 《单片微机原理及应用》教学课件

  19. (一)数据传送类指令(5种/29条) 内部存储器间传送指令 (16条): MOV 类指令的操作方向总是后面的 操作数 指向前面的操作数! 例:MOV A,30H ——(A)(30H) Rn: R0—R7 @Ri: @R0,@R1 #data:8位立即数 #data16:16位立即数 direct:直接地址 rel: 8位带符号偏移量 Acc 累加器 Direct 直接寻址 @Ri 间接寻址 Rn 寄存器 #data 立即数 《单片微机原理及应用》教学课件

  20. 数据传送类指令(续) P.52 外部数据存储器与累加器间传送 (4条): MOVX类指令可在累加器与以@DPTR或@Ri所代表的外部 RAM之间进行数据传送。 例如: MOVX A, @DPTR ——(A) ((DPTR)) MOVX A, @Ri ——(A)((Ri)) MOVX @DPTR, A ——((DPTR)) (A) MOVX @Ri, A ——((Ri)) (A) 《单片微机原理及应用》教学课件

  21. 数据传送类指令(续) P.52 程序存储器向累加器传送指令(2条): MOVC A,@A+DPTR MOVC A,@A+PC ——通常称为查表指令,寻址方式属: “基址寄存器+ 变址寄存器间接寻址” @A+DPTR或@A+PC指向程序存储器中的某单元。拟传送给累加器ACC 的数据就是程序中事先写进去的表格数据。这些表格数据往往用伪指令 DB,DW 等定义在程序中。 《单片微机原理及应用》教学课件

  22. 数据传送类指令(续) 数据交换指令(5条):——P.53 XCH A,direct (字节互换) XCH A,@Ri (字节互换) XCH A,Rn (字节互换) (A) (direct)[或((Ri)),或(Rn)] XCHD A,@Ri 累加器 Acc的低4位与((Ri))的低4位互换,各自的高4位不变 SWAP A 累加器 Acc的低4位与自身的高4位互换 《单片微机原理及应用》教学课件

  23. 数据传送类指令(续) 堆栈操作指令(2条): ——P.54 PUSH——压栈指令 POP ——弹栈指令 √堆栈区由特殊功能寄存器堆栈指针SP管理 √堆栈区可以安排在 RAM区任意位置,一般不安排在工作寄存器区和可按位寻址的RAM区,而是放在RAM区的靠后的位置 √堆栈总是指向栈顶 √通常PUSH与POP两条指令成对使用 《单片微机原理及应用》教学课件

  24. 例如:设(A)=7BH; (35H)=11H 并且知道(SP)=60H PUSH ACC ;(61H)  #7BH PUSH 35H ;(62H)  (35H) 即:(62H)  #11H POP ACC ;(A)  (62H) 即:(A) #11H POP 5AH ;(5AH)  (61H) 即:(5AH)  #7BH 《单片微机原理及应用》教学课件

  25. (二)算术运算类指令(6种/24条)P.54 加法运算:(ADD——4条) 带进位加法运算:(ADDC——4条) 带借位减法运算:(SUBB——4条) 加1/减1操作:(INC,DEC——9条) 单字节乘/除法运算: (MUL,DIV——2条) 十进制调整:(DA A——1条) 《单片微机原理及应用》教学课件

  26. (二)算术运算类指令(续) P.55 加法运算:(ADD——4条) 带进位加法运算:(ADDC——4条) 带借位减法运算: (SUBB——4条) 所有的加法(ADD)、带进位加法(ADDC)、带借位减法(SUBB)运算都是以A为一个加数或被减数,最终结果也存进A 。  加法(ADD)、带进位加法(ADDC) 以及带借位减法(SUBB)运算中,如果产生了进位或借位,将自动对PSW中的Cy标志位置“1”。  带进位加法(ADDC):(A)(A)+(Cy)+(第二操作数)带借位减法(SUBB):(A)(A)-(Cy)-(第二操作数)  《单片微机原理及应用》教学课件

  27. (二)算术运算类指令(续) P.57 加1/减1操作:(INC,DEC——9条) INC, DEC与用加/减法指令做加1/减1 操作不同之处在于INC、DEC不影响标志位. 单字节乘/除运算: (MUL,DIV——2条) 两个单字节数的乘/除法运算只在A与B之间进行。 MUL AB: (A)与(B)相乘, 积为16位数, (A)积的高8位; (B)积的低8位 DIV AB: (A)除以(B),结果用2字节表示, (A)商的整数部分;(B)余数 《单片微机原理及应用》教学课件

  28. (二)算术运算类指令(续) P.60 十进制调整:(DA A——1条) 用于两个BCD码之间的相加,这条指令只能跟在 ADD 或 ADDC 之后 BCD码是指“用二进制表达的十进制数”。如: 十进制数20可以用二进制数00010100B表示; 也可以用十六进制数14H表示; 还可以用BCD码 00100000B 或 20H 表示。  4个二进制位就可以表示一位BCD码: 0000~1001 可表示十进制数(BCD数) 0~9;8个二进制位就可以表示两位压缩的BCD码:00000000~10011001 表示 00~99。  《单片微机原理及应用》教学课件

  29. 指令 “DA A”完成的操作:  若(A)3~09或(AC)=1则(A)3~0(A)3~0+6; 若(A)7~49或(CY)=1则(A)7~4(A)7~4+6; P.60例5:两个十进制数“65”与“58”相加,根据常识,显然其和应当为“123”。  6 5 0110 0101 5 8 0101 1000 MOV A,#65H ADD A,#58HDA A 结果:(A)= 23H (CY)= 1  + 6 6 0110 0110 18 19 2 3 1 《单片微机原理及应用》教学课件

  30. 指令 “DA A”完成的操作:  若(A)3~09或(AC)=1则(A)3~0(A)3~0+6; 若(A)7~49或(CY)=1则(A)7~4(A)7~4+6; 又如:两个十进制数“39”与“58”相加,根据常识,显然其和应当为“97”。  3 9 0011 1001 5 8 0101 1000 MOV A,#39H ADD A,#58HDA A 结果:(A)= 97H (CY)= 0  + 6 0110 23 9 7 0 《单片微机原理及应用》教学课件

  31. (三)逻辑运算及移位类指令(5种/24条)—— P.61 逻辑与运算: (ANL——6条) 逻辑或运算: (ORL——6条) 逻辑异或运算: (XRL——6条) 累加器清零/取反: (CLR,CPL——2条) 累加器移位操作: (RL,RLC,RR,RRC—4条) 《单片微机原理及应用》教学课件

  32. 逻辑运算及移位类指令(续) P.61 逻辑与(ANL),逻辑或(ORL),逻辑异或(XRL): 累加器清零/取反操作 (CLR,CPL——2条) CLR A ——对累加器清零 1 Byte 1个Tm CPL A ——对累加器按位取非 1 Byte 1个Tm 《单片微机原理及应用》教学课件

  33. 逻辑运算指令的常见用法 ( 已知累加器A中已存有数:9AH ) 逻辑与ANL用于清0或者保留某些位: 例: ANL A, #0FH; 则(A) = 0AH 逻辑或ORL用于置1或者保留某些位: 例: ORL A, #0FH; 则(A) = 9FH 逻辑异或XRL用于取反或者保留某些位: 例: XRL A, #0FH; 则(A) = 95H (A)  1001 1010 #0FH  0000 1111 95H  1001 0101 《单片微机原理及应用》教学课件

  34. 逻辑运算及移位类指令(续) P.64 累加器移位操作:(RL,RLC,RR,RRC——4条) RL A 左环移 累加器 A RR A 右环移 累加器 A RLC A 带进位位左环移 累加器 A Cy RRC A 带进位位右环移 累加器 A Cy 《单片微机原理及应用》教学课件

  35. (四)控制转移类指令(4种/17条)P.65 此类指令改变程序的执行顺序——改变当前PC值 无条件转移: (LJMP,AJMP,SJMP,JMP——4条) 条件转移(判断跳转): (JZ,JNZ,CJNE,DJNZ——8条) 子程序调用及返回: (LCALL,ACALL,RET,RETI——4条) 空操作: (NOP——1条) “耗时”一个机器周期。do nothing! 《单片微机原理及应用》教学课件

  36. 控制转移类指令(续) P.65-67 无条件转移: LJMP,AJMP,SJMP,JMP——4条 LJMP addr16 长跳转指令 ——可在64K范围内跳转 AJMP addr11 绝对跳转指令 ——可在指令所在的2K范围内跳转 SJMP rel 相对跳转指令 ——可在当前PC-128与+127范围内跳转 JMP @A+DPTR 间接长跳转指令 ——可在以DPTR为基址+A为偏移量 之和所指向的64K程序范围内跳转 《单片微机原理及应用》教学课件

  37. 控制转移类指令(续) P.67-69 条件转移: JZ,JNZ,CJNE,DJNZ——8条 JZ rel JNZ rel ——根据Acc的内容是否为0决定是否跳转 DJNZ direct,rel DJNZ Rn, rel ——将direct(或Rn)里的内容减 1,结果不等于0就跳转;等于0则不跳转继续往下走。 《单片微机原理及应用》教学课件

  38. 条件转移(续) CJNE A,#data, rel CJNE A,direct,rel CJNE @Ri,#data, rel CJNE Rn,#data, rel ——将A(或@Ri,或Rn)与#data(或direct)相比较,其值不相等就跳转;相等则不跳转,继续往下走。 《单片微机原理及应用》教学课件

  39. 控制转移类指令(续) P.70 子程序调用及返回: (LCALL,ACALL,RET,RETI——4条) LCALL addr16 子程序长调用指令 ——可在64K范围内调用子程序 ACALL addr11 子程序绝对调用指令 ——可在指令所在的2K范围内调用子程序 RET 子程序返回指令 ——子程序结束并返回调用的下一条指令 RETI 中断服务子程序返回指令 ——中断结束/返回被打断处的下一条指令 《单片微机原理及应用》教学课件

  40. (五)位操作类指令(17条) P.71 位操作类指令 以位为单位进行逻辑运算及操作,可分为4种: 位传送: (MOV——2条) 位清零/置位: (CLR,SETB——4条) 位逻辑与/或/非运算:(ANL,ORL,CPL——6条) 位条件转移: (JC,JNC,JB,JNB,JBC——5条) 《单片微机原理及应用》教学课件

  41. 位操作类指令(续) P.72 位传送指令(2条): MOV C, bit ——(C)(bit) MOV bit, C ——(bit)(C) 注: bit表示位地址 位清零/置位指令(4条): CLR bit(或C)——(bit或 C)“0” SETB bit(或C)——(bit或 C)“1” 位逻辑与/或/非指令(6条): ANL C,bit(或/bit) ORL C,bit(或/bit) CPL bit (或 C) 注:“/bit”表示对bit位先取反然后再参加运算 《单片微机原理及应用》教学课件

  42. 位操作类指令(续) P.74 判位条件转移指令(5条): JC rel——(Cy)=“1”就跳转;否则不跳转 JNC rel——(Cy)“1”就跳转;否则不跳转 JB bit,rel ——(bit)=“1”就跳转;否则不跳转 JNB bit,rel ——(bit)“1”就跳转;否则不跳转 JBC bit,rel ——(bit)=“1”就先将其清零 再跳转; 否则,不动此位也不跳转。 《单片微机原理及应用》教学课件

  43. 前面的简单测控实例中的程序: 位操作指令 任务一:控制一盏灯点亮 JOB1:CLR P1.0;P1.0清“0”,亮红灯 HERE: AJMP HERE;原地等待,不做别的事 任务二:红灯周期性地亮/灭 JOB2: CPL P1.0 ;对P1.0取反:红灯亮/灭 ACALL DELAY ;延时1秒 AJMP JOB2 ;重复 任务三:红外防盗报警 JOB3: CLR P1.1 ; P1.1清“0”,亮绿灯 REDO: SETB P1.3 ;将P1.3置“1” CHECK:JNB P1.3,CHECK ;检测传感器是否被阻断LOOP: ………… ;有入侵者,报警! AJMP REDO ;再跳回去检测 《单片微机原理及应用》教学课件

  44. 前面的简单测控实例中的程序: 跳转指令 任务一:控制一盏灯点亮 JOB1:CLR P1.0 ;P1.0清“0”,亮红灯 HERE: AJMP HERE;原地等待,不做别的事 任务二:红灯周期性地亮/灭 JOB2: CPL P1.0 ;对P1.0取反:红灯亮/灭 ACALL DELAY ;延时1秒 AJMP JOB2;重复 任务三:红外防盗报警 JOB3: CLR P1.1 ; P1.1清“0”,亮绿灯 REDO: SETB P1.3 ;将P1.3置“1” CHECK:JNB P1.3,CHECK ;检测传感器是否被阻断LOOP: ………… ;有入侵者,报警! AJMP REDO;再跳回去检测 《单片微机原理及应用》教学课件

  45. 小结 小结:MCS-51指令集(五大类功能) 数据传送类指令 (29条) 算术运算类指令 (24条) 逻辑运算及移位类指令 (24条) 控制转移类指令 (17条) 位操作(布尔操作)类指令 (17条) 《单片微机原理及应用》教学课件

  46. (一)数据传送类指令(5种/29条) 小结 内部存储器间传送: (MOV——16条) 外部数据存储器RAM与累加器间传送: (MOVX——4条) 程序存储器ROM向累加器传送: (MOVC——2条) 数据交换:(XCH,XCHD,SWAP——5条) 堆栈操作: (PUSH,POP——2条) 《单片微机原理及应用》教学课件

  47. 小结 (二)算术运算类指令(6种/24条) 加法运算(ADD——4条) 带进位加法运算(ADDC——4条) 带借位减法运算 (SUBB——4条) 加1/减1操作(INC,DEC——9条) 单字节乘/除法运算(MUL,DIV——2条) 十进制调整(DA A——1条) 《单片微机原理及应用》教学课件

  48. 小结 (三)逻辑运算及移位指令(5种/24条) 逻辑与运算: (ANL——6条) 逻辑或运算: (ORL——6条) 逻辑异或运算: (XRL——6条) 累加器清零/取反: (CLR,CPL——2条) 累加器移位操作:(RL,RLC,RR,RRC—4条) 《单片微机原理及应用》教学课件

  49. 小结 (四)控制转移类指令(4种/17条) 无条件转移: (LJMP,AJMP,SJMP,JMP——4条) 条件转移(判断跳转): (JZ,JNZ,CJNE,DJNZ——8条) 子程序调用及返回: (LCALL,ACALL,RET,RETI——4条) 空操作: (NOP——1条) 《单片微机原理及应用》教学课件

  50. 小结 (五)位操作类指令(4种17条) 位传送: (MOV——2条) 位清零/置位: (CLR,SETB——4条) 位逻辑与/或/非运算: (ANL,ORL,CPL——6条) 位条件转移: (JC,JNC,JB,JNB,JBC——5条) 《单片微机原理及应用》教学课件

More Related