def i_dec(self, op): val = self.getOperValue(op, 0) uval = e_bits.unsigned(val, op.opers[0].tsize) if val == None: self.undefFlags() return val -= 1 self.setOperValue(op, 0, val) #FIXME change over to integer subtraction self.setFlag(EFLAGS_OF, 0) #FIXME OF self.setFlag(EFLAGS_SF, e_bits.is_signed(val, op.opers[0].tsize)) self.setFlag(EFLAGS_ZF, not val) self.setFlag(EFLAGS_AF, e_bits.is_aux_carry_sub(1, uval)) self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(val))
def intSubBase(self, src, dst, ssize, dsize): usrc = e_bits.unsigned(src, ssize) udst = e_bits.unsigned(dst, dsize) ssrc = e_bits.signed(src, ssize) sdst = e_bits.signed(dst, dsize) ures = udst - usrc sres = sdst - ssrc #print "dsize/ssize: %d %d" % (dsize, ssize) #print "unsigned: %d %d %d" % (usrc, udst, ures) #print "signed: %d %d %d" % (ssrc, sdst, sres) self.setFlag(EFLAGS_OF, e_bits.is_signed_overflow(sres, dsize)) self.setFlag(EFLAGS_AF, e_bits.is_aux_carry_sub(usrc, udst)) self.setFlag(EFLAGS_CF, e_bits.is_unsigned_carry(ures, dsize)) self.setFlag(EFLAGS_SF, e_bits.is_signed(ures, dsize)) self.setFlag(EFLAGS_ZF, not sres) self.setFlag(EFLAGS_PF, e_bits.is_parity_byte(ures)) return ures