diff options
Diffstat (limited to 'miasm2/arch/x86/sem.py')
| -rw-r--r-- | miasm2/arch/x86/sem.py | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index bc98baf3..52cec344 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -970,7 +970,7 @@ def popfd(ir, instr): def popfw(ir, instr): - tmp = m2_expr.ExprMem(esp) + tmp = m2_expr.ExprMem(mRSP[instr.mode]) e = [] e.append(m2_expr.ExprAff(cf, m2_expr.ExprSlice(tmp, 0, 1))) e.append(m2_expr.ExprAff(pf, m2_expr.ExprSlice(tmp, 2, 3))) @@ -983,7 +983,7 @@ def popfw(ir, instr): e.append(m2_expr.ExprAff(of, m2_expr.ExprSlice(tmp, 11, 12))) e.append(m2_expr.ExprAff(iopl, m2_expr.ExprSlice(tmp, 12, 14))) e.append(m2_expr.ExprAff(nt, m2_expr.ExprSlice(tmp, 14, 15))) - e.append(m2_expr.ExprAff(esp, esp + m2_expr.ExprInt32(2))) + e.append(m2_expr.ExprAff(mRSP[instr.mode], mRSP[instr.mode] + m2_expr.ExprInt_fromsize(mRSP[instr.mode].size, 2))) return e, [] @@ -2496,32 +2496,41 @@ def aas(ir, instr, ): return e, [] -def bsf(ir, instr, a, b): - lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode) - lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode) +def bsr_bsf(ir, instr, a, b, op_name): + """ + IF SRC == 0 + ZF = 1 + DEST is left unchanged + ELSE + ZF = 0 + DEST = @op_name(SRC) + """ + lbl_src_null = m2_expr.ExprId(ir.gen_label(), instr.mode) + lbl_src_not_null = m2_expr.ExprId(ir.gen_label(), instr.mode) + lbl_next = m2_expr.ExprId(ir.get_next_label(instr), instr.mode) - e = [m2_expr.ExprAff(zf, m2_expr.ExprCond(b, m2_expr.ExprInt_from(zf, 0), - m2_expr.ExprInt_from(zf, 1)))] + aff_dst = m2_expr.ExprAff(ir.IRDst, lbl_next) + e = [m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(b, + lbl_src_not_null, + lbl_src_null))] + e_src_null = [] + e_src_null.append(m2_expr.ExprAff(zf, m2_expr.ExprInt_from(zf, 1))) + # XXX destination is undefined + e_src_null.append(aff_dst) - e_do = [] - e_do.append(m2_expr.ExprAff(a, m2_expr.ExprOp('bsf', b))) - e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) - e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(b, lbl_do, lbl_skip))) - return e, [irbloc(lbl_do.name, [e_do])] + e_src_not_null = [] + e_src_not_null.append(m2_expr.ExprAff(zf, m2_expr.ExprInt_from(zf, 0))) + e_src_not_null.append(m2_expr.ExprAff(a, m2_expr.ExprOp(op_name, b))) + e_src_not_null.append(aff_dst) + return e, [irbloc(lbl_src_null.name, [e_src_null]), + irbloc(lbl_src_not_null.name, [e_src_not_null])] -def bsr(ir, instr, a, b): - lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode) - lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode) - - e = [m2_expr.ExprAff(zf, m2_expr.ExprCond(b, m2_expr.ExprInt_from(zf, 0), - m2_expr.ExprInt_from(zf, 1)))] +def bsf(ir, instr, a, b): + return bsr_bsf(ir, instr, a, b, "bsf") - e_do = [] - e_do.append(m2_expr.ExprAff(a, m2_expr.ExprOp('bsr', b))) - e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) - e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(b, lbl_do, lbl_skip))) - return e, [irbloc(lbl_do.name, [e_do])] +def bsr(ir, instr, a, b): + return bsr_bsf(ir, instr, a, b, "bsr") def arpl(ir, instr, a, b): |