自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

大家好,又见面了,我是全栈君。

将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第17篇。我尽量每周四篇

5.4 逻辑、移位操作与空指令说明

      MIPS32指令集架构中定义的逻辑操作指令有8条:andandiororixorxorinorlui。当中ori指令已经实现了,本章要实现其余7条指令。

      MIPS32指令集架构中定义的移位操作指令有6条:sllsllvsrasravsrlsrlv

      MIPS32指令集架构中定义的空指令有2条:nopssnop

当中ssnop是一种特殊类型的空操作。在每一个周期发射多条指令的CPU中,使用ssnop指令能够确保单独占用一个发射周期。OpenMIPS设计为标量处理器,也就是每一个周期发射一条指令,所以ssnop的作用与nop同样。能够依照nop指令的处理方式来处理ssnop指令。

      另外,MIPS32指令集架构中还定义了syncpref2条指令,当中sync指令用于保证载入、存储操作的顺序,对于OpenMIPS而言,是严格依照指令顺序运行的,载入、存储操作也是依照顺序进行的,所以能够将sync指令当作nop指令处理,在这里将其归纳为空指令。pref指令用于缓存预取,OpenMIPS没有实现缓存,所以也能够将pref指令当作nop指令处理,此处也将其归纳为空指令。

      以上17条指令依照格式、作用的不用,又可分为几类,分别说明例如以下。

      1andorxornor

      这4条指令的格式如图5-10所看到的。从图中能够发现这4条指令都是R类型指令。而且指令码都是6’b000000,也就是MIPS32指令集架构中定义的SPECIAL类。此外,第6-10bit都为0,须要根据指令中0-5bit功能码的值进一步推断是哪一种指令。

自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

  •  当功能码是6‘b100100时,表示是and指令。逻辑“与”运算

      指令使用方法为:and rd, rs, rt

      指令作用为:rd <- rs AND rt,将地址为rs的通用寄存器的值。与地址为rt的通用寄存器的值进行逻辑“与”运算。运算结果保存到地址为rd的通用寄存器中。

  •  当功能码是6‘b100101时。表示是or指令,逻辑“或”运算

      指令使用方法为:or rd, rs, rt

      指令作用为:rd <- rs OR rt。将地址为rs的通用寄存器的值,与地址为rt的通用寄存器的值进行逻辑“或”运算,运算结果保存到地址为rd的通用寄存器中。

  •  当功能码是6‘b100110时,表示是xor指令,异或运算

      指令使用方法为:xor rd, rs, rt

      指令作用为:rd <- rs XOR rt,将地址为rs的通用寄存器的值,与地址为rt的通用寄存器的值进行逻辑“异或”运算,运算结果保存到地址为rd的通用寄存器中。

  •  当功能码是6‘b100111时,表示是nor指令。或非运算

      指令使用方法为:nor rd, rs, rt

      指令作用为:rd <- rs NOR rt。将地址为rs的通用寄存器的值。与地址为rt的通用寄存器的值进行逻辑“或非”运算,运算结果保存到地址为rd的通用寄存器中。

      2andixori指令

      这2条指令的格式如图5-11所看到的。从图中能够发现这2条指令都是I类型指令,能够根据指令中26-31bit指令码的值推断是哪一种指令。

 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

 

  •  当指令码是6’b001100,表示是andi指令,逻辑“与”运算

      指令使用方法为:andi rt, rs, immediate

      指令作用为:rt <- rs AND zero_extended(immediate)。将地址为rs的通用寄存器的值,与指令中马上数进行零扩展后的值进行逻辑“与”运算,运算结果保存到地址为rt的通用寄存器中。

  •  当指令码是6’b001110。表示是xori指令。异或运算

      指令使用方法为:xori rt, rs, immediate

      指令作用为:rt <- rs XOR zero_extended(immediate)。将地址为rs的通用寄存器的值。与指令中马上数进行零扩展后的值进行逻辑“异或”运算,运算结果保存到地址为rt的通用寄存器中。

      3lui指令

      lui指令的格式如图5-12所看到的。

