Ejemplo n.º 1
0
        public void VpSliceShift()
        {
            Constant   eight = Constant.Word16(8);
            Identifier C     = m.Reg8("C");
            Expression e     = new Slice(PrimitiveType.Byte, new BinaryExpression(Operator.Shl, PrimitiveType.Word16, C, eight), 8);
            var        vp    = new ExpressionSimplifier(segmentMap, new SsaEvaluationContext(arch.Object, m.Ssa.Identifiers, dynamicLinker.Object), listener);

            e = e.Accept(vp);
            Assert.AreEqual("C", e.ToString());
        }
Ejemplo n.º 2
0
        public void SliceShift()
        {
            Constant   eight = Constant.Word16(8);
            Identifier C     = Reg8("C");
            Expression e     = new Slice(PrimitiveType.Byte, new BinaryExpression(Operator.Shl, PrimitiveType.Word16, C, eight), 8);
            var        vp    = new ExpressionSimplifier(new SsaEvaluationContext(arch, ssaIds), listener);

            e = e.Accept(vp);
            Assert.AreEqual("C", e.ToString());
        }
Ejemplo n.º 3
0
 public void SliceShift()
 {
     Constant eight = Constant.Word16(8);
     Constant ate = Constant.Word32(8);
     Identifier C = Reg8("C");
     Identifier ax = Reg16("ax");
     Expression e = new Slice(PrimitiveType.Byte, new BinaryExpression(Operator.Shl, PrimitiveType.Word16, C, eight), 8);
     var vp = new ExpressionSimplifier(new SsaEvaluationContext(arch, ssaIds));
     e = e.Accept(vp);
     Assert.AreEqual("C", e.ToString());
 }
Ejemplo n.º 4
0
        private Expression FuseAdjacentSlices(DataType dataType, Expression[] elems)
        {
            var fused = new List <Expression> {
                AsSlice(elems[0]) ?? elems[0]
            };
            bool changed = false;

            for (int i = 1; i < elems.Length; ++i)
            {
                Slice slNext = AsSlice(elems[i]);
                if (fused[fused.Count - 1] is Slice slPrev && slNext != null &&
                    cmp.Equals(slPrev.Expression, slNext.Expression) &&
                    slPrev.Offset == slNext.Offset + slNext.DataType.BitSize)
                {
                    // Fuse the two consecutive slices.
                    var newSlice = new Slice(
                        PrimitiveType.CreateWord(slPrev.DataType.BitSize + slNext.DataType.BitSize),
                        slNext.Expression,
                        slNext.Offset);
                    fused[fused.Count - 1] = newSlice.Accept(this);
                    changed = true;
                }
Ejemplo n.º 5
0
        private Expression FuseAdjacentSlices(DataType dataType, Expression[] elements)
        {
            var fused = new List <Expression> {
                elements[0]
            };

            for (int i = 1; i < elements.Length; ++i)
            {
                var e = elements[i];
                if (fused[fused.Count - 1] is Slice slPrev && e is Slice slNext &&
                    cmp.Equals(slPrev.Expression, slNext.Expression) &&
                    slPrev.Offset == slNext.Offset + slNext.DataType.BitSize)
                {
                    // Found two consecutive slices. Fuse them into one slice and
                    // un-use the shared expression.
                    var newSlice = new Slice(
                        PrimitiveType.CreateWord(slPrev.DataType.BitSize + slNext.DataType.BitSize),
                        slNext.Expression,
                        slNext.Offset);
                    ctx.RemoveExpressionUse(slPrev);
                    fused[fused.Count - 1] = newSlice.Accept(this);
                }