80c51笔记

80C51单片机的指令系统

具有255种操作码(00H~FFH)除A5H外的集合
只需数机42种助记符,代表33种功能
指令功能助记符与操作数各种寻址方式结合,构造出111中指令

80C51系统

寻址方式

  • 立即寻址
  • 直接寻址
  • 寄存器寻址
  • 寄存器间接寻址
  • 相对寻址
  • 变址寻址
  • 位寻址
  1. 立即寻址

    直接给出操作数,出现的操作数称为立即数
    立即数前必须加上#

      MOV  DPTR, #1234H
    
  2. 直接寻址

    在指令中直接给出操作单元地址

      MOV  A, 3AH  
    

    ① 只能给出8位地址
    ② 寻址范围只限于片内数据存储器
    ③ 低128单元,在指令中直接以单元地址形式给出
    ④ 特殊功能寄存器,这使除单元地址形式给出外,还可以寄存器符号形式给出

  3. 寄存器寻址

    指在指令中将指定寄存器的内容作为操作数

    寻址范围
    ① 4个寄存器组共32个通用寄存器,单在指令中只能使用当前寄存器组
    ② 在使用前要通过指定PSW中指定的RS1、RS0,以选择使用的当前寄存器组
    ③ 部分特殊功能寄存器

  4. 寄存器间接寻址

    指在指令中给出的寄存器内容是操作数的地址,从该地址中取出的为操作数
    在寄存器间接寻址中,应在寄存器的名称前加@

    寻址范围
    ① 片内数据存储器的低128字节单位,只能采用R0/R1间址寄存器,形式为@Ri
    ② 片外数据存储器的64KB单元,使用DPTR作为间址寄存器,形式为@DPTR
    ③ 片外数据存储器低256字节单元,除可使用DPTR作为间址寄存器外,也可使用R0、R1作为间址寄存器
    ④ 堆栈区,堆栈操作指令(PUSH和POP也算作间址寻址)

  5. 相对寻址

    在指令中给出的操作数为程序转移的偏移量
    相对寻址为实现程序相对转移而设定的,为相对转移指令采用
    给出的偏移量用 rel 表示,把PC的当前值加上偏移量得到程序的相对转移的目的地址

    目的地址 = 转移指令所在的地址 + 转移指令字节数 + rel

    rel为一个带符号的8位二进制补码数,表示范围-128B ~ +127B

  6. 变址寻址(基址+变址)

    一般用于查表操作
    指以DPTR或PC作为基址寄存器,累加器A作为变址寄存器,二者内容相加

      MOVC     A, @A+DPTR   
    

    特点
    ① 只能对程序存储器进行寻址
    ② 变址寻址指令只有3条:

      MOVC     A, @A+DPTR ;  程序存储器读指令
      MOVC     A, @A+PC   ;  程序存储器读指令
      JMP      @A+DPTR    ;  无条件转移指令  
    

    ③ 上面的3条指令都是单字节指令
    ④ 变址寻址方式用于查表操作

  7. 位寻址

    位寻址区:
    片内数据存储器中的单元地址20H ~ 2FH,共16个单元128位,为位寻址区,位地址是0H ~ 7FH

      MOVC     C, 2BH  
    

    可供位寻址的特殊功能寄存器共有11个,实有寻址位83位

    位寻址只能使用C寄存器,不能使用其他寄存器,否则会报错
    表示方法
    ① 直接使用位地址表示方法
    ② 单元地址加位的表示方法

    88H单元的位5 => 88H.5
    ③ 特殊功能寄存器符号加位的表示方法

    PSW寄存器的位5 => PSW.5
    ⑤ 位名称表示方法,特殊功能寄存器中的一些寻址位是有名称的

      PSW的位5为F0标志位,使用F0表示该位   
    

总结

寻址方式 寻址空间
寄存器寻址 R0~R7、A、B、CY(bit)、DPTR
直接寻址 内部数据存储器低128字节
特殊功能寄存器
寄存器间接寻址 内部数据存储器(@R0,@R1,@SP仅PUSH、POP)
外部数据存储器(@R0,@R1,@DPTR)
立即寻址 程序存储器
变址寻址 程序存储器(@A+PC,@A+DPTR)
相对寻址 程序存储器(PC+位移量)
位寻址 内部数据存储器中有128个可寻址位
特殊功能寄存器中可位寻址的位

