51单片机指令系统详解

本文详细介绍了MCS-51单片机的指令系统,包括111条指令,分为数据传送类、算数运算类、逻辑运算类、程序控制类和位操作类指令。数据传送类指令如MOV,算数运算类包括加法、减法、乘法和除法等,逻辑运算类涉及与、或、异或和移位等操作,程序控制类包含转移和调用返回指令,位操作类则支持位寻址和按位处理。
摘要由CSDN通过智能技术生成

指令系统

微型机的功能是由指令系统体现的。所以,寻址方式和指令系统是衡量微型机的重要指标。

MSC-51的指令系统一共有111条指令,包括单字节49条,双字节46条和三字节16条。按周期分,有单周期,双周期和三周期指令。在晶振频率为12MHZ时,三种不同周期的指令执行的时间分别为1 μ s {\mu}s μs、2 μ s {\mu}s μs、4 μ s {\mu}s μs.

按照功能来分一共可以分为以下五类

  • 数据传送类指令
  • 算数运算类指令
  • 逻辑运算类指令
  • 程序控制类指令
  • 位(布尔)操作类指令
  1. 数据传送类指令:

    数据传送类指令是最常用,最基本的一类指令。它们可以实现寄存器与寄存器之间、寄存器与片内RAM之间、片内RAM单元之间的数据传送等。

    1. 八位数通用传送指令
      • MOV 目的,源

        指令中,源操作数是指带传送的数据源,它可以是立即数、累加器A,工作寄存器或片内RAM存储单元;目的操作数是指数据源传送到的目的地,不能是立即数。

        指令执行后,源操作数不变,目的操作数被改变。

        1. 累加器A为目的的操作数的指令

          MOV A,Rn;A<-Rn
          MOV A,direct;A<-(direct)
          MOV A,@Ri;A<-(Ri)
          MOV A,#data;A<-data
          
        2. 工作寄存器Rn为目的的操作数的指令

          MOV Rn,A;Rn<-A 传送的是A中保存的数
          MOV Rn,direct;Rn<-(direct)
          MOV Rn,#data;Rn<-data
          ;把源操作数的累加器A,片内RAM单元,SFR内容或立即数传送到R0~R7的某个寄存器中
          
        3. 直接地址为目的操作数的指令

          MOV direct,A;(direct)<-A
          MOV direct,Rn;(direct)<-Rn
          MOV direct,direct;(direct)<-(direct)
          MOV direct,@Ri;(direct)<-Ri
          MOV direct,#data;(direct)<-data
          ;需要注意的是:MOV direct,direct和MOV direct,#data均为三字节指令,但汇编后,它们的指令机器代码排列顺序不同。
          ;操作码 源direct 目的direct(源地址在前,目的地址在后)
          ;操作码 direct data 目的地址在前,源操作数在后
          
        4. 间接地址为目的操作数的指令

          MOV @Ri,A;(Ri)<-A 把A中的数传送给(Ri)地址下保存的数。比如Ri=30H,A=20H,则操作后(30H)=20H
          MOV @Ri,direct;(Ri)<-(direct)
          MOV @Ri,#data;(Ri)<-data
          
    2. 16位数目标地址传送指令
      MOV DPTR,#data 16
      ;唯一的16位立即数传送指令
      ;DPTR是一个16位的地址寄存器,所以通常称16位立即数为目标地址
      ;这也是一个三字节的指令。汇编成机器码的时候,立即数的高位字节在前,低位字节在后
      MOV DPTR,#2068H
      ;机器代码 90 20 68
      
    3. 堆栈操作指令
      PUSH direct ;SP<-SP+1,(SP)<-(direct)
      POP direct ;(direct)<-(SP),SP<-SP-1
      ;SP始终指向栈顶,PUSH是入栈指令,POP是出栈指令
      ;eg:设SP=30H,(50H)=80H
      PUSH 50H ;SP从30H变为31H,同时把(50H)->(31H)
      POP 40H ;把(31H)->(40H),同时SP从31H变为30H
      
    4. 查表指令(程序存储器内容送累加器A)
      • 主要有两条

        1. 查表指令(以PC作为基址)

          MOVC A,@A+PC ;PC<-PC+1,A<-(A+PC)
          ;通过将PC当前值与累加器A中的地址偏移量相加,将得到的地址中间的数取给A
          ;步骤如下:
          ;1.将地址偏移量(待查数据表的项数)送累加器A
          ;2.用加法指令(ADD A,#data)对累加器A进行修正,修正量data由PC(CURRENT)+data=数据表首地址计算出
          ;若data=1,则可以采用INC A指令对A进行修正
          ;这里主要是通过参考PC地址在PC后面进行查表。这里面数据只能存放在PC的后面,且需要与命令保持一定的间距
          
        2. 查表指令(以DPTR作为基址)

          MOVC A,@A+DPTR  ;A<-A+DPTR
          ;这是一条单字节指令,以DPTE为基址寄存器,存放数据表的首地址
          ;由于DPTR为一个十六位的寄存器,可以任意设定初值,因此数据表可以随意设置。
          ORG 0200H
          HEXABC: MOV DPTR,#DTAB ;置数据表首地址
          	  MOVC A,@A+DPTR ;查表
          	  RET 
          DTAB:  DB 30H
          	 ;...
          	 DB 39H
          	 ;...
          	 DB 46H
          ;这里面取DTAB的值就是DTAB所在的地址
          
    5. 累加器A与片外数据存储器传送指令
      • CPU访问片外数据存储器RAM时,只能通过累加器A进行,包括读取片外RAM的数据和把数据写到片外RAM存储单元中。指令如下:

        MOVX A,@Ri ;A<-(Ri)
        MOVX A,@DPTR ;A<-(DPTR)
        MOVX @Ri,A ;(Ri)<-A
        MOVX @DPTR,A ;(DPTR)<-A
        

        例如,把片内RAM 40H单元中的内容送到片外RAM2000H单元中去:

        MOV A,40H
        MOV DPTR,#2000H
        MOVX @DPTR,A
        ;访问外部只有上面的四个操作,其他操作都是违规的
        
    6. 交换指令

      • 交换指令一共有五条:

        1. 字节交换指令

          XCH A,Rn ;A<->Rn
          XCH A,direct ;A<->direct
          XCH A,@Rn ;A<->(Ri)
          ;XCH的功能是将累加器A中的内容与源操作数所指的数据互相交换
          
        2. 半字节交换指令

          XCHD A,@Ri ;A.3~A.0<->(Ri.3~Ri.0)
          ;该指令的功能是,将累加器A中的低四位与Ri间接寻址单元内容的低四位相互交换,而各自的高四位的内容不变。
          ;对于十六进制位来说,就是只交换个位的数字
          
        3. 累加器A的高四位与低四位内容呼唤指令

          SWAP A ;A.3~A.0<->A.7~A.4
          ;将A的高、低两半字节相互交换。本指令也可以看作4位循环移位指令
          
  2. 算数运算类指令

    • MCS-51算数运算类指令主要是对8位无符号二进制数进行加减乘除四则运算。增一,减一;实现对BCD码的压缩。一共有24条

    • 在加法,带进位的假发和带借位的剑法的指令中,累加器A中总是存放着目的操作数,并存放操作的中间结果。这些指令都影响程序状态字寄存器PSW的进位位CY,溢出位OV,半进位位AC和奇偶标志位P。乘法和除法只影响标志位OV和P

      1. 加法类指令

        主要有四条

        ADD A,Rn ;A<-A+Rn
        ADD A,direct ;A<-A+(direct)
        ADD A,@Ri ;A<-A+(Ri)
        ADD A,#data ;A<-A+data
        
      2. 带进位的加法指令
        ADDC A,Rn ;A<-A+Rn+CY
        ADD A,direct ;A<-A+(direct)+CY
        ADD A,@Ri ;A<-A+(Ri)+CY
        ADD A,#data ;A<-A+data+CY
        
      3. 加一指令
        INC A
        INC Rn 
        INC direct
        INC @Ri
        INC DPTR
        ;把操作数所指定单元的内容加一。其操作除了第一条指令影响奇偶标志位外,其余指令操作均不影响PSW。程序设计中,+1指令的使用十分频繁,通常配合寄存器间址指令使用,用于修改地址指针。
        
      4. 带借位的减法指令

        SUBB A,Rn 
        SUBB A,direct
        SUBB A,@Ri
        SUBB A,#data
        ;A<-A-Rn-CY
        
      5. 减一指令

        DEC A ;A<-A-1
        DEC Rn
        DEC direct
        DEC @Ri
        ;这组指令的功能是把操作数所指定的单元内容减一,其操作除了第一条指令影响奇偶标志外,其余指令操作均不影响PSW标志
        
      6. 乘法指令

        MUL AB
        ;将A,B,两个八字节位的无符号数相乘。结果为16字节数。结果的高八位保存在B中,低八位保存在A中。如果B中有数,则OV(溢出位)置为一。
        
      7. 除法指令

        DIV AB ;A/B 商保存在A中,余数保存在B中
        ;如果被除数B为零,则OV置为1,否则置为零
        
  3. 逻辑运算类指令
    • 这类指令主要用于对八字节数进行逻辑运算。包括逻辑与,或,异或,取反,以及逻辑移位指令。

      1. 逻辑“与”指令

        ANL A,Rn
        ANL A,direct
        ANL A,@Ri
        ANL A,#data
        ANL direct,A
        ANL direct,#data
        ;前四条指令的目的操作数是累加器A,源操作数可以是工作寄存器,片内RAM和立即数。指令的功能是,将A中的内容和源操作数所指定的内容按位逻辑与,结果存入目的操作数中。
        ;逻辑与指令常用于屏蔽某些位
        
      2. 逻辑“或”指令

        ORL A,Rn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飔、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值