MIPS指令集摘要

news2025/2/24 15:59:42

目录

MIPS指令R I J三种格式

MIPS五种寻址方式

立即数寻址

寄存器寻址

基址寻址

PC相对寻址

伪直接寻址

WinMIPS64汇编指令

助记 

从内存中加载数据

lb

lbu

lh

lhu

lw

lwu

ld

l.d

lui

存储数据到内存

sb

sh

sw

sd

s.d

算术运算

daddi

daddui

dadd

daddu

dsub

dsubu

dmul

dmulu

ddiv

ddivu

add.d

sub.d

mul.d

div.d

逻辑运算

and

or

xor

andi

ori

xori

置位

slt

sltu

slti

sltiu

分支

beq

bne

beqz

bnez

跳转

j

jr

jal

jalr

移位

dsll

dsrl

dsra

dsllv

dsrlv

dsrav

移动

movz

movn

mov.d

mtcl

mfcl

其他

halt

nop

cvt.d.l

cvt..l.d

c.lt.d

c.le.d

c.eq.d

bclf

bclt

终端交互

内存映射 

示例①输出hello world

示例②读取两个数计算乘积


MIPS指令R I J三种格式

op

操作码opcode

rs

第一个源寄存器编号

rt

第二个源寄存器编号

rd

目的寄存器编号

shamt

移位位数

funct

功能码 

MIPS五种寻址方式

立即数寻址

操作数为指令自身中的常数立即数

addi r2,r1,1

r2=r1+1 

寄存器寻址

操作数为寄存器中的值

add r2,r1,r0

r2=r1+r0 

基址寻址

以基址寄存器中的值和立即数常数之和作为地址,该地址指向的内存的值作为操作数 

lw r2,8(r1)

r2=M[r1+8] 

PC相对寻址

以PC程序计数器和指令中常数之和作为地址,即16位地址左移2位(即乘以4)与PC计数器相加

beq r2,r1,label

如果r2==r1则程序跳到label处 

伪直接寻址

跳转地址由指令中26位地址左移两位(即乘以4)与PC计数器的高4位相连所组成

j label

WinMIPS64汇编指令

助记 

从内存中加载数据

lb

lb rd,imm(rs)

基址偏移寻址,加载一个字节8位,rd=M[rs+imm]

lbu

lbu rd,imm(rs)

基址偏移寻址,加载一个无符号字节8位,rd=M[rs+imm]

lh

lh rd,imm(rs)

基址偏移寻址,加载一个半字16位,rd=M[rs+imm]

lhu

lhu rd,imm(rs)

基址偏移寻址,加载一个无符号半字16位,rd=M[rs+imm]

lw

lw rd,imm(rs)

基址偏移寻址,加载一个字32位,rd=M[rs+imm]

lwu

lwu rd,imm(rs)

基址偏移寻址,加载一个无符号字32位,rd=M[rs+imm]

ld

ld rd,imm(rs)

基址偏移寻址,加载一个64位,rd=M[rs+imm]

l.d

l.d freg,imm(rs)

基址偏移寻址,加载一个64位浮点数,freg=M[rs+imm]

lui

lui reg,imm

英文原文是这个load upper half of register immediate,我也不是很懂@_@

存储数据到内存

sb

sb rs,imm(rd)

基址偏移寻址,存储一个字节8位,M[rd+imm]=rs

sh

sh rs,imm(rd)

基址偏移寻址,存储一个半字16位,M[rd+imm]=rs

sw

sw rs,imm(rd)

基址偏移寻址,存储一个字32位,M[rd+imm]=rs

sd

sd rs,imm(rd)

基址偏移寻址,存储一个64位,M[rd+imm]=rs

s.d

s.d freg,imm(rd)

基址偏移寻址,存储一个64位浮点数,M[rd+imm]=freg

算术运算

daddi

daddi rd,rs,imm

立即数寻址,加法操作,rd=rs+imm

daddui

daddi rd,rs,imm

立即数寻址,无符号加法操作,rd=rs+imm

dadd

dadd rd,rs,rt