指令格式

  1. 通常由操作码和操作数两部分组成

    • 操作码用来规定指令完成的操作
    • 操作数表示操作的对象

    ① 单字节指令
     只有一个字节,操作码和操作数在同一个字节中
     共有49条单字节指令
    ② 双字节指令
     双字节指令包括两个字节,一个字节为操作码,另一个为操作符
     共有45条双字节指令
    ③ 三字节指令
     在三字节指令中,操作数(既可能是数据又可能是地址)占2个字节,操作码占1个字节
     共有17条指令

  2. 指令分类

    共111条指令

    • 数据传送类(28)
    • 算数运算类(24)
    • 逻辑运算类(25)
    • 控制转移类(17)
    • 布尔(位)操作类(17)
  3. 符号说明

符号 含义
Rn n=07,表示当前寄存器组的8个通用寄存器R0R7中的一个
Ri i=0、1,可用作间址寻址的寄存器,只能是R0,R1中的一个
Direct 内部的8位地址,既可指片内数据存储器的低128个单元地址,也可指SFR的地址或符号名称,direct表示直接寻址方式
#data 指令中的8位立即数
#data16 指令中的16位立即数
addr16 16位目的地址,只限于LCALL和LJMP中使用
addr11 11位目的地址,只限于ACALL和AJMP指令使用
rel 相对转移指令中的偏移量,为8位带符号数,为SJMP和所有条件转移指令所使用
DPTR 数据指针
bit 片内数据存储器中的直接寻址位
A 累加器
B B寄存器
C 进位标志位
/ 位地址的前缀标志,表示对该位操作数取反

数据传送类指令

  • 内部8位数据传送指令
  • 16位数据传送指令(专用于设定地址指针)
  • 程序存储器传送指令
  • 交换指令
  • 堆栈操作指令

特点
① 不影响标志位C、AC、OV,只有一种堆栈操作指令可以直接修改程序状态字(PSW)
② 可以进行直接地址到直接地址的数据传送,能把一个并行I/O口中的内容传送到片内数据存储器
③ 用R0,R1间址访问片外数据存储器256字节地址及片内数据存储器中的任一单元,用DPTR访问片外全部64KB的数据存储器或I/O
④ A能够对Rn寄存器寻址
⑤ 能用变址寻址访问程序存储器中的表格

  1. 内部8位数据传送指令

    主要用于内部数据存储器和寄存器之间的数据传送

      MOV <目的字节>, <源字节>  
    

    操作属于拷贝属性

    ① 以累加器A为目的操作数的指令组

    指令 目的操作数 源操作数 功能 寻址范围
    MOV A Rn A <- Rn R0~R7
    MOV A direct A <- direct 00~FFH
    MOV A @Ri A <- Ri 00~FFH
    MOV A #data A <- #data #00~#FFH

    ② 以寄存器Rn为目的操作数的指令数

    指令 目的操作数 源操作数 功能
    MOV Rn A Rn <- A
    MOV Rn direct Rn <- direct
    MOV Rn #data Rn <- data

    ③ 以直接地址direct为目的操作数的指令组

    指令 目的操作数 源操作数 功能
    MOV direct A direct <- A
    MOV direct Rn direct <- Rn
    MOV direct direct direct <- direct
    MOV direct @Ri direct <- Ri
    MOV direct #data dierct <- data

    ⑤ 以间接寻址寄存器Ri为目的操作数的指令组

    指令 目的操作数 源操作数
    MOV @Ri A
    MOV @Ri direct
    MOV @Ri #data
  2. 16位数据传送指令

    MOV   DPTR, #data16   ; DPTR <- data16  
    

    数据的高8位送入DPH寄存器,数据低8位送入DPL寄存器

  3. 外部数据传送指令

    ① 采用间址寻址方式访问外部数据存储器,有Ri和DPTR两种间接寻址方式
    ② 采用R0或R1作为间址寄存器时,可寻址256个外部数据存储器单元,8位地址和数据均由P0口分时输入和输出
    ③ 采用16位DPTR作间址可寻址整个64KB片外数据存储空间,低8位(DPL)由P0口进行分时使用,高8位(DPH)由P2口输出

    1. 外部数据存储器或I/O内容送累加器A(读)

      MOVX     A, @Ri  
      MOVX     A, @DPTR  
      

      在P3.7引脚上输出\(\overline{RD}\)有效信号,可作为外部数据存储器或I/O的读选通信号

    2. 累加器A内容送外部数据存储器或I/O(写)

      MOVX     @Ri, A   
      MOVX     @DPTR, A  
      

      在P3.6引脚上输出\(\overline{WR}\)有效信号,可作为外部数据存储器或I/O的写选通信号

  4. 程序存储器数据传送指令(查表指令)

    MOVC     A, @A+PC  
    MOVC     A, @A+DPTR  
    

    均从程序存储器中读取数据(如表格、常数等)
    累加器A为变址寄存器,而PC、DPTR为基址寄存器
    DPTR为基址寄存器时为远程查表, PC为基址寄存器时为近程查表

  5. 数据交换指令

    1. 字节交换指令XCH组

      XCH      A, Rn  
      XCH      A, direct  
      XCH      A, @Ri  
      

      将累加器A与源操作数的字节内容互换

    2. 半字节交换指令组

      XCH      A, @Ri  
      

      将Ri间址寻址单元的低4位内容与累加器A的低4位内容互换,高4位不变,不影响标志位

        SWAP     A
      

      将累加器A的高、低半字节交换,也可看做4位循环指令

  6. 堆栈操作指令

    PUSH     direct   
    POP      direct   
    

