-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathasm.py
66 lines (51 loc) · 1.71 KB
/
asm.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python
"""Disassembled instuctions"""
from .adt import ADT
class Kind(ADT) : pass
class Having_side_effects(Kind) : pass
class Affecting_control(Kind) : pass
class Branch(Affecting_control) : pass
class Conditional_branch(Branch) : pass
class Unconditional_branch(Branch) : pass
class Indirect_branch(Branch) : pass
class Return(Affecting_control) : pass
class Call(Affecting_control) : pass
class Barrier(Affecting_control) : pass
class Terminator(Affecting_control): pass
class May_affect_control_flow(Affecting_control) : pass
class May_load(Having_side_effects) : pass
class May_store(Having_side_effects) : pass
class Valid(Kind) : pass
def eval_if_not_adt(s):
if isinstance(s, ADT):
return s
else:
return eval(s)
def map_eval(ss):
return [eval_if_not_adt(s) for s in ss]
class Insn(object) :
def __init__(self, name, addr, size, asm, kinds, operands, target=None, bil=None, **kw):
self.name = name
self.addr = int(addr)
self.size = int(size)
self.operands = map_eval(operands)
self.asm = str(asm)
self.kinds = map_eval(kinds)
self.target = target
self.bil = bil
self.__dict__.update(kw)
def has_kind(self, k):
return exists(self.kinds, lambda x: isinstance(x,k))
def __repr__(self):
return 'Insn("{name}", {addr:#010x}, {size}, "{asm}", {kinds}, {operands})'.\
format(**self.__dict__)
class Op(ADT) : pass
class Reg(Op) : pass
class Imm(Op) : pass
class Fmm(Op) : pass
def exists(cont,f):
try:
r = (x for x in cont if f(x)).next()
return True
except StopIteration:
return False