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)
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)