about summary refs log tree commit diff stats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--miasm2/arch/x86/sem.py148
-rw-r--r--miasm2/expression/expression_helper.py19
-rw-r--r--test/arch/x86/unit/mn_daa.py76
-rw-r--r--test/arch/x86/unit/mn_das.py106
-rw-r--r--test/expression/simplifications.py33
-rw-r--r--test/test_all.py2
6 files changed, 360 insertions, 24 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py
index 6b5ae583..f99d2d9d 100644
--- a/miasm2/arch/x86/sem.py
+++ b/miasm2/arch/x86/sem.py
@@ -20,6 +20,7 @@ import miasm2.expression.expression as m2_expr
 from miasm2.expression.simplifications import expr_simp
 from miasm2.arch.x86.regs import *
 from miasm2.arch.x86.arch import mn_x86, repeat_mn, replace_regs
+from miasm2.expression.expression_helper import expr_cmps, expr_cmpu
 from miasm2.ir.ir import ir, irbloc
 import math
 import struct
@@ -1212,7 +1213,9 @@ def jz(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(zf, dst, n).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(zf,
+                             dst.zeroExtend(instr.mode),
+                             n.zeroExtend(instr.mode))
     e = [m2_expr.ExprAff(meip, dst_o),
          m2_expr.ExprAff(ir.IRDst, dst_o),
      ]
@@ -1224,7 +1227,8 @@ def jcxz(ir, instr, dst):
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
     dst_o = m2_expr.ExprCond(mRCX[instr.mode][:16],
-                             n, dst).zeroExtend(instr.mode)
+                             n.zeroExtend(instr.mode),
+                             dst.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1235,7 +1239,8 @@ def jecxz(ir, instr, dst):
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
     dst_o = m2_expr.ExprCond(mRCX[instr.mode][:32],
-                             n, dst).zeroExtend(instr.mode)
+                             n.zeroExtend(instr.mode),
+                             dst.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1245,7 +1250,9 @@ def jrcxz(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(mRCX[instr.mode], n, dst).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(mRCX[instr.mode],
+                             n.zeroExtend(instr.mode),
+                             dst.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1255,7 +1262,9 @@ def jnz(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(zf, n, dst).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(zf,
+                             n.zeroExtend(instr.mode),
+                             dst.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1265,7 +1274,9 @@ def jp(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(pf, dst, n).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(pf,
+                             dst.zeroExtend(instr.mode),
+                             n.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1275,7 +1286,9 @@ def jnp(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(pf, n, dst).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(pf,
+                             n.zeroExtend(instr.mode),
+                             dst.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1285,7 +1298,9 @@ def ja(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(cf | zf, n, dst).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(cf | zf,
+                             n.zeroExtend(instr.mode),
+                             dst.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1295,7 +1310,9 @@ def jae(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(cf, n, dst).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(cf,
+                             n.zeroExtend(instr.mode),
+                             dst.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1305,7 +1322,9 @@ def jb(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(cf, dst, n).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(cf,
+                             dst.zeroExtend(instr.mode),
+                             n.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1315,7 +1334,9 @@ def jbe(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(cf | zf, dst, n).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(cf | zf,
+                             dst.zeroExtend(instr.mode),
+                             n.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1325,7 +1346,9 @@ def jge(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(nf - of, n, dst).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(nf - of,
+                             n.zeroExtend(instr.mode),
+                             dst.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1335,7 +1358,9 @@ def jg(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(zf | (nf - of), n, dst).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(zf | (nf - of),
+                             n.zeroExtend(instr.mode),
+                             dst.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1345,7 +1370,9 @@ def jl(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(nf - of, dst, n).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(nf - of,
+                             dst.zeroExtend(instr.mode),
+                             n.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1355,7 +1382,9 @@ def jle(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(zf | (nf - of), dst, n).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(zf | (nf - of),
+                             dst.zeroExtend(instr.mode),
+                             n.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1365,7 +1394,9 @@ def js(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(nf, dst, n).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(nf,
+                             dst.zeroExtend(instr.mode),
+                             n.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1375,7 +1406,9 @@ def jns(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(nf, n, dst).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(nf,
+                             n.zeroExtend(instr.mode),
+                             dst.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1385,7 +1418,9 @@ def jo(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(of, dst, n).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(of,
+                             dst.zeroExtend(instr.mode),
+                             n.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1395,7 +1430,9 @@ def jno(ir, instr, dst):
     e = []
     meip = mRIP[instr.mode]
     n = m2_expr.ExprId(ir.get_next_label(instr), dst.size)
-    dst_o = m2_expr.ExprCond(of, n, dst).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(of,
+                             n.zeroExtend(instr.mode),
+                             dst.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1410,7 +1447,9 @@ def loop(ir, instr, dst):
 
     n = m2_expr.ExprId(ir.get_next_label(instr), instr.mode)
     c = myecx - m2_expr.ExprInt_from(myecx, 1)
-    dst_o = m2_expr.ExprCond(c, dst, n).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(c,
+                             dst.zeroExtend(instr.mode),
+                             n.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(myecx, c))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
@@ -1432,7 +1471,9 @@ def loopne(ir, instr, dst):
     c &= zf ^ m2_expr.ExprInt1(1)
 
     e.append(m2_expr.ExprAff(myecx, myecx - m2_expr.ExprInt_from(myecx, 1)))
-    dst_o = m2_expr.ExprCond(c, dst, n).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(c,
+                             dst.zeroExtend(instr.mode),
+                             n.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -1451,7 +1492,9 @@ def loope(ir, instr, dst):
                  m2_expr.ExprInt1(0))
     c &= zf
     e.append(m2_expr.ExprAff(myecx, myecx - m2_expr.ExprInt_from(myecx, 1)))
-    dst_o = m2_expr.ExprCond(c, dst, n).zeroExtend(instr.mode)
+    dst_o = m2_expr.ExprCond(c,
+                             dst.zeroExtend(instr.mode),
+                             n.zeroExtend(instr.mode))
     e.append(m2_expr.ExprAff(meip, dst_o))
     e.append(m2_expr.ExprAff(ir.IRDst, dst_o))
     return e, []
@@ -2416,9 +2459,65 @@ def rdtsc(ir, instr):
     return e, []
 
 
-# XXX TODO
 def daa(ir, instr):
-    return [], None
+    e = []
+    r_al = mRAX[instr.mode][:8]
+
+    cond1 = expr_cmpu(r_al[:4], m2_expr.ExprInt_fromsize(4, 0x9)) | af
+    e.append(m2_expr.ExprAff(af, cond1))
+
+
+    cond2 = expr_cmpu(m2_expr.ExprInt8(6), r_al)
+    cond3 = expr_cmpu(r_al, m2_expr.ExprInt8(0x99)) | cf
+
+
+    cf_c1 = m2_expr.ExprCond(cond1,
+                             cf | (cond2),
+                             m2_expr.ExprInt1(0))
+    new_cf = m2_expr.ExprCond(cond3,
+                              m2_expr.ExprInt1(1),
+                              m2_expr.ExprInt1(0))
+    e.append(m2_expr.ExprAff(cf, new_cf))
+
+    al_c1 = m2_expr.ExprCond(cond1,
+                             r_al + m2_expr.ExprInt8(6),
+                             r_al)
+
+    new_al = m2_expr.ExprCond(cond3,
+                              al_c1 + m2_expr.ExprInt8(0x60),
+                              al_c1)
+    e.append(m2_expr.ExprAff(r_al, new_al))
+    return e, []
+
+def das(ir, instr):
+    e = []
+    r_al = mRAX[instr.mode][:8]
+
+    cond1 = expr_cmpu(r_al[:4], m2_expr.ExprInt_fromsize(4, 0x9)) | af
+    e.append(m2_expr.ExprAff(af, cond1))
+
+
+    cond2 = expr_cmpu(m2_expr.ExprInt8(6), r_al)
+    cond3 = expr_cmpu(r_al, m2_expr.ExprInt8(0x99)) | cf
+
+
+    cf_c1 = m2_expr.ExprCond(cond1,
+                             cf | (cond2),
+                             m2_expr.ExprInt1(0))
+    new_cf = m2_expr.ExprCond(cond3,
+                              m2_expr.ExprInt1(1),
+                              cf_c1)
+    e.append(m2_expr.ExprAff(cf, new_cf))
+
+    al_c1 = m2_expr.ExprCond(cond1,
+                             r_al - m2_expr.ExprInt8(6),
+                             r_al)
+
+    new_al = m2_expr.ExprCond(cond3,
+                              al_c1 - m2_expr.ExprInt8(0x60),
+                              al_c1)
+    e.append(m2_expr.ExprAff(r_al, new_al))
+    return e, []
 
 
 def aam(ir, instr, a):
@@ -3272,6 +3371,7 @@ mnemo_func = {'mov': mov,
               'cqo': cqo,
 
               'daa': daa,
+              'das': das,
               'aam': aam,
               'aad': aad,
               'aaa': aaa,
diff --git a/miasm2/expression/expression_helper.py b/miasm2/expression/expression_helper.py
index 3555530a..196ad5cd 100644
--- a/miasm2/expression/expression_helper.py
+++ b/miasm2/expression/expression_helper.py
@@ -533,3 +533,22 @@ class ExprRandom(object):
             cls.generated_elements = {}
 
         return got
+
+def _expr_cmp_gen(arg1, arg2):
+    return (arg2 - arg1) ^ ((arg2 ^ arg1) & ((arg2 - arg1) ^ arg2))
+
+def expr_cmpu(arg1, arg2):
+    """
+    Returns a one bit long Expression:
+    * 1 if @arg1 is strictly greater than @arg2 (unsigned)
+    * 0 otherwise.
+    """
+    return (_expr_cmp_gen(arg1, arg2) ^ arg2 ^ arg1).msb()
+
+def expr_cmps(arg1, arg2):
+    """
+    Returns a one bit long Expression:
+    * 1 if @arg1 is strictly greater than @arg2 (signed)
+    * 0 otherwise.
+    """
+    return _expr_cmp_gen(arg1, arg2).msb()
diff --git a/test/arch/x86/unit/mn_daa.py b/test/arch/x86/unit/mn_daa.py
new file mode 100644
index 00000000..cb96a22b
--- /dev/null
+++ b/test/arch/x86/unit/mn_daa.py
@@ -0,0 +1,76 @@
+#! /usr/bin/env python
+from asm_test import Asm_Test
+
+
+class Test_DAA(Asm_Test):
+    TXT = '''
+    main:
+       MOV     EBP, ESP
+       LEA     ESI, DWORD PTR [array_al]
+    loop:
+
+       ; load original cf
+       LODSB
+       MOV     BL, AL
+       ; load original af
+       LODSB
+       SHL     AL, 4
+       OR      AL, BL
+       MOV     AH, AL
+       SAHF
+       ; load original al
+       LODSB
+
+       DAA
+       MOV     BL, AL
+
+       LAHF
+       MOV     CL, AH
+
+       ; test cf
+       LODSB
+       MOV     DL, CL
+       AND     DL, 1
+       CMP     DL, AL
+       JNZ BAD
+
+       MOV     DL, CL
+       SHR     DL, 4
+       AND     DL, 1
+       ; test af
+       LODSB
+       CMP     DL, AL
+       JNZ BAD
+
+       ; test value
+       LODSB
+       CMP     AL, BL
+       JNZ BAD
+
+       CMP     ESI, array_al_end
+       JB      loop
+
+
+    end:
+       RET
+
+BAD:
+       INT     0x3
+       RET
+
+array_al:
+.byte 0, 1, 0x08, 0, 1, 0x0E
+.byte 0, 1, 0x09, 0, 1, 0x0F
+.byte 0, 1, 0x0A, 0, 1, 0x10
+.byte 0, 1, 0x98, 0, 1, 0x9E
+.byte 0, 1, 0x99, 0, 1, 0x9F
+.byte 0, 1, 0x9A, 1, 1, 0x00
+array_al_end:
+.long 0
+    '''
+    def check(self):
+        pass
+
+
+if __name__ == "__main__":
+    [test()() for test in [Test_DAA]]
diff --git a/test/arch/x86/unit/mn_das.py b/test/arch/x86/unit/mn_das.py
new file mode 100644
index 00000000..ba84abdd
--- /dev/null
+++ b/test/arch/x86/unit/mn_das.py
@@ -0,0 +1,106 @@
+#! /usr/bin/env python
+from asm_test import Asm_Test
+
+
+class Test_DAS(Asm_Test):
+    TXT = '''
+    main:
+       MOV     EBP, ESP
+       LEA     ESI, DWORD PTR [array_al]
+    loop:
+
+       ; load original cf
+       LODSB
+       MOV     BL, AL
+       ; load original af
+       LODSB
+       SHL     AL, 4
+       OR      AL, BL
+       MOV     AH, AL
+       SAHF
+       ; load original al
+       LODSB
+
+       DAS
+       MOV     BL, AL
+
+       LAHF
+       MOV     CL, AH
+
+       ; test cf
+       LODSB
+       MOV     DL, CL
+       AND     DL, 1
+       CMP     DL, AL
+       JNZ BAD
+
+       MOV     DL, CL
+       SHR     DL, 4
+       AND     DL, 1
+       ; test af
+       LODSB
+       CMP     DL, AL
+       JNZ BAD
+
+       ; test value
+       LODSB
+       CMP     AL, BL
+       JNZ BAD
+
+       CMP     ESI, array_al_end
+       JB      loop
+
+
+    end:
+       RET
+
+BAD:
+       INT     0x3
+       RET
+
+array_al:
+.byte 0, 0, 0x05, 0, 0, 0x05
+.byte 0, 1, 0x05, 1, 1, 0xFF
+.byte 1, 0, 0x05, 1, 0, 0xA5
+.byte 1, 1, 0x05, 1, 1, 0x9F
+.byte 0, 0, 0x06, 0, 0, 0x06
+.byte 0, 1, 0x06, 0, 1, 0x00
+.byte 1, 0, 0x06, 1, 0, 0xA6
+.byte 1, 1, 0x06, 1, 1, 0xA0
+.byte 0, 0, 0x07, 0, 0, 0x07
+.byte 0, 1, 0x07, 0, 1, 0x01
+.byte 1, 0, 0x07, 1, 0, 0xA7
+.byte 1, 1, 0x07, 1, 1, 0xA1
+.byte 0, 0, 0x08, 0, 0, 0x08
+.byte 0, 1, 0x08, 0, 1, 0x02
+.byte 1, 0, 0x08, 1, 0, 0xA8
+.byte 1, 1, 0x08, 1, 1, 0xA2
+.byte 0, 0, 0x09, 0, 0, 0x09
+.byte 0, 1, 0x09, 0, 1, 0x03
+.byte 1, 0, 0x09, 1, 0, 0xA9
+.byte 1, 1, 0x09, 1, 1, 0xA3
+.byte 0, 0, 0x0A, 0, 1, 0x04
+.byte 0, 1, 0x0A, 0, 1, 0x04
+.byte 1, 0, 0x0A, 1, 1, 0xA4
+.byte 1, 1, 0x0A, 1, 1, 0xA4
+.byte 0, 0, 0x98, 0, 0, 0x98
+.byte 0, 1, 0x98, 0, 1, 0x92
+.byte 1, 0, 0x98, 1, 0, 0x38
+.byte 1, 1, 0x98, 1, 1, 0x32
+.byte 0, 0, 0x99, 0, 0, 0x99
+.byte 0, 1, 0x99, 0, 1, 0x93
+.byte 1, 0, 0x99, 1, 0, 0x39
+.byte 1, 1, 0x99, 1, 1, 0x33
+.byte 0, 0, 0x9A, 1, 1, 0x34
+.byte 0, 1, 0x9A, 1, 1, 0x34
+.byte 1, 0, 0x9A, 1, 1, 0x34
+.byte 1, 1, 0x9A, 1, 1, 0x34
+array_al_end:
+.long 0
+    '''
+    def check(self):
+        pass
+
+
+if __name__ == "__main__":
+    [test()() for test in [Test_DAS]]
diff --git a/test/expression/simplifications.py b/test/expression/simplifications.py
index 1f5a5c5b..6290a807 100644
--- a/test/expression/simplifications.py
+++ b/test/expression/simplifications.py
@@ -3,6 +3,7 @@
 #
 from pdb import pm
 from miasm2.expression.expression import *
+from miasm2.expression.expression_helper import expr_cmpu, expr_cmps
 from miasm2.expression.simplifications import expr_simp, ExpressionSimplifier
 from miasm2.expression.simplifications_cond import ExprOp_inf_signed, ExprOp_inf_unsigned, ExprOp_equal
 
@@ -264,6 +265,38 @@ to_test = [(ExprInt32(1) - ExprInt32(1), ExprInt32(0)),
      a[:16]),
     ((a << ExprInt32(16))[24:32],
      a[8:16]),
+    (expr_cmpu(ExprInt32(0), ExprInt32(0)),
+     ExprInt1(0)),
+    (expr_cmpu(ExprInt32(10), ExprInt32(0)),
+     ExprInt1(1)),
+    (expr_cmpu(ExprInt32(10), ExprInt32(5)),
+     ExprInt1(1)),
+    (expr_cmpu(ExprInt32(5), ExprInt32(10)),
+     ExprInt1(0)),
+    (expr_cmpu(ExprInt32(-1), ExprInt32(0)),
+     ExprInt1(1)),
+    (expr_cmpu(ExprInt32(-1), ExprInt32(-1)),
+     ExprInt1(0)),
+    (expr_cmpu(ExprInt32(0), ExprInt32(-1)),
+     ExprInt1(0)),
+    (expr_cmps(ExprInt32(0), ExprInt32(0)),
+     ExprInt1(0)),
+    (expr_cmps(ExprInt32(10), ExprInt32(0)),
+     ExprInt1(1)),
+    (expr_cmps(ExprInt32(10), ExprInt32(5)),
+     ExprInt1(1)),
+    (expr_cmps(ExprInt32(5), ExprInt32(10)),
+     ExprInt1(0)),
+    (expr_cmps(ExprInt32(-1), ExprInt32(0)),
+     ExprInt1(0)),
+    (expr_cmps(ExprInt32(-1), ExprInt32(-1)),
+     ExprInt1(0)),
+    (expr_cmps(ExprInt32(0), ExprInt32(-1)),
+     ExprInt1(1)),
+    (expr_cmps(ExprInt32(-5), ExprInt32(-10)),
+     ExprInt1(1)),
+    (expr_cmps(ExprInt32(-10), ExprInt32(-5)),
+     ExprInt1(0)),
 
 ]
 
diff --git a/test/test_all.py b/test/test_all.py
index f59e3781..55e69e70 100644
--- a/test/test_all.py
+++ b/test/test_all.py
@@ -36,6 +36,8 @@ for script in ["x86/sem.py",
                "x86/unit/mn_strings.py",
                "x86/unit/mn_float.py",
                "x86/unit/mn_stack.py",
+               "x86/unit/mn_daa.py",
+               "x86/unit/mn_das.py",
                "arm/arch.py",
                "arm/sem.py",
                "msp430/arch.py",