电子技术论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
下载方法|用单线程|避免多扣帖子规范|求助必读|发帖建议积分策略|勋章介绍|新人必读获取金币|推广论坛|出售帖子基本礼节|致会员信|版规总则
禁涉政治|反对低俗|举报专帖征集相片|留下足迹|推荐精华上传附件|制作分卷|使用网盘禁发qq群|恶意灌水|纯表情帖加入团队|监督机制|安全上网
楼主: cyc20180228

PICmicro微控制器指令集

[复制链接]
 楼主| 发表于 2018-12-19 11:45:06 | 显示全部楼层

       PIC17Cxx(和PIC18Cxx)器件有读写程序存储器的能力,用tablrdtablwt 指令实现,这些指令一次只能传送程序存储器数据8位(虽然每一个指令都要传送16位数据),为了访问“丢下”的8位数据,不得不使用tlrdtlwt 指令:
      5)tablrd 指令格式:
      tablrd t,i,Reg
      指令位模式:
      101010ti|ffffffff
      指令操作:
      if (t = =  1 )
               Reg = TBLATH;
      else
         TBLAT = PM(TBLPTR);
               Reg = TBLATL;
      if (i = =  1 )
        TBLPTR = TBLPTR + 1;
      标识位改变:None
      指令周期:
         2 (3 if Reg= PCL)
     6)tablwt 指令格式:
      tablwt t,i,Reg
      指令位模式:
      101011ti|ffffffff
      指令操作:
      if (t = =  1 )
              TBLATH = Reg ;
      else
              TBLATL = Reg ;
         PM(TBLPTR) = TBLAT;
      if (i = =  1 )
        TBLPTR = TBLPTR + 1;
      标识位改变:
         None
      指令周期:
      2(Many if EPROM Write)
 楼主| 发表于 2018-12-19 11:54:41 | 显示全部楼层
      7)tlrd 指令格式:
      tlrd t,Reg
      指令位模式:
      101010ti|ffffffff
      指令操作:
      if (t = =  1 )
               Reg = TBLATH;
      else
               Reg = TBLATL;
      标识位改变:
      None
      指令周期:
       1
     8)tlwt 指令格式:
      tablwt t,Reg
      指令位模式:
      101001ti|ffffffff
      指令操作:
      if (t = =  1 )
              TBLATH = Reg ;
      else
              TBLATL = Reg ;
       标识位改变:
       None
      指令周期:
       1
 楼主| 发表于 2018-12-19 12:37:09 | 显示全部楼层
     2、数据处理指令
     更高效率的加减法指令addwfcsubwfb 指令。
      1)addwfc 指令格式:
      addwfc f,d
      指令位模式:
      0001000d|ffffffff
      指令操作:
      Result = WREG + Reg + C;
      标识位改变:
      C,DC,Z,OV
      指令周期:
       1
     2)subwfb 指令格式:
      subwfb f,d
      指令位模式:
      0000001d|ffffffff
      指令操作:
      Result = Reg + (WREG^0x0FF)+1-!C;
      标识位改变:
      C,DC,Z,OV
      指令周期:
       1
 楼主| 发表于 2018-12-19 13:09:07 | 显示全部楼层
      另一个新指令是加法的十进制修正 DAW 指令,该指令在两个BCD加法运算之后执行,把结果转换成一个有效的BCD。
      3)DAW 指令格式:
      daw f,s
      指令位模式:
      0010111s|ffffffff
      指令操作:
      if (((WREG & 15)>9)|(DC= = 1))
                        WREG = Reg + 6;
      if (((WREG & 250)>144)|(C= = 1))
                        WREG = Reg + 96;
      if (s = = 1)
                       Reg  = WREG;
      标识位改变:
      C
      指令周期:
       1
 楼主| 发表于 2018-12-19 17:46:23 | 显示全部楼层
      4)移位指令格式:
      Rotate Reg,d
      指令位模式:
      rlcf  |0001101d|ffffffff
      rlncf |0010001d|ffffffff
      rrcf  |0001100d|ffffffff
      rrncf |0010000d|ffffffff
      指令操作:
      rlcf:
        Dest = Reg < < 1 + C;
        C = Reg:7 ;               
      rlncf:
        Dest = Reg < < 1 ;
        Dest:0 = Reg:7 ;
      rrcf:
        Dest = Reg > > 1+(C<<7);
        C = Reg:0 ;
      rrncf:
        Dest = Reg > > 1;
        Dest:7 = Reg:0 ;
      标识位改变:
      Carry Optionally
      指令周期:
       1
 楼主| 发表于 2018-12-19 18:08:55 | 显示全部楼层
      1指令周期的乘法指令:
      5)mullw 把WREG的内容与一个常数相乘,其指令格式:
      mullw Constant
      指令位模式:
      10111100|kkkkkkkk
      指令操作:
      PRODH : PRODL = WREG * Constant;
      标识位改变:
      None
      指令周期:
       1
      6)mullwf 把一个指定的寄存器内容与WREG的内容相乘,其指令格式:
      mullwf Reg
      指令位模式:
      00110100|ffffffff
      指令操作:
      PRODH : PRODL = WREG * Reg;
      标识位改变:
      None
      指令周期:
       1
 楼主| 发表于 2018-12-19 18:57:12 | 显示全部楼层
