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类型指令

相关推荐
超级小忍1 小时前
如何配置 MySQL 允许远程连接
数据库·mysql·adb
吹牛不交税1 小时前
sqlsugar WhereIF条件的大于等于和等于查出来的坑
数据库·mysql
hello早上好2 小时前
BeanFactory 实现
后端·spring·架构
我命由我123452 小时前
Spring Boot 项目集成 Redis 问题:RedisTemplate 多余空格问题
java·开发语言·spring boot·redis·后端·java-ee·intellij-idea
hshpy2 小时前
setting up Activiti BPMN Workflow Engine with Spring Boot
数据库·spring boot·后端
白宇横流学长2 小时前
基于J2EE架构的在线考试系统设计与实现【源码+文档】
java·架构·java-ee
文牧之3 小时前
Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS
运维·数据库·oracle
篱笆院的狗3 小时前
如何使用 Redis 快速实现布隆过滤器?
数据库·redis·缓存
洛神灬殇4 小时前
【LLM大模型技术专题】「入门到精通系列教程」基于ai-openai-spring-boot-starter集成开发实战指南
网络·数据库·微服务·云原生·架构
Nejosi_念旧4 小时前
Vite 双引擎架构 —— Esbuild 概念篇
架构·前端框架