def prev(cls, ea, count):
ea = interface.address.within(ea)
isStop = lambda ea: _instruction.feature(ea) & idaapi.CF_STOP == idaapi.CF_STOP
invalidQ = utils.compose(utils.fap(utils.compose(type.is_code, operator.not_), isStop), any)
refs = filter(type.is_code, xref.up(ea))
if len(refs) > 1 and invalidQ(address.prev(ea)):
logging.fatal("{:s}.prev({:x}, count={:d}) : Unable to determine previous address due to multiple previous references being available : {:s}".format('.'.join((__name__, cls.__name__)), ea, count, ', '.join(__builtin__.map("{:x}".format,refs))))
return None
try:
if invalidQ(address.prev(ea)):
res = refs[0]
count += 1
else:
res = address.prev(ea)
except:
res = ea
return cls.prev(res, count-1) if count > 1 else res
评论列表
文章目录