我正在像这样用十六进制输入文本文件
程序的重点是将这些值转换为mips指令。有没有更好的方法来重写或改进我的代码?我对C#还是很陌生,想看看我是否可以改进此程序。
答案 0 :(得分:1)
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;
}
}
}