diff options
| author | Ajax <commial@gmail.com> | 2015-11-10 17:15:26 +0100 |
|---|---|---|
| committer | Ajax <commial@gmail.com> | 2015-11-10 17:15:26 +0100 |
| commit | c7cf6d1aaf5cc61c5667b4c430cd7dfee9740439 (patch) | |
| tree | 44f3e9dee877e9a1ffc7853d70257a4bfb352a86 | |
| parent | 31a1a40509da9423d564044d373430353db4bdb9 (diff) | |
| download | miasm-c7cf6d1aaf5cc61c5667b4c430cd7dfee9740439.tar.gz miasm-c7cf6d1aaf5cc61c5667b4c430cd7dfee9740439.zip | |
x86/sem: add `fldenv`
| -rw-r--r-- | miasm2/arch/x86/sem.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index 9dc92414..d74af13d 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -2210,6 +2210,42 @@ def fnstenv(ir, instr, a): e.append(m2_expr.ExprAff(ad, float_ds)) return e, [] +def fldenv(ir, instr, a): + e = [] + # Inspired from fnstenv (same TODOs / issues) + + s = instr.mode + # The behaviour in 64bit is identical to 32 bit + # This will truncate addresses + s = min(32, s) + + ## Float control + ad = m2_expr.ExprMem(a.arg, size=16) + e.append(m2_expr.ExprAff(float_control, ad)) + + ## Status word + ad = m2_expr.ExprMem(a.arg + m2_expr.ExprInt(s / 8 * 1, size=a.arg.size), + size=16) + e += [m2_expr.ExprAff(x, y) for x, y in ((float_c0, ad[8:9]), + (float_c1, ad[9:10]), + (float_c2, ad[10:11]), + (float_stack_ptr, ad[11:14]), + (float_c3, ad[14:15])) + ] + + ## EIP, CS, Address, DS + for offset, target in ((3, float_eip[:s]), + (4, float_cs), + (5, float_address[:s]), + (6, float_ds)): + size = target.size + ad = m2_expr.ExprMem(a.arg + m2_expr.ExprInt(s / 8 * offset, + size=a.arg.size), + size=target.size) + e.append(m2_expr.ExprAff(target, ad)) + + return e, [] + def fsub(ir, instr, a, b=None): a, b = float_implicit_st0(a, b) @@ -3643,6 +3679,7 @@ mnemo_func = {'mov': mov, 'fcmovnbe': fcmovnbe, 'fcmovnu': fcmovnu, 'fnstenv': fnstenv, + 'fldenv': fldenv, 'sidt': sidt, 'sldt': sldt, 'arpl': arpl, |