Как я могу улучшить свой код для текстового файла с шестнадцатеричным для ясности и простоты? - PullRequest
0 голосов
/ 15 января 2019

Я беру в текстовом файле с шестнадцатеричным как это

смысл программы - преобразовать эти значения в инструкции mips. Есть ли лучший способ переписать или улучшить мой код? Я довольно новичок в c # и хотел бы посмотреть, смогу ли я улучшить эту программу.

1 Ответ

0 голосов
/ 15 января 2019

Возврат 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;
      }
   }
}
...