算术运算类指令

  1. 加法指令

    ADD   A, Rn       ; A + Rn -> A  
    ADD   A, direct   ; A + direct -> A  
    ADD   A, @Ri      ; A + Ri -> A   
    ADD   A, #data    ; A + data -> A  
    

    影响AC、CY、OV、P
    ① 当和的第3位有进位时,AC标志位置位,否则为0
    ② 当和的第7位有进位时,CY标志位置位,否则为0

  2. 带进位加法指令

    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  
    

    影响AC、CY、OV、P
    ① 和的第3位有进位时,AC将置位
    ② 和的第7位有进位时,CY将置位,表示和溢出

  3. 加1指令

    INC   Rn  
    INC   direct  
    INC   @Ri  
    INC   A  
    INC   DPTR   
    

    不影响标志位

  4. 二-十进制调整指令

    DA    A   
    

    修正方法:
    ① 当累加器低4位大于9或半进位标志AC=1时,进行低4加6修正
    \(A_{0~3}\) + 6 -> \(A_{0~3}\)
     即 A = A + 06H

    ② 当累加器高4位大于9或进位标志CY=1时,进行低4位加6修正
    \(A_{4~7}\) + 6 -> \(A_{4~7}\)
     即 A = A + 60H

  5. 带借位减法指令

    SUBB     A, Rn  
    SUBB     A, direct  
    SUBB     A, @Ri  
    SUBB     A, #data  
    

    若第7位有借位则CY置1;若第3位有借位,则AC置1
    若第7位和第5位中有1位需借位而另一位不借位,则OV置1

  6. 减1指令

    DEC   Rn  
    DEC   direct  
    DEC   @Ri  
    DEC   A  
    

    不影响各个标志位

    注意
    执行对并行I/O口的输出内容减1操作,是将该口输出锁存器的内容读出并减1,再写入锁存器

  7. 减法/除法指令

    1. 乘法指令

      MUL   AB   
      

      将A和B中两个无符号数8位二进制相乘,所得16积的低8位存在A中,高8位存在B中
      若乘积大于255,即高位B不为0,OV置位;CY总是清0

    2. 除法指令

      DIV   AB    
      

      将A中无符号8位二进制数除以B中的无符号8位二进制数,所得商的二进制部分存在A中,余数存在B中,并将CY和OV置0

逻辑运算类指令

包括:与、或、异或、清除、求反、移位等操作
助记符有ANL、ORL、XRL、RL、RLC、RR、RRC、CPL、CLR等
只按位进行逻辑运算,结果不影响PSW中标志位

  1. 逻辑与运算

    ANL A,Rn/direct/@Ri/#data  
    

将目的地址单元中的数和源地址单元中的数按位相与
作用:用作清除或屏蔽某些位

  1. 逻辑或运算

    ORL  A,Rn/direct/@Ri/#data   
    

将目的地址单元中的数和源地址单元中的数按位相或
作用:给某些位强迫置1,合并两个数中的1

  1. 逻辑异或运算

    XOR   A,Rn/direct/@Ri/#data  
    

作用:对目的操作数的某些位取反,也可用于判单两个数是否相等,若相等则结果为0

  1. 累加器移位/循环指令
    (1) 循环右移指令

         RR    A    
    

    将累加器的内容逐位循环右移一位,并将A0的内容移到A7,不影响标志位
    (2) 带进位循环右移指令

         RRC   A
    

    将累加器的内容和进位一起循环右移一位,并且A0移入进位位CY,CY的内容移到A7,不影响CY之外的标志位
    (3) 循环左移指令

         RL    A
    

    将累加器的内容逐位循环左移一位,并且A7的内容移到A0
    (4) 带进位循环左移指令

         RLC   A
    

    将累加器的内容和进位位一起循环左移一位,并且A7移入进位位CY,CY的内容移到A0,不影响CY之外的标志位
    (5) 累加器按位取反指令

         CPL   A
    

    对进行累加器的内容逐位取反,结果仍存在A中,此操作不影响标志位
    (6) 累加器清0指令

         CLR   A
    

    对累加器进行清0,此操作不影响标志位

