about summary refs log tree commit diff stats
path: root/miasm/expression/expression.py
diff options
context:
space:
mode:
Diffstat (limited to 'miasm/expression/expression.py')
-rw-r--r--miasm/expression/expression.py26
1 files changed, 17 insertions, 9 deletions
diff --git a/miasm/expression/expression.py b/miasm/expression/expression.py
index 5108deab..55e7e265 100644
--- a/miasm/expression/expression.py
+++ b/miasm/expression/expression.py
@@ -334,11 +334,14 @@ class ExprCond(Expr):
         return "(%s?%s:%s)"%(self.cond.toC(), self.src1.toC(), self.src2.toC())
 
 class ExprMem(Expr):
-    def __init__(self, arg, size = 32):
+    def __init__(self, arg, size = 32, segm = None):
         if not isinstance(arg, Expr): raise 'arg must be expr'
-        self.arg, self.size = arg, size
+        self.arg, self.size, self.segm = arg, size, segm
     def __str__(self):
-        return "@%d[%s]"%(self.size, str(self.arg))
+        if self.segm:
+            return "%s:@%d[%s]"%(self.segm, self.size, str(self.arg))
+        else:
+            return "@%d[%s]"%(self.size, str(self.arg))
     def get_r(self, mem_read=False):
         if mem_read:
             return set(self.arg.get_r(mem_read).union(set([self])))
@@ -352,10 +355,13 @@ class ExprMem(Expr):
         if self in g:
             return g[self]
         arg = self.arg
+        segm = self.segm
         if isinstance(arg, Expr):
             arg = self.arg.reload_expr(g)
+        if isinstance(segm, Expr):
+            segm = self.segm.reload_expr(g)
 
-        return ExprMem(arg, self.size )
+        return ExprMem(arg, self.size, segm)
     def __contains__(self, e):
         return self == e or self.arg.__contains__(e)
 
@@ -363,18 +369,20 @@ class ExprMem(Expr):
         if self in g:
             return g[self]
         arg = self.arg.replace_expr(g)
-        return ExprMem(arg, self.size )
+        return ExprMem(arg, self.size, self.segm)
 
     def __eq__(self, a):
         if not isinstance(a, ExprMem):
             return False
-        return self.arg == a.arg and self.size == a.size
+        return self.arg == a.arg and self.size == a.size and self.segm == a.segm
     def __hash__(self):
-        return hash(self.arg)^hash(self.size)
+        return hash(self.arg)^hash(self.size)^hash(self.segm)
 
     def toC(self):
-        return "MEM_LOOKUP_%.2d(%s)"%(self.size, self.arg.toC())
-
+        if self.segm:
+            return "MEM_LOOKUP_%.2d_SEGM(%s, %s)"%(self.size, self.segm.toC(), self.arg.toC())
+        else:
+            return "MEM_LOOKUP_%.2d(%s)"%(self.size, self.arg.toC())
 
 class ExprOp(Expr):
     def __init__(self, op, *args):