寄存器寻址,加法操作,rd=rs+rt

daddu

daddu rd,rs,rt

寄存器寻址,无符号加法操作,rd=rs+rt

dsub

dsub rd,rs,rt

寄存器寻址,减法操作,rd=rs-rt

dsubu

dsubu rd,rs,rt

寄存器寻址,无符号减法操作,rd=rs-rt

dmul

dmul rd,rs,rt

寄存器寻址,乘法操作,rd=rs*rt

dmulu

dmulu rd,rs,rt

寄存器寻址,无符号乘法操作,rd=rs*rt

ddiv

ddiv rd,rs,rt

寄存器寻址,除法操作,rd=rs/rt

ddivu

ddivu rd,rs,rt

寄存器寻址,无符号除法操作,rd=rs/rt

add.d

add.d freg1,freg2,freg3

寄存器寻址,浮点数加法,freg1=freg2+freg3

sub.d

sub.d freg1,freg2,freg3

寄存器寻址,浮点数减法,freg1=freg2-freg3

mul.d

mul.d freg1,freg2,freg3

寄存器寻址,浮点数乘法,freg1=freg2*freg3

div.d

div.d freg1,freg2,freg3

寄存器寻址,浮点数除法,freg1=freg2/freg3

逻辑运算

and

and rd,rs,rt

寄存器寻址,与操作,rd=rs&rt

or

or rd,rs,rt

寄存器寻址,或操作,rd=rs|rt

xor

xor rd,rs,rt

寄存器寻址,异或操作,rd=rs^rt

andi

andi rd,rs,imm

立即数寻址,与操作,rd=rs&imm

ori

ori rd,rs,imm

立即数寻址,或操作,rd=rs|imm

xori

andi rd,rs,imm

立即数寻址,异或操作,rd=rs^imm

置位

slt

slt rd,rs,rt

寄存器寻址,如果rs<rt那么rd=1,否则rd=0

sltu

sltu rd,rs,rt

寄存器寻址,无符号比较,如果rs<rt那么rd=1,否则rd=0

slti

slti rd,rs,imm

立即数寻址,如果rs<imm那么rd=1,否则rd=0

sltiu

sltiu rd,rs,imm

立即数寻址,无符号比较,如果rs<imm那么rd=1,否则rd=0

分支

beq

beq rs,rt,label

PC相对寻址,如果rs==rt,那么程序跳转到label

bne

bne rs,rt,label

PC相对寻址,如果rs!=rt,那么程序跳转到label

beqz

beqz rs,label

PC相对寻址,如果rs==0,那么程序跳转到label

bnez

bnez rs,label

PC相对寻址,如果rs!=0,那么程序跳转到label

跳转

j

j label

伪直接寻址,程序直接跳转到label

jr

jr rs

伪直接寻址,程序直接跳转到rs中的地址

jal

jal label

伪直接寻址,程序直接跳转到label并保存程序当前下一条指令地址到r31

jalr

jalr rs

伪直接寻址,程序直接跳转到rs中的地址并保存程序当前下一条指令地址到r31

移位

为什么没有算术左移,因为算术左移和逻辑左移效果一样,都是右边补0,但是逻辑右移和算术右移不一样,逻辑右移左边直接补0,而算术右移左边需要补符号位,即负数补1,非负数补0

dsll

dsll rd,rs,imm

立即数寻址,逻辑左移,rd=rs<<imm

dsrl

dsrl rd,rs,imm

立即数寻址,逻辑右移,rd=rs>>imm

dsra

dsra rd,rs,imm

立即数寻址,算术右移,rd=rs>>imm

dsllv

dsllv rd,rs,rt

寄存器寻址,逻辑左移,rd=rs<<rt

dsrlv

dsrlv rd,rs,rt

寄存器寻址,逻辑右移,rd=rs>>rt

dsrav

dsrav rd,rs,rt

寄存器寻址,算术左移,rd=rs<<rt

移动

movz

movz rd,rs,rt

寄存器寻址,如果rt==0那么rd=rs

