MIPS 指令集与机器码生成
2024-09-29
MIPS 指令集概览
MIPS 指令集采用 32 位定长指令,根据字段格式和用途分为多种类型。
主要指令类型
- R 型指令:用于寄存器之间的操作。
opcode | rs | rt | rd | shamt | funct
- I 型指令:用于寄存器与立即数之间的操作,或内存访问。
opcode | rs | rt | immediate
- J 型指令:用于跳转操作。
opcode | address
- 分支指令:属于 I 型指令,用于条件跳转。
opcode | rs | rt | offset
R 型指令
R 型指令用于寄存器之间的操作,操作数和结果均保存在寄存器中,常用于算术和逻辑运算。
格式
|
|
- opcode:操作码,固定为
000000。 - rs:源寄存器 1。
- rt:源寄存器 2。
- rd:目标寄存器。
- shamt:移位量,非移位操作时为
00000。 - funct:功能码,指定具体操作。
示例:add $s0, $t0, $t1
将 $t0 和 $t1 的值相加,并把结果存入 $s0。
- opcode:
000000 - rs:
$t0(01000) - rt:
$t1(01001) - rd:
$s0(10000) - shamt:
00000 - funct:
100000(加法)
机器码:
|
|
十六进制表示: 0x01098020
I 型指令
I 型指令用于寄存器与立即数之间的操作,或内存的加载与存储操作。它包含一个 16 位立即数或地址偏移量。
格式
|
|
- opcode:操作码,指定指令类型。
- rs:源寄存器或基址寄存器。
- rt:目标寄存器。
- immediate:立即数或地址偏移量。
示例一:addi $t0, $0, 10
将立即数 10 与 $0(其值始终为 0)相加,并把结果存入 $t0。
- opcode:
001000(addi) - rs:
$0(00000) - rt:
$t0(01000) - immediate:
0000000000001010(10 的二进制表示)
机器码:
|
|
十六进制表示: 0x2008000A
注意: 在 addi $t0, $0, 10 的汇编格式中,目标寄存器 $t0 写在源寄存器 $0 前面;机器码则按 opcode | rs | rt | immediate 排列,源寄存器 rs 在目标寄存器 rt 前。这种差异来自指令架构的设计。
示例二:lw $t0, 4($t1)
从地址 $t1 + 4 加载一个字,存入 $t0。
- opcode:
100011(lw) - rs:
$t1(01001) - rt:
$t0(01000) - immediate:
0000000000000100(4 的二进制表示)
机器码:
|
|
十六进制表示: 0x8D280004
J 型指令
J 型指令用于无条件跳转到指定地址。
格式
|
|
- opcode:操作码,表示跳转指令。
- address:目标地址,不包含最高 4 位和最低 2 位。
示例:j 0x00400000
无条件跳转到地址 0x00400000。
- opcode:
000010(j) - address:
00000000010000000000000000
机器码:
|
|
十六进制表示: 0x08000000
分支指令
分支指令用于条件跳转,常见于条件判断和循环等控制流程。
格式
|
|
- opcode:操作码,表示分支类型,例如
beq、bne。 - rs:源寄存器 1。
- rt:源寄存器 2。
- offset:相对于下一条指令地址的偏移量。
示例:beq $t0, $t1, label
如果 $t0 等于 $t1,则跳转到 label。
- opcode:
000100(beq) - rs:
$t0(01000) - rt:
$t1(01001) - offset:
0000000000000010(假设偏移量为 2)
机器码:
|
|
十六进制表示: 0x11090002