예제 #1
0
	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)