def get_annotation(self, xdata: InstrXData) -> str:
        """data format: a:vvvxxxxxx .

        vars[0]: lhs (memory location)
        vars[1]: srcptrlhs (esi)
        vars[2]: dstptrlhs (edi)
        xprs[0]: rhs (memory location)
        xprs[1]: rhs (simplified)
        xprs[2]: srcptrrhs
        xprs[3]: srcptrrhs (simplified)
        xprs[4]: dstptrrhs
        xprs[5]: dstptrrhs (simplified
        """

        lhs = str(xdata.vars[0])
        rhs = xdata.xprs[0]
        rrhs = xdata.xprs[1]
        xrhs = simplify_result(xdata.args[3], xdata.args[4], rhs, rrhs)
        srcptrrhs = xdata.xprs[2]
        rsrcptrrhs = xdata.xprs[3]
        xsrcptrrhs = simplify_result(xdata.args[5], xdata.args[6], srcptrrhs,
                                     rsrcptrrhs)
        dstptrrhs = xdata.xprs[4]
        rdstptrrhs = xdata.xprs[5]
        xdstptrrhs = simplify_result(xdata.args[7], xdata.args[8], dstptrrhs,
                                     rdstptrrhs)
        return (lhs + ' = ' + xrhs + '; esi = ' + xsrcptrrhs + '; edi = ' +
                xdstptrrhs)
Example #2
0
    def annotation(self, xdata: InstrXData) -> str:
        """data format a:vxxxxxx

        vars[0]: lhs
        xprs[0]: rhs1 (dst)
        xprs[1]: rhs2 (src)
        xprs[2]: rhs1 - rhs2 (syntactic)
        xprs[3]: (rhs1 - rhs2) + 1 (syntactic)
        xprs[4]: rhs1 - rhs2 (simplified)
        xprs[5]: (rhs1 - rhs2) + 2 (simplified)
        """

        lhs = str(xdata.vars[0])
        rhsx = xdata.xprs[2]
        rrhsx = xdata.xprs[3]
        xrhsx = simplify_result(xdata.args[3], xdata.args[4], rhsx, rrhsx)
        rhsx1 = xdata.xprs[4]
        rrhsx1 = xdata.xprs[5]
        xrhsx1 = simplify_result(xdata.args[5], xdata.args[6], rhsx1, rrhsx1)
        return (lhs + ' = ' + xrhsx + ' or ' + xrhsx1)
Example #3
0
    def annotation(self, xdata: InstrXData) -> str:
        """data format: a:vvxxxxxx

        vars[0]: quotient-lhs
        vars[1]: remainder-lhs
        xprs[0]: dividend
        xprs[1]: divisor
        xprs[2]: quotient-rhs (syntactic)
        xprs[3]: quotient-rhs (simplified)
        xprs]4]: remainder-rhs (syntactic)
        xprs[5]: remainder-rhs (simplified)
        """

        lhs1 = str(xdata.vars[0])
        lhs2 = str(xdata.vars[1])
        quot = xdata.xprs[2]
        rquot = xdata.xprs[3]
        rem = xdata.xprs[4]
        rrem = xdata.xprs[5]
        xquot = simplify_result(xdata.args[4], xdata.args[5], quot, rquot)
        xrem = simplify_result(xdata.args[6], xdata.args[7], rem, rrem)
        return lhs1 + ' = ' + xquot + '; ' + lhs2 + ' = ' + xrem
    def annotation(self, xdata: InstrXData) -> str:
        """data format: a:vxxx .

        vars[0]: lhs
        xprs[0]: rhs
        xprs[1]: rhs simplified
        """

        lhs = str(xdata.vars[0])
        rhs = xdata.xprs[0]
        rrhs = xdata.xprs[1]
        xrhs = simplify_result(xdata.args[1], xdata.args[2], rhs, rrhs)
        return lhs + ' = ' + xrhs
