1093 def dis(cls, bs_o, mode_o = None, offset=0):
1094 if not isinstance(bs_o, bin_stream):
1098 pre_dis_info, bs, mode, offset, prefix_len = cls.pre_dis(
1099 bs_o, mode_o, offset)
1100 candidates = cls.guess_mnemo(bs, mode, pre_dis_info, offset)
1103 if hasattr(bs,
'getlen'):
1109 for c
in candidates:
1110 log.debug(
"*" * 40, mode, c.mode)
1113 c = cls.all_mn_inst[c][0]
1118 if not c.add_pre_dis_info(pre_dis_info):
1124 fname_values = dict(pre_dis_info)
1125 offset_b = offset * 8
1128 for i, f
in enumerate(c.fields_order):
1129 if f.flen
is not None:
1130 l = f.flen(mode, fname_values)
1137 log.debug(
"FIELD %s %s %s %s", f.__class__, f.fname,
1139 if bs_l * 8 - offset_b < l:
1142 bv = cls.getbits(bs, mode, offset_b, l)
1144 if not f.fname
in fname_values:
1145 fname_values[f.fname] = bv
1148 f.is_present =
False
1154 c.l = prefix_len + total_l / 8
1155 for i
in c.to_decode:
1156 f = c.fields_order[i]
1158 ret = f.decode(todo[i])
1160 log.debug(
"cannot decode %r", f)
1168 c.b = cls.getbytes(bs, offset_o, c.l)
1173 c_args = [a.expr
for a
in c.args]
1174 instr = cls.instruction(c.name, mode, c_args,
1175 additional_info=c.additional_info())
1176 instr.l = prefix_len + total_l / 8
1177 instr.b = cls.getbytes(bs, offset_o, instr.l)
1178 instr.offset = offset_o
1188 log.warning(
'dis multiple args ret default')
1190 assert(len(out) == 2)
1191 for i, o
in enumerate(out_c):
1194 raise NotImplementedError(
'not fully functional')