public void BwLoadIndexed() { var eax = m.Frame.EnsureRegister(Registers.eax); var edx = m.Frame.EnsureRegister(Registers.edx); var al = m.Frame.EnsureRegister(Registers.al); var SCZO = m.Frame.EnsureFlagGroup(Registers.eflags, (uint)(FlagM.SF | FlagM.ZF | FlagM.CF | FlagM.OF), "SCZO", PrimitiveType.Byte); var bw = new Backwalker(host, new RtlGoto(m.LoadDw(m.IAdd(eax, 0x1000)), RtlClass.Transfer), expSimp); Assert.IsTrue(bw.BackwalkInstruction( m.Assign(al, m.LoadB(m.IAdd(edx, 0x1004))))); Assert.AreSame(Registers.edx, bw.Index); }
public void VpLoadDpb() { var m = new ProcedureBuilder(); var a2 = m.Reg32("a2", 10); var d3 = m.Reg32("d3", 3); var tmp = m.Temp(PrimitiveType.Byte, "tmp"); m.Assign(tmp, m.LoadB(a2)); m.Assign(d3, m.Dpb(d3, tmp, 0)); m.Store(m.IAdd(a2, 4), m.Cast(PrimitiveType.Byte, d3)); SsaState ssa = RunTest(m); var sExp = #region Expected @"a2:a2 def: def a2 uses: tmp_2 = Mem0[a2:byte] Mem5[a2 + 0x00000004:byte] = tmp_2 Mem0:Global memory def: def Mem0 uses: tmp_2 = Mem0[a2:byte] tmp_2: orig: tmp def: tmp_2 = Mem0[a2:byte] uses: d3_4 = DPB(d3, tmp_2, 0) Mem5[a2 + 0x00000004:byte] = tmp_2 d3:d3 def: def d3 uses: d3_4 = DPB(d3, tmp_2, 0) d3_4: orig: d3 def: d3_4 = DPB(d3, tmp_2, 0) Mem5: orig: Mem0 def: Mem5[a2 + 0x00000004:byte] = tmp_2 // ProcedureBuilder // Return size: 0 void ProcedureBuilder() ProcedureBuilder_entry: def a2 def Mem0 def d3 // succ: l1 l1: tmp_2 = Mem0[a2:byte] d3_4 = DPB(d3, tmp_2, 0) Mem5[a2 + 0x00000004:byte] = tmp_2 ProcedureBuilder_exit: "; #endregion AssertStringsEqual(sExp, ssa); }
public void BwZeroExtend() { var rax = m.Reg64("rax", 0); var eax = m.Reg32("eax", 0); var al = m.Reg8("al", 0); var ecx = m.Reg32("ecx", 1); var CZ = m.Flags("CZ"); m.Assign(eax, m.LoadB(rax)); m.Assign(CZ, m.Cond(m.ISub(al, 0x78))); m.BranchIf(m.Test(ConditionCode.UGT, CZ), "ldefault"); m.Assign(ecx, m.Cast(PrimitiveType.Word32, al)); var xfer = new RtlGoto(m.LoadDw(m.IAdd(Constant.Word32(0x00411F40), m.IMul(ecx, 8))), RtlClass.Transfer); var bw = new Backwalker <Block, Instruction>(host, xfer, expSimp); Assert.IsTrue(bw.CanBackwalk()); var ops = bw.BackWalk(m.Block); Assert.AreEqual(3, ops.Count); Assert.AreEqual("cmp 120", ops[0].ToString()); Assert.AreEqual("branch UGT", ops[1].ToString()); Assert.AreEqual("* 8", ops[2].ToString()); }