Example #5
0
    def annotation(self, xdata: InstrXData) -> str:
        """data format a:vxx

        vars[0]: dst
        xprs[0]: src
        xprs[1]: src simplified
        """

        lhs = str(xdata.vars[0])
        rhs = xdata.xprs[0]
        rrhs = xdata.xprs[1]
        xrhs = simplify_result(xdata.args[1], xdata.args[2], rhs, rrhs)
        return lhs + ' = sign-extend ' + xrhs
    def annotation(self, xdata: InstrXData) -> str:
        """data format: a:vxxx .

        vars[0]: dst
        xprs[0]: src
        xprs[1]: src - 1 (syntactic)
        xprs[2]: src - 1 (simplified)
        """

        lhs = str(xdata.vars[0])
        rhs = xdata.xprs[1]
        rrhs = xdata.xprs[2]
        xrhs = simplify_result(xdata.args[2], xdata.args[3], rhs, rrhs)
        return lhs + ' = ' + xrhs
Example #7
0
    def annotation(self, xdata: InstrXData) -> str:
        """data format: a:vxxx

        vars[0]: lhs
        xprs[0]: rhs
        xprs[1]: rhs 2's complement (syntactic)
        xprs[2]: rhs 2's complement (simplified)
        """

        lhs = str(xdata.vars[0])
        rhsx = xdata.xprs[1]
        rrhsx = xdata.xprs[2]
        xrhs = simplify_result(xdata.args[2], xdata.args[3], rhsx, rrhsx)
        return lhs + ' = ' + xrhs
    def annotation(self, xdata: InstrXData) -> str:
        """data format a:vxxxx

        vars[0]: dst
        xprs[0]: rhs-base
        xprs[1]: rhs-expr
        xprs[2]: rhs-result (syntactic)
        xprs[3]: rhs-result (simplified)
        """

        lhs = str(xdata.vars[0])
        rhs = xdata.xprs[2]
        rrhs = xdata.xprs[3]
        xrhs = simplify_result(xdata.args[3], xdata.args[4], rhs, rrhs)
        return lhs + ' = ' + xrhs
    def annotation(self, xdata: InstrXData) -> str:
        """data format a:xx .

        xprs[0]: value of eax
        xprs[1]: value of eax simplified
        """

        eax = xdata.xprs[0]
        reax = xdata.xprs[1]
        xeax = simplify_result(xdata.args[0], xdata.args[1], eax, reax)
        popped = self.bytes_popped
        if popped == 0:
            return 'return (' + xeax + ')'
        else:
            return "return (" + xeax + ") (adj: " + str(popped) + ")"
Example #10
0
    def annotation(self, xdata: InstrXData) -> str:
        """data format

        vars[0]: lhs
        xprs[0]: rhs1
        xprs[1]: rhs2
        xprs[2]: rhs1 * rhs2 (syntactic)
        xprs[3]: rhs1 * rhs2 (simplified)
        """

        lhs = str(xdata.vars[0])
        rhs = xdata.xprs[2]
        rrhs = xdata.xprs[3]
        xrhs = simplify_result(xdata.args[3], xdata.args[4], rhs, rrhs)
        return lhs + ' = ' + xrhs
Example #11
0
    def annotation(self, xdata: InstrXData) -> str:
        """data format: a:vxxxx .

        vars[0]: dst-lhs
        xprs[0]: src
        xprs[1]: dst-rhs
        xprs[2]: src + dst (syntactic)
        xprs[3]: src + dst (simplified)
        """
        lhs = str(xdata.vars[0])
        result = xdata.xprs[2]
        rresult = xdata.xprs[3]
        xresult = simplify_result(xdata.args[3], xdata.args[4], result,
                                  rresult)
        return lhs + ' := ' + xresult
