当前位置: 首页 > news >正文

MIPS指令集摘要

目录

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".textdaddi r1,r0,meslw r2,DATA(r0)sd r1,0(r2)daddi r1,r0,4lw 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".textdaddi r1,r0,cue1 	# please enter two numberslw r2,DATA(r0)sd r1,0(r2)daddi r1,r0,4lw r2,CONTROL(r0)sd r1,0(r2)daddi r1,r0,8	 	# r3=alw r2,CONTROL(r0)sd r1,0(r2)lw r2,DATA(r0)lw r3,0(r2)daddi r1,r0,8 		# r4=blw r2,CONTROL(r0)sd r1,0(r2)lw r2,DATA(r0)lw r4,0(r2)dadd r5,r0,r0		# r5=0 for r5=a*bdaddi 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,1dsra r4,r4,1daddi r1,r1,-1bne r1,r0,loopdaddi r1,r0,cue2	# resultslw r2,DATA(r0)sd r1,0(r2)daddi r1,r0,4lw r2,CONTROL(r0)sd r1,0(r2)lw r2,DATA(r0)		# output a*bsd r5,0(r2)daddi r1,r0,2lw r2,CONTROL(r0)sd r1,0(r2)dsra r1,r5,16		# r1=r5[0:31]dsra r1,r1,16		beq r1,r0,enddaddi r1,r0,cue3	# output overflowlw r2,DATA(r0)sd r1,0(r2)daddi r1,r0,4lw r2,CONTROL(r0)sd r1,0(r2)end:	halt

相关文章:

MIPS指令集摘要

目录 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…...

数据可视化素材分享 | 数十图表、无数模板

很多人在后台求分享报表、源代码&#xff0c;其实何必这么麻烦&#xff0c;在奥威BI数据可视化平台上点击即可获得大量的可视化素材&#xff0c;如数十种可视化图表&#xff0c;适用于不同分析场景&#xff1b;又如大量不同主题的BI数据可视化报表模板&#xff0c;套用后替换数…...

Hadoop3教程(三十二):(生产调优篇)NameNode故障恢复与集群的安全模式

文章目录 &#xff08;159&#xff09;NameNode故障处理&#xff08;160&#xff09;集群安全模式&磁盘修复集群安全模式磁盘修复等待安全模式 参考文献 &#xff08;159&#xff09;NameNode故障处理 如果NameNode进程挂了并且存储的数据也丢失了&#xff0c;如何恢复Nam…...

uniapp下载附件保存到手机(文件、图片)ios兼容

downloadFile(file)&#xff0c;其中file为下载的文件地址uni.downloadFile图片使用uni.saveImageToPhotosAlbum【安卓、ios都合适】文件使用uni.openDocument【安卓图片也可以用这个&#xff0c;ios会失败】 // 下载文件 export function downloadFile(file) {let acceptArr …...

【Edabit 算法 ★☆☆☆☆☆】 Basketball Points

【Edabit 算法 ★☆☆☆☆☆】 Basketball Points language_fundamentals math numbers Instructions You are counting points for a basketball game, given the amount of 2-pointers scored and 3-pointers scored, find the final points for the team and return that …...

Web攻防04_MySQL注入_盲注

文章目录 MYSQL-SQL操作-增删改查盲注概念盲注分类盲注语句参考&更多盲注语句/函数 注入条件-数据回显&错误处理PHP开发项目-注入相关条件&#xff1a;基于延时&#xff1a;基于布尔&#xff1a;基于报错&#xff1a; CMS案例-插入报错&删除延时-PHP&MYSQL1、x…...

Flask自定义装饰和g的使用

1. 在commons.py文件中新增一个装饰器类: 注&#xff1a;一定要加入wraps进行装饰否则&#xff0c;装饰器在给多个函数进行装饰时会报错 from functools import wraps from flask import session, current_app, g# 定义登陆装饰器&#xff0c;封装用户的登陆数据 def user_log…...

【汇编】汇编语言基础知识(学习笔记)

一、汇编语言概述 汇编语言是直接在硬件之上工作的编程语言&#xff0c;首先要了解硬件奈统的结构&#xff0c;才能有效的应用汇编语言对其编程。 二、汇编语言的产生 机器语言&#xff1a;机器语言是机器指令的集合 汇编语言的主体是汇编指令 汇编指令和机器指令的差别在…...

前端 | FormData 用法详解

