public static List <byte> LookupByteArray(AssemblyOperator objectOp, object operand1 = null, object operand2 = null, object operand3 = null) { if ((objectOp == AssemblyOperator.shl) || (objectOp == AssemblyOperator.shr)) { operand1 = (operand1 is BigInteger) ? 0L : operand1; operand2 = (operand2 is BigInteger) ? 0L : operand2; operand3 = (operand3 is BigInteger) ? 0L : operand3; } ObjectCodeInfo info = new ObjectCodeInfo(objectOp, operand1, operand2, operand3); byte[] byteArray = ObjectCodeTable.MainArrayMap[info]; Assert.ErrorXXX(byteArray != null); List <byte> byteList = new List <byte>(); foreach (byte b in byteArray) { byteList.Add(b); } return(byteList); }
public void FromAdditionToIncrement() { object operand0 = m_operandArray[0], operand1 = m_operandArray[1], operand2 = m_operandArray[2]; if (((m_operator == AssemblyOperator.add) || (m_operator == AssemblyOperator.sub)) && (operand0 is Track) && (operand1 is BigInteger) && (operand2 == null)) { BigInteger value = (BigInteger)operand1; if (((m_operator == AssemblyOperator.add) && (value == 1)) || ((m_operator == AssemblyOperator.sub) && (value == -1))) { m_operator = AssemblyOperator.inc; m_operandArray[1] = null; } else if (((m_operator == AssemblyOperator.sub) && (value == 1)) || ((m_operator == AssemblyOperator.add) && (value == -1))) { m_operator = AssemblyOperator.dec; m_operandArray[1] = null; } } }
public static AssemblyOperator OperatorToSize(AssemblyOperator objectOp, int size) { string name = Enum.GetName(typeof(AssemblyOperator), objectOp); if (objectOp == AssemblyOperator.interrupt) { return(AssemblyOperator.interrupt); } switch (size) { case 1: name = name + "_byte"; break; case 2: name = name + "_word"; break; case 4: name = name + "_dword"; break; case 8: name = name + "_qword"; break; default: Assert.Error(false); break; } return((AssemblyOperator)Enum.Parse(typeof(AssemblyOperator), name)); }
public AssemblyCode(AssemblyOperator objectOp, object operand0, object operand1, object operand2 = null, int size = 0) { m_operator = objectOp; m_operandArray[0] = operand0; m_operandArray[1] = operand1; m_operandArray[2] = operand2; // add rsi, 24 FromAdditionToIncrement(); CheckSize(size); if ((m_operator == AssemblyOperator.sub) && ((m_operandArray[0] is Track) || (m_operandArray[0] is Register)) && (m_operandArray[1] is int) && (m_operandArray[2] == null)) { int i = 1; } string operatorName = Enum.GetName(typeof(AssemblyOperator), Operator).Replace("_", " "); if (operatorName.Equals("add") && (operand0 is Register) && (operand1 is int)) { int i = 1; } }
public static AssemblyOperator OperatorToSize (AssemblyOperator objectOp, int size) { string name = Enum.GetName(typeof(AssemblyOperator), objectOp); Assert.ErrorXXX(objectOp != AssemblyOperator.interrupt); switch (size) { case 1: name = name + "_byte"; break; case 2: name = name + "_word"; break; case 4: name = name + "_dword"; break; case 8: name = name + "_qword"; break; } Assert.ErrorXXX(name.Contains("_")); return((AssemblyOperator)Enum.Parse(typeof(AssemblyOperator), name)); }
public ObjectCodeInfo(AssemblyOperator operatorX, object value1, object value2, object value3) { m_operator = operatorX; m_value1 = value1; m_value2 = value2; m_value3 = value3; }
public AssemblyCode(AssemblyOperator objectOp, object operand0, object operand1, object operand2 = null, int assemblyListIndex = -1) { m_operator = objectOp; m_operandArray[0] = operand0; m_operandArray[1] = operand1; m_operandArray[2] = operand2; FromAdditionToIncrement(); }
public AssemblyCode(AssemblyOperator objectOp, object operand0, object operand1, object operand2 = null, int size = 0) { m_operator = objectOp; m_operandArray[0] = operand0; m_operandArray[1] = operand1; m_operandArray[2] = operand2; FromAdditionToIncrement(); CheckSize(size); }
private void CheckSize(int size) { if ((size != 0) && ((m_operandArray[0] is Register) || (m_operandArray[0] is Track) || (m_operandArray[0] is String)) && (m_operandArray[1] is int) && (IsUnary() || ((m_operandArray[2] is BigInteger) || (m_operandArray[2] is String)))) { m_operator = OperatorToSize(m_operator, size); } }
public static int SizeOfValue(BigInteger value, AssemblyOperator op) { string name = Enum.GetName(typeof(AssemblyOperator), op); if (name.StartsWith("mov")) { return(SizeOfOperator(op)); } else if (name.StartsWith("cmp") && (value == 0)) { return(1); } else { return(SizeOfValue(value)); } }
private void CheckIncrement(int valueIndex) { int value = (int)((BigInteger)m_operandArray[valueIndex]); if (((Operator == AssemblyOperator.add) && (value == 1)) || ((Operator == AssemblyOperator.sub) && (value == -1))) { m_operator = AssemblyOperator.inc; m_operandArray[valueIndex] = null; } else if (((Operator == AssemblyOperator.add) && (value == -1)) || ((Operator == AssemblyOperator.sub) && (value == 1))) { m_operator = AssemblyOperator.dec; m_operandArray[valueIndex] = null; } }
/// <summary> /// 编译脚本,生成委托 /// </summary> /// <param name="className">类名</param> /// <param name="methodName">方法名</param> /// <param name="delegateType">委托类型</param> /// <returns></returns> public Delegate Complie(string className, string content, string methodName, Type delegateType) { //获取程序集 Assembly assembly = GetAssemblyByScript(content); //判空 if (assembly == null) { return(null); } //获取方法委托 return(AssemblyOperator .Loader(assembly)[className] .GetMethod(methodName) .CreateDelegate(delegateType)); }
/// <summary> /// 编译脚本,生成委托 /// </summary> /// <param name="className">类名</param> /// <param name="methodName">方法名</param> /// <param name="delegateType">委托类型</param> /// <returns></returns> public Delegate Complie <T>(string className, string content, string methodName, object binder) { //获取程序集 Assembly assembly = GetAssemblyByScript(content); //判空 if (assembly == null) { return(null); } //获取方法委托 return(AssemblyOperator .Loader(assembly)[className] .GetMethod(methodName) .CreateDelegate(typeof(T), binder)); }
public static int SizeOfOperator(AssemblyOperator objectOp) { string name = Enum.GetName(typeof(AssemblyOperator), objectOp); if (name.Contains("_byte")) { return(1); } else if (name.Contains("_word")) { return(2); } else if (name.Contains("_dword")) { return(4); } else { Assert.ErrorXXX(name.Contains("_qword")); return(8); } }
public static int SizeOfOperator(AssemblyOperator objectOp) { string name = Enum.GetName(typeof(AssemblyOperator), objectOp); if (name.Contains("_byte")) { return(Type.Bytes1); } else if (name.Contains("_word")) { return(Type.Bytes2); } else if (name.Contains("_dword")) { return(Type.Bytes4); } else if (name.Contains("_qword")) { return(Type.Bytes8); } Assert.Error(Message.Operator_size); return(0); }
public void TestInit() { string _path = string.Format(@"{0}\TestSource\DotNet2.Interfaces.dll", AppDomain.CurrentDomain.BaseDirectory); assHelper = new AssemblyOperator(_path); }
public void Optimize() { foreach (AssemblyCode assemblyCode in m_assemblyCodeList) { AssemblyOperator operatorX = assemblyCode.Operator; object operand0 = assemblyCode[0], operand1 = assemblyCode[1], operand2 = assemblyCode[2]; switch (operatorX) { case AssemblyOperator.add: case AssemblyOperator.sub: if ((operand0 is Register) && (operand1 is int) && (operand2 == null)) { int value = (int)operand1; if (((operatorX == AssemblyOperator.add) && (value == 1)) || ((operatorX == AssemblyOperator.sub) && (value == -1))) { assemblyCode.Operator = AssemblyOperator.inc; assemblyCode[1] = null; } else if (((operatorX == AssemblyOperator.add) && (value == -1)) || ((operatorX == AssemblyOperator.sub) && (value == 1))) { assemblyCode.Operator = AssemblyOperator.dec; assemblyCode[1] = null; } } else if ((operand0 is Register) && (operand1 is int) && (operand2 is int)) { int value = (int)operand2; if (((operatorX == AssemblyOperator.add) && (value == 1)) || ((operatorX == AssemblyOperator.sub) && (value == -1))) { assemblyCode.Operator = AssemblyOperator.inc; assemblyCode[2] = null; } else if (((operatorX == AssemblyOperator.add) && (value == -1)) || ((operatorX == AssemblyOperator.sub) && (value == 1))) { assemblyCode.Operator = AssemblyOperator.dec; assemblyCode[2] = null; } } break; case AssemblyOperator.jmp: case AssemblyOperator.je: case AssemblyOperator.jne: case AssemblyOperator.jc: case AssemblyOperator.jnc: case AssemblyOperator.jl: case AssemblyOperator.jle: case AssemblyOperator.jg: case AssemblyOperator.jge: case AssemblyOperator.jb: case AssemblyOperator.jbe: case AssemblyOperator.ja: case AssemblyOperator.jae: { if (operand0 is int) { int address = (int)operand0; if (address == 0) { assemblyCode.Operator = AssemblyOperator.empty; assemblyCode[0] = null; } } } break; } } }