关于MIPS I型指令机器码转汇编代码的疑问
MIPS机器码转汇编:寄存器命名误区解析
已接触的转换示例
之前接触的机器码转汇编示例均采用$rN的寄存器编号格式:
I型指令示例:
001000 00001 00000 0000000000000100 -- addi $r0, $r1, 0x0004R型指令示例:
000000 00000 00001 00010 00000 100000 -- add $r2, $r0, $r1
遇到的新指令与困惑
现在遇到的addi指令转换结果使用了$s0、$t0这类命名形式:
示例1:
001000 10001 10000 0000000000000101 -- addi $s0, $s1, 5示例2:
001000 10011 01000 1111111111110100 -- addi $t0, $s3, –12
已知addi指令格式为addi target_reg, source_reg, imm,最初误以为$t、$s是寄存器类型标识,错误地将上述机器码转换为:
错误转换1:
addi $t16, $s17, 5错误转换2:
addi $t8, $s19, -12
问题解析与正确理解
这类转换错误的核心是对MIPS寄存器命名规则的误解:
- MIPS的32个通用寄存器有两种命名方式:一种是
$r0-$r31的编号形式,另一种是功能别名形式:$t系列(临时寄存器)对应$r8-$r15、$r24-$r25,比如$t0就是$r8$s系列(保存寄存器)对应$r16-$r23,比如$s0对应$r16,$s1对应$r17,$s3对应$r19
- 正确转换逻辑是:先将机器码中的寄存器二进制字段转为十进制编号,再映射到对应的功能别名。比如第一个示例中,源寄存器字段
10001(二进制)=17(十进制),对应$s1;目标寄存器字段10000=16,对应$s0,因此正确转换结果为addi $s0, $s1, 5。
内容的提问来源于stack exchange,提问作者Elias Sk
相关产品推荐
相关产品推荐

