MIPS指令集与简要分析
作者:
月见樽 | 来源:发表于
2018-02-18 15:16 被阅读0次
R格式指令
基本格式
标记 |
op |
rs |
rt |
rd |
shamt |
funct |
位数 |
31-26 |
25-21 |
20-16 |
15-11 |
10-6 |
5-0 |
功能 |
操作符 |
源操作数寄存器1 |
源操作数寄存器2 |
目的操作数寄存器 |
位移量 |
操作符附加段 |
指令
算数类指令
指令 |
op |
rs |
rt |
rd |
shamt |
funct |
功能 |
add |
000000 |
rs |
rt |
rd |
00000 |
100000 |
rd=rs+rt |
addu |
000000 |
rs |
rt |
rd |
00000 |
100001 |
rd=rs+rt(无符号数) |
sub |
000000 |
rs |
rt |
rd |
00000 |
100010 |
rd=rs-rt |
subu |
000000 |
rs |
rt |
rd |
00000 |
100011 |
rd=rs+rt(无符号数) |
slt |
000000 |
rs |
rt |
rd |
00000 |
101010 |
rd=(rs<rt)?1:0 |
sltu |
000000 |
rs |
rt |
rd |
00000 |
101011 |
rd=(rs<rt)?1:0(无符号数) |
逻辑类指令
指令 |
op |
rs |
rt |
rd |
shamt |
funct |
功能 |
and |
000000 |
rs |
rt |
rd |
00000 |
100100 |
rd=rs&rt |
or |
000000 |
rs |
rt |
rd |
00000 |
100101 |
rd=rs|rt |
xor |
000000 |
rs |
rt |
rd |
00000 |
100110 |
rd=rs xor rd |
nor |
000000 |
rs |
rt |
rd |
00000 |
100111 |
rd=!(rs|rt) |
位移类指令
指令 |
op |
rs |
rt |
rd |
shamt |
funct |
功能 |
sll |
000000 |
00000 |
rt |
rd |
shamt |
000000 |
rd=rt<<shamt |
srl |
000000 |
00000 |
rt |
rd |
shamt |
000010 |
rd=rt>>shamt |
sra |
000000 |
00000 |
rt |
rd |
shamt |
000011 |
rd=rt>>shamt(符号位保留) |
sllv |
000000 |
rs |
rt |
rd |
00000 |
000100 |
rd=rt<<rs |
srlv |
000000 |
rs |
rt |
rd |
00000 |
000110 |
rd=rt>>rs |
srav |
000000 |
rs |
rt |
rd |
00000 |
000111 |
rd=rt>>rs(符号位保留) |
跳转指令
指令 |
op |
rs |
rt |
rd |
shamt |
funct |
功能 |
jr |
000000 |
rs |
00000 |
00000 |
00000 |
001000 |
PC=rs |
I格式指令
基本格式
标记 |
op |
rs |
rd |
im |
位数 |
31-26 |
25-21 |
20-16 |
15-0 |
功能 |
操作符 |
源操作数寄存器 |
目的操作数寄存器 |
立即数 |
指令
算数指令
指令 |
op |
rs |
rd |
im |
功能 |
addi |
001000 |
rs |
rd |
im |
rd=rs+im |
addiu |
001001 |
rs |
rd |
im |
rd=rs+im(无符号数) |
slti |
001010 |
rs |
rd |
im |
rd=(rs<im)?1:0 |
sltiu |
001011 |
rs |
rd |
im |
rd=(rs<im)?1:0(无符号数) |
逻辑类指令
指令 |
op |
rs |
rd |
im |
功能 |
andi |
001100 |
rs |
rd |
im |
rd=rs&im |
ori |
001101 |
rs |
rd |
im |
rd=rs|im |
xori |
001110 |
rs |
rd |
im |
rd=rs xor im |
载入类指令
指令 |
op |
rs |
rd |
im |
功能 |
lui |
001111 |
00000 |
rd |
im |
rt=im*65536 |
lw |
100011 |
rs |
rd |
im |
rt=memory[rs+im] |
sw |
101011 |
rs |
rd |
im |
memory[rs+im]=rt |
跳转类指令
指令 |
op |
rs |
rd |
im |
功能 |
beq |
000100 |
rs |
rd |
im |
PC=(rs==rt)?PC+4+im<<2:PC |
bne |
000101 |
rs |
rd |
im |
PC=(rs!=rt)?PC+4+im<<2:PC |
J格式指令
基本格式
标记 |
op |
address |
位数 |
31-26 |
25-0 |
功能 |
操作符 |
地址 |
指令
指令 |
op |
address |
功能 |
j |
000010 |
addr |
PC={(PC+4)[31,28],addr,00} |
jal |
000011 |
addr |
$31=PC;PC={(PC+4)[31,28],addr,00} |
指令分析
指令格式
MIPS_order.png
不同格式的指令具有不同的功能,其中:
- R格式指令为纯寄存器指令,所有的操作数(除移位外)均保存在寄存器中。Op字段均为0,使用funct字段区分指令
- I格式指令为带立即数的指令,最多使用两个寄存器,同时包括了load/store指令。使用Op字段区分指令
- J格式指令为长跳转指令,仅有一个立即数操作数。使用Op字段区分指令
数据通路
以上的指令包括以下几种与指令有关的数据通路:
- 指令——寄存器组:R格式指令均为寄存器指令,需要指令提供寄存器地址
- 指令——运算单元(ALU):运算指令由指令提供运算类型,同时提供参与运算的立即数和位移量
- 指令——存储器:load/store指令的寻址方式仅为寄存器偏移量寻址,需要指令提供立即数偏移量
- 指令——PC:J格式指令需要将指令中的立即数载入PC中
同时还有几种必备的与指令无关的数据通路:
- 寄存器组——运算单元(ALU):寄存器组为运算单元提供操作数,运算结果存在寄存器组中
- 寄存器组——存储器:load/store指令的两端
- 寄存器组——PC:跳转指令与寄存器组有关
当使用哈弗结构时,数据通路框图如下所示:
MIPS_dataflow.png
流水线划分
若使用流水线实现,可以将流水线划分为:取指->译码->准备操作数->执行->回写四个阶段:
- 取指阶段:按PC从指令寄存器中取出完整的32位指令,之后PC自增
- 译码阶段:按指令的高6位(Op字段)将指令解释为相应的格式
- 准备操作数阶段:按指令中的对应字段准备操作数,包括:计算地址(load/store指令),取出寄存器中的操作数置于数据总线(寄存器指令),计算PC值(跳转指令)等
- 执行阶段:执行指令,包括:访问存储器(load/store指令),ALU运算(计算类指令),刷新PC值(跳转指令)等
- 回写阶段:将结果存入寄存器中,包括:ALU的运算结果(计算类指令),访存结果(load指令),原PC值(带返回跳转指令)等
本文标题:MIPS指令集与简要分析
本文链接:https://www.haomeiwen.com/subject/hllbtftx.html
网友评论