movn

movn rd,rs,rt

寄存器寻址,如果rt!=0那么rd=rs

mov.d

mov.d freg1,freg2

寄存器寻址,freg1=freg2

mtcl

mtcl rs,freg

寄存器寻址,freg=rs

mfcl

mfcl rd,freg

寄存器寻址,rd=freg

其他

halt

halt

程序结束

nop

nop

没有操作

cvt.d.l

cvt.d.l freg,freg

convert 64-bit integer to a double FP format

cvt..l.d

cvt.l.d freg,freg

convert double FP to a 64-bit integer format

c.lt.d

c.lt.d freg,freg

set FP flag if less than

c.le.d

c.le.d freg,freg

 set FP flag if less than or equal to

c.eq.d

c.eq.d freg,freg

 set FP flag if equal to

bclf

bclf label

branch to address if FP flag is FALSE

bclt

bclt label

 branch to address if FP flag is TRUE

终端交互

内存映射 

CONTROL: .word 0x10000
DATA:    .word 0x10008

WinMIPS64 模拟器支持内存映射 IO 模型,用于写入 或 从 WinMIPS64 终端读取。

要写入终端:

  1. 将内存地址设置为要写入的值DATA

  2. 将适当的值写入内存地址CONTROL

要从终端读取:

  1. 将适当的值写入内存地址CONTROL

  2. 从内存地址读取输入DATA

CONTROL用法

写入操作

1

设置为输出的无符号整数DATA

2

设置为输出的有符号整数DATA

3

设置为输出的浮点值DATA

4

设置为用于输出的字符串的内存地址DATA

5

设置为像素的坐标、坐标和 RGB 颜色(分别使用字节、字节和 word32 存储)DATA+5xDATA+4yDATA

读取操作

8

从终端/键盘读取(整数或浮点值)DATA

9

从中读取一个字节,没有字符被回显DATA

其他操作

6

清除终端屏幕

7

清除图形屏幕

示例①输出hello world

	.data
CONTROL: .word32 0x10000
DATA:	.word32 0x10008
mes:	.asciiz "Hello World!\n"
	
	.text
	daddi r1,r0,mes
	lw r2,DATA(r0)
	sd r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sd r1,0(r2)
	halt

示例②读取两个数计算乘积

	.data
CONTROL: .word32 0x10000
DATA:	.word32 0x10008
cue1:	.asciiz "please enter two numbers:\n"
cue2:   .asciiz "results:\n"
cue3:   .asciiz "warning: result overflow\n"
	
	.text
	daddi r1,r0,cue1 	# please enter two numbers
	lw r2,DATA(r0)
	sd r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sd r1,0(r2)
 
	daddi r1,r0,8	 	# r3=a
	lw r2,CONTROL(r0)
	sd r1,0(r2)
	lw r2,DATA(r0)
	lw r3,0(r2)
 
 
	daddi r1,r0,8 		# r4=b
	lw r2,CONTROL(r0)
	sd r1,0(r2)
	lw r2,DATA(r0)
	lw r4,0(r2)
 
	dadd r5,r0,r0		# r5=0 for r5=a*b
	daddi r1,r0,32
loop:	andi r2,r4,1		# r4[-1]
	beq r2,r0,zero		# r4[-1]==1?
	dadd r5,r5,r3
zero:	dsll r3,r3,1
	dsra r4,r4,1
	daddi r1,r1,-1
	bne r1,r0,loop
 
	daddi r1,r0,cue2	# results
	lw r2,DATA(r0)
	sd r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sd r1,0(r2)
 
	lw r2,DATA(r0)		# output a*b
	sd r5,0(r2)
	daddi r1,r0,2
	lw r2,CONTROL(r0)
	sd r1,0(r2)
 
	dsra r1,r5,16		# r1=r5[0:31]
	dsra r1,r1,16		
	beq r1,r0,end
	
	daddi r1,r0,cue3	# output overflow
	lw r2,DATA(r0)
	sd r1,0(r2)
	daddi r1,r0,4
	lw r2,CONTROL(r0)
	sd r1,0(r2)
 
