1 / 50

3. MCS-51 单片机的指令系统

3. MCS-51 单片机的指令系统. 3-1 8051 汇编语言概述 一 ) 指令分类 42 个助记符, 33 种功能,共 111 条指令。 a. 按占用存储单元数量来分 : 单字节指令 (49) 、双字节指令 (45) 、三字节指令 (17) ; b. 按执行时间分 : 单周期指令 (64) 、双周期指令 (45) 、 4 周期指令 (2: 乘、除 ) c. 按指令用途分 : 伪指令 (6) 、数据传送类指令 (28) 、逻辑操作类指令 (25) 、算术运算类指令 (24) 、位操作类指令 (17) 、控制转移类指令 (17) 。. 二) 指令格式

zared
Download Presentation

3. MCS-51 单片机的指令系统

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单片机的指令系统 3-1 8051汇编语言概述 一 ) 指令分类 42个助记符,33种功能,共111条指令。 a. 按占用存储单元数量来分: 单字节指令(49)、双字节指令(45)、三字节指令(17); b. 按执行时间分: 单周期指令(64)、双周期指令(45)、4周期指令(2: 乘、除) c. 按指令用途分: 伪指令(6)、数据传送类指令(28)、逻辑操作类指令(25)、算术运算类指令(24)、位操作类指令(17)、控制转移类指令(17) 。

  2. 二) 指令格式 操作码 目的操作数,源操作数 例如:ADD A,#6FH ; 三) 汇编语言语句的格式 在8051单片机汇编语言设计中,不区分大小写字母 标号:操作码 操作数1,操作数2 ,操作数3;注释 例如: LP1: MOVE R3, #00H ;给寄存器R3置0 MOV DPTR, #LP1 ;将LP1在存储器的 ; 位置付给DPTR cjne a, #20h, LP1

  3. 四) 常用符号 A : 累加器(ACC) @: 间接寻址的前缀。如: @R0,@A+PC,@A+DPTR #: 立即数(常数) 如: #10 #0feh #0fadeh #00101011B Direct: 储单元的地址,数字前没有#, (00h~0ffh) B: 寄存器B, 乘,除指令中使用 bit: 可用于位操作的位的地址 C: 进位标志, 在位运算时做位累加器. addr11: 11位目标地址,用于2k范围跳转(ACALL AJMP) addr16: 16位目标地址,用于64kB长跳转或查表 DPTR: 16位数据指针寄存器(DPH DPL) PC: 16位程序计数器,用于存放下一条执行程序的地址 Ri: 可用于间接寻址的地址寄存器 R0或R1 Rn: 工作寄存器R0~R7

  4. 五)汇编语言的伪指令 伪指令不是真正的指令,它无对应的机器码,在汇编时不产生目标程序,只是用来对汇编过程进行某种控制。 (p178) 1)ORG nnnnh ;设置起始地址 例如: ORG 0030h mov a,#00h …… 2)END 汇编结束伪指令 3)EQU (data、bit)等值伪指令 例如:SDA EQU P1.0 ; sda bit P1.0 addr1 EQU 1000h ; addr1 data 1000h D5 EQU 5fh ; D5 data 5fh

  5. 五)汇编语言的伪指令 4) DB nn1,nn2 … ;单字节项或项表 例如:tab1: DB 07h,10,’A’,0f5h 5)DW nnnn1,nnnn2 … ;双字节项或项表 例如:tab2: DW 07h,1230h 则在tab2起始程序存储器单元的内容为: 07h 00h 30h 12h 6)DS nn ; 预留程序存储区 例如:ORG 1200h DS 10 则在1200h地址开始,保留10个单元的存储区

  6. 3-2 8051的寻址方式 3-2-1立即寻址 立即寻址的操作数为常数,包含在指令字节中。即操作数为存放在程序存储空间的常数,一般为双字节或3字节指令。 例如: D0 equ 30h mov a, #30h ;将常数48 (#30h) 送到累加器A mov r0, #D0 ;将常数48 (#30h) 送到r0 mov dptr, #1234h ;将#1234h送到dptr mov DPTR, #tab1 ;将tab1标号的地址送到 dptr寄存器中 …… tab1: db 10h,11h,55h,0f8h,0ach

  7. 直接寻址的操作数为RAM单元的地址。一般为双字节或3字节指令。直接寻址的操作数为RAM单元的地址。一般为双字节或3字节指令。 例如: D0 equ 30h mov a, 30h ;将30h单元的内容送到累加器A mov r0, D0 ;将30h单元的内容送到r0 mov 31h,30h ;将30h单元的内容送到31h add a, 30h ; (30h) +A -> A 注意:直接寻址不能用于高128B的通用RAM单元 例如: mov a, 80h 相当于 mov a, p0 ;将P0口的状态送到累加器A 3-2-2直接寻址

  8. 寄存器寻址是指R0~R7、A、B、dptr或CY的间操作。寻址寄存器的地址隐含在操作码中,其中R0~R7由操作码的低3位指定。多为单字节指令。寄存器寻址是指R0~R7、A、B、dptr或CY的间操作。寻址寄存器的地址隐含在操作码中,其中R0~R7由操作码的低3位指定。多为单字节指令。 例如: mov r0, a ;将的内容送到r0 add a, r0 ;将累加器A 的内容+r0->A inc r0 ;r0的内容+1 inc dptr ;dptr的内容+1 clr c ;进位标志c清零 3-2-3寄存器寻址

  9. 寄存器间接寻址的1个操作数的地址存放在寄存器r0、r1或dptr中。多为单字节指令。寄存器间接寻址的1个操作数的地址存放在寄存器r0、r1或dptr中。多为单字节指令。 例如: D0 equ 30h mov r0, #D0 ;将#30h送到r0 mov A ,@r0 ;将30h单元的内容送到A inc r0 ;r0=r0+1 mov A ,@r0 ;将31h单元的内容送到A add A ,@r0 ;将(31h)+A A movx A ,@dptr ;将dptr指定的外部存储单元的 ;内容送到A 3-2-4寄存器间接寻址

  10. 变址寻址是以PC或DPTR为基地址,以累加器A为变址寄存器的间接寻址方式,其操作数存放在(PC+A)或(DPTR+A)指定的程序存储单元中。常用于查表。变址寻址是以PC或DPTR为基地址,以累加器A为变址寄存器的间接寻址方式,其操作数存放在(PC+A)或(DPTR+A)指定的程序存储单元中。常用于查表。 例如:mov dptr, #tab mov a, #00h movc a, @a+dptr ;执行后A = #11h mov a, #01h movc a, @a+dptr ;执行后A = #22h tab: db 11h,22h,33h,44h,55h,66h,77h,88h 3-2-5变址寻址 movc a, @a+pc Ljmp @a+dptr

  11. 相对寻址是以PC基地址,+指令给定的相对偏移量(+127~ -128),作为程序跳转的新地址付给PC。在编程时,偏移量常通过标号让编译软件自动计算。 例如:mov dptr, #tab jz LP1 …… LP1: mov a, #00h …… jc LP1 …… sjmp LP1 3-2-5相对寻址

  12. 位寻址的的操作数是RAM单元和特殊功能寄存器中可用于位操作的位的地址。位寻址的的操作数是RAM单元和特殊功能寄存器中可用于位操作的位的地址。 例如: setb 40h ;将28h的最低位(第0位)置1 mov c, 3fh ;将27h的最高位(第7位)送到CY mov 3fh , c ;将CY 送到27h的最高位(第7位) anl c, 3fh ;CY & (27h的第7位) -> CY 3-2-6位寻址

  13. 3-3数据传送类指令 数据传送操作是指把数据从源地址传送到目的地址,源地址内容不变。共29条指令,使用8种助记符: 片内数据存储器传送指令MOV; 片外数据存储器传送指令MOVX; 程序存储器传送指令MOVC; 累加器交换指令 XCH、XCHD、SWAP; 堆栈操作指令 PUSH、 POP; 3-5

  14. 3-3-1 片内数据存储器传送指令MOV 片内数据存储器传送指令MOV 共17 条,指令基本格式: MOV <目的操作数>, <源操作数> 1)以累加器 A 为目的地址的传送指令(4 条) 注意:以上传送指令的结果均影响程序状态字寄存器 PSW 的 P 和 Z 标志。

  15. 2) 以Rn 为目的地址的传送指令(3 条) 注意:以上传送指令的结果均不影响程序状态字寄存器 PSW 的 P 和 Z 标志。

  16. 3) 以直接地址为目的地址的传送指令(5 条)

  17. 4) 以间接地址为目的地址的传送指令(3 条) 5) 16位传送指令 mov dptr, #mmnnH ; nnH -> DPL mmH -> DPH

  18. 3-3-2 片外数据存储器传送指令MOVX MOVX A, @Ri 和 MOVX @Ri, A 不影响P2口的状态

  19. 3-3-3 程序存储器传送指令MOVC MOVC可对程序存储区数据进行传送,主要用于将程序存储区的数据表格传送到A,所以,又称查表指令。共有2条: MOVC A,@A+PC MOVC A, @A+DPTR 例1:请将程序存储器中,标号TAB起始的32个字节的数据读入到30H开始的内部RAM中 编程如下:

  20. MOV R2,#20h ;设置传送次数 MOV DPTR,#TAB ;设置数据源起始地址 MOV R0,#30H ;设置目标起始地址 LOOP: MOV A, #00h ;设置变址值 MOVC A, @A+DPTR ;读外部数据存储器 MOV @R0, A ;将数据传送到内部RAM INC R0 ;目标地址+1 INC DPTR ;源地址+1 DJNZ R2,LOOP ;传送个数判断

  21. 3-3-4 累加器交换指令 1) 字节交换指令XCH(3 条) 注意:以上指令结果影响程序状态字寄存器 PSW 的 P 标志。

  22. 2) 半字节交换指令XCHD(1 条) 注意:上指令结果影响程序状态字寄存器 PSW 的 P 标志。 3) 高低字节交换指令SWP(1 条) 注意:上指令结果影响程序状态字寄存器 PSW 的 P 标志。

  23. 3-3-5 堆栈操作指令PUSH POP 注意: 1) 堆栈是用户自己设定的内部 RAM 中的一块专用存储区,使用时一定先设堆栈指针,堆栈指针缺省为 SP=07H。 2) 堆栈遵循后进先出的原则安排数据,必须成对使用。 3) 堆栈操作必须是字节操作,且只能直接寻址。 4) 在子程序调用和中断调用时,系统将自动将PC压入堆栈,返回时自动将 PC弹出,如果堆栈空间不够(子程序、中断嵌套过多或要保护的变量过多),堆栈进入变量区,将导致执行混乱。

  24. 例2: MOV SP,#30H ;设置堆栈指针,SP=30H 为栈底地址 PUSH ACC ;SP+1→SP,SP=31H,ACC →(SP) PUSH DPH ;SP+1→SP,SP=32H,DPH →(SP) PUSH DPL ;SP+1→SP,SP=33H,DPL →(SP) PUSH 01H ;SP+1→SP,SP=34H,01H →(SP) ;不能写成PUSH R1 …… POP 01H ;(SP)→01H,SP-1→SP,SP=33H POP DPL ;(SP)→DPL,SP-1→SP,SP=32H POP DPH ;(SP)→DPH,SP-1→SP,SP=31H POP ACC ;(SP)→ACC,SP-1→SP,SP=30H

  25. 3-4算术运算类指令 8051系列单片机共24条8位算术运算指令,这些指令将对PSW的CY、AC、OV和P标志位产生不同影响,使用时应特别予以注意。 1) 加、减法指令(22 条) a. 加法指令(8 条) ADD ADDC b. 减法指令(4 条) SUBB c. BCD 码(十进制)调整指令(1 条) DA d. 加 1 减 1 指令(9 条) INC DEC 2) 乘、除法指令 (2 条) a. 乘法指令(1 条) MUL b. 除法指令(1 条) DIV

  26. 3-4-2 加法指令 1) 不带进位的加法指令 ADD ADD A,Rn ;AA+Rn ADD A,@Ri ;AA+(Ri) ADD A,direct ;AA+(direct) ADD A,#data ;AA+data ADD 指令将影响PSW的CY、AC、OV和P标志 当第7位有进位时,CY=1,于判断无符号运算是否溢出 和多字节的加法运算。 当第7位或第6位有进位时,OV=1,用于判断8位有符号 数相加后是否溢出(>127或<-128) 当第3位需借位时,AC=1。 当A中1的个数为奇数时,P=1。

  27. 例3: MOV A, #7AH MOV R0,#65H ADD A, R0 0 1 1 1 1 0 1 0 A +) 0 1 1 0 0 1 0 1 R0 1 1 0 1 1 1 1 1 A CY=0;OV=1;AC=0;P=1。

  28. 1) 带进位的加法指令 ADDC ADDC A,Rn ;AA+Rn+CY ADDC A,@Ri ;AA+(Ri)+CY ADDC A,direct ;AA+(direct)+CY ADDC A,#data ;AA+data+CY ADDC 对PSW的CY、AC、OV和P标志的影响同ADD ADDC用于多字节加法中的高字节的运算 例4:试设计一32位的加法程序。被加数存放在LD0开始的4个RAM单元,加数存放在LD1开始的4个RAM单元,和仍存放到LD0开始的4个RAM。 解:用R0记录被加数地址,R1存放加数地址,运算过程采用子程序。 编程如下:

  29. 主程序 MOV R0, #LD0 MOV R1, #LD1 LCALL ADD32 …… 子程序 ADD32:PUSH A PUSH PSW MOV R2, #3 MOV A,@R0 ADD A, @R1 MOV @R0, A LP1: INC R0 INC R1 MOV A,@R0 ADDC A,@R1 MOV @R0,A DJNZ R2,LP1 MOV flag1, C MOV flag2, OV POP PSW POP A RET

  30. 3-4-3 减法指令 8051系列单片机只有4条带进位的减法指令 SUBB SUBB A,Rn ;AA-Rn SUBB A,@Ri ;AA-(Ri) SUBB A,direct ;AA-(direct) SUBB A,#data ;AA-data SUBB 指令将影响PSW的CY、AC、OV和P标志 当第7位需借位时,CY=1,于判断无符号运算是否溢出 和多字节的加法运算。 当第7位需借位而第6位不需借位或第7位不需借位而第6位 需借位,OV=1,否则OV=0。用于判断8位有符号数相减后 是否溢出(>127或<-128) 当第3位有进位时,AC=1,用于十进制加法。 当A中1的个数为奇数时,P=1。

  31. 3-4-3 BCD调整指令 DA 在单片机中,通常用每位都小于0AH(0~9)的十六进制数来表示十进制数,即BCD码。CPU本身不能区分一个数是不是BCD码,而是程序设计者用程序来区分的。 在单片机中,没有十进制的运算指令,而是通过对二进制加法运算的结果进行调整来实现十进制的加法运算;而减法运算则必须通过BCD补码的加法运算来实现。 DA A 在加法运算后,根据AC和A的内容,对A中数据进行调整,以保证A中数据仍为 BCD 码,操作如下: 1)如果A3~0>9 , 则:A3~0-0AHA3~0 ,A7~4+1A7~4 ,AC=1 如果AC=1 , 则:A3~0+06H A3~0 ,A7~4+1A7~4 ,AC=0 2)如果A7~4+AC >9 , 则:A7~A-0AH A7~4 ,CY=1 如果CY=1 , 则:A7~4+06H  A7~4 ,CY=1

  32. 例5: CY AC 76 0111 0110 +) 95 1001 0101 10bH 1 0000 (0) 1011 DA (1) -) 1010 +)0110+1 1 71 1 0111 0001 该运算也可认为是76-(100-95)=71

  33. 例6: CY AC 89 1000 1001 +) 99 1001 1001 122H 1 0010 (1) 0010 DA (0) +) 0110 +)0110+0 1 88 1 1000 1000 该运算也可认为是89-1=88

  34. 3-4-4 +1、-1指令 INC DEC INC A ;A A+1 INC Rn ;Rn Rn+1 INC @Ri ;(Ri)  (Ri)+1 INC direct ; (direct)  (direct)+1 INC DPTR ;(dptr)(dptr)+1 DEC A ;A A-1 DEC Rn ;Rn Rn-1 DEC @Ri ;(Ri)  (Ri)-1 EDC direct ; (direct)  (direct)-1 注意:该指令不将影响PSW的CY、AC 、OV标志

  35. 3-4-5 乘除法指令 8051中有1条无符号的8位乘法和1条无符号的8位除法指令: MUL A,B ;B AA*B DIV A,B ;A A÷B , B余数 注意:上指令结果影响程序状态字寄存器 PSW 的 P 标志。 将乘法和加法结合起来可实现多字节的乘法运算,但多字节的除法运算,非常麻烦,在实际应用中应尽量避免。

  36. 3-5逻辑运算类指令 逻辑运算类指令有与、或、异或、清除、取反、移位等 24条操作指令: 1) 逻辑运算指令(20 条) a. 逻辑与指令(6 条) ANL b. 逻辑或指令(6 条) ORL c. 逻辑异或指令(6 条)XRL d. 累加器 A 清 0 和取反指令(2 条)CLR CPL 2) 循环移位指令(4 条)RR RRC RL RLC

  37. 3-5-1 逻辑运算类指令 1) 与、或、异或逻辑指令 ANL ORLXRL A,Rn ;AA∧/∨/⊕ Rn ANL ORLXRL A,@Ri ;AA∧/∨/⊕ (Ri) ANL ORLXRL A,direct ;AA∧/∨/⊕ (direct) ANL ORLXRL A,#direct ;AA∧/∨/⊕ #direct 仅影响P标志 ANL ORLXRL direct , A ;(direct)A∧/∨/⊕ (direct) ANL ORLXRL direct , #data;(direct) (direct) ∧/∨/⊕ data 不影响PSW

  38. A7A6 …... A1 A0 A7A6 …… A1 A0 2) 累加器A 清0 和取反指令 CLR A ; A  0 CPL A ; A逐位取反 3-5-2 循环移位指令 1) 不带进位标志的循环移位指令RL A ;循环左移位 RR A ;循环右移位

  39. 2) 带进位标志的循环移位指令 RLC A ;带进位标志的循环左移位 CY A7A6 …... A1 A0 RRC A ;带进位标志的循环左移位 CY A7A6 …… A1 A0 循环移位指令都为单周期指令

  40. 3-6位操作类指令 位操作指令的操作数是“位”,其取值只能是 0 或 1,故又称之为布尔操作指令。 位操作指令的操作对象是片内 RAM 的位寻址区(20H~2FH)和特殊功能寄存器 SFR 中的16 个可位寻址的寄存器。 位的传送和运算必须通过C,所以 C 也称为位累加器 位寻址有三种不同的写法: 1)直接地址写法:09h (21h的第1位),07fh (2fh的第7位)。 2)点操作符写法:21h.1 0D0H.2 P1.0 。 3)位名称写法: a) 可以位寻址的SFR, 如:OV, P, TR0。 b) 用equ(或bit) 定义的位地址,如:flag1 equ 23h

  41. SETB C ; C0 SETB bit ;bit1 CLR C ; C0 CLR bit ;bit0 CPL C ; CC CPL bit ;bitbit ANL C, bit ; CC∧bit ANL C, /bit ; CC∧bit ORL C, bit ; CC∨bit ORL C, /bit ; CC∨bit 1 位传送指令(2条) MOV MOV C, bit ;Cbit MOV bit, C ;bitC 2 位修正指令(6条) SETB CLR CPL 3 位逻辑运算指令(4条) ANL ORL

  42. 4 位判断转移指令(5条) JC rel ; C=1时PCPC+2+rel;C=0 继续 JNC rel ; C=0时PCPC+2+rel;C=1 继续 JB bit,rel ; bit=1时PCPC+3+rel;bit=0 继续 JNB bit,rel ; bit=0时PCPC+3+rel;bit=1 继续 JBC bit,rel ; bit=1时PCPC+3+rel,bit  0; bit=1 继续 注意:以上指令结果不影响程序状态字寄存器 PSW 。

  43. 3-6 控制转移类指令 (17条) 1) 条件转移指令(8 条) a. 累加器判零转移指令(2 条)JZ JNZ b. 比较转移指令(4 条)CJNE c. 循环转移指令(2 条)DJNZ 2) 无条件转移指令(4 条) a. 短转移指令 (1 条)SJMP b. 长转移指令(1 条) LJMP c. 绝对转移指令 (1 条) AJMP d. 间接转移指令(1 条) JMP 3) 子程序调用和返回指令(4 条) a. 调用指令(2 条) ACALL LCALL b. 返回指令(2 条) RET RETI 4) 空操作指令(1 条) NOP

  44. 3-6-1 条件转移指令(8 条) 1 累加器判零转移指令(2 条)JZ JNZ JZ rel ; A= 0 时PCPC+2+rel;否则继续 JNZ rel ; A≠0 时PCPC+2+rel;否则继续 2 比较转移指令(4 条)CJNE CJNE A, #data, rel ; A≠ data 时PCPC+3+rel CJNE Rn, #data, rel ; Rn≠data 时PCPC+3+rel CJNE @Ri, #data, rel ; (Ri)≠ data 时PCPC+3+rel CJNE A, direct, rel ; A≠(direct) 时PCPC+3+rel 注意:CJNE指令将影响CY 标志。当第1操作数<第2操作数时,CY=1; 否则CY=0。 3) 循环转移指令(2 条)DJNZ DJNZ Rn, rel ; Rn-1≠0 时PCPC+2+rel DJNZ direct, rel ; (direct)-1≠0 时PCPC+3+rel

  45. 3-6-2 无条件转移指令(4 条) 1 短转移指令SJMP (2字节) SJMP rel ; PC  PC+2+rel 2 长转移指令 LJMP (3字节) LJMP addr16 ; PC  addr16 3 绝对转移指令AJMP (2字节) AJMP addr11 ; PC10..0  addr11 4 间接长转移指令 JMP (1字节) JMP @A+DPTR ; PC  A+DPTR 注意:以上指令结果不影响程序状态字寄存器 PSW 。

  46. 3-6-3 子程序调用和返回指令(4条) 1 绝对调用指令(1 条) ACALL ACALL addr11 ; PC←PC+2, ; SP←SP+1, (SP)←PC7~0, ; SP←SP+1, (SP)←PC15~8, ; PC10~0←addr11 2 长调用指令(1 条) LCALL LCALL addr16 ; PC←PC+3, ; SP←SP+1, (SP)←PC7~0 , ; SP←SP+1, (SP)←PC15~8 , ; PC←addr16

  47. 3 返回指令(2 条)RET RETI RET ;子程序返回 ; PC15~8←(SP), SP←SP-1 ; PC7~0 ← (SP), SP←SP-1 RETI ;中断程序返回 ; PC15~8←(SP), SP←SP-1 ; PC7~0 ← (SP), SP←SP-1 中断服务程序必须以RETI为结束指令。CPU执行RETI指令后至少再执行一条指令,才能响应新的中断请求。 3-6-4 空操作指令 NOP NOP ;PC← PC+1

  48. 3-7805x程序的执行流程 0000H 程序入口地址(复位时PC=0000h) 0003H 外部中断INT0程序入口地址 000BH 定时器0中断程序入口地址 0013H 外部中断INT1程序入口地址 001BH 定时器1中断程序入口地址 0023H 串行通信中断程序入口地址 002BH 定时器2中断程序入口地址 程序区 0FFFFH

  49. 汇编程序的一般程序框架 ORG 0000H LJMP main ORG 0003H LJMP INT_0 ORG 000BH Timer0: INC T0_D SETB flag_T0 RETI ORG 0013H LJMP INT_1 ORG 001BH LJMP Timer1 ORG 0023H LJMP RS232 ORG 002BH Timer2: …… …… RETI Main: … … …

  50. 作业 1.试设计一子程序,用来将内部RAM中24位整数(3字节)转化为BCD数。 2.试设计一子程序,用来将内部RAM中8位BCD整数(4字节)转化为二进制数。 3.试设计一子程序,实现将内部RAM中4字节BCD整数 -1。 4.设计一程序,将30h起始的RAM中的60个带符号整数,按从小到大排序,结果仍存放在30h起始的RAM中。 5.设计一程序,当P1.0从低电平变到高CNT+1电平时,CNT+1,当P1.0从高电平变到低电平时, CNT-1。CNT为32位二进制整数(4字节)。

More Related