MIPS指令

2024-05-29 03:48
文章标签 指令 mips

本文主要是介绍MIPS指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MIPS有三种指令格式:(所有指令都是32 位长)

  • R格式
功能操作码6bit1源操作数寄存器5bit2源操作数寄存器5bit目标操作数寄存器(放结果)5bit偏移量5bit函数码6bit说明
标记/指令opcodersrtrdshamtfunct
位数31-2625-2120-1615-1110-65-0
例:add000000rsrtrd00000100000rd=rs+rt
例: jr000000rs000000000000000001000PC=rs

算数类指令
逻辑类指令
位移类指令
跳转指令

  • I格式
功能操作码6bit源操作数寄存器5bit目标寄存器(放结果)5bit地址相对基址偏移量(立即数)16bit说明
标记/指令opcodersrdaddress
位数31-2625-2120-1615-0
算数 addi001000rsrdimrd=rs+im
逻辑 andi001100rsrdimrd=rs&im
载入 lui00111100000rdimrt=im*65536
跳转 beq000100rsrdimPC=(rs==rt)?PC+4+im<<2:PC
  • J格式
功能操作码6bit目标地址26bit说明
标记opcodetarget address
j000010addrPC={(PC+4)[31,28],addr,00}
jal000011addr$31=PC;PC={(PC+4)[31,28],addr,00}

MIPS指令

指令
功能
应用实例
.align n将以2的n次方的对齐方式编译代码,这个位置就基于开始位置偏移,实现对二进制的指定位置编译
dla 用来加载程序中某些带标号的位置或者变量的地址的宏指令,双字
la (load address)用来加载程序中某些带标号的位置或者变量的地址的宏指令la $t0, var1拷贝var1 内存地址到t0;
dli 装入双字立即数常数
li (load immediate)装入立即数常数li register_destination, value
lui 把立即数加载到寄存器高位;

jal 绝对跳转指令,直接寻址方式 MIPS文档中描述为not PC-relative,即PC无关寻址。基地址+偏移
bal 相对跳转指令,相对寻址以程序计数器PC的当前值(R15中的值)为基地址,进行偏移;MIPS文档中描述为PC-relative,即PC相关寻址

cache 操作指令
I格式:cache op,offset(base)
执行op制定的cace操作,16位的offset经符号位扩展,添加到base寄存器以形成有效地址;
cache指令中的op字段低两位[17:16]表示操作的是哪个cache

2‘b00 I-L1(primary instruction)
2'b01 D-L1(primary data or unified primary)
2'b10    L3Cache(Tertiary)
2'b11 L2Cache(secondary)

cache指令中的op字段高三位[20:18]表示的是cache操作模式

addi 加立即数指令,支持溢出检测,具体表现为:遇到溢出时,溢出错误标志变为高电平,传送到控制器cu中,导致此时的寄存器写使能信号regwr无效,最终结果为不将运算结果写入目的寄存器
addiu是加立即数指令,不受溢出限制,具体表现为:遇到溢出时,对溢出的结果进行32bit求模,将求模结果写入目的寄存器中,因而不受溢出限制。
忽略溢出,addi与addiu等价
Add是将rs与rt中的值相加,结果存储在rd寄存器中。检测溢出。如果不溢出,将结果存储在rd寄存器中,如果溢出,抛出溢出异常,不改变rd中的值。
Addu是将rs与rt中的值相加,结果存储在rd寄存器中。不检测溢出,如果溢出,不会抛出异常。
忽略溢出,add与addu等价
add是有符号数加法,addu是"无符号数"加法,但是对于cpu来说,都是一样的,不管有没有符号位,都是从最低位加,进位,一直到最高位。

LB ( load byte)从存储器中读取一个字节的数据到寄存器中LB R1, 0(R2)
lb register_destination, RAM_source

LH从存储器中读取半个字的数据到寄存器中LH R1, 0(R2)

LW (Load Word)从存储器中读取一个字的数据到寄存器中LW R1, 0(R2)数字是偏移量,可以正负
从内存中 复制 RAM_source 的内容到 对应的寄存器中,'l’加载‘Load’ ‘w’意为’word’,即该数据大小为4个字节
lw register_destination, RAM_source

LD从存储器中读取双字的数据到寄存器中LD R1, 0(R2)

L.S从存储器中读取单精度浮点数到寄存器中L.S R1, 0(R2)

L.D从存储器中读取双精度浮点数到寄存器中L.D R1, 0(R2)

LBU
功能与LB指令相同,但读出的是不带符号的数据
LBU R1, 0(R2)

LHU
功能与LH指令相同,但读出的是不带符号的数据
LHU R1, 0(R2)

LWU
功能与LW指令相同,但读出的是不带符号的数据
LWU R1, 0(R2)

SB (store byte (low-order))把一个字节的数据从寄存器存储到存储器中SB R1, 0(R2)
sb register_source, RAM_destination
SH
把半个字节的数据从寄存器存储到存储器中
SH R1,0(R2)

