about summary refs log tree commit diff stats
path: root/example/expression/manip_expression6.py
diff options
context:
space:
mode:
Diffstat (limited to 'example/expression/manip_expression6.py')
-rw-r--r--example/expression/manip_expression6.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/example/expression/manip_expression6.py b/example/expression/manip_expression6.py
new file mode 100644
index 00000000..079faf76
--- /dev/null
+++ b/example/expression/manip_expression6.py
@@ -0,0 +1,107 @@
+from miasm.expression.expression import *
+from miasm.expression.expression_helper import *
+import os
+
+filename = os.environ.get('PYTHONSTARTUP')
+if filename and os.path.isfile(filename):
+    execfile(filename)
+
+a = ExprId('a')
+b = ExprId('b')
+c = ExprId('c')
+d = ExprId('d')
+
+
+x = ExprMem(a+b+ExprInt32(0x42))
+
+def replace_expr(e):
+    #print 'visit', e
+    dct = {c+ExprInt32(0x42):d,
+           a+b:c,}
+    if e in dct:
+        return dct[e]
+    return e
+
+
+print x
+y = x.visit(replace_expr)
+print y
+print x.copy()
+print y.copy()
+print y == y.copy()
+print repr(y), repr(y.copy())
+
+
+z = ExprCompose([(a[5:9], 0, 8), (b, 8, 24), (x, 24, 32)])
+print z
+print z.copy()
+print z[:31].copy().visit(replace_expr)
+
+print 'replace'
+print x.replace_expr({c+ExprInt32(0x42):d,
+                      a+b:c,})
+print z.replace_expr({c+ExprInt32(0x42):d,
+                      a+b:c,})
+
+
+u = z.copy()
+print u
+u.args[-1][0].arg.args[1].arg = uint32(0x45)
+print u
+print z
+print u == z
+
+to_test = [(ExprInt32(5)+c+a+b-a+ExprInt32(1)-ExprInt32(5)),
+           a+b+c-a-b-c+a,
+           a+a+b+c-(a+(b+c)),
+           c^b^a^c^b,
+           a^ExprInt32(0),
+           (a+b)-b,
+           -(ExprInt32(0)-((a+b)-b)),
+
+           ExprOp('<<<', a, ExprInt32(32)),
+           ExprOp('>>>', a, ExprInt32(32)),
+           ExprOp('>>>', a, ExprInt32(0)),
+           ExprOp('<<', a, ExprInt32(0)),
+
+           ExprOp('<<<', a, ExprOp('<<<', b, c)),
+           ExprOp('<<<', ExprOp('<<<', a, b), c),
+           ExprOp('<<<', ExprOp('>>>', a, b), c),
+           ExprOp('>>>', ExprOp('<<<', a, b), c),
+           ExprOp('>>>', ExprOp('<<<', a, b), b),
+
+
+           ExprOp('>>>', ExprOp('<<<', a, ExprInt32(10)), ExprInt32(2)),
+
+           ExprOp('>>>', ExprOp('<<<', a, ExprInt32(10)), ExprInt32(2)) ^ ExprOp('>>>', ExprOp('<<<', a, ExprInt32(10)), ExprInt32(2)),
+           ExprOp(">>", (a & ExprInt32(0xF)), ExprInt32(0x15)),
+           ExprOp("==", ExprInt32(12), ExprInt32(10)),
+           ExprOp("==", ExprInt32(12), ExprInt32(12)),
+           ExprOp("==", a|ExprInt32(12), ExprInt32(0)),
+           ExprOp("==", a|ExprInt32(12), ExprInt32(14)),
+           ExprOp("parity", ExprInt32(0xf)),
+           ExprOp("parity", ExprInt32(0xe)),
+           ExprInt32(0x4142)[:32],
+           ExprInt32(0x4142)[:8],
+           ExprInt32(0x4142)[8:16],
+           a[:32],
+           a[:8][:8],
+           a[:16][:8],
+           a[8:16][:8],
+           a[8:32][:8],
+           a[:16][8:16],
+           ExprCompose([(a, 0, 32)]),
+           ExprCompose([(a[:16], 0, 16)]),
+           ExprCompose([(a[:16], 0, 16), (a, 16, 32)]),
+           ExprCompose([(a[:16], 0, 16), (a[16:32], 16, 32)]),
+
+           ExprMem(a)[:32],
+           ExprMem(a)[:16],
+           ]
+
+
+for e in to_test:
+    print "#"*80
+    print e
+    print e.visit(expr_simp)
+