public void TestStringAsParameter() { MemoryStream stream = new MemoryStream(); var writer = new StreamWriter(stream); var inst = new X86_64(writer); inst.visit(new StringAsParameter(".LC0", 0)); string actual = Encoding.Default.GetString(stream.ToArray()); Assert.AreEqual("leaq\t.LC0(%rip), %rcx", actual); }
public static string MakeAssembly(string origin, string dest, List<Module> modules, Global.InstructionSets targetInstructionSet) { using (file = new System.IO.StreamWriter(dest)) { InstructionSetGenerator ISVisitor; switch (targetInstructionSet) { case Global.InstructionSets.X86_64: ISVisitor = new X86_64(file); break; default: ISVisitor = new X86_64(file); break; } ISVisitor.processModules(origin, modules); //foreach (Instruction instruction in intercode) //{ // instruction.accept(ISVisitor); /*pos = str.IndexOf(':'); if (pos == -1) opcode = str; else { opcode = str.Substring(0, pos); code = str.Substring(pos + 1); } switch (opcode) { case "call": if (code[0] == '%') { if (code == "%SETUP_C%") w("call\t___main"); break; } pos = code.IndexOf(','); switch (code.Substring(0, pos)) { case "print": code = code.Substring(pos + 1); pos = code.IndexOf(','); if (code.Substring(0, pos) == "constant") w("movl\t$A" + code.Substring(pos + 1) + ", (%esp)"); w("call\t_puts"); break; } break; case "comment": w(".ident\t" + code); break; case "define_constant_string": pos = code.IndexOf(":"); wn("A" + code.Substring(0, pos) + ":"); code = code.Substring(pos + 1); w(".asciz " + code); break; case "define_main_method": w(".globl\t_main"); w(".def\t_main;\t.scl\t2;\t.type\t32;\t\t.endef"); wn("_main:"); break; case "file": w(".file\t" + code); file_origin = code; break; case "get_base_pointer": w("leave"); break; case "reserve_stack": w("andl\t$-16, %esp"); w("subl\t$16, %esp"); break; case "return": w("ret"); break; case "section": switch (code) { case "code": w(".text"); break; case "constants": w(".section\t.rdata,\"dr\""); break; case "var_initialised": w(".section\t.data"); break; case "var_unitialised": w(".section\t.comm"); break; } break; case "set_base_pointer": w("pushl\t%ebp"); w("movl\t%esp, %ebp"); break; }*/ //} } return "Compilation successful. The compilation of the source \"" + origin + "\" is contained in \"" + dest + "\""; }