MIPS指令大全
52条基本指令和 5条特权指令如下:
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中 |
更多推荐
所有评论(0)