从图中能够发现lui指令是I类型指令,能够根据指令中26-31bit指令码的值是否为6‘b001111。从而推断是否是lui指令。

自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

      指令使用方法为:lui rt, immediate

      指令作用为:rt <- immediate || 016,将指令中的16bit马上数保存到地址为rt的通用寄存器的高16位。另外。地址为rt的通用寄存器的低16位使用0填充。

      4sllsllvsrasravsrlsrlv指令

      这6条指令的格式如图5-13所看到的,从图中能够发现这6条指令都是R类型指令。而且指令码都是6’b000000。也就是都是SPECIAL类,须要根据指令中0-5bit功能码的值进一步推断是哪一种指令。

自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

  •  当功能码是6’b000000,表示是sll指令,逻辑左移

      指令使用方法为:sll rd, rt, sa

      指令作用为:rd <- rt << sa (logic),将地址为rt的通用寄存器的值,向左移sa位。空出来的位置使用0填充。结果保存到地址为rd的通用寄存器中。

  •  当功能码是6’b000010,表示是srl指令。逻辑右移

      指令使用方法为:srl rd, rt, sa

      指令作用为:rd <- rt >> sa (logic),将地址为rt的通用寄存器的值,向右移sa位,空出来的位置使用0填充,结果保存到地址为rd的通用寄存器中。

  •  当功能码是6’b000011。表示是sra指令,算术右移

      指令使用方法为:sra rd, rt, sa

      指令作用为:rd <- rt >> sa (arithmetic),将地址为rt的通用寄存器的值,向右移sa位。空出来的位置使用rt[31]的值填充,结果保存到地址为rd的通用寄存器中。

  •  当功能码是6’b000100。表示是sllv指令,逻辑左移

      指令使用方法为:sllv rd, rt, rs

      指令作用为:rd <- rt << rs[4:0](logic)。将地址为rt的通用寄存器的值。向左移位,空出来的位置使用0填充,结果保存到地址为rd的通用寄存器中。移位位数由地址为rs的寄存器值的0-4bit确定。

  •  当功能码是6’b000110,表示是srlv指令。逻辑右移

      指令使用方法为:srlv rd, rt, rs

      指令作用为:rd <- rt >> rs[4:0](logic),将地址为rt的通用寄存器的值,向右移位,空出来的位置使用0填充。结果保存到地址为rd的通用寄存器中。

移位位数由地址为rs的寄存器值的0-4bit确定。

  •  当功能码是6’b000111,表示是srav指令,算术右移

      指令使用方法为:srav rd, rt, rs

      指令作用为:rd <- rt >> rs[4:0](arithmetic),将地址为rt的通用寄存器的值,向右移位。空出来的位置使用rt[31]填充,结果保存到地址为rd的通用寄存器中。

移位位数由地址为rs的寄存器值的0-4bit确定。

      总结来说。这六条移位操作指令能够分为两种情况:sllvsravsrlv3条指令的助记符最后有“v”。表示移位位数是通过寄存器的值确定的,sllsrasrl3条指令的助记符最后没有“v”,表示移位位数就是指令中6-10bitsa的值。

      5nopssnopsyncpref指令

      这4条指令的格式如图5-14所看到的。从图中能够发现nopssnopsync3条指令都是R类型指令,而且指令码都是6’b000000。也就是都是SPECIAL类。

自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

      更进一步,能够发现nopssnop两条指令的功能码都是6’b000000,与之前介绍的逻辑左移指令sll的功能码同样。这样在译码的时候会不会有冲突:nop指令的二进制码与sll $0,$0,0的二进制码一样,处理器怎样译码?ssnop指令的二进制码与sll $0,$0,1的二进制码一样,处理器怎样译码?

