diff options
Diffstat (limited to 'miasm2/core/cpu.py')
| -rw-r--r-- | miasm2/core/cpu.py | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/miasm2/core/cpu.py b/miasm2/core/cpu.py index aa94773f..57057a85 100644 --- a/miasm2/core/cpu.py +++ b/miasm2/core/cpu.py @@ -100,6 +100,24 @@ class reg_info: return self.expr.index(e) + +class reg_info_dct: + + def __init__(self, reg_expr): + self.dct_str_inv = dict((v.name, k) for k, v in reg_expr.iteritems()) + self.dct_expr = reg_expr + self.dct_expr_inv = dict((v, k) for k, v in reg_expr.iteritems()) + reg_str = [v.name for v in reg_expr.itervalues()] + self.parser = literal_list(reg_str).setParseAction(self.reg2expr) + + def reg2expr(self, s): + i = self.dct_str_inv[s[0]] + return self.dct_expr[i] + + def expr2regi(self, e): + return self.dct_expr_inv[e] + + def gen_reg(rname, env, sz=32): """ Gen reg expr and parser @@ -431,13 +449,14 @@ class bs(object): self.cls = cls self.fname = fname self.order = order - self.lmask = lmask self.fbits = fbits self.fmask = fmask self.flen = flen self.value = value self.kargs = kargs + lmask = property(lambda self:(1 << self.l) - 1) + def __getitem__(self, item): return getattr(self, item) @@ -502,7 +521,6 @@ class bsi(object): self.cls = cls self.fname = fname self.order = order - self.lmask = lmask self.fbits = fbits self.fmask = fmask self.flen = flen @@ -510,6 +528,8 @@ class bsi(object): self.kargs = kargs self.__dict__.update(self.kargs) + lmask = property(lambda self:(1 << self.l) - 1) + def decode(self, v): self.value = v & self.lmask return True @@ -1393,7 +1413,9 @@ class cls_mn(object): log.debug('cannot encode %r', f) can_encode = False break + if f.value is not None and f.l: + assert f.value <= f.lmask cur_len += f.l index += 1 if ret is True: @@ -1557,6 +1579,8 @@ class imm_noarg(object): v = self.encodeval(v) if v is False: return False + if v > self.lmask: + return False self.value = v return True |