diff options
| -rw-r--r-- | miasm/arch/ia32_sem.py | 12 | ||||
| -rw-r--r-- | miasm/expression/expression.py | 2 | ||||
| -rw-r--r-- | miasm/tools/emul_lib/libcodenat.c | 11 | ||||
| -rw-r--r-- | miasm/tools/emul_lib/libcodenat.h | 1 |
4 files changed, 22 insertions, 4 deletions
diff --git a/miasm/arch/ia32_sem.py b/miasm/arch/ia32_sem.py index 211e0bfd..b66fd8dd 100644 --- a/miasm/arch/ia32_sem.py +++ b/miasm/arch/ia32_sem.py @@ -1778,7 +1778,7 @@ def fadd(info, a, b = None): return e def faddp(info, a, b = None): - e = fadd(a, b) + e = fadd(info, a, b) if b == None: e+=float_pop(float_st0) else: @@ -1858,8 +1858,13 @@ def fdiv(info, a, b = None): def fdivp(info, a): # Invalid emulation - e = [] - e.append(ExprAff(a, ExprOp('fdiv', a, float_st0))) + e = fdiv(info, a) + e+=float_pop(a) + return e + +def fmulp(info, a): + # Invalid emulation + e = fmul(info, a) e+=float_pop(a) return e @@ -2396,6 +2401,7 @@ mnemo_func = {'mov': mov, 'faddp':faddp, 'fsub':fsub, 'fmul':fmul, + 'fmulp':fmulp, 'fdiv':fdiv, 'fdivp':fdivp, 'fxch':fxch, diff --git a/miasm/expression/expression.py b/miasm/expression/expression.py index 1029b319..acf2cac8 100644 --- a/miasm/expression/expression.py +++ b/miasm/expression/expression.py @@ -444,7 +444,7 @@ class ExprOp(Expr): return "parity(%s&0x%x)"%(self.args[0].toC(), my_size_mask[self.args[0].get_size()]) elif self.op == '!': return "(~ %s)&0x%x"%(self.args[0].toC(), my_size_mask[self.args[0].get_size()]) - elif self.op in ['int_32_to_double', 'int_64_to_double']: + elif self.op in ['int_16_to_double', 'int_32_to_double', 'int_64_to_double']: return "%s(%s)"%(self.op, self.args[0].toC()) elif self.op == 'double_to_int_32': return "%s(%s)"%(self.op, self.args[0].toC()) diff --git a/miasm/tools/emul_lib/libcodenat.c b/miasm/tools/emul_lib/libcodenat.c index 31a2be31..4a558b4b 100644 --- a/miasm/tools/emul_lib/libcodenat.c +++ b/miasm/tools/emul_lib/libcodenat.c @@ -942,6 +942,17 @@ double mem_64_to_double(uint64_t m) return d; } +double int_16_to_double(unsigned int m) +{ + double d; + + d = (double)(m&0xffff); +#ifdef DEBUG_MIASM_DOUBLE + printf("%d %e\n", m, d); +#endif + return d; +} + double int_32_to_double(unsigned int m) { double d; diff --git a/miasm/tools/emul_lib/libcodenat.h b/miasm/tools/emul_lib/libcodenat.h index 8865b285..d0f4930a 100644 --- a/miasm/tools/emul_lib/libcodenat.h +++ b/miasm/tools/emul_lib/libcodenat.h @@ -506,6 +506,7 @@ unsigned int fcom_c3(double a, double b); double mem_32_to_double(unsigned int m); double mem_64_to_double(uint64_t m); +double int_16_to_double(unsigned int m); double int_32_to_double(unsigned int m); double int_64_to_double(uint64_t m); int double_to_int_32(double d); |