end:	halt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1119589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自然语言处理---Transformer机制详解之GPT2模型介绍

1 GPT2的架构 从模型架构上看, GPT2并没有特别新颖的架构, 它和只带有解码器模块的Transformer很像. 所谓语言模型, 作用就是根据已有句子的一部分, 来预测下一个单词会是什么. 现实应用中大家最熟悉的一个语言模型应用, 就是智能手机上的输入法, 它可以根据当前输入的内容智…

hdlbits系列verilog解答(向量)-11

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 向量用于使用一个名称对相关信号进行分组,以使其更易于操作。例如,声明一个名为 8 位向量, wire [7:0] w; 该向量在 w 功能上等效于具有 8 个单独的线网(wire w0, w1, w2, w3, w4, w5, w6, w7)。 与C语言…

【Ubuntu系统搭建STM32开发环境(国内镜像全程快速配置)】

源于本人失败的经历苦心研究 虚拟机安装ubuntu换源VScode安装安装Java环境安装cubemx安装 arm-Linux-gcc安装gdb server安装OpenOCD 虚拟机安装ubuntu 系统镜像可以在阿里云镜像站且下载速度很快。 选择安装的版本。 我选择的是&#xff1a;ubuntu-22.10-desktop-amd64.iso。…

Hadoop3教程(三十四):(生产调优篇)MapReduce生产经验汇总

文章目录 &#xff08;164&#xff09;MR跑得慢的原因&#xff08;165&#xff09;MR常用调优参数Map阶段Reduce阶段 &#xff08;166&#xff09;MR数据倾斜问题参考文献 &#xff08;164&#xff09;MR跑得慢的原因 MR程序执行效率的瓶颈&#xff0c;或者说当你觉得你的MR程…

json-server工具准备后端接口服务环境

1.安装全局工具json-server&#xff08;全局工具仅需要安装一次&#xff09; 官网&#xff1a;json-server - npm 点击Getting started可以查看使用方法 在终端中输入yarn global add json-server或npm i json-server -g 2.代码根目录新建一个db目录 3.在db目录下创建index…

061:mapboxGL利用fitBounds同时将多个点放在可视范围内

第061个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载geojson数据,利用fitBounds同时将多个点放在可视范围内。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共134行)相关API参考:专栏目标示例…

linux性能分析(四)如何学习linux性能优化

一 如何学习linux性能优化 强调&#xff1a; 由于知识记忆曲线以及某些知识点不常用,所以一定要注重复习思考&#xff1a; 如何进行能力转义以及能力嫁接? --> 真正站在巨人的肩膀上性能调优的目的&#xff1a; 不影响系统稳定性的资源最大利用化补充&#xff1a; 性能…

【Spring Cloud】如何确定微服务项目的Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本

文章目录 1. 版本选择2. 用脚手架快速生成微服务的pom.xml3. 创建一个父工程4. 代码地址 本文描述如何确定微服务项目的Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本。 1. 版本选择 我们知道Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本选择一致性非常重…

CSS常见的预处理器有哪些?

CSS常见的预处理器有以下几种&#xff1a; 1&#xff1a;Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;&#xff1a;Sass是一种成熟且广泛使用的CSS预处理器。它提供了许多功能&#xff0c;如变量、嵌套规则、混合&#xff08;Mixins&#xff09;、继承&am…

RT-Thread学习笔记(四):RT-Thread Studio工具使用

RT-Thread Studio工具使用 官网详细资料实用操作1. 查看 RT-Thread RTOS API 文档2.打开已创建的工程3.添加头文件路径4. 如何设置生成hex文件5.新建工程 官网详细资料 RT-Thread Studio 用户手册 实用操作 1. 查看 RT-Thread RTOS API 文档 2.打开已创建的工程 如果打开项目…

库的操作【MySQL】

文章目录 创建数据库字符集和校验规则概念分类例子 查看数据库显示创建语句修改数据库删除数据库备份和恢复备份恢复 创建数据库 SQL: CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARSETcharset_name] [[DEFAULT] COLLATEcollation_name];其中&#xff0c;大写的单…

