MIPS指令与机器码互转

1. I类型

带有立即数指令

lw 100011

sw 101011

bwq

bne 000101

addi 001000

image-20200411211831542

opcode(6位)操作码

rs(5位)第一源操作数寄存器编号

rt(5位)第二源操作数寄存器编号

immediate(16位)立即数,使用时根据需求进行0扩展或符号扩展至32位

1.1 addi

1
addi   $21,$22,-50

opcode = 8 (查MIPS指令手册可得)
rs = 22 (源寄存器编号)
rt = 21 (目标寄存器编号)
immediate = -50 (16进制表示为-50的补码:FFCE)

1.2 beq/bne

1
2
3
4
5
Loop:  	beq   $9,$0,End
addu $8,$8,$10
addiu $9,$9,-1
j Loop
End:

opcode = 4 (查MIPS指令手册可得)
rs = 9 (第1源寄存器)
rt = 0 (第2源寄存器)
immediate = 3

2. J类型

转移类的指令

j 000010

jal 000011

image-20200411212834651

储存单元的地址需要32位,但是26位的target address指令已经足够定位指令了

  1. 因为一条指令占用一个字空间(即4个字节空间),所以指令的地址低两位永远为0,只需表示前30位即可。
  2. 剩下的4位由此时PC地址+4的最高位提供,这也是为什么J型指令的跳转范围仅为2^26 字空间=2^28 字节空间

3. R类型

其他指令

image-20200411210644020

opcode(6位)操作码,全0

rs(5位)第一源操作数寄存器编号

rt(5位)第二源操作数寄存器编号

rd(5位)接收结果的寄存器编号

shamt(5位)移位数目,非移位指令时总是0

funct(6位)功能码,与操作码共同确定指令功能

3.1 add

add $8,$9,$10

opcode = 0 (R型指令)
rs = 9 (第一源寄存器编号)
rt = 10 (第二源寄存器编号)
rd = 8 (目的寄存器编号)
shamt = 0 (非移位指令)
funct = 32 (查MIPS指令手册可得)

4. 寄存器列表

image-20200411235031626