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

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

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

相关文章

绿盾控制台如何给未授权终端分配相应权限

环境&#xff1a; 绿盾控制台7.0 问题描述&#xff1a; 绿盾控制台如何给未授权终端分配相应权限 解决方案&#xff1a; 1.进入桌面管理系统 2.通过终端号&#xff0c;找到未授权终端下面&#xff0c;选择相应的未授权终端 3.点击鼠标右键&#xff0c;选择分配授权模块 4.下…

01认识微服务

一、微服务架构演变 1.单体架构 将所有的功能集中在一个项目开发&#xff0c;打成一个包部署。优点架构简单&#xff0c;部署成本低。缺点耦合度高&#xff0c;不利于大型项目的开发和维护 2.分布式架构 根据业务功能对系统进行拆分&#xff0c;每个业务模块作为独立的项目…

修改ConsoleApplication17_2项目实现oss上线

首先创建号oss&#xff0c;上传文件&#xff0c;复制临时链接 木马内写 可以看到能成功上线但是有个问题就是占用cpu大小为9%左右&#xff0c;这里我用的是腾讯云oss实现的&#xff0c;用阿里云oss实现也是9%左右 我再次进行url的aes加密 还是百分之9左右&#xff0c; 这里…

npm publish发布到在线仓库时,提示:Scope not found

当npm publish发布时&#xff0c;控制台提示&#xff1a;Scope not found&#xff0c;具体错误信息如下&#xff1a; npm notice npm ERR! code E404 npm ERR! 404 Not Found - PUT https://registry.npmjs.org/xxx%2fxxx - Scope not found npm ERR! 404 npm ERR! 404 xxx/xx…

Spring源码解析——事务的回滚和提交

正文 上一篇文章讲解了获取事务&#xff0c;并且通过获取的connection设置只读、隔离级别等&#xff0c;这篇文章讲解剩下的事务的回滚和提交。最全面的Java面试网站 回滚处理 之前已经完成了目标方法运行前的事务准备工作&#xff0c;而这些准备工作最大的目的无非是对于程…

Rust 中的String与所有权机制

文章目录 一、string二、所有权2.1 所有权与作用域2.2 对所有权的操作2.2.1 转移2.2.3 拷贝2.2.3 传递 2.3 引用2.3.1 借用2.3.2 可变引用 一、string 之前学习过 Rust 只有几种基础的数据类型&#xff0c;但是没有常用的字符串也就是String&#xff0c;今天来学习一下 String…

C++初阶(五)类和对象

文章目录 一、C两大类型二、类的6个默认成员函数三、构造函数1、概念2、特性1、构造函数自动调用特性演示2、无参有参调用两种情况演示3、函数重载演示4、默认构造函数组成及演示5、内置类型成员不初始化的补丁演示 3、析构函数1、概念2、特性1、代码演示2、析构两种情况 4、构…

Django实现音乐网站 (21)

使用Python Django框架做一个音乐网站&#xff0c; 本篇音乐播放器功能完善及原有功能修改。 目录 播放列表修改 视图修改 删除、清空播放器 设置路由 视图处理 修改加载播放器脚本 模板修改 脚本设置 清空功能实现 删除列表音乐 播放列表无数据处理 视图修改 播放…

【算法】TOP101-二叉树篇(持续更新ing)

文章目录 1. JZ36 二叉搜索树与双向链表2. 100. 相同的树3. 572. 另一棵树的子树4. BM26 求二叉树的层序遍历5. BM33 二叉树的镜像6. BM40 重建二叉树7. 106. 从中序与后序遍历序列构造二叉树 1. JZ36 二叉搜索树与双向链表 JZ36 二叉搜索树与双向链表 解题思路: 由题目可知,…

【uniapp/uView】解决消息提示框悬浮在下拉框之上

需要实现这样的效果&#xff0c;即 toast 消息提示框在 popup 下拉框之上&#xff1a; 解决方法&#xff0c;把 <u-toast ref"uToast" /> 放在 u-popup 里面即可&#xff0c;这样就可以提升 toast 的优先级&#xff1a; <!-- 弹出下拉框 --><u-popu…

大规模语言LLaVA:多模态GPT-4智能助手,融合语言与视觉,满足用户复杂需求

大规模语言LLaVA&#xff1a;多模态GPT-4智能助手&#xff0c;融合语言与视觉&#xff0c;满足用户复杂需求 一个面向多模式GPT-4级别能力构建的助手。它结合了自然语言处理和计算机视觉&#xff0c;为用户提供了强大的多模式交互和理解。LLaVA旨在更深入地理解和处理语言和视…

web前端基础CSS------美化页面“footer”部分

一&#xff0c;实验代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>关于我们</title><style type"text/css">#footer{margin: 10px 0px;background: #f5f5f5;border: top 1px solid #eee ;}#f…

NET7下用WebSocket做简易聊天室

NET7下用WebSocket做简易聊天室 步骤&#xff1a; 建立NET7的MVC视图模型控制器项目创建websocket之间通信的JSON字符串对应的实体类一个房间用同一个Websocketwebsocket集合类&#xff0c;N个房间创建websocket中间件代码Program.cs中的核心代码&#xff0c;使用Websocket聊…

NRK3301语音芯片在智能窗帘上的应用

窗帘是人们日常生活中所经常使用的家居产品&#xff0c;传统的窗帘大多都需要手动拉动窗帘使用&#xff1b;存在着拉拽费劲&#xff0c;挂钩容易掉落等问题。随着数字化转型的升级&#xff0c;推进了窗帘市场的高质量发展。智能窗帘也“适时出现”出现了&#xff0c;一款带有语…

[python 刷题] 287 Find the Duplicate Number

[python 刷题] 287 Find the Duplicate Number 题目&#xff1a; Given an array of integers nums containing n 1 integers where each integer is in the range [1, n] inclusive. There is only one repeated number in nums, return this repeated number. You must sol…

实现Traefik工具Dashboard远程访问:搭建便捷的远程管理平台

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

wireshark数据包内容查找功能详解

wireshark提供通过数据包特征值查找具体数据包的功能&#xff0c;具体查找功能如下&#xff0c; &#xff08;1&#xff09;选择查找目标区域&#xff08;也就是在哪里去匹配特征值&#xff09; 如下图&#xff0c;【分组列表】区域查找指的是在最上方的数据包列表区域查找&…

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

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

自然语言处理---huggingface平台使用指南

1 huggingface介绍 Huggingface总部位于纽约&#xff0c;是一家专注于自然语言处理、人工智能和分布式系统的创业公司。他们所提供的聊天机器人技术一直颇受欢迎&#xff0c;但更出名的是他们在NLP开源社区上的贡献。Huggingface一直致力于自然语言处理NLP技术的平民化(democr…

设计模式:组合模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

简介&#xff1a; 组合模式&#xff0c;它是一种用于处理树形结构、表示“部分-整体”层次结构的设计模式。它允许你将对象组合成树形结构&#xff0c;以表示部分和整体的关系。这种模式的主要目的是简化客户端代码&#xff0c;并使客户端以一致的方式处理单个对象和组合对象。…