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