diff options
Diffstat (limited to 'miasm2/arch/x86/sem.py')
| -rw-r--r-- | miasm2/arch/x86/sem.py | 115 |
1 files changed, 66 insertions, 49 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index ca5b3f8d..b3dfb3ef 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -693,17 +693,14 @@ def push_gen(ir, instr, src, size): raise ValueError('bad size stacker!') if src.size < size: src = src.zeroExtend(size) - elif src.size == size: - pass - else: - raise ValueError('strange arg size') + off_size = src.size sp = mRSP[instr.mode] - new_sp = sp - m2_expr.ExprInt(size / 8, sp.size) + new_sp = sp - m2_expr.ExprInt(off_size / 8, sp.size) e.append(m2_expr.ExprAff(sp, new_sp)) if ir.do_stk_segm: new_sp = m2_expr.ExprOp('segm', SS, new_sp) - e.append(m2_expr.ExprAff(ir.ExprMem(new_sp, size), + e.append(m2_expr.ExprAff(ir.ExprMem(new_sp, off_size), src)) return e, [] @@ -722,7 +719,7 @@ def pop_gen(ir, instr, src, size): raise ValueError('bad size stacker!') sp = mRSP[instr.mode] - new_sp = sp + m2_expr.ExprInt(size / 8, sp.size) + new_sp = sp + m2_expr.ExprInt(src.size / 8, sp.size) # don't generate ESP incrementation on POP ESP if src != ir.sp: e.append(m2_expr.ExprAff(sp, new_sp)) @@ -937,25 +934,34 @@ def cmps(ir, instr, size): lbl_df_1 = m2_expr.ExprId(ir.gen_label(), ir.IRDst.size) lbl_next = m2_expr.ExprId(ir.get_next_label(instr), ir.IRDst.size) - s = instr.v_admode() - a = ir.ExprMem(mRDI[instr.mode][:s], size) - b = ir.ExprMem(mRSI[instr.mode][:s], size) + src1 = mRSI[instr.mode][:instr.v_admode()] + src2 = mRDI[instr.mode][:instr.v_admode()] + + if ir.do_str_segm: + if instr.additional_info.g2.value: + raise NotImplementedError("add segm support") + src1_sgm = m2_expr.ExprOp('segm', DS, src1) + src2_sgm = m2_expr.ExprOp('segm', ES, src2) + else: + src1_sgm = src1 + src2_sgm = src2 + + offset = m2_expr.ExprInt(size / 8, src1.size) + + e, _ = l_cmp(ir, instr, + ir.ExprMem(src1_sgm, size), + ir.ExprMem(src2_sgm, size)) - e, _ = l_cmp(ir, instr, b, a) e0 = [] - e0.append(m2_expr.ExprAff(a.arg, - a.arg + m2_expr.ExprInt(size / 8, a.arg.size))) - e0.append(m2_expr.ExprAff(b.arg, - b.arg + m2_expr.ExprInt(size / 8, b.arg.size))) + e0.append(m2_expr.ExprAff(src1, src1 + offset)) + e0.append(m2_expr.ExprAff(src2, src2 + offset)) e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) e0 = IRBlock(lbl_df_0.name, [AssignBlock(e0, instr)]) e1 = [] - e1.append(m2_expr.ExprAff(a.arg, - a.arg - m2_expr.ExprInt(size / 8, a.arg.size))) - e1.append(m2_expr.ExprAff(b.arg, - b.arg - m2_expr.ExprInt(size / 8, b.arg.size))) + e1.append(m2_expr.ExprAff(src1, src1 - offset)) + e1.append(m2_expr.ExprAff(src2, src2 - offset)) e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) e1 = IRBlock(lbl_df_1.name, [AssignBlock(e1, instr)]) @@ -969,20 +975,28 @@ def scas(ir, instr, size): lbl_df_1 = m2_expr.ExprId(ir.gen_label(), ir.IRDst.size) lbl_next = m2_expr.ExprId(ir.get_next_label(instr), ir.IRDst.size) - s = instr.v_admode() - a = ir.ExprMem(mRDI[instr.mode][:s], size) + src = mRDI[instr.mode][:instr.v_admode()] - e, extra = l_cmp(ir, instr, mRAX[instr.mode][:size], a) + if ir.do_str_segm: + if instr.additional_info.g2.value: + raise NotImplementedError("add segm support") + src_sgm = m2_expr.ExprOp('segm', ES, src) + else: + src_sgm = src + + offset = m2_expr.ExprInt(size / 8, src.size) + e, extra = l_cmp(ir, instr, + mRAX[instr.mode][:size], + ir.ExprMem(src_sgm, size)) e0 = [] - e0.append(m2_expr.ExprAff(a.arg, - a.arg + m2_expr.ExprInt(size / 8, a.arg.size))) + e0.append(m2_expr.ExprAff(src, src + offset)) + e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) e0 = IRBlock(lbl_df_0.name, [AssignBlock(e0, instr)]) e1 = [] - e1.append(m2_expr.ExprAff(a.arg, - a.arg - m2_expr.ExprInt(size / 8, a.arg.size))) + e1.append(m2_expr.ExprAff(src, src - offset)) e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) e1 = IRBlock(lbl_df_1.name, [AssignBlock(e1, instr)]) @@ -1081,12 +1095,11 @@ pa_regs = [ def pusha_gen(ir, instr, size): e = [] + cur_sp = mRSP[instr.mode] for i, reg in enumerate(pa_regs): - stk_ptr = mRSP[instr.mode] + \ - m2_expr.ExprInt(-(reg[size].size / 8) * (i + 1), instr.mode) - e.append(m2_expr.ExprAff(ir.ExprMem( - stk_ptr, reg[size].size), reg[size])) - e.append(m2_expr.ExprAff(mRSP[instr.mode], stk_ptr)) + stk_ptr = cur_sp + m2_expr.ExprInt(-(size / 8) * (i + 1), instr.mode) + e.append(m2_expr.ExprAff(ir.ExprMem(stk_ptr, size), reg[size])) + e.append(m2_expr.ExprAff(cur_sp, stk_ptr)) return e, [] @@ -1100,16 +1113,15 @@ def pushad(ir, instr): def popa_gen(ir, instr, size): e = [] + cur_sp = mRSP[instr.mode] for i, reg in enumerate(reversed(pa_regs)): if reg == mRSP: continue - stk_ptr = mRSP[instr.mode] + \ - m2_expr.ExprInt((reg[size].size / 8) * i, instr.mode) - e.append(m2_expr.ExprAff(reg[size], ir.ExprMem(stk_ptr, instr.mode))) + stk_ptr = cur_sp + m2_expr.ExprInt((size / 8) * i, instr.mode) + e.append(m2_expr.ExprAff(reg[size], ir.ExprMem(stk_ptr, size))) - stk_ptr = mRSP[instr.mode] + \ - m2_expr.ExprInt((instr.mode / 8) * (i + 1), instr.mode) - e.append(m2_expr.ExprAff(mRSP[instr.mode], stk_ptr)) + stk_ptr = cur_sp + m2_expr.ExprInt((size / 8) * (i + 1), instr.mode) + e.append(m2_expr.ExprAff(cur_sp, stk_ptr)) return e, [] @@ -1726,29 +1738,34 @@ def movs(ir, instr, size): lbl_df_1 = m2_expr.ExprId(ir.gen_label(), ir.IRDst.size) lbl_next = m2_expr.ExprId(ir.get_next_label(instr), ir.IRDst.size) - a = mRDI[instr.mode][:instr.v_admode()] - b = mRSI[instr.mode][:instr.v_admode()] + dst = mRDI[instr.mode][:instr.v_admode()] + src = mRSI[instr.mode][:instr.v_admode()] e = [] - src = b - dst = a if ir.do_str_segm: if instr.additional_info.g2.value: raise NotImplementedError("add segm support") - src = m2_expr.ExprOp('segm', DS, src) - dst = m2_expr.ExprOp('segm', ES, dst) - e.append(m2_expr.ExprAff(ir.ExprMem(dst, size), - ir.ExprMem(src, size))) + src_sgm = m2_expr.ExprOp('segm', DS, src) + dst_sgm = m2_expr.ExprOp('segm', ES, dst) + + else: + src_sgm = src + dst_sgm = dst + + offset = m2_expr.ExprInt(size / 8, src.size) + + e.append(m2_expr.ExprAff(ir.ExprMem(dst_sgm, size), + ir.ExprMem(src_sgm, size))) e0 = [] - e0.append(m2_expr.ExprAff(a, a + m2_expr.ExprInt(size / 8, a.size))) - e0.append(m2_expr.ExprAff(b, b + m2_expr.ExprInt(size / 8, b.size))) + e0.append(m2_expr.ExprAff(src, src + offset)) + e0.append(m2_expr.ExprAff(dst, dst + offset)) e0.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) e0 = IRBlock(lbl_df_0.name, [AssignBlock(e0, instr)]) e1 = [] - e1.append(m2_expr.ExprAff(a, a - m2_expr.ExprInt(size / 8, a.size))) - e1.append(m2_expr.ExprAff(b, b - m2_expr.ExprInt(size / 8, b.size))) + e1.append(m2_expr.ExprAff(src, src - offset)) + e1.append(m2_expr.ExprAff(dst, dst - offset)) e1.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) e1 = IRBlock(lbl_df_1.name, [AssignBlock(e1, instr)]) |