def p_instr_pseudo(self,p): 'instr : pseudo' pseudo = p[1] def mk_op_list(op): if op is None: return [None] if isinstance(op,X86UnknownSizeImmediate): v = op.value l = [X86.Id(v)] if v <= 0xFF or (v <= 0x7F or v >= 0xFFFFFF80) or (v <= 0x7F or (v >= 0xFF80 and v <= 0xFFFF)): l.append(X86.Ib(v)) if v <= 0xFFFF or (v <= 0x7F or v >= 0xFFFF8000) or (v <= 0x7F or (v >= 0xFF80 and v <= 0xFFFF)): l.append(X86.Iw(v)) return l elif isinstance(op,X86UnknownSizeMem16): return map(lambda s: X86.Mem16(op.Seg,s,op.BaseReg,op.IndexReg,op.Disp),memsizes) elif isinstance(op,X86UnknownSizeMem32): return map(lambda s: X86.Mem32(op.Seg,s,op.BaseReg,op.IndexReg,op.ScaleFac,op.Disp),memsizes) else: return [op] g = itertools.product(*tuple(map(mk_op_list,[pseudo.op1,pseudo.op2,pseudo.op3]))) tc = X86TypeChecker.X86TypeChecker() for t in g: i = X86.Instruction(pseudo.pf,pseudo.mnem,*t) for enc in X86EncodeTable.mnem_to_encodings[i.mnem.IntValue()]: # See if the encoding matches, i.e. if the operands type-check. val = tc.TypeCheckInstruction_opt(i,enc.ops) if val == None: continue p[0] = i return raise ValueError("%s: bad instruction" % pseudo)