Exemplo n.º 1
0
    def _div(self, op, isInvalid=None):
        oper = op.opers[0]
        denom = self.getOperObj(op, 0)
        if denom == 0:
            # TODO: make effect
            raise envi.DivideByZero('AMD64 Divide by zero')

        if isInvalid is None:
            limit = (2 ** (oper.tsize * 8)) - 1
            isInvalid = lambda val: val > limit

        if oper.tsize == 8:
            rax = Var('rax', self._psize)
            rdx = Var('rdx', self._psize)
            num = (rdx << Const(64, self._psize)) + rax
            temp = num / denom
            if temp.isDiscrete() and isInvalid(temp):
                # TODO: make effect
                raise envi.DivideError('AMD64 i_div #DE')

            self.effSetVariable('rax', temp)
            self.effSetVariable('rdx', num % denom)

            return

        return vsym_i386.IntelSymbolikTranslator._div(self, op, isInvalid=isInvalid)
Exemplo n.º 2
0
    def _div(self, op, isInvalid=None):
        oper = op.opers[0]
        divbase = self.getOperObj(op, 0)
        if isInvalid is None:
            limit = (2**(oper.tsize * 8)) - 1
            isInvalid = lambda val: val > limit

        if oper.tsize == 1:
            ax = self.getRegObj(e_i386.REG_AX)
            quot = ax / divbase
            rem = ax % divbase
            if quot.isDiscrete() and isInvalid(quot):
                raise envi.DivideError('i386 #DE')
            self.effSetVariable('eax', (rem << 8) + quot)

        elif oper.tsize == 2:
            ax = self.getRegObj(e_i386.REG_AX)
            dx = self.getRegObj(e_i386.REG_DX)
            tot = (edx << Const(16, self._psize)) + eax
            quot = tot / divbase
            rem = tot % divbase
            if quot.isDiscrete() and isInvalid(quot):
                raise envi.DivideError('i386 #DE')
            self.effSetVariable('eax', quot)
            self.effSetVariable('edx', rem)

        elif oper.tsize == 4:
            eax = Var('eax', self._psize)
            edx = Var('edx', self._psize)
            tot = (edx << Const(32, self._psize)) + eax
            quot = tot / divbase
            rem = tot % divbase
            if quot.isDiscrete() and isInvalid(quot):
                raise envi.DivideError('i386 #DE')
            self.effSetVariable('eax', quot)
            self.effSetVariable('edx', rem)
            # FIXME maybe we need a "check exception" effect?

        else:
            raise envi.UnsupportedInstruction(self, op)