数据结构与算法设计分析——动态规划

目录 一、动态规划的定义二、动态规划的基本要素和主要步骤&#xff08;一&#xff09;最优子结构&#xff08;二&#xff09;重叠子问题 三、贪心法、分治法和动态规划的对比&#xff08;一&#xff09;贪心法&#xff08;二&#xff09;分治法&#xff08;三&#xff09;动态…

flink中使用GenericWriteAheadSink的优缺点

背景 GenericWriteAheadSink是flink中提供的实现几乎精确一次输出的数据汇抽象类&#xff0c;本文就来看一下使用GenericWriteAheadSink的优缺点 GenericWriteAheadSink的优缺点 先看一下GenericWriteAheadSink的原理图 优点&#xff1a; 几乎可以精确一次的输出&#xf…

[人工智能-综述-15]:第九届全球软件大会(南京)有感 -4-大语言模型全流程、全方面提升软件生产效能

目录 一、软件生产通用模型 1.1 企业软件生产模型 1.2 软件项目管理 VS 软件工程 1.3 企业管理与部门管理 二、第一步&#xff1a;企业数字化&#xff1a;企业信息系统 三、第二步&#xff1a;软件生产自动化&#xff1a;DevOps 四、第四步&#xff1a;软件生产智能化&a…

LeetCode讲解篇之77. 组合

文章目录 题目描述题解思路题解代码 题目描述 题解思路 遍历nums&#xff0c;让当前数字添加到结果前缀中&#xff0c;递归调用&#xff0c;直到前缀的长度为k&#xff0c;然后将前缀添加到结果集 题解代码 func combine(n int, k int) [][]int {var nums make([]int, n)fo…

lv8 嵌入式开发-网络编程开发 20 域名解析与http服务实现原理

目录 1 域名解析 2 如何实现万维网服务器&#xff1f; 2.1 HTTP 的操作过程 2.2 万维网服务器实现 1 域名解析 域名解析gethostbyname函数 主机结构在 <netdb.h> 中定义如下&#xff1a; struct hostent {char *h_name; /* 官方域名 */char **h_alias…

MIT 6.824 -- Cache Consistency -- 11

MIT 6.824 -- Cache Consistency -- 11 引言严峻挑战锁服务缓存一致性问题案例演示优化 原子性问题故障恢复问题log内容故障恢复 小结 课程b站视频地址: MIT 6.824 Distributed Systems Spring 2020 分布式系统 推荐伴读读物: 极客时间 – 大数据经典论文解读DDIA – 数据密集…

网工记背命令(7)----静态路由(负载分担,主备备份)

1.静态路由负载分担 如图所示&#xff0c;属于不同网段的主机通过几台 Switch 相连&#xff0c;要求不配置动态路由协议&#xff0c;使不同网 段的任意两台主机之间能够互通&#xff0c;从拓扑图中可以看出&#xff0c;从 PCA 到 PCC 有两条路径可以过去&#xff0c;分别是 PC…

第三章 内存管理 十三、页面置换算法(最佳置换算法、先进先出置换算法、最近最久未使用置换算法、时钟置换算法、改进型的时钟置换算法)

目录 一、定义 二、分类 1、最佳置换算法 / 最远置换算法&#xff08;OPT&#xff0c;Optimal): 1.1、定义&#xff1a; 1.2、例子&#xff1a; 2、先进先出置换算法(FIFO&#xff09;: 2.1、定义&#xff1a; 2.2、实现方法&#xff1a; 2.3、例子&#xff1a; 3、最…

【Pillow库的内涵】01/3 进行基本图像操作

一、说明 Pillow 具有被 Python 社区广泛使用的优势&#xff0c;并且它不像其他一些图像处理库那样具有陡峭的学习曲线。应用PIL库的Image对象&#xff0c;益处很多&#xff0c;首先它可以处理网上URL文件&#xff0c;其次&#xff0c;图片可以方面转化成int32、64或float类型&…