public void BwTempRegister() { var v1 = m.Frame.CreateTemporary(PrimitiveType.Word32); var edi = m.Frame.CreateTemporary(PrimitiveType.Word32); var esi = m.Frame.EnsureRegister(Registers.esi); var xfer = new RtlCall(m.Mem32(m.IAdd(esi, 40)), 4, InstrClass.Transfer); m.Assign(v1, m.Mem32(edi)); m.Assign(esi, v1); var bw = new Backwalker <Block, Instruction>(host, xfer, expSimp); bool result; result = bw.BackwalkInstruction(m.Block.Statements[1].Instruction); result = bw.BackwalkInstruction(m.Block.Statements[0].Instruction); Assert.IsFalse(result); Assert.AreEqual("None", bw.Index.ToString()); }
public void BwMaskWithHoles() { var eax = m.Frame.EnsureRegister(Registers.eax); var bw = new Backwalker <Block, Instruction>(host, new RtlGoto(m.Mem32(m.IAdd(eax, 0x10000)), InstrClass.Transfer), expSimp); Assert.IsFalse(bw.BackwalkInstruction(m.Assign(eax, m.And(eax, 0x0A)))); Assert.IsNull(bw.Index); Assert.AreEqual(0, bw.Operations.Count); }
public void BwAndMask() { var eax = m.Frame.EnsureRegister(Registers.eax); var bw = new Backwalker <Block, Instruction>(host, new RtlGoto(m.Mem32(m.IAdd(eax, 0x10000)), InstrClass.Transfer), expSimp); Assert.IsFalse(bw.BackwalkInstruction(m.Assign(eax, m.And(eax, 0x7)))); Assert.AreSame(Registers.eax, bw.Index); Assert.AreEqual(0x10000ul, bw.VectorAddress.ToLinear()); Assert.AreEqual("cmp 8", bw.Operations[0].ToString()); }
public void BwXorHiwordOfIndex() { var bx = m.Frame.EnsureRegister(Registers.bx); var bl = m.Frame.EnsureRegister(Registers.bl); var bh = m.Frame.EnsureRegister(Registers.bh); var bw = new Backwalker <Block, Instruction>(host, new RtlGoto(m.Mem32(m.IAdd(bx, 0x1000)), InstrClass.Transfer), expSimp); Assert.IsTrue(bw.BackwalkInstruction( m.Assign(bh, m.Xor(bh, bh)))); Assert.AreSame(Registers.bl, bw.Index); Assert.AreEqual("& 255", bw.Operations[0].ToString()); }
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 BwComparison() { var eax = m.Frame.EnsureRegister(Registers.eax); var SCZO = m.Frame.EnsureFlagGroup((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); bw.UsedFlagIdentifier = m.Frame.EnsureFlagGroup((uint)FlagM.CF, "C", PrimitiveType.Byte); Assert.IsFalse(bw.BackwalkInstruction( m.Assign(SCZO, new ConditionOf(m.ISub(eax, 3)))), "Encountering this comparison should terminate the backwalk"); Assert.AreSame(Registers.eax, bw.Index); Assert.AreEqual("cmp 3", bw.Operations[0].ToString()); }
public void BwAdd() { var eax = m.Frame.EnsureRegister(Registers.eax); var bw = new Backwalker <Block, Instruction>( host, new RtlGoto(m.Mem32(m.IAdd(eax, 0x10000)), InstrClass.Transfer), expSimp); Assert.IsTrue(bw.BackwalkInstruction(m.Assign(eax, m.IAdd(eax, eax)))); Assert.AreSame(Registers.eax, bw.Index); Assert.AreEqual("* 2", bw.Operations[0].ToString()); Assert.AreEqual(2, bw.Stride); }
public void BwJmp() { var eax = m.Frame.EnsureRegister(Registers.eax); var SCZO = m.Frame.EnsureFlagGroup(Registers.eflags, (uint)(FlagM.SF | FlagM.ZF | FlagM.CF | FlagM.OF), "SCZO", PrimitiveType.Byte); var bw = new Backwalker <Block, Instruction>(host, new RtlGoto(m.Mem32(m.IAdd(eax, 0x1000)), InstrClass.Transfer), expSimp); Assert.IsTrue( bw.BackwalkInstruction( m.BranchIf( new TestCondition(ConditionCode.UGT, SCZO), "Nizze").Instruction)); Assert.AreEqual("branch UGT", bw.Operations[0].ToString()); Assert.AreEqual("SCZO", bw.UsedFlagIdentifier.ToString()); }