52条基本指令和 5条特权指令如下:
指令 |
31:26 |
25:21 |
20:16 |
15:11 |
10:6 |
5:0 |
描述 |
||
8条逻辑运算指令 |
and rd, rs, rt |
000000 |
rs |
rt |
rd |
00000 |
100100 |
将rs 与rt 寄存器内的数据进行逻辑运算,结果存入rd 寄存器中 |
|
or rd, rs, rt |
000000 |
rs |
rt |
rd |
00000 |
100101 |
|||
xor rd, rs, rt |
000000 |
rs |
rt |
rd |
00000 |
100110 |
|||
nor rd, rs, rt |
000000 |
rs |
rt |
rd |
00000 |
100111 |
|||
andi rt, rs, immediate |
001100 |
rs |
rt |
immediate |
addi ori xori:寄存器 rs 中的值与 0 扩展至 32 位的立即数 imm 按位逻辑运算,结果写入寄存器 rt 中。 LUI:将 16 位立即数 imm 写入寄存器 rt 的高 16 位,寄存器 rt 的低 16 位置 0。 |
||||
xori rt, rs, immediate |
001110 |
rs |
rt |
immediate |
|||||
lui rt, immediate |
001111 |
00000 |
rt |
immediate |
|||||
ori rs, rt, immediate |
001101 |
rs |
rt |
immediate |
|||||
6条移位运算指令 |
sll rd, rt, sa |
00000 |
00000 |
rt |
rd |
sa |
000000 |
由立即数sa指定位移量,sll,srl分别对寄存器rt的值逻辑左移、逻辑右移,结果写入rd寄存器中.sraj则进行算数右移(左边补上符号位) |
|
srl rd, rt, sa |
00000 |
00000 |
rt |
rd |
sa |
000010 |
|||
sra rd, rt, sa |
00000 |
00000 |
rt |
rd |
sa |
000011 |
|||
sllv rd, rt, rs |
00000 |
rs |
rt |
rd |
00000 |
000100 |
由寄存器rs的值指定位移量,其余同上 |
||
srlv rd, rt, rs |
00000 |
rs |
rt |
rd |
00000 |
000110 |
|||
srav rd, rt, rs |
00000 |
rs |
rt |
rd |
00000 |
000111 |
|||
4条数据移动指令 |
补充:乘法中,两个32位数相乘结果位64位,而在除法中除了商数外还有余数。因此为了避免32位通用寄存器存不下这些数的问题,MIPS架构使用了额外的HI、LO寄存器来完成乘除法运算。 |
||||||||
MFHI rd |
000000 |
00000 |
00000 |
rd |
00000 |
010000 |
HI寄存器内容->rd寄存器 |
||
MFLO rd |
000000 |
00000 |
00000 |
rd |
00000 |
010010 |
LO寄存器内容->rd寄存器 |
||
MTHI rs |
000000 |
rs |
00000 |
00000 |
00000 |
010001 |
rs寄存内容器-> HI寄存器 |
||
MTLO rs |
000000 |
rs |
00000 |
00000 |
00000 |
010011 |
rs寄存内容器->LO寄存器 |
||
14条算数指令 |
add rd, rs, rt |
000000 |
rs |
rt |
rd |
00000 |
100000 |
加(可产生溢出例外) |
|
addu rd, rs, rt |
000000 |
rs |
rt |
rd |
00000 |
100001 |
加(不可产生溢出例外) |
||
addi rt, rs, immediate |
001000 |
rs |
rt |
immediate |
加立即数(可产生溢出例外) |
||||
addiu rt, rs, immediate |
001001 |
rs |
rt |
immediate |
加立即数(不可产生溢出例外) |
||||
sub rd, rs, rt |
000000 |
rs |
rt |
rd |
00000 |
100010 |
减(可产生溢出例外) |
||
subu rd, rs, rt |
000000 |
rs |
rt |
rd |
00000 |
100011 |
减(不可产生溢出例外) |
||
slt rd, rs, rt |
000000 |
rs |
rt |
rd |
00000 |
101010 |
若rs 有符号小于 rt 则rd置1 |
||
sltu rd, rs, rt |
000000 |
rs |
rt |
rd |
00000 |
101011 |
若rs 无符号小于 rt 则rd置1 |
||
slti rt, rs, immediate |
001010 |
rs |
rt |
immediate |
若rs 有符号小于 立即数 则rd置1 |
||||
sltiu rt, rs, immediate |
001011 |
rs |
rt |
immediate |
若rs 无符号小于 立即数 则rd置1 |
||||
div rs, rt |
000000 |
rs |
rt |
00000 |
00000 |
011010 |
有符号字除和无符号字除,rs/rt的值存入LO寄存器,rs%rt的值存入HI寄存器 |
||
divu rs, rt |
000000 |
rs |
rt |
00000 |
00000 |
011011 |
|||
mult rs, rt |
000000 |
rs |
rt |
00000 |
00000 |
011000 |
有符号字乘和无符号字乘,rs*rt的低32位和高32位分别存入LO和HI寄存器中 |
||
multu rs, rt |
000000 |
rs |
rt |
00000 |
00000 |
011001 |
|||
12条跳转指令 |
beq rs, rt, offset |
000100 |
rs |
rt |
offset |
rs,rt寄存器内的值相等时跳转 |
|||
bne rs, rt, offset |
000101 |
rs |
rt |
offset |
rs,rt寄存器内的值不相等时跳转 |
||||
bgez rs, offset |
000001 |
rs |
00001 |
offset |
rs寄存器内的值大于等于0时跳转 |
||||
bgtz rs, offset |
000111 |
rs |
00000 |
offset |
rs寄存器内的值大于0时跳转 |
||||
blez rs, offset |
000110 |
rs |
00000 |
offset |
rs寄存器内的值小于等于0时跳转 |
||||
bltz rs, offset |
000001 |
rs |
|
offset |
rs寄存器内的值小于0时跳转 |
||||
bltzal rs, offset |
000001 |
rs |
10000 |
offset |
rs寄存器内的值小于0时跳转并保存返回地址 |
||||
bgezal rs, offset |
000001 |
rs |
10001 |
offset |
rs寄存器内的值大于等于0时跳转并保存返回地址 |
||||
j target |
000010 |
target |
无条件跳转 |
||||||
jal targrt |
000011 |
target |
无条件跳转并保存返回地址 |
||||||
jr rs |
000000 |
rs |
00000 |
00000 |
00000 |
001000 |
无条件跳转至寄存器内的PC值 |
||
jral rs |
000000 |
rs |
00000 |
00000 |
00000 |
001001 |
无条件跳转至寄存器内的PC值并保存返回地址 |
||
8条访存指令 |
lb rt, offset(rs) |
100000 |
rs |
rt |
offset |
从rs偏移offset处取一个字节并做有符号扩展存入rt |
|||
lbu rt, offset(rs) |
100100 |
rs |
rt |
offset |
从rs偏移offset处取一个字节并做无符号扩展存入rt |
||||
lh rt, offset(rs) |
100001 |
|
rt |
offset |
从rs偏移offset处取一半字并做有符号扩展存入rt |
||||
lhu rt, offset(rs) |
100101 |
rs |
rt |
offset |
从rs偏移offset处取一个半字并做无符号扩展存入rt |
||||
lw rt, offset(rs) |
100011 |
rs |
rt |
offset |
取字 |
||||
sb rt, offset(rs) |
101000 |
rs |
rt |
offset |
存字节 |
||||
sh rt, offset(rs) |
101001 |
rs |
rt |
offset |
存半字 |
||||
sw rt, offset(rs) |
101011 |
rs |
rt |
offset |
存字 |
||||
5条特权指令 |
break |
000000 |
code |
001101 |
发生断点异常,立即无条件地将控制权转到异常处理程序。code字段可用作软件参数,但异常处理程序只能通过加载包含指令的内存字的内容来检索。 |
||||
syscall |
000000 |
code |
001100 |
发生断点异常,立即无条件地将控制权转到异常处理程序。code字段可用作软件参数,但异常处理程序只能通过加载包含指令的内存字的内容来检索。 |
|||||
eret |
010000 |
1 000 0000 0000 0000 0000 |
011000 |
在中断、异常或错误处理完成时返回中断指令。ERET不执行下一条指令(即,它没有延迟槽)。 |
|||||
mtco |
010000 |
00100 |
rt |
rd |
0000 0000 sel(3位) |
通用寄存器rt的内容加载到由rd和sel组合指定的协处理器CP0寄存器中。 |
|||
mfco |
010000 |
00000 |
rt |
rd |
0000 0000 sel(3位) |
由rd和sel组合指定的CP0寄存器的数据加载到通用寄存器rt中 |