about summary refs log tree commit diff stats
path: root/miasm/arch/ia32_sem.py
diff options
context:
space:
mode:
authorserpilliere <devnull@localhost>2012-11-28 16:28:14 +0100
committerserpilliere <devnull@localhost>2012-11-28 16:28:14 +0100
commitdee93cbe8121c7aab4f31e78167898ff5daf7ece (patch)
tree4969b29e2e6001da9a01a79a6b20bc58e87b78a3 /miasm/arch/ia32_sem.py
parent6fd48777a927670ab255b561226c3224b8aeba8c (diff)
downloadmiasm-dee93cbe8121c7aab4f31e78167898ff5daf7ece.tar.gz
miasm-dee93cbe8121c7aab4f31e78167898ff5daf7ece.zip
ia32_sem: update movcc, fpu (louis granboulan)
Diffstat (limited to '')
-rw-r--r--miasm/arch/ia32_sem.py150
1 files changed, 146 insertions, 4 deletions
diff --git a/miasm/arch/ia32_sem.py b/miasm/arch/ia32_sem.py
index 240cf79e..46619e1a 100644
--- a/miasm/arch/ia32_sem.py
+++ b/miasm/arch/ia32_sem.py
@@ -1052,6 +1052,54 @@ def seto(info, a):
     e.append(ExprAff(a, ExprCond(of, ExprInt_from(a, 1), ExprInt_from(a, 0))))
     return e
 
+def setp(info, a):
+    e = []
+    e.append(ExprAff(a, ExprCond(pf, ExprInt_from(a, 1), ExprInt_from(a, 0))))
+    return e
+
+def setnp(info, a):
+    e = []
+    e.append(ExprAff(a, ExprCond(pf, ExprInt_from(a, 0), ExprInt_from(a, 1))))
+    return e
+
+def setle(info, a):
+    e = []
+    a0 = ExprInt_from(a, 0)
+    a1 = ExprInt_from(a, 1)
+    e.append(ExprAff(a, ExprOp("&",
+                               ExprCond(zf, a1, a0),
+                               ExprCond(nf-of, a1, a0)))
+             )
+    return e
+
+def setna(info, a):
+    e = []
+    a0 = ExprInt_from(a, 0)
+    a1 = ExprInt_from(a, 1)
+    e.append(ExprAff(a, ExprOp('&',
+                               ExprCond(cf, a1, a0),
+                               ExprCond(zf, a1, a0)))
+             )
+    return e
+
+def setnbe(info, a):
+    e = []
+    e.append(ExprAff(a, ExprCond(ExprOp('|',cf,zf),
+                                 ExprInt_from(a, 0),
+                                 ExprInt_from(a, 1)))
+             )
+    return e
+
+def setno(info, a):
+    e = []
+    e.append(ExprAff(a, ExprCond(of, ExprInt_from(a, 0), ExprInt_from(a, 1))))
+    return e
+
+def setnb(info, a):
+    e = []
+    e.append(ExprAff(a, ExprCond(cf, ExprInt_from(a, 0), ExprInt_from(a, 1))))
+    return e
+
 def setalc(info):
     a = eax[0:8]
     e = []
@@ -1513,7 +1561,6 @@ def mul(info, a):
 
     return e
 
-#XXX size to do; eflag
 def imul(info, a, b = None, c = None):
     e= []
     if b == None:
@@ -1522,23 +1569,30 @@ def imul(info, a, b = None, c = None):
             c_lo = ExprOp('imul32_lo', eax, a)
             e.append(ExprAff(edx, c_hi))
             e.append(ExprAff(eax, c_lo))
+            e.append(ExprAff(cf, ExprCond(c_hi, ExprInt32(1), ExprInt32(0))))
+            e.append(ExprAff(of, ExprCond(c_hi, ExprInt32(1), ExprInt32(0))))
         elif a.get_size() == 16:
             c_hi = ExprOp('imul16_hi', r_ax, a)
             c_lo = ExprOp('imul16_lo', r_ax, a)
             e.append(ExprAff(r_dx, c_hi))
             e.append(ExprAff(r_ax, c_lo))
