如何确定MIPS指令中rs、rd、rt字段的取值?
MIPS指令rs、rt、rd字段取值判定规则
rs、rt、rd都是MIPS指令中的5位寄存器编号字段,取值完全由两个规则共同决定:一是MIPS架构统一规定的通用寄存器编号映射,二是不同指令类型的字段分配规则,具体推导逻辑如下:
1. 先明确指令类型的字段分配规则
MIPS是定长32位指令集,不同类型指令的字段排布固定:
- I型指令(如addi、lw、sw等立即数/访存类指令):32位按顺序拆分为「6位操作码 + 5位rs + 5位rt + 16位立即数」,对应汇编格式为
操作码 rt, rs, 立即数,即汇编语句中第二个寄存器参数对应rs字段,第一个寄存器参数对应rt字段,无rd字段。 - R型指令(如add、sub等寄存器运算类指令):32位按顺序拆分为「6位0操作码 + 5位rs + 5位rt + 5位rd + 5位移位量 + 6位功能码」,对应汇编格式为
操作码 rd, rs, rt,即汇编语句中第一个寄存器参数对应rd字段,第二个对应rs字段,第三个对应rt字段。
2. 匹配通用寄存器的编号映射
MIPS32架构共定义32个通用寄存器,每个寄存器的汇编助记符对应固定的十进制编号,转5位二进制就是对应字段的取值,常用寄存器映射关系如下:
- $0 ($zero):十进制0 → 00000
- $1 ($at):十进制1 → 00001
- $2~$3 ($v0$v1):十进制23 → 00010~00011
- $4~$7 ($a0$a3):十进制47 → 00100~00111
- $8~$15 ($t0$t7):十进制815 → 01000~01111
- $t0:8 → 01000
- $t1:9 → 01001
- $t2:10 → 01010
- $t3:11 → 01011
- 其余以此类推
- $16~$23 ($s0$s7):十进制1623 → 10000~10111
- $24~$25 ($t8$t9):十进制2425 → 11000~11001
- $26~$27 ($k0$k1):十进制2627 → 11010~11011
- $28 ($gp):十进制28 → 11100
- $29 ($sp):十进制29 → 11101
- $30 ($fp):十进制30 → 11110
- $31 ($ra):十进制31 → 11111
示例推导(对应addi $t1, $t2, 20)
- 识别指令类型:
addi是I型指令,按照I型指令汇编规则,语句中第二个寄存器参数$t2对应rs字段。 - 查寄存器映射:
$t2对应的十进制编号是10,转换为5位二进制就是01010,就是rs字段的取值。
内容的提问来源于stack exchange,提问作者Heavenguard.01
相关产品推荐
相关产品推荐

