diff options
| author | serpilliere <fabrice.desclaux@cea.fr> | 2015-10-22 22:18:59 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-10-23 10:53:52 +0200 |
| commit | 1165f18a01640225a5cc96607e80964b71eb875a (patch) | |
| tree | 027d2ae141fec693a4ee0d1ba5c202e16ed6ce9c /miasm2/arch/x86/sem.py | |
| parent | f732a129cddb0b70816652647051088adc118870 (diff) | |
| download | miasm-1165f18a01640225a5cc96607e80964b71eb875a.tar.gz miasm-1165f18a01640225a5cc96607e80964b71eb875a.zip | |
Arch/x86/sem: factorize jcc code
Diffstat (limited to '')
| -rw-r--r-- | miasm2/arch/x86/sem.py | 217 |
1 files changed, 45 insertions, 172 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index dd9ee472..e2468f1d 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -185,6 +185,32 @@ def float_implicit_st0(arg1, arg2): arg1 = float_st0 return arg1, arg2 + +def gen_jcc(ir, instr, cond, dst, jmp_if): + """ + Macro to generate jcc semantic + @ir: ir instance + @instr: instruction + @cond: condtion of the jcc + @dst: the dstination if jcc is taken + @jmp_if: jump if/notif cond + """ + + e = [] + meip = mRIP[instr.mode] + next_lbl = m2_expr.ExprId(ir.get_next_label(instr), dst.size) + if jmp_if: + dstA, dstB = dst, next_lbl + else: + dstA, dstB = next_lbl, dst + mn_dst = m2_expr.ExprCond(cond, + dstA.zeroExtend(instr.mode), + dstB.zeroExtend(instr.mode)) + e.append(m2_expr.ExprAff(meip, mn_dst)) + e.append(m2_expr.ExprAff(ir.IRDst, mn_dst)) + return e, [] + + def mov(ir, instr, a, b): if a in [ES, CS, SS, DS, FS, GS]: b = b[:a.size] @@ -1216,232 +1242,79 @@ def jmpf(ir, instr, a): 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.zeroExtend(instr.mode), - n.zeroExtend(instr.mode)) - e = [m2_expr.ExprAff(meip, dst_o), - m2_expr.ExprAff(ir.IRDst, dst_o), - ] - return e, [] + return gen_jcc(ir, instr, zf, dst, True) def jcxz(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][:16], - 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, [] + return gen_jcc(ir, instr, mRCX[instr.mode][:16], dst, False) def jecxz(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][:32], - 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, [] + return gen_jcc(ir, instr, mRCX[instr.mode][:32], dst, False) 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.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, [] + return gen_jcc(ir, instr, mRCX[instr.mode], dst, False) 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.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, [] + return gen_jcc(ir, instr, zf, dst, False) 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.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, [] + return gen_jcc(ir, instr, pf, dst, True) 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.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, [] + return gen_jcc(ir, instr, pf, dst, False) 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.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, [] + return gen_jcc(ir, instr, cf|zf, dst, False) 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.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, [] + return gen_jcc(ir, instr, cf, dst, False) 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.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, [] + return gen_jcc(ir, instr, cf, dst, True) 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.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, [] + return gen_jcc(ir, instr, cf|zf, dst, True) 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.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, [] + return gen_jcc(ir, instr, nf-of, dst, False) 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.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, [] + return gen_jcc(ir, instr, zf|(nf-of), dst, False) 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.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, [] + return gen_jcc(ir, instr, nf-of, dst, True) 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.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, [] + return gen_jcc(ir, instr, zf|(nf-of), dst, True) 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.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, [] + return gen_jcc(ir, instr, nf, dst, True) 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.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, [] + return gen_jcc(ir, instr, nf, dst, False) 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.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, [] + return gen_jcc(ir, instr, of, dst, True) 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.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, [] + return gen_jcc(ir, instr, of, dst, False) def loop(ir, instr, dst): |