nop      =     sll $0,$0,0
ssnop    =     sll $0,$0,1

      事实上两者是等价的。sll指令向$0寄存器保存移位结果,实际不会有不论什么效果,由于不管向$0写不论什么数,其值始终为0,所以效果等同于什么都不做,这也正是空指令nopssnop的效果。所以nopssnop指令不用特意实现,全然能够当作特殊的逻辑左移指令sll


下一次将实现上面介绍的逻辑、移位、空指令,敬请关注!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115924.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript性能优化-GC算法篇[通俗易懂]

    JavaScript性能优化-GC算法篇[通俗易懂]GC算法简介1、GC是一种机制,垃圾回收器完成具体的工作2、工作的内容就是查找垃圾释放空间、回收空间3、算法就是工作时查找和回收所遵循的规则常见的GC算法1、引用计数2、标记清除3、标记整理4、分代回收GC算法之引用计数算法1、核心思想:设置引用数,判断当前引用数是否为02、引用计数器3、引用关系发生改变时改变引用数字4、引用数字为0是立即回收代码演示如下constuser1={age:10};constuser2={age:20};con.

    2022年6月21日
    31
  • Discuz二次开发相应知识点

    Discuz二次开发相应知识点“Discuz”在下文中简称“DZ”。要弄DZ二次开发,必须至少具备如下技能:1)能够理很好理解MVC构架的原理(虽然DZ不是MVC架构的)2)扎实的PHP基础,熟悉结构化程序,OOP程序的写法及应用3)熟悉MYSQL就用,掌握SQL语言,懂SQL优化者更佳4)熟悉使用Discuz的各项功能一)Discuz的文件系统目录注:想搞DZ开发,就得弄懂DZ中每个文件的功能。

    2022年5月19日
    35
  • 计算机网络基础(路由器的作用 MAC地址 IP地址 IP地址分类 子网掩码 网段,等长子网划分)

    计算机网络基础(路由器的作用 MAC地址 IP地址 IP地址分类 子网掩码 网段,等长子网划分)前言在上一篇我们聊到了简单的了解到了计算机的通信方式,并且都是处于同一个网段下的通信,简要理解(大局观)计算机之间的通信方式【同一网段】(直接相连,同轴电缆,集线器,网桥,交换机),今天我们聊聊路由器和MAC地址IP地址的基础知识文章目录前言计算机之间连接方式—路由器连接MAC地址IP地址IP地址的分类计算机之间连接方式—路由器连接我们知道如果全世界都用交换机连接网络的话,会导致广播风暴,即,当在由交换机连接网络的时候,两台计算机通信,首先会发ARP广播得到对方的MAC地址,于此同时交换机就会记

    2022年5月5日
    62
  • mysql floor报错注入_mysql报错注入总结[通俗易懂]

    mysql floor报错注入_mysql报错注入总结[通俗易懂]最近又深刻的研究了一下mysql的报错注入,发现很多值得记录的东西,于是写了这篇博客做一个总结,目的是为了更深刻的理解报错注入报错注入原因及分类既然是研究报错注入,那我们先要弄明白为什么我们的注入语句会导致数据库报错,报错的原因我自己总结了一下,有以下几点重复数据报错,这里的重复主要有两个方面,其中之一是基于主键的唯一性:一个表主键必须是唯一的,如果一个表尝试生成两个相同的主键,就会爆出Dupli…

    2022年9月30日
    0
  • 激光导航和slam导航区别_激光导航和视觉导航的区别

    激光导航和slam导航区别_激光导航和视觉导航的区别激光SLAM基本原理基本原理

    2022年8月23日
    5
  • 把数据库中的静态图片遍历在前端页面上[通俗易懂]

    把数据库中的静态图片遍历在前端页面上[通俗易懂]把数据库中的静态图片遍历在前端页面上先上数据库中数据其次是后端的接口(把所有数据封装到List集合中发送过去):@RequestMapping(value=”/scenicSpots”,method=RequestMethod.GET)publicActionResultfindScenicSpots(){List<ScenicSpots>scenicSpots=scenicSpotService.QueryScenicSpots();

    2022年5月10日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号