前端 | FormData 用法详解 介绍 ​FormData 是 Ajax2.0 对象用以将数据编译成键值对&#xff0c;以便于 XMLHttpRequest 来发送数据。XMLHttpRequest Level 2 提供的一个接口对象&#xff0c;可以使用该对象来模拟和处理表单并方便的进行文件上传操作 ​ 如果表单属性设为 mu…...

linux常见命令-文件目录类

9.4 文件目录类 &#xff08;1&#xff09;pwd 指令:显示当前工作目录的绝对路径 &#xff08;2&#xff09;Is指令:查看当前目录的所有内容信息 基本语法&#xff1a; ls [选项,可选多个] [目录或是文件] 常用选项:-a:显示当前目录所有的文件和目录&#xff0c;包括隐藏的…...

2023 10月8日 至 10 月16日学习总结

1.做的题目 [RootersCTF2019]I_&#xff1c;3_Flask_双层小牛堡的博客-CSDN博客 [NCTF2019]SQLi regexp 盲注-CSDN博客 [网鼎杯 2018]Comment git泄露 / 恢复 二次注入 .DS_Store bash_history文件查看-CSDN博客 PHP LFI 利用临时文件Getshell_双层小牛堡的博客-CSDN博客 …...

【Java 进阶篇】深入了解 Bootstrap 表格和菜单

表格和菜单是网页设计中的重要组成部分&#xff0c;它们用于展示数据、导航和用户交互。Bootstrap 是一个强大的前端框架&#xff0c;提供了丰富的表格样式和菜单组件&#xff0c;使开发者能够轻松创建功能丰富的网页。在本文中&#xff0c;我们将深入探讨 Bootstrap 中表格和菜…...

java的for循环中遇到异常抛出后继续循环执行

java的for循环中遇到异常抛出后继续循环执行 Test public void loopTryCatchTest() throws Exception {Map<String, Object> a new HashMap();a.put("a", "1");a.put("b", null);a.put("c", "3");for (Map.Entry<…...

【Javascript】构造函数之new的作用

目录 new的作用 把对象返回了回来 无new 有new 把构造函数的this指向了要返回的对象 无new​编辑 有new new的执行流程 new的作用 创建了新空对象将构造函数的作用域赋值给新对象(this指向新对象)执行构造函数代码 &#xff08;为这个新对象添加属性&#xff09;返回新对…...

粘包和半包问题及解决办法

粘包问题是指数据在传输时&#xff0c;在一条消息中读取到了另一条消息的部分数据&#xff0c;这种现象就叫做粘包。 半包问题是指数据在传输时&#xff0c;接收端只收到了部分数据&#xff0c;而非完整的数据&#xff0c;就叫做半包。 产生粘包和半包问题原因&#xff1a; …...

MySQL数据库查询实战操作

前置条件: 创建库:MySQL基本操作之创建数据库-CSDN博客 创建表:MySQL基本操作之创建数据表-CSDN博客 目录 常规查询常用函数union查询一、常规查询 1、查询所有姓名以 "张" 开头的学生: SELECT * FROM student WHERE name LIKE 张%; 这条语句使用 LIKE 运算…...

Elasticsearch 8.9 Master节点处理请求源码

大家看可以看ElasticSearch源码&#xff1a;Rest请求与Master节点处理流程&#xff08;1&#xff09; 这个图非常好&#xff0c;下午的讲解代码在各个类和方法之间流转&#xff0c;都体现这个图上 一、Master节点处理请求的逻辑1、节点(数据节点)要和主节点进行通讯&#xff0…...

Python---练习:while循环案例:猜数字

需求&#xff1a; 计算机从1 ~ 10之间随机生成一个数字&#xff0c;然后提示输入数字&#xff0c;如果我们输入的数字与随机数相等&#xff0c;则提示恭喜你&#xff0c;答对了。如果输入的数字比随机数大&#xff0c;则提示&#xff0c;猜大了。反之&#xff0c;则提示猜小了…...

CRM自动化意味着什么?企业如何从中受益?

客户关系管理&#xff08;CRM&#xff09;软件不再仅仅适用于大公司或销售周期长的行业&#xff0c;它越来越成为各种规模企业的重要工具。 在日常工作中&#xff0c;当你陷入流程的所有细节时&#xff0c;可能会产生不必要的工作。因此&#xff0c;如果你想要CRM提供的组织和…...

Python大数据之PySpark

PySpark入门 1、 Spark与PySpark 1、 Spark与PySpark...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...