+            e.append(ExprAff(cf, ExprCond(c_hi, ExprInt32(1), ExprInt32(0))))
+            e.append(ExprAff(of, ExprCond(c_hi, ExprInt32(1), ExprInt32(0))))
         elif a.get_size() == 8:
             c = ExprOp('imul08', eax, a)
             e.append(ExprAff(eax[:16], c))
+            e.append(ExprAff(cf, ExprCond(c-eax[:16], ExprInt32(1), ExprInt32(0))))
+            e.append(ExprAff(of, ExprCond(c-eax[:16], ExprInt32(1), ExprInt32(0))))
     else:
         if c == None:
             c = b
             b = a
         c = ExprOp('*', b, c)
         e.append(ExprAff(a, c))
+        e.append(ExprAff(cf, ExprCond(c[16:], ExprInt32(1), ExprInt32(0))))
+        e.append(ExprAff(of, ExprCond(c[16:], ExprInt32(1), ExprInt32(0))))
     return e
 
-
 def cdq(info):
     # XXX to check
     opmode, admode = info.opmode, info.admode
@@ -1636,6 +1690,24 @@ def ficom(info, a):
     e += set_float_cs_eip(info)
     return e
 
+def fcomi(info, a):
+    # Invalid emulation
+    InvalidEmulation
+def fcomip(info, a):
+    # Invalid emulation
+    InvalidEmulation
+def fucomi(info, a):
+    # Invalid emulation
+    InvalidEmulation
+def fucomip(info, a):
+    # Invalid emulation, only read/write analysis is valid
+    cond = ExprOp('fcomp', float_st0, a)
+    e = []
+    e.append(ExprAff(zf, ExprCond(cond, ExprInt_from(zf, 0), ExprInt_from(zf, 1))))
+    e.append(ExprAff(pf, ExprCond(cond, ExprInt_from(zf, 0), ExprInt_from(zf, 1))))
+    e.append(ExprAff(cf, ExprCond(cond, ExprInt_from(zf, 0), ExprInt_from(zf, 1))))
+    return e
+
 def fcomp(info, a):
     e= fcom(info, a)
     e+=float_pop()
@@ -1809,6 +1881,13 @@ def fdiv(info, a, b = None):
     e += set_float_cs_eip(info)
     return e
 
+def fdivp(info, a):
+    # Invalid emulation
+    e = []
+    e.append(ExprAff(a, ExprOp('fdiv', a, float_st0)))
+    e+=float_pop(a)
+    return e
+
 def ftan(info, a):
     e = []
     if isinstance(a, ExprMem):
@@ -2010,6 +2089,36 @@ def cmovnz(info, a, b):
     e= []
     e.append(ExprAff(a, ExprCond(zf, a, b)))
     return e
+def cmovge(info, a, b):
+    e= []
+    e.append(ExprAff(a, ExprCond( ExprOp('^', nf, of) , a, b)))
+    return e
+def cmovl(info, a, b):
+    e= []
+    e.append(ExprAff(a, ExprCond( ExprOp('^', nf, of) , b, a)))
+    return e
+def cmovle(info, a, b):
+    e= []
+    e.append(ExprAff(a, ExprCond( ExprOp('|', ExprOp('^', nf, of), zf) , b, a)))
+    return e
+def cmovo(info, a, b):
+    e= []
+    e.append(ExprAff(a, ExprCond(of , b, a)))
+    return e
+def cmovno(info, a, b):
+    e= []
+    e.append(ExprAff(a, ExprCond(of , a, b)))
+    return e
+def cmovs(info, a, b):
+    e= []
+    # SF is called nf in miasm
+    e.append(ExprAff(a, ExprCond(nf , b, a)))
+    return e
+def cmovns(info, a, b):
+    e= []
+    # SF is called nf in miasm
+    e.append(ExprAff(a, ExprCond(nf , a, b)))
+    return e
 
 #XXX
 def l_int(info, a):
