public int GetAddress(int memoperand) { var RegOffset = new Nbit(4); var MemPoint = new Nbit(28); RegOffset.Value = memoperand >> 28; MemPoint.Value = memoperand; var i1 = (RegOffset.Value != 15 ? MRT.Registers[RegOffset.Value] : 0) + (int)MemPoint; return(i1); }
public static int ParseMemAddress(int reg, int shifset) { var RegOffset = new Nbit(4) { Value = reg }; var MemPoint = new Nbit(28) { Value = shifset }; return(RegOffset.Value << 28 | MemPoint.Value); }
public static Operand Parse(string s) { var o = new Operand(); o.OperandType = char.IsDigit(s[0]) ? OperandType.imm : (s[0] == '[' ? OperandType.Mem : OperandType.Reg); switch (o.OperandType) { case OperandType.Reg: o.Value = Registers.GetHasheCode(s); break; case OperandType.imm: int c; if (s.Length > 2 && s[1] == 'x') { s = s.Substring(2); o.Value = int.Parse(s, NumberStyles.AllowHexSpecifier); c = s.Length; } else { o.Value = int.Parse(s, NumberStyles.Integer); c = 32; } o.DataType = c == 1 ? DataType.Hex : (c == 2 ? DataType.Byte : (c <= 4 ? DataType.Word : DataType.DWord)); break; case OperandType.Mem: Nbit a = new Nbit(4, -1), b = new Nbit(28, 0); var d = s.Substring(1, s.Length - 2).Split(new[] { '+' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < d.Length; i++) { if (d[i][0] == '0') { b.Value = int.Parse(d[i].Substring(2), NumberStyles.AllowHexSpecifier); } else { a.Value = Registers.GetHasheCode(d[i]); } } o.Value = a.Value << 28 | b.Value; break; } return(o); }
public static int MemOperandType(string s) { int r = 0; Nbit a = new Nbit(4, -1), b = new Nbit(28, 0); var d = s.Split(new[] { '+' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < d.Length; i++) { if (IsNumbre(d[i], out r)) { b.Value = r; } else { a.Value = Registers.GetHasheCode(d[i]); } } return(a.Value << 28 | b.Value); }
public override string ToString() { switch (OperandType) { case OperandType.Reg: return(Registers.GetName(Value)); case OperandType.Mem: Nbit a = new Nbit(4, Value >> 28), b = new Nbit(28, Value); string c = "["; if (a.Value != 15) { c += Registers.GetName(a.Value) + (b.Value != 0 ? "+" : ""); } c += a.Value != 15 && b.Value == 0 ? "]" : "0x" + b.Value.ToString("x7") + "]"; return(c); case OperandType.imm: c = "0x"; switch (DataType) { case DataType.Hex: return(c + ((byte)(Value & 0xf)).ToString("x1", CultureInfo.InvariantCulture)); case DataType.Byte: return(c + ((byte)Value).ToString("x2", CultureInfo.InvariantCulture)); case DataType.Word: return(c + ((short)Value).ToString("x4", CultureInfo.InvariantCulture)); case DataType.DWord: return(c + Value.ToString("x8", CultureInfo.InvariantCulture)); } break; } return(""); }
public static int MemOperandType(int reg, int offset) { Nbit a = new Nbit(4, reg), b = new Nbit(28, offset); return(a.Value << 28 | b.Value); }