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

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

MIPS32指令集架构中定义的逻辑操作指令有8条:and、andi、or、ori、xor、xori、nor、lui。当中ori指令已经实现了,本章要实现其余7条指令。

MIPS32指令集架构中定义的移位操作指令有6条:sll、sllv、sra、srav、srl、srlv。

MIPS32指令集架构中定义的空指令有2条:nop、ssnop。

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

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

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

  1、and、or、xor、nor

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

  • 当功能码是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的通用寄存器中。

  2、andi、xori指令

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

  • 当指令码是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的通用寄存器中。

      3、lui指令

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

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

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

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

4、sll、sllv、sra、srav、srl、srlv指令

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

  • 当功能码是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确定。

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

5、nop、ssnop、sync、pref指令

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

更进一步,能够发现nop、ssnop两条指令的功能码都是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,所以效果等同于什么都不做,这也正是空指令nop、ssnop的效果。所以nop、ssnop指令不用特意实现,全然能够当作特殊的逻辑左移指令sll。

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

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

  1. 自己动手写CPU之第五阶段(1)——流水线数据相关问题

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...

  2. 自己动手写CPU之第五阶段(2)——OpenMIPS对数据相关问题的解决措施

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第16篇.我尽量每周四篇 5.2 OpenMIPS对数据相关问题的解决措施 OpenMIPS处理器採用数据前推的方法来解决流水 ...

  3. 自己动手写CPU之第七阶段(7)——乘累加指令的实现

    将陆续上传本人写的新书<自己动手写CPU>.今天是第30篇.我尽量每周四篇 亚马逊的销售地址例如以下.欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

  4. 自己动手写CPU之第六阶段(2)——移动操作指令实现思路

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第21篇,我尽量每周四篇 6.2 移动操作指令实现思路 6.2.1 实现思路 这6条移动操作指令能够分为两类:一类是不涉及特殊 ...

  5. 自己动手写CPU之第四阶段(3)——MIPS编译环境的建立

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第13篇.我尽量每周四篇 4.4 MIPS编译环境的建立 OpenMIPS处理器在设计的时候就计划与MIPS32指令集架构兼容 ...

  6. 自己动手写CPU之第七阶段(2)——简单算术操作指令实现过程

    将陆续上传本人写的新书<自己动手写CPU>.今天是第25篇.我尽量每周四篇 亚马逊的预售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

  7. 自己动手写CPU之第七阶段(5)——流水线暂停机制的设计与实现

    将陆续上传本人写的新书<自己动手写CPU>,今天是第28篇.我尽量每周四篇 China-pub的预售地址例如以下(有文件夹.内容简单介绍.前言): http://product.china ...

  8. 自己动手写CPU之第八阶段(4)——转移指令实现过程2

    将陆续上传本人写的新书<自己动手写CPU>,今天是第36篇,我尽量每周四篇 开展晒书评送书活动,在亚马逊.京东.当当三大图书站点上,发表<自己动手写CPU>书评的前十名读者,均 ...

  9. 自己动手写CPU之第七阶段(6)——乘累加指令实现思路

    将陆续上传本人写的新书<自己动手写CPU>.今天是第29篇.我尽量每周四篇 亚马逊的销售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

随机推荐

  1. C语言的本质(17)——回调函数

    如果函数的参数是一个函数指针,我们可以通过这个函数指针传递一个函数的地址给另外一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数(Callback Function).回调函数不是由 ...

  2. GetModuleHandle,AfxGetInstanceHandle使用区别

    当一个文件被映射到调用进程的地址空间时,GetModuleHandle函数得到其中某一模块的句柄. 使用GetModuleHandle函数格式:HMODULE GetModuleHandle( LPC ...

  3. 【hihocoder1255 Mysterious Antiques in Sackler Museum】构造 枚举

    2015北京区域赛现场赛第2题. 题面:http://media.hihocoder.com/contests/icpcbeijing2015/problems.pdf OJ链接:http://hih ...

  4. Walking Ant(一道有意思的蚂蚁游戏,bfs)

    Walking Ant Time Limit: 2 Seconds      Memory Limit: 65536 KB Ants are quite diligent. They sometime ...

  5. LSH算法原理

    原始链接--http://www.jiahenglu.net/NSFC/LSH.html LSH(Location Sensitive Hash),即位置敏感哈希函数.与一般哈希函数不同的是位置敏感性 ...

  6. Mule与其它web应用服务器的区别

    跟JBoss.Tomcat或其它web应用服务器相比,Mule有何不同?虽然他们有一些重要的相同点,不同点可以归结为你想达到的目标是什么.某些种类的应用对于Mule来说比较容易去编写.部署和管理,其它 ...

  7. (转)C#反射机制详解

    反射的定义:审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包 ...

  8. 各种Adapter的用法

    同样是一个ListView,可以用不同的Adapter让它显示出来,比如说最常用的ArrayAdapter,SimpleAdapter,SimpleCursorAdapter,以及重写BaseAdap ...

  9. mysql的约束的讨论

    问题:该不该加约束,比如非空约束,外键约束 学院派会告诉你在设计的时候把应该有的约束都加上 而实践派得出的结论是主键一定加,非空约束尽量加,外键最好依赖于程序逻辑,而不是数据库,从而更好的拥抱变化,快 ...

  10. 整理mysql的一些常用用法

    在php项目中,使用mysql的一些常用的语句,今天有空系统整体一下.有些整理自网络,如有错误,请指正,谢谢.... #显示数据库和显示数据表show databases;use databaseNa ...