about summary refs log tree commit diff stats
path: root/miasm2/core/cpu.py
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/core/cpu.py')
-rw-r--r--miasm2/core/cpu.py28
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