示例#1
0
    def _translate_bsh(self, oprnd1, oprnd2, oprnd3):
        """Return a formula representation of a BSH instruction.
        """
        assert oprnd1.size and oprnd2.size and oprnd3.size
        assert oprnd1.size == oprnd2.size

        op1_var = self._translate_src_oprnd(oprnd1)
        op2_var = self._translate_src_oprnd(oprnd2)
        op3_var, _ = self._translate_dst_oprnd(oprnd3)

        if oprnd3.size > oprnd1.size:
            op1_var_zx = smtlibv2.ZEXTEND(op1_var, oprnd3.size)
            op2_var_zx = smtlibv2.ZEXTEND(op2_var, oprnd3.size)

            op2_var_neg = (-op2_var)
            op2_var_neg_sx = smtlibv2.SEXTEND(op2_var_neg, oprnd2.size,
                                              oprnd3.size)

            shl = smtlibv2.EXTRACT(op1_var_zx >> op2_var_neg_sx, 0,
                                   op3_var.size)
            shr = smtlibv2.EXTRACT(op1_var_zx << op2_var_zx, 0, op3_var.size)
        elif oprnd3.size < oprnd1.size:
            shl = smtlibv2.EXTRACT(op1_var >> (-op2_var), 0, op3_var.size)
            shr = smtlibv2.EXTRACT(op1_var << op2_var, 0, op3_var.size)
        else:
            shl = op1_var >> (-op2_var)
            shr = op1_var << op2_var

        return [(op3_var == smtlibv2.ITEBV(oprnd3.size, op2_var >= 0, shr,
                                           shl))]
示例#2
0
    def _translate_mod(self, oprnd1, oprnd2, oprnd3):
        """Return a formula representation of an MOD instruction.
        """
        assert oprnd1.size and oprnd2.size and oprnd3.size
        assert oprnd1.size == oprnd2.size
        # assert oprnd2.size == oprnd3.size

        op1_var = self._translate_src_oprnd(oprnd1)
        op2_var = self._translate_src_oprnd(oprnd2)
        op3_var, parent_reg_constrs = self._translate_dst_oprnd(oprnd3)

        if oprnd1.size == oprnd3.size:
            expr = [(op3_var == (op1_var % op2_var))]
        elif oprnd3.size > oprnd1.size:
            op1_var_zx = smtlibv2.ZEXTEND(op1_var, oprnd3.size)
            op2_var_zx = smtlibv2.ZEXTEND(op2_var, oprnd3.size)

            expr = [(op3_var == (op1_var_zx % op2_var_zx))]
        else:
            raise Exception("Error")

        rv = expr

        if parent_reg_constrs:
            rv += parent_reg_constrs

        return rv
示例#3
0
    def _translate_mul(self, oprnd1, oprnd2, oprnd3):
        """Return a formula representation of an MUL instruction.
        """
        assert oprnd1.size and oprnd2.size and oprnd3.size
        assert oprnd1.size == oprnd2.size

        op1_var = self._translate_src_oprnd(oprnd1)
        op2_var = self._translate_src_oprnd(oprnd2)
        op3_var, parent_reg_constrs = self._translate_dst_oprnd(oprnd3)

        if oprnd3.size > oprnd1.size:
            op1_var_zx = smtlibv2.ZEXTEND(op1_var, oprnd3.size)
            op2_var_zx = smtlibv2.ZEXTEND(op2_var, oprnd3.size)

            expr = (op3_var == op1_var_zx * op2_var_zx)
        elif oprnd3.size < oprnd1.size:
            mul_extract = smtlibv2.EXTRACT(op1_var * op2_var, 0, oprnd3.size)

            expr = (op3_var == mul_extract)
        else:
            expr = (op3_var == (op1_var * op2_var))

        rv = [expr]

        if parent_reg_constrs:
            rv += parent_reg_constrs

        return rv
示例#4
0
    def _translate_sub(self, oprnd1, oprnd2, oprnd3):
        """Return a formula representation of an SUB instruction.
        """
        assert oprnd1.size and oprnd2.size and oprnd3.size
        assert oprnd1.size == oprnd2.size

        op1_var = self._translate_src_oprnd(oprnd1)
        op2_var = self._translate_src_oprnd(oprnd2)
        op3_var, _ = self._translate_dst_oprnd(oprnd3)

        if oprnd3.size > oprnd1.size:
            op1_var_zx = smtlibv2.ZEXTEND(op1_var, oprnd3.size)
            op2_var_zx = smtlibv2.ZEXTEND(op2_var, oprnd3.size)

            expr = (op3_var == (op1_var_zx - op2_var_zx))
        elif oprnd3.size < oprnd1.size:
            sub_extract = smtlibv2.EXTRACT(op1_var - op2_var, 0, oprnd3.size)

            expr = (op3_var == sub_extract)
        else:
            expr = (op3_var == (op1_var - op2_var))

        return [expr]