MIPS32 指令架构

指令格式

R 类型

说明: 用于寄存器和寄存器操作

参数说明:

  • Op: 指令操作码
  • Rs: 第一个源操作数寄存器号,参与运算使用
  • Rd: 目的操作数寄存器号,保存结果使用
  • Shamt: 位偏移量,仅在位移指令使用,在此直接置0
  • Func: 指令函数码,用于选择Op操作中的具体函数

例子:

  • 比如加法运算,在指令操作码中,指出它是算术运算;在指令函数码中,指出它是算术运算中的加法运算
  • $Rd = $Rs + $Rt

I类型

说明:

  • 用于短立即数和内存载入指令load操作
  • 立即数,顾名思义,就是可以立即使用的数,即在指令中就给了具体的数据,而不用先给出寄存器号到寄存器中去找

参数说明:

  • Op: 指令操作码
  • Rs: 第一个源操作数寄存器号,参与运算使用
  • Rt: 第二个源操作数寄存器号,参与运算使用
  • 16位立即数: 作为数据,参与运算使用

J型指令

说明: 用于无条件跳转

参数说明:

  • Op: 指令操作码
  • 26位地址数: 作为地址,参与寻址使用

and、or、xor、nor(R类型)

图例

and 例子

当功能码是6'b100100时,表示是and指令,逻辑"与"运算

指令用法: add rd, rs, rt

指令作用:

  • rd <- rs AND rt 。将地址为rs 的通用寄存器的值与地址为rt的通用寄存器的值进行逻辑"与"运算
  • 运算结果保存到地址为rd的通用寄存器中

or 例子

当功能码是 6'b100101时,表示是or指令,逻辑"或"运算

指令用法: or rd, rs, st

指令作用:

  • rd <- rs OR rt, 将地址为rs的通用寄存器的值与地址为rt的通用寄存器的值进行逻辑"或"运算
  • 运算结果保存到地址为rd的通用寄存器中

xor 例子

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

指令用法: xor rd, rs, rt

指令作用:

  • rd <- rs XOR rt, 将地址为rs的通用寄存器的值与地址为rt的通用寄存器的值进行逻辑"异或"运算
  • 运算结果保存到地址为rd的通用寄存器中

nor 例子

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

指令用法: nor rd, rs, rt

指令作用:

  • rs <- rs NOR rt,将地址为rs的通用寄存器的值,与地址为rt的通用寄存器的值进行逻辑"或非"运算
  • 运算结果保存到地址为rd的通用寄存器中

andi、xori指令 (I类型)

图例

andi 例子

当指令码是 6'b001100,表示是andi指令,逻辑"与"运算

指令用法: andi rt,rs, immediate

指令作用:

  • rd <- rs AND zero_extended(immediate)
  • 将地址为rs的通用寄存器的值与指令中立即数进行零扩展后的值与指令中立即数进行零扩展后的值进行逻辑"与"运算
  • 运算结果保存到地址为rt的通用寄存器中

xori 例子

当指令码是6'b001110,表示xori指令,异或运算

指令用法: xori, rt, rs, immediate

指令作用:

  • rs <- rs XOR zero_extended(immediate)
  • 将地址为rs的通用寄存器的值与指令中立即数进行零扩展后的值进行逻辑"异或"运算
  • 运算结果保存到地址为rt的通用寄存器

lui 指令(I类型)

图例

lui 例子

依据指令中第26 ~ 31bit指令码的值是否为6'b001111,从而判断是否是lui指令

指令用法: lui rt, immediate

指令作用:

  • rt <- immediate || 0 ^ 16
  • 将指令中的16bit立即数保存到地址为rt的通用寄存器的高16位
  • 另外,地址为rt的通用寄存器的低16位使用0填充

sll、sllv、sra、srav、srl、srlv指令(R类型)

图例

sll 例子

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

指令用法: sll rd, rt, sa

指令作用:

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

srl 例子

当功能码事 6'b000010, 表示srl指令,逻辑右移

指令用法: srl rd, rt, sa

指令作用:

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

sra 例子

当功能码是 6'b000022,表示sra指令,算术右移

指令用法: sra rd, rt, sa

指令作用:

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

sllv 例子

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

指令用法: sllv rd, rt, rs

指令作用

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

srlv 例子

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

指令用法: srlv rd, rt, rs

指令作用:

  • rd <- rt >> rs[4:9](logic),将地址为rt的通用寄存器的值向右移位,空出来的位置用0填充
  • 结果保存到地址为rd的通用寄存器中
  • 移位位数由地址为rs的寄存器的第0~4bit

srav 例子

当功能码是 6'b000111,表示是srav,算术右移

指令用法: srav rd, rt, rs

指令作用:

  • rd <- rt >> rs[4:0](arthmetic) ,将地址为rt的通用寄存器的值向右移位,空出来的位置使用rt[31]填充
  • 结果保存到地址为rd的通用寄存器中
  • 移位位数由地址为rs的寄存器值的第0~4bit确定

nop、ssnop、sync、pref指令

图例

nop、ssnop、sync 这3条指令都是R类型指令,并且 指令码都是 6'b000000,都是SPECIAL 类

pref 属于 J类型指令

相关推荐
TDengine (老段)5 分钟前
TDengine 字符串函数 CHAR_LENGTH 用户手册
大数据·数据库·时序数据库·tdengine·涛思数据
wind_one17 分钟前
5.基础--SQL--DDL数据库操作
数据库·sql
TDengine (老段)8 分钟前
TDengine 数学函数 CRC32 用户手册
java·大数据·数据库·sql·时序数据库·tdengine·1024程序员节
llxxyy卢8 分钟前
SQL注入之二次、加解密、DNS等注入
数据库·sql
数据库学啊12 分钟前
供暖季技术实战:益和热力用 TDengine 时序数据库破解热力数据处理难题
数据库·时序数据库·tdengine
SEO_juper22 分钟前
搜索引擎索引权威指南:抓取、收录与排名的基础
数据库·搜索引擎·seo·数字营销
不剪发的Tony老师30 分钟前
SQLite 3.51.0发布,新功能解读
数据库·sqlite
努力学习的小廉40 分钟前
初识MYSQL —— 复合查询
android·数据库·mysql
NPE~1 小时前
[手写系列]Go手写db — — 第七版(实现Disk存储引擎、Docker化支持)
数据库·后端·docker·golang·教程·手写数据库
workflower2 小时前
FDD与其他方法的相似和区别
数据库·算法·需求分析·个人开发