SW (store word存储一个字) 把一个字的数据从寄存器存储到存储器中SW R1, 0(R2) 数字是偏移量,可以正负
sw register_source, RAM_destination

SD
把两个字节的数据从寄存器存储到存储器中SD R1, 0(R2)

S.S
把单精度浮点数从寄存器存储到存储器中
S.S R1, 0(R2)

S.D
把双精度数据从存储器存储到存储器中
S.D R1, 0(R2)

DADD
把两个定点寄存器的内容相加,也就是定点加
DADD R1,R2,R3

DADDI
把一个寄存器的内容加上一个立即数
DADDI R1,R2,#3

DADDU
不带符号的加
DADDU R1,R2,R3

DADDIU
把一个寄存器的内容加上一个无符号的立即数
DADDIU R1,R2,#3

ADD.S
把一个单精度浮点数加上一个双精度浮点数,结果是单精度浮点数
ADD.S F0,F1,F2

ADD.D
把一个双精度浮点数加上一个单精度浮点数,结果是双精度浮点数
ADD.D F0,F1,F2

ADD.PS
两个单精度浮点数相加,结果是单精度浮点数
ADD.PS F0,F1,F2

DSUB
两个寄存器的内容相减,也就是定点数的减
DSUB R1,R2,R3

DSUBU
不带符号的减
DSUBU R1,R2,R3

SUB.S
一个双精度浮点数减去一个单精度浮点数,结果为单精度
SUB.S F1,F2,F3

SUB.D
一个双精度浮点数减去一个单精度浮点数,结果为双精度浮点数
SUB.D F1,F2,F3

SUB.PS
两个单精度浮点数相减
SUB.SP F1,F2,F3

DDIV
两个定点寄存器的内容相除,也就是定点除
DDIV R1,R2,R3

DDIVU
不带符号的除法运算
DDIVU R1,R2,R3

DIV.S
一个双精度浮点数除以一个单精度浮点数,结果为单精度浮点数
DIV.S F1,F2,F3

DIV.D
一个双精度浮点数除以一个单精度浮点数,结果为双精度浮点数
DIV.D F1,F2,F3

DIV.PS
两个单精度浮点数相除,结果为单精度
DIV.PS F1,F2,F3

DMUL
两个定点寄存器的内容相乘,也就是定点乘
DMUL R1,R2,R3

DMULU
不带符号的乘法运算
DMULU R1,R2,R3

MUL.S
一个双精度浮点数乘以一个单精度浮点数,结果为单精度浮点数
DMUL.S F1,F2,F3

MUL.D
一个双精度浮点数乘以一个单精度浮点数,结果为双精度浮点数
DMUL.D F1,F2,F3

MUL.PS
两个单精度浮点数相乘,结果为单精度浮点数
DMUL.PS F1,F2,F3

AND
与运算,两个寄存器中的内容相与
ANDR1,R2,R3

ANDI
一个寄存器中的内容与一个立即数相与
ANDIR1,R2,#3

OR
或运算,两个寄存器中的内容相或
ORR1,R2,R3

ORI
一个寄存器中的内容与一个立即数相或
ORIR1,R2,#3

XOR
异或运算,两个寄存器中的内容相异或
XORR1,R2,R3

XORI
一个寄存器中的内容与一个立即数异或

XORIR1,R2,#3

‘b’ (Branches) 流控制,分支(if else系列)

b	target		#  unconditional branch to program label target
beq	$t0,$t1,target	#  branch to target if  $t0 = $t1
blt	$t0,$t1,target	#  branch to target if  $t0 < $t1
ble	$t0,$t1,target	#  branch to target if  $t0 <= $t1
bgt	$t0,$t1,target	#  branch to target if  $t0 > $t1
bge	$t0,$t1,target	#  branch to target if  $t0 >= $t1
bne	$t0,$t1,target	#  branch to target if  $t0 <> $t1

BEQZ条件转移指令,当寄存器中内容为0时转移发生BEQZ R1,target
BNEZ条件转移指令,当寄存器中内容不为0时转移发生BNEZ R1, target
BEQ条件转移指令,当两个寄存器内容相等时转移发生BEQ R1,R2 target
if(R1==R2) 跳转到target,target=PC <- PC+4 + (sign-extend)immediate<<2
BNE 条件转移指令,当两个寄存器中内容不等时转移发生BNE R1,R2 target
if(R1!=R2) 跳转到target,target=PC <- PC+4 + (sign-extend)immediate<<2

汇编中的while1

1:b 1bnop

0~9的数字为局部标签。局部标签可以重复使用,语法为:
xf:往前跳的意思,就是还未执行的程序,x代表0~9的某个标签,f代表forward的意思。
xb:往后跳的意思,回到原来已经执行过的语句,x代表0~9的某个标签,b代表backward的意思。

1: ;A
#cmp r0, #0
beqz r0, 1f ;    @  r0==0那么向前跳转到B处执行
nopbnez r0,1b ;   @ 否则向后跳转到A处执行
nop
1: ;B

J (Jumps)直接跳转指令,跳转的地址在指令中,跳转(while, for, goto系列)jtarget

