public void Exs_CompareFrameAccess() { Given_ExpressionSimplifier(); foo.DataType = PrimitiveType.Ptr32; var(expr, _) = m.Eq0(m.ISubS(foo, 16)).Accept(simplifier); Assert.AreEqual("foo_1 == 0x00000010<p32>", expr.ToString()); }
/// <summary> /// Mutually recursive functions that jump into each other's bodies. /// </summary> /// <returns></returns> public static Program BuildProgram() { var prog = new ProgramBuilder(); var m = new ProcedureBuilder("even"); var r1 = m.Register(1); m.BranchIf(m.Eq0(r1), "done"); m.Assign(r1, m.ISub(r1, 1)); m.Call("odd", 4); m.Assign(r1, m.Not(r1)); m.Return(); m.Label("done"); m.Assign(r1, true); m.Return(); prog.Add(m); m = new ProcedureBuilder("odd"); r1 = m.Register(1); m.BranchIf(m.Eq(r1, 1), "done"); m.Assign(r1, m.ISub(r1, 1)); m.Call("event", 4); m.Assign(r1, m.Not(r1)); m.Return(); m.Label("done"); m.Assign(r1, true); m.Return(); prog.Add(m); return(prog.BuildProgram()); }
public void TrfConstNonConst() { // Constant in one branch, not constant in other. p.Add("main", m => { var ax = m.Frame.EnsureRegister(Registers.ax); var cl = m.Frame.EnsureRegister(Registers.cl); var cx = m.Frame.EnsureRegister(Registers.cx); m.BranchIf(m.Eq0(ax), "zero"); m.Assign(cl, 0); m.Return(); m.Label("zero"); m.Assign(cx, m.LoadW(ax)); m.Return(); }); var sExp = @"main ax cx al cl ah ch const ax:0x0000 cx:<invalid> main_entry:esp:fp "; RunTest(p, sExp); }
public void VpLoop() { var b = new ProgramBuilder(); b.Add("main", m => { var r = m.Reg32("r0", 0); var zf = m.Flags("Z"); m.Label("l0000"); m.Store(r, 0); m.Assign(r, m.ISub(r, 4)); m.Assign(zf, m.Cond(r)); m.BranchCc(ConditionCode.NE, "l0000"); m.Label("l0001"); m.Assign(r, 42); m.Label("l0002"); m.Store(r, 12); m.Assign(r, m.ISub(r, 4)); m.BranchIf(m.Eq0(r), "l0002"); m.Return(); }); RunFileTest(b.BuildProgram(), "Analysis/VpLoop.txt"); }
public void StrAnls_Issue_529() { var m = new ProcedureBuilder(); var fp = m.Frame.FramePointer; var sp = m.Frame.EnsureRegister(m.Architecture.StackRegister); var puts = new ExternalProcedure("puts", new FunctionType()); m.Label("m4E2"); m.Goto("m4F7"); m.Label("m4E4"); m.SideEffect(m.Fn(puts, Constant.String("Hello", StringType.NullTerminated(PrimitiveType.Byte)))); m.Return(); m.Label("m4F7"); m.BranchIf(m.Eq0(m.Mem32(m.Word32(0x0808A0A4))), "m502"); m.Label("m500"); m.Goto("m50D"); m.Label("m502"); m.BranchIf(m.Eq0(m.Mem32(m.Word32(0x0808A0A8))), "m4E4"); m.Goto("m50D"); m.Label("m50D"); m.SideEffect(m.Fn(puts, Constant.String("Goodbye", StringType.NullTerminated(PrimitiveType.Byte)))); m.Goto("m4E4"); var sExp = #region Expected @" if (Mem0[0x0808A0A4:word32] != 0x00 || Mem0[0x0808A0A8:word32] != 0x00) puts(""Goodbye""); puts(""Hello""); return; "; #endregion Given_CompoundConditionCoalescer(m.Procedure); RunTest(sExp, m.Procedure); }
public void StrAnls_r00237() { //byte fn0800_0541(byte al, selector ds) var ds = m.Temp(PrimitiveType.SegmentSelector, "ds"); var cx_10 = m.Temp(PrimitiveType.Word16, "cx_10"); var si_12 = m.Temp(PrimitiveType.Word16, "si_12"); var ah_13 = m.Temp(PrimitiveType.Byte, "al_13"); var al_43 = m.Temp(PrimitiveType.Byte, "al_43"); var Z_26 = m.Temp(PrimitiveType.Byte, "Z_26"); m.Assign(cx_10, 20000); m.Label("l0800_0544"); m.Assign(si_12, 0x8E8A); m.Assign(ah_13, 0x00); m.Label("l0800_054A"); m.Assign(si_12, m.IAdd(si_12, 0x01)); m.BranchIf(m.Eq0(m.SegMem8(ds, si_12)), "l0800_0557"); m.Label("l0800_054F"); m.Assign(ah_13, 0x01); m.Assign(Z_26, m.Cond(m.ISub(si_12, m.SegMem16(ds, m.Word16(0x8F0B))))); m.BranchIf(m.Ne(si_12, m.SegMem16(ds, m.Word16(0x8F0B))), "l0800_055F"); m.Label("l0800_0557"); m.Assign(Z_26, m.Cond(m.ISub(si_12, 0x8F0A))); m.BranchIf(m.Eq(si_12, 0x8F0A), "l0800_055F"); m.Label("l0800_055D"); m.Goto("l0800_054A"); m.Label("l0800_055F"); m.BranchIf(Z_26, "l0800_0578"); m.Label("l0800_0561"); m.SegStore(ds, m.Word16(0x8F0B), si_12); m.Assign(al_43, m.SegMem8(ds, m.ISub(si_12, 0x8E31))); m.BranchIf(m.Eq0(al_43), "l0800_0576"); m.Label("l0800_0571"); m.BranchIf(m.Ge(al_43, 0x00), "l0800_0575"); m.Label("l0800_0573"); m.Assign(al_43, 0x00); m.Label("l0800_0575"); m.Return(al_43); m.Label("l0800_0576"); m.Goto("l0800_0583"); m.Label("l0800_0578"); m.BranchIf(m.Ne0(ah_13), "l0800_0583"); m.Label("l0800_057D"); m.SegStore(ds, m.Word16(0x8F0B), m.Byte(0)); m.Label("l0800_0583"); m.Assign(cx_10, m.ISub(cx_10, 0x01)); m.BranchIf(m.Ne0(cx_10), "l0800_0544"); m.Label("l0800_0585"); m.Return(m.Byte(0x00)); var sExp = #region Expected @" cx_10 = 20000; do { si_12 = 0x8E8A; al_13 = 0x00; do { si_12 = si_12 + 0x01; if (Mem0[ds:si_12:byte] != 0x00) { al_13 = 0x01; Z_26 = cond(si_12 - Mem0[ds:0x8F0B:word16]); if (si_12 != Mem0[ds:0x8F0B:word16]) break; } Z_26 = cond(si_12 - 0x8F0A); } while (si_12 != 0x8F0A); if (!Z_26) { Mem0[ds:0x8F0B:word16] = si_12; al_43 = Mem0[ds:si_12 - 0x8E31:byte]; if (al_43 != 0x00) { if (al_43 < 0x00) al_43 = 0x00; return al_43; } } else if (al_13 == 0x00) Mem0[ds:0x8F0B:byte] = 0x00; cx_10 = cx_10 - 0x01; } while (cx_10 != 0x00); return 0x00; "; #endregion RunTest(sExp, m.Procedure); }