本帖最后由 cyc20180228 于 2018-12-19 19:03 编辑

      剩下的指令是很基本的指令:setf 指令给一个寄存器的所有的位设置并选择地给WREG设置。setf 的数值结果根据应用的不同可以被认为是 0x0FF、255 或 -1 。setf 是与 clrf 相反的指令(它把一个寄存器的所有的位清除)
      8)setf 指令格式:
      setf Reg,d
      指令位模式:
      0010101s|ffffffff
      指令操作:
      Reg = 0x0FF ;
      if ( d = = 1)
      WREG = 0x0ff ;
      标识位改变:
      None
      指令周期:
       1
      9)Btg 只是把一个位的状态反转,其指令格式:
      btg Reg,Bit
      指令位模式:
      00111bbb|ffffffff
      指令操作:
      Reg = Reg^(1 < < Bit);
      标识位改变:
      None
      指令周期:
       1
 楼主| 发表于 2018-12-19 19:50:12 | 显示全部楼层
    3、执行过程转向指令
    1)tstfsz 跳跃指令格式:
      tstfsz Reg
      指令位模式:
      00110011|ffffffff
      指令操作:
      if ( Reg !=0)
         PC = PC + 1 ;
      标识位改变:
      None
      指令周期:
       1 or 2 (if Skip )
    2)Lcall 调用指令格式:
      Lcall Label
      指令位模式:
      10110111|kkkkkkkk
      指令操作:
      Push Next Address ;
      PC = (PCLATH < < 8 ) + Label ;
      标识位改变:
      None
      指令周期:
       2
 楼主| 发表于 2018-12-19 20:35:26 | 显示全部楼层
      3)Compare 比较指令格式:
      Compare
      指令位模式:
      seq   |00110001|ffffffff
      sgt   |00110010|ffffffff
      slt   |00110000|ffffffff
      指令操作:
      Temp = f - WREG;
      switch(Ins) {
         case seq:
          if (Temp = = 0)
           PC = PC + 1;
        case sgt:
          if (Temp.7 = = 0)
           PC = PC + 1;
        case slt:
          if (Temp.7 ! = 0)
           PC = PC + 1;
       }
      标识位改变:
      None
      指令周期:
      1 if Condition NOT True,
      2 if Condition True
 楼主| 发表于 2018-12-19 21:06:51 | 显示全部楼层
本帖最后由 cyc20180228 于 2018-12-19 21:08 编辑

      3)infsnz 递增跳跃指令格式:
      infsnz Reg,D
      指令位模式:
      0010010d|ffffffff
      指令操作:
      Destination = Register + 1;
      if ( Destination !=0)
                    PC = PC + 1 ;
      标识位改变:
      None
      指令周期:
       1 (or 2 if Skip Executed )
      4)dcfsnz 递减跳跃指令格式:
      dcfsnz Reg,D
      指令位模式:
      0010110d|ffffffff
      指令操作:
      Destination = Register - 1;
      if ( Destination !=0)
                    PC = PC - 1 ;
      标识位改变:
      None
      指令周期:
       1 (or 2 if Skip Executed )
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|家电维修技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2025-5-10 23:10 , Processed in 0.031200 second(s), 3 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

CopyRight © 电子技术论坛
电子邮箱:8794149@qq.com | 联系 QQ:3081868839 | 官方网址:www.dzdu.com

Qiji. All Rights Reserved


服务条款 | 站长声明

Wuhan Qiji Technology Co., Ltd.武汉奇迹科技有限公司版权所有


鄂ICP备09003585号-2鄂公网安备42010602000420号

快速回复 返回顶部 返回列表