Qingyun Qian

UBC 计算机科学本科生
UBC NLP 研究组研究助理

MIPS 指令集与机器码生成

2024-09-29


MIPS 指令集概览

MIPS 指令集采用 32 位定长指令,根据字段格式和用途分为多种类型。

主要指令类型

R 型指令

R 型指令用于寄存器之间的操作,操作数和结果均保存在寄存器中,常用于算术和逻辑运算。

格式

1
| opcode (6 bits) | rs (5 bits) | rt (5 bits) | rd (5 bits) | shamt (5 bits) | funct (6 bits) |

示例:add $s0, $t0, $t1

将 $t0 和 $t1 的值相加,并把结果存入 $s0。

机器码:

1
000000 01000 01001 10000 00000 100000

十六进制表示: 0x01098020

I 型指令

I 型指令用于寄存器与立即数之间的操作,或内存的加载与存储操作。它包含一个 16 位立即数或地址偏移量。

格式

1
| opcode (6 bits) | rs (5 bits) | rt (5 bits) | immediate (16 bits) |

示例一:addi $t0, $0, 10

将立即数 10 与 $0(其值始终为 0)相加,并把结果存入 $t0。

机器码:

1
001000 00000 01000 0000000000001010

十六进制表示: 0x2008000A

注意: 在 addi $t0, $0, 10 的汇编格式中,目标寄存器 $t0 写在源寄存器 $0 前面;机器码则按 opcode | rs | rt | immediate 排列,源寄存器 rs 在目标寄存器 rt 前。这种差异来自指令架构的设计。

示例二:lw $t0, 4($t1)

从地址 $t1 + 4 加载一个字,存入 $t0。

机器码:

1
100011 01001 01000 0000000000000100

十六进制表示: 0x8D280004

J 型指令

J 型指令用于无条件跳转到指定地址。

格式

1
| opcode (6 bits) | address (26 bits) |

示例:j 0x00400000

无条件跳转到地址 0x00400000。

机器码:

1
000010 00000000010000000000000000

十六进制表示: 0x08000000

分支指令

分支指令用于条件跳转,常见于条件判断和循环等控制流程。

格式

1
| opcode (6 bits) | rs (5 bits) | rt (5 bits) | offset (16 bits) |

示例:beq $t0, $t1, label

如果 $t0 等于 $t1,则跳转到 label。

机器码:

1
000100 01000 01001 0000000000000010

十六进制表示: 0x11090002