@@ -2212,6 +2321,24 @@ mnemo_func = {'mov': mov,
               'setns':setns,
               'sets':sets,
               'seto':seto,
+              'setp':setp,
+              'setpe':setp,
+              'setnp':setnp,
+              'setpo':setnp,
+              'setle':setle,
+              'setng':setle,
+              'setna':setna,
+              'setnbe':setnbe,
+              'setno':setno,
+              'setnc':setnb,
+              'setz':sete,
+              'setne':setnz,
+              'setnb':setae,
+              'setnae':setb,
+              'setc':setb,
+              'setnge':setl,
+              'setnl':setge,
+              'setnle':setg,
               'setalc':setalc,
               'bswap':bswap,
               'cmpsb':cmps,
@@ -2295,6 +2422,7 @@ mnemo_func = {'mov': mov,
               'fsub':fsub,
               'fmul':fmul,
               'fdiv':fdiv,
+              'fdivp':fdivp,
               'fxch':fxch,
               'fptan':fptan,
               'frndint':frndint,
@@ -2314,6 +2442,16 @@ mnemo_func = {'mov': mov,
               'cmovz':cmovz,
               'cmove':cmovz,
               'cmovnz':cmovnz,
+              'cmovge':cmovge,
+              'cmovnl':cmovge,
+              'cmovl':cmovl,
+              'cmovnge':cmovl,
+              'cmovle':cmovle,
+              'cmovng':cmovle,
+              'cmovo':cmovo,
+              'cmovno':cmovno,
+              'cmovs':cmovs,
+              'cmovns':cmovns,
               'int':l_int,
               'xlat': xlat,
               'bt':bt,
@@ -2321,6 +2459,10 @@ mnemo_func = {'mov': mov,
               'jo': jo,
               'fcom':fcom,
               'ficom':ficom,
+              'fcomi':fcomi,
+              'fcomip':fcomip,
+              'fucomi':fucomi,
+              'fucomip':fucomip,
               'ins':ins,
               'btc':btc,
               'bts':bts,
@@ -2469,7 +2611,7 @@ def dict_to_Expr(d, modifs = {}, opmode = u32, admode = u32, segm_to_do = set())
     elif modifs[wd]:
         size = x86_afs.u16
 
-    tab32 = {ia32_rexpr.u08:ia32_rexpr.reg_list8, ia32_rexpr.u16:ia32_rexpr.reg_list16, ia32_rexpr.u32:ia32_rexpr.reg_list32,ia32_rexpr.f32:ia32_rexpr.reg_flt}
+    tab32 = {ia32_rexpr.u08:ia32_rexpr.reg_list8, ia32_rexpr.u16:ia32_rexpr.reg_list16, ia32_rexpr.u32:ia32_rexpr.reg_list32,ia32_rexpr.f32:ia32_rexpr.reg_flt,ia32_rexpr.f64:ia32_rexpr.reg_flt}
     tab16 = {ia32_rexpr.u08:ia32_rexpr.reg_list8, ia32_rexpr.u16:ia32_rexpr.reg_list32, ia32_rexpr.u32:ia32_rexpr.reg_list16}
     ad_size = {ia32_rexpr.u08:ia32_rexpr.u08, ia32_rexpr.u16:ia32_rexpr.u16, ia32_rexpr.u32:ia32_rexpr.u32, ia32_rexpr.f32:ia32_rexpr.u32, ia32_rexpr.f64:ia32_rexpr.u32}
 
@@ -2568,7 +2710,7 @@ def dict_to_Expr(d, modifs = {}, opmode = u32, admode = u32, segm_to_do = set())
                         out.append(ExprOp('*', ExprInt(int_cast(d[k])), ia32_rexpr.reg_list32[k]))
 
             elif k == ia32_rexpr.symb:
-                print 'warning: symbol.. in mem look', d[k]
+                #print 'warning: symbol.. in mem look', d[k]
                 out.append(ExprId(str(d[k].items()[0][0].name)))
             else:
                 raise 'strange ad componoant: %s'%str(d)