控制转移类指令

  • 无条件转移指令
  • 条件转移指令
  • 循环转移指令
  • 子程序调用和返回指令
  • 空操作指令

采用的助记符有:AJMP、LJMP、SJMP、JZ、JNZ、CJNE、DJNZ、ACALL、LACALL、RET、RETI、NOP等

  1. 无条件转移指令
    (1) 短转移指令

         SJMP  rel
    

    其目标地址是由当前PC(程序计数器)值和指令的第二个字节提供的8位带符号的相对地址相加而成
    有以下2种情况
    ① 根据偏移量计算转移的目的地址
    ② 根据目的地址计算偏移量
    (2) 绝对转移指令

         AJMP  addr11 
    

    其目标地址由指向第一个字节的高位A10A8和指令第二个字节的A7A0组成
    目标地址必须包含AJMP后第一条指令的字节在内的2KB范围内
    (3) 长转移指令

         LJMP  addr16  
    

    半酣程序存储器整个64KB的空间
    (4) 间接转移指令

         JMP   @A+DPTR     
    

    A中8位无符号数与DPTR内容相加  
    DPTR固定,A不同则可实现多分支转移  

  2. 条件转移指令
    JZ rel
    A = 0,PC = PC+2+rel
    A ≠ 0,PC = PC+2
    JNZ rel
    A = 0,PC = PC+2+rel
    A ≠ 0,PC = PC+2
    数值比较转移指令
    (1) CJNZ A,direct,rel
    (2) CJNZ A,#data,rel
    (3) CJNZ Rn,#data,rel
    (4) CJNZ @Ri,#data,rel

  3. 循环转移指令
    (1) DJNZ Rn,rel
    (2) DJNZ direct,rel
    先将Rn/direct相减,再判别其内容是否为0
    为0,结束循环
    不为0,转向目标地址,继续执行循环程序

子程序调用

  • ACALL addr11
    无条件调用首地址为addr11的子程序,不影响标志位
    过程
    ① 断点地址压栈,先PCL,后PCH,堆栈指针加2
    ② 将指令提供的11位目标地址送入PC10~PC0,所调用的子程序地址须与ACALL后指令第一个字节在同一个2KB区域内

  • 长调用 LCALL addr16
    过程
    ① 断点地址压栈
    PC+3 -> 获F一条指令地址
    将这16位的地址压栈后,SP <- SP+2
    ② 将指令第二个和第三个字节所提供的16位目标地址送PC15~PC0,程序转向子程序首地址开始执行

  • 返回指令 RET
    返回调用指令ACALL或LCALL的下一条指令

  • 中断返回指令 RETI
    ① 清除内部响应的中断状态寄存器
    ② 中断服务程序须以RETI结束
    ③ CPU执行RETI指令后至少再执行一条指令,才能响应新的中断请求

  • 空操作指令

不作任何操作,仅将程序计数器PC加1,使程序继续向下执行

布尔(位)操作类指令

① 以进位标志CY为位累加器,以内部数据存储器的20H至2FH单元及部分SFR为位存储器
② 以P0,P1,P2,P3为位I/O

只能使用C寄存器和bit位寄存器作为操作数

  1. 布尔(位)传送指令

    MOV   C,bit  
    MOV   bit,C  
    
  2. 布尔(位)状态控制指令

    ```assembly
    清除  CLR   C   
          CLR   bit
    置1   SETB  C   
          SETB  bit   
    取反  CPL   C   
          CPL   bit   
    ```
    
  3. 布尔(位)逻辑操作指令

    1. 位逻辑与操作  
    ANL		C,bit  
    ANL		C,/bit  
    2. 位逻辑或操作  
    ORL		C,bit  
    ORL		C,/bit  
    
  4. 布尔(位)条件转移指令

    1.布尔累加器条件转移指令  
    JC		rel  ; C=1时转移
    JNC		rel  ; C=0时转移
    操作不影响标志位 
    2. 位测试条件转移指令  
    JB		bit,rel  ;bit=1
    JNB		bit,rel  ;bit=0
    检测指定位,当位变量分别位1或0时,程序转向当前PC值(转移指令地址+3)与第二字节中带符号的相对地址(rel)之和的目标地址,否则程序往下顺序执行  
    操作不想影响标志位  
    3. 位测试条件转移并清0指令  
    JBC		bit,rel  
    检测指定位,当位变量为1时,将该位清0,且程序转向当前PC值(转移指令地址+3)与第二字节中带符号的相对地址(rel)之和的目标地址,否则程序往下顺序执行  
    此操作不影响标志位
    
    
posted @ 2021-01-23 21:52  则阳  阅读(297)  评论(0)    收藏  举报