MIPS指令集与简要分析

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值(带返回跳转指令)等

推荐阅读更多精彩内容