Example #12
0
    def annotation(self, xdata: InstrXData) -> str:
        """data format: """

        if len(xdata.tags) > 1 and xdata.tags[1] == 'arg':
            callsite = xdata.tags[1]
            argindex = xdata.args[2]
            xval = str(xdata.xprs[1])
            return '[' + str(callsite) + ':' + str(
                argindex) + ': ' + xval + ']'
        if len(xdata.xprs) == 2:
            lhs = str(xdata.vars[0])
            rhs = xdata.xprs[0]
            rrhs = xdata.xprs[1]
            xrhs = simplify_result(xdata.args[1], xdata.args[2], rhs, rrhs)
            return lhs + ' = ' + xrhs
        else:
            if len(xdata.tags) > 0:
                return xdata.tags[0]
            else:
                return 'mov:????'
    def annotation(self, xdata: InstrXData) -> str:
        """data format a:vvxxxx

        vars[0]: srclhs
        vars[1]: dstlhs
        xprs[0]: rhs1
        xprs[1]: rhs2
        xprs[2]: sum (syntactic)
        xprs[3]: sum (simplified)
        """

        srclhs = str(xdata.vars[0])
        dstlhs = str(xdata.vars[1])
        srcrhs = str(xdata.xprs[0])
        dstrhs = str(xdata.xprs[1])
        result = xdata.xprs[2]
        rresult = xdata.xprs[3]
        xresult = simplify_result(xdata.args[4], xdata.args[5], result,
                                  rresult)
        return dstlhs + ' = ' + xresult + '; ' + srclhs + ' = ' + dstrhs
    def annotation(self, xdata: InstrXData) -> str:
        """data format
             a:v, restore  : restore initial value of register
             a:vxxx  otherwise

        vars[0]: dst
        xprs[0]: rhs
        xprs[1]: esp
        xprs[2]: esp (simplified)
        """

        if len(xdata.tags) == 2 and xdata.tags[1] == "restore":
            return "restore " + str(xdata.vars[0])
        else:
            lhs = str(xdata.vars[0])
            rhs = xdata.xprs[0]
            esp = xdata.xprs[1]
            resp = xdata.xprs[2]
            xresp = simplify_result(xdata.args[2], xdata.args[3], esp, resp)
            return lhs + ' = ' + str(rhs) + '; esp = ' + xresp
    def annotation(self, xdata: InstrXData) -> str:
        """"data format: a:vxxxx

        vars[0]: lhs
        xprs[0]: rhs1
        xprs[1]: rhs2
        xprs[2]: rhs1 xor rhs2 (syntactic)
        xprs[3]: rhs1 xor rhs2 (simplified)
        """

        if len(xdata.xprs) == 0:  # src, dst are the same, result is zero
            lhs = str(xdata.vars[0])
            return lhs + ' = 0'

        else:
            lhs = str(xdata.vars[0])
            result = xdata.xprs[2]
            rresult = xdata.xprs[3]
            xresult = simplify_result(xdata.args[3], xdata.args[4], result,
                                      rresult)
            return lhs + ' = ' + xresult
Example #16
0
    def annotation(self, xdata: InstrXData) -> str:
        """Different formats dependent on operands.

        1) stack realignment: "stack-realign", with number of bytes

        2) zero assignement: "a:v"

        3) rewrite register: "a:vxx"  (dst = src (register))

        4) general case: "a:vxxxx"

        vars[x]: lhs
        xprs[0]: src
        xprs[1]: dst-rhs
        xprs[2]: src & dst (syntactic)
        xprs[3]: src & dst (simplified)
        """

        if xdata.tags[0] == 'stack-realign':
            alignment = str(xdata.args[0])
            return 'align stack on ' + alignment + ' bytes'

        elif len(xdata.xprs) == 0:  # rhs is zero, result is zero
            lhs = str(xdata.vars[0])
            return lhs + ' = 0'

        elif len(xdata.xprs) == 1:  # dst = src, value is unchanged
            lhs = str(xdata.vars[0])
            rhs = str(xdata.xprs[1])
            return lhs + ' = ' + rhs + ' (unchanged)'

        else:
            lhs = str(xdata.vars[0])
            result = xdata.xprs[2]
            rresult = xdata.xprs[3]
            xresult = simplify_result(xdata.args[3], xdata.args[4], result,
                                      rresult)
            return lhs + ' = ' + xresult
    def annotation(self, xdata: InstrXData) -> str:
        """data formats:
              a:v second operand is -1, result is -1
              a:vxxxx otherwise

        vars[0]: dst
        xprs[0]: src-rhs
        xprs[1]: dst-rhs
        xprs[2]: src-rhs | dst-rhs (syntactic)
        xprs[3]: src-rhs | dst-rhs (simplified)
        """

        if len(xdata.xprs) == 0:
            # second operand is -1
            lhs = str(xdata.vars[0])
            return lhs + ' = -1'
        else:
            lhs = str(xdata.vars[0])
            result = xdata.xprs[2]
            rresult = xdata.xprs[3]
            xresult = simplify_result(xdata.args[2], xdata.args[3], result,
                                      rresult)
            return lhs + ' = ' + xresult