diff options
| author | Ajax <commial@gmail.com> | 2015-11-16 13:51:58 +0100 |
|---|---|---|
| committer | Ajax <commial@gmail.com> | 2015-11-16 14:02:39 +0100 |
| commit | 733fcb7dc780f23a4cfda4d3ef721b11ee843cfb (patch) | |
| tree | fe78e098af71776e69ac0c084a92603cb1a15ab2 /miasm2/arch/x86/sem.py | |
| parent | 2370668e86ea15e3a74abcf150449be31b1990e6 (diff) | |
| download | miasm-733fcb7dc780f23a4cfda4d3ef721b11ee843cfb.tar.gz miasm-733fcb7dc780f23a4cfda4d3ef721b11ee843cfb.zip | |
x86/sem: refactor 'aaa' and fix it
Ref: http://www.hugi.scene.org/online/coding/hugi%2017%20-%20coaax.htm
Diffstat (limited to '')
| -rw-r--r-- | miasm2/arch/x86/sem.py | 40 |
1 files changed, 16 insertions, 24 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index 3f4168f8..27b2de82 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -2637,32 +2637,24 @@ def aad(ir, instr, a): return e, [] -def aaa(ir, instr, ): +def aaa(ir, instr): e = [] - c = (mRAX[instr.mode][:8] & m2_expr.ExprInt8(0xf)) - m2_expr.ExprInt8(9) - - c = m2_expr.ExprCond(c.msb(), - m2_expr.ExprInt1(0), - m2_expr.ExprInt1(1)) & \ - m2_expr.ExprCond(c, - m2_expr.ExprInt1(1), - m2_expr.ExprInt1(0)) - - c |= af & m2_expr.ExprInt1(1) + r_al = mRAX[instr.mode][:8] + r_ah = mRAX[instr.mode][8:16] + r_ax = mRAX[instr.mode][:16] + i0 = m2_expr.ExprInt1(0) + i1 = m2_expr.ExprInt1(1) + # cond: if (al & 0xf) > 9 OR af == 1 + cond = (r_al & m2_expr.ExprInt8(0xf)) - m2_expr.ExprInt8(9) + cond = ~cond.msb() & m2_expr.ExprCond(cond, i1, i0) + cond |= af & i1 + + to_add = m2_expr.ExprInt(0x106, size=r_ax.size) + new_ax = (r_ax + to_add) & m2_expr.ExprInt(0xff0f, size=r_ax.size) # set AL - m_al = m2_expr.ExprCond(c, - (mRAX[instr.mode][:8] + m2_expr.ExprInt8(6)) & \ - m2_expr.ExprInt8(0xF), - mRAX[instr.mode][:8] & m2_expr.ExprInt8(0xF)) - m_ah = m2_expr.ExprCond(c, - mRAX[instr.mode][8:16] + m2_expr.ExprInt8(1), - mRAX[instr.mode][8:16]) - - e.append(m2_expr.ExprAff(mRAX[instr.mode], m2_expr.ExprCompose([ - (m_al, 0, 8), (m_ah, 8, 16), - (mRAX[instr.mode][16:], 16, mRAX[instr.mode].size)]))) - e.append(m2_expr.ExprAff(af, c)) - e.append(m2_expr.ExprAff(cf, c)) + e.append(m2_expr.ExprAff(r_ax, m2_expr.ExprCond(cond, new_ax, r_ax))) + e.append(m2_expr.ExprAff(af, cond)) + e.append(m2_expr.ExprAff(cf, cond)) return e, [] |