JR (jump and link)使用寄存器的跳转指令,跳转地址在寄存器中JR R1

JAL

直接跳转指令,并带有链接功能,指令的跳转地址在指令中,跳转发生时要把返回地址存放到R31这个寄存器中

JAL R1 name

JALR

使用寄存器的跳转指令,并且带有链接功能,指令的跳转地址在寄存器中,跳转发生时指令的放回地址放在R31这个寄存器中

JALR R1

move 寄存器复制到另一个寄存器move t 2 , t2, t2,t3 --> $t2 = $t3

MOV.S把一个单精度浮点数从一个浮点寄存器复制到另一个浮点寄存器MOV.S F0,F1

MOV.D

把一个双精度浮点数从一个浮点寄存器复制到另一个浮点寄存器
MOV.D F0,F1

  • MFC0 把一个数据从特殊寄存器复制到通用寄存器 MFC0 R1,R2
    mfc0 rt, rd将CP0中的rd寄存器内容传输到rt通用寄存器;
  • MTC0把一个数据从通用寄存器复制到特殊寄存器 MTC0 R1,R2
    mtc0 rt, rd 将rt通用寄存器中内容传输到CP0中寄存器rd;
  • MFC1 把一个数据从定点寄存器复制到浮点寄存器 MFC1 R1,F1
  • MTC1 把一个数据从浮点寄存器复制到定点寄存器MTC1 R1,F1
    mfhi/mflo rt将CP0的hi/lo寄存器内容传输到rt通用寄存器中;
    mthi/mtlo rt将rt通用寄存器内容传输到CP0的hi/lo寄存器中;
    当MIPS体系结构演进到MIPS IV的64位架构后,新增了两条指令dmfc0和dmtc0,向CP0的寄存器中读/写一个64bit的数据。

LUI

把一个16位的立即数填入到寄存器的高16位,低16位补零

LUI R1,#42

DSLL

双字逻辑左移

DSLL R1,R2,#2

DSRL

双字逻辑右移

DSRL R1,R2,#2

DSRA

双字算术右移

DSRA R1,R2,#2

DSLLV

可变的双字逻辑左移

DSLLV R1,R2,#2

DSRLV可变的双字罗伊右移DSRLV R1,R2,#2

DSRAV可变的双字算术右移DSRAV R1,R2,#2

SLT如果R2的值小于R3,那么设置R1的值为1,否则设置R1的值为0SLT R1,R2,R3

SLTI如果寄存器R2的值小于立即数,那么设置R1的值为1,否则设置寄存器R1的值为0SLTI R1,R2,#23

SLTU功能与SLT一致,但是带符号的SLTU R1,R2,R3

SLTUI功能与SLT一致,但不带符号SLTUI R1,R2,R3

MOVN如果第三个寄存器的内容为负,那么复制一个寄存器的内容到另外一个寄存器MOVN R1,R2,R3

MOVZ如果第三个寄存器的内容为0,那么复制一个寄存器的内容到另外一个寄存器MOVZ R1,R2,R3

TRAP根据地址向量转入管态

ERET从异常中返回到用户态

MADD.S一个双精度浮点数与单精度浮点数相乘加,结果为单精度

MADD.D一个双精度浮点数与单精度浮点数相乘加,结果为双精度

MADD.PS两个单精度浮点数相乘加,结果为单精度

这篇关于MIPS指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012563

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行

mysql中导入txt文件数据的操作指令

1 表tt的格式:    CREATE TABLE `tt` (   `ind` int NOT NULL auto_increment,   `name` char(100) default NULL,   PRIMARY KEY  (`ind`)  )   2 文件d.txt的内容示例:  1,a  2,b  3,c

可选择的反思指令微调

论文:https://arxiv.org/pdf/2402.10110代码:GitHub - tianyi-lab/Reflection_Tuning: [ACL'24] Selective Reflection-Tuning: Student-Selected Data Recycling for LLM Instruction-Tuning机构:马里兰大学, Adobe Research领

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)

MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构,客户端可以订阅任意数量的主题,并可以发布消息到这些主题。服务器(通常称为MQTT Broker)则负责接受来自客户端的连接请求,并转发消

matlab一些基本重要的指令

重点内容 运行MATLAB的帮助demo,在Command Window 输入 “demo”,或在Launch Pad 选项卡“demos” 任何时候都可以: 清除Command Window内容:clc 清除Figure Window(图形窗口) clf 清除workspace 变量内容: clear 注意:M脚本文件和输入指令中的变量都在workspace中,为避免变量冲突,一般在

vue的v-slot指令使用总结

父组件代码:  <template><div id="app"><img alt="Vue logo" src="./assets/logo.png"><slotdemo> <template v-slot:a>this is a </template>asdad</slotdemo></div></template><script>import slotdemo from './compon

maven 指令之package 和install的区别

https://blog.csdn.net/zy103118/article/details/79901357   maven 指令之package 和install的区别 2018年04月11日 19:08:46 brave_zhao 阅读数:2018更多 个人分类: maven maven package 和 install 区别 原创 2016年08月18日 14:55:26