about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm/expression/expression_eval_abstract.py2
-rw-r--r--miasm/expression/expression_helper.py7
-rwxr-xr-xmiasm/tools/emul_helper.py14
-rw-r--r--miasm/tools/modint.py2
4 files changed, 22 insertions, 3 deletions
diff --git a/miasm/expression/expression_eval_abstract.py b/miasm/expression/expression_eval_abstract.py
index 9fc20c4f..27f13e3b 100644
--- a/miasm/expression/expression_eval_abstract.py
+++ b/miasm/expression/expression_eval_abstract.py
@@ -783,7 +783,7 @@ class eval_abs:
             a = xx.arg
             mask = (1<<(stop-start))-1
             a&=mask
-            a<<=e.args[i][1]
+            a<<=start#e.args[i][1]
             total_bit+=stop-start
             rez|=a
         if total_bit in tab_uintsize:
diff --git a/miasm/expression/expression_helper.py b/miasm/expression/expression_helper.py
index 39f643f1..d2c239c1 100644
--- a/miasm/expression/expression_helper.py
+++ b/miasm/expression/expression_helper.py
@@ -218,6 +218,12 @@ def _expr_simp(e):
                         args[i] = ExprInt(tab_size_int[args[i].get_size()](0))
                         del(args[j])
                         continue
+                # (- A) + A => 0
+                if op == '+' and isinstance(args[i], ExprOp) and args[i].op == "-":
+                    if len(args[i].args) == 1 and args[j] == args[i].args[0]:
+                        args[i] = ExprInt(tab_size_int[args[i].get_size()](0))
+                        del(args[j])
+                        continue
                 # A | A => A
                 if op == '|' and args[i] == args[j]:
                     del(args[j])
@@ -289,6 +295,7 @@ def _expr_simp(e):
             if total_bit in tab_size_int:
                 return ExprInt(tab_size_int[total_bit]((uint64((e.arg.arg)>>e.start)) & mask))
             else:
+                # XXX TODO fix correct size
                 fds
                 return ExprInt(type(e.arg.arg)((uint64((e.arg.arg)>>e.start)) & mask))
         # Slice(Slice(A, x), y) => Slice(A, z)
diff --git a/miasm/tools/emul_helper.py b/miasm/tools/emul_helper.py
index 2c0a7364..0987c37c 100755
--- a/miasm/tools/emul_helper.py
+++ b/miasm/tools/emul_helper.py
@@ -74,7 +74,17 @@ def dump_reg(p):
 
     return out
 
-
+def cmp_ptr(x, y):
+    r = expr_simp(x.arg-y.arg)
+    if not isinstance(r, ExprInt):
+        return 1
+    if r.arg == 0:
+        return 0
+    r = expr_simp(get_op_msb(r))
+    if r == ExprInt(uint1(0)):
+        return 1
+    else:
+        return -1
 def dump_mem(p):
     out = []
     todo = []
@@ -83,7 +93,7 @@ def dump_mem(p):
     for x in kk:
         if isinstance(x, ExprMem):
             todo.append(x)
-    todo.sort()
+    todo.sort(cmp=lambda x,y:cmp_ptr(x, y))
     for x in todo:
         out.append('%s    %s'%(str(x), str(p[x])))
 
diff --git a/miasm/tools/modint.py b/miasm/tools/modint.py
index 75664597..3bd3ea3e 100644
--- a/miasm/tools/modint.py
+++ b/miasm/tools/modint.py
@@ -2,6 +2,8 @@ import os
 
 class moduint(object):
     def __init__(self, arg):
+        if isinstance(arg, moduint):
+            arg = arg.arg
         self.arg = arg%self.__class__.limit
         assert(self.arg >= 0 and self.arg < self.__class__.limit)
     def __repr__(self):