为了清晰和简单起见,如何使用十六进制改进我的文本文件代码?

时间:2019-01-15 04:50:01

标签: binary mips

我正在像这样用十六进制输入文本文件

程序的重点是将这些值转换为mips指令。有没有更好的方法来重写或改进我的代码?我对C#还是很陌生,想看看我是否可以改进此程序。

1 个答案:

答案 0 :(得分:1)

返回IEnumerable<T>yield

public static IEnumerable<string> GetCode(IEnumerable<string> lines)
{
   foreach (var line in Lines)
   {
      var binary = Convert.ToUInt32(line, 16);
      var opCode = binary >> 26;
      var funCode = binary & 0x3f;
      var rs = (binary >> 21) & 31;
      var rt = (binary >> 16) & 31;
      var rd = (binary >> 11) & 31;
      int nImm = (short)(binary & 0xffff);
      var jImm = (binary & 0x03ffffff) << 2;

      switch (opCode)
      {
         case 0x00:
            switch (funCode)
            {
               case 0x0c: yield return "syscall"; break;
               case 0x20: yield return $"add\t{_reg[rd]}, {_reg[rs]}, {_reg[rt]}";  break;
            } break;
         case 0x02: yield return $"j\t0x00{jImm:x04}";  break;
         case 0x04: yield return $"beq\t{_reg[rs]}, {_reg[rt]}, 0x{nImm:x04}"; break;
         case 0x08: yield return $"addi\t{_reg[rt]}, {_reg[rs]}, {nImm}"; break;
         case 0x0d: yield return $"ori\t{_reg[rt]}, {_reg[rs]}, 0x{nImm:x04}"; break;
         case 0x0f: yield return $"lui\t{_reg[rt]}, 0x{nImm:x04}"; break;
         case 0x23: yield return $"lw\t{_reg[rt]}, {nImm}({_reg[rs]})"; break;
         case 0x2b: yield return $"sw\t{_reg[rt]}, {nImm}({_reg[rs]})"; break;
      }
   }
}