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 1b
 nop

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处执行
nop

bnez 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两个单精度浮点数相乘加,结果为单精度

  • 8
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MIPS指令格式是一种常用的计算机指令格式,它采用固定长度的32位二进制编码表示。其中,MIPS指令由操作码、源寄存器号、目标寄存器号和立即数等部分组成。 首先,操作码(opcode)指示了指令的操作类型,如加法、逻辑运算等。操作码的长度通常为6位,一个MIPS指令可以根据操作码的不同实现不同的操作。 然后,源寄存器号(rs)指示了指令中的第一个操作数在寄存器文件中的位置。源寄存器号的长度也通常为5位,它决定了需要对哪个寄存器进行读取操作。 接着,目标寄存器号(rt)指示了指令中的第二个操作数在寄存器文件中的位置,以及存放运算结果的寄存器位置。目标寄存器号的长度也通常为5位。 而对于立即数(immediate)来说,它是指令中的一个常数或者字面值,用于进行一些特定的运算或者指示某些操作的位置。立即数的长度通常是16位。 根据这些不同的字段,我们可以将MIPS指令进行解析和编码。例如,对于一条简单的加法指令,它的MIPS指令格式为: opcode rs rt rd shamt funct 其中,opcode表示该指令的操作类型(如加法、减法),rs和rt分别表示两个源操作数在寄存器文件中的位置,rd表示目的寄存器的位置,shamt表示移位操作中的位移量,funct表示指示该操作码具体操作类型的另一个字段。 总之,MIPS指令格式利用固定长度的二进制编码实现了指令字段的统一和规范化,使得计算机能够高效地解析和执行各种指令

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值