/// <summary> /// Saves the disassembled functions to a file for the given container /// </summary> /// <param name="container">The container</param> /// <param name="fileName">The name of the file</param> public static void SaveDisassembledFunctions(Win64Container container, string fileName) { using (var fileStream = new FileStream(fileName, FileMode.Create)) using (var writer = new StreamWriter(fileStream)) { foreach (var assembly in container.VirtualMachine.LoadedAssemblies) { foreach (var function in assembly.Functions) { var disassembler = new Disassembler( container.VirtualMachine.Compiler.GetCompilationData(function), x => new XONEVirtualMachine.Compiler.Win64.Disassembler(x), DisassemblerOptions.NewLineAfterInstruction); writer.WriteLine(disassembler.Disassemble()); } } } }
static void Main(string[] args) { using (var container = new Win64Container()) { var intType = container.VirtualMachine.TypeProvider.GetPrimitiveType(PrimitiveTypes.Int); var floatType = container.VirtualMachine.TypeProvider.GetPrimitiveType(PrimitiveTypes.Float); var def = new FunctionDefinition("main", new List<VMType>(), intType); var instructions = new List<Instruction>(); instructions.Add(new Instruction(OpCodes.LoadFloat, 2.5f)); instructions.Add(new Instruction(OpCodes.LoadFloat, 1.35f)); instructions.Add(new Instruction(OpCodes.AddFloat)); instructions.Add(new Instruction(OpCodes.Call, "std.println", Enumerable.Repeat(floatType, 1).ToList())); instructions.Add(new Instruction(OpCodes.LoadInt, 0)); instructions.Add(new Instruction(OpCodes.Ret)); var assembly = Assembly.SingleFunction(new Function(def, instructions, new List<VMType>())); container.LoadAssembly(assembly); container.VirtualMachine.Compile(); foreach (var function in assembly.Functions) { var disassembler = new Disassembler( container.VirtualMachine.Compiler.GetCompilationData(function), x => new Compiler.Win64.Disassembler(x)); Console.WriteLine(disassembler.Disassemble()); } int returnValue = container.VirtualMachine.GetEntryPoint()(); Console.WriteLine(returnValue); } Console.ReadLine(); }