diff options
| author | Camille Mougey <commial@gmail.com> | 2015-02-13 14:16:52 +0100 |
|---|---|---|
| committer | Camille Mougey <commial@gmail.com> | 2015-02-13 14:16:52 +0100 |
| commit | 13a3fcbb168589703d56d6c36312d788f68786e3 (patch) | |
| tree | b54647a953afbb30b0939d90e9ac256604093b74 /miasm2/arch/x86/sem.py | |
| parent | 9af3164437657d93916b3658c483d6c3e4949cd5 (diff) | |
| parent | ef6c6b0b855800375758058863861f28657b5ba7 (diff) | |
| download | miasm-13a3fcbb168589703d56d6c36312d788f68786e3.tar.gz miasm-13a3fcbb168589703d56d6c36312d788f68786e3.zip | |
Merge pull request #69 from serpilliere/x86_fix_op_32_in_64
X86 fix op 32 in 64
Diffstat (limited to 'miasm2/arch/x86/sem.py')
| -rw-r--r-- | miasm2/arch/x86/sem.py | 60 |
1 files changed, 24 insertions, 36 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index 93e24350..585d4190 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -1399,21 +1399,13 @@ def loope(ir, instr, dst): # XXX size to do; eflag def div(ir, instr, a): e = [] - s = a.size - if s == 8: + size = a.size + if size == 8: b = mRAX[instr.mode][:16] - elif s == 16: - s1, s2 = mRDX[instr.mode][:16], mRAX[instr.mode][:16] - b = ExprCompose([(s1, 0, 16), - (s1, 16, 32)]) - elif s == 32: - s1, s2 = mRDX[instr.mode][:32], mRAX[instr.mode][:32] - b = ExprCompose([(s2, 0, 32), - (s1, 32, 64)]) - elif s == 64: - s1, s2 = mRDX[instr.mode], mRAX[instr.mode] - b = ExprCompose([(s2, 0, 64), - (s1, 64, 128)]) + elif size in [16, 32, 64]: + s1, s2 = mRDX[size], mRAX[size] + b = ExprCompose([(s2, 0, size), + (s1, size, size*2)]) else: raise ValueError('div arg not impl', a) @@ -1421,12 +1413,12 @@ def div(ir, instr, a): c_r = ExprOp('umod', b, a.zeroExtend(b.size)) # if 8 bit div, only ax is affected - if s == 8: + if size == 8: e.append(ExprAff(b, ExprCompose([(c_d[:8], 0, 8), (c_r[:8], 8, 16)]))) else: - e.append(ExprAff(s1, c_r[:s])) - e.append(ExprAff(s2, c_d[:s])) + e.append(ExprAff(s1, c_r[:size])) + e.append(ExprAff(s2, c_d[:size])) return e, [] # XXX size to do; eflag @@ -1434,18 +1426,14 @@ def div(ir, instr, a): def idiv(ir, instr, a): e = [] - s = a.size + size = a.size - if s == 8: + if size == 8: b = mRAX[instr.mode][:16] - elif s == 16: - s1, s2 = mRDX[instr.mode][:16], mRAX[instr.mode][:16] - b = ExprCompose([(s1, 0, 16), - (s1, 16, 32)]) - elif s == 32: - s1, s2 = mRDX[instr.mode][:32], mRAX[instr.mode][:32] - b = ExprCompose([(s2, 0, 32), - (s1, 32, 64)]) + elif size in [16, 32]: + s1, s2 = mRDX[size], mRAX[size] + b = ExprCompose([(s2, 0, size), + (s1, size, size*2)]) else: raise ValueError('div arg not impl', a) @@ -1453,12 +1441,12 @@ def idiv(ir, instr, a): c_r = ExprOp('imod', b, a.signExtend(b.size)) # if 8 bit div, only ax is affected - if s == 8: + if size == 8: e.append(ExprAff(b, ExprCompose([(c_d[:8], 0, 8), (c_r[:8], 8, 16)]))) else: - e.append(ExprAff(s1, c_r[:s])) - e.append(ExprAff(s2, c_d[:s])) + e.append(ExprAff(s1, c_r[:size])) + e.append(ExprAff(s2, c_d[:size])) return e, [] # XXX size to do; eflag @@ -1469,10 +1457,10 @@ def mul(ir, instr, a): size = a.size if a.size in [16, 32, 64]: result = ExprOp('*', - mRAX[instr.mode][:size].zeroExtend(size * 2), + mRAX[size].zeroExtend(size * 2), a.zeroExtend(size * 2)) - e.append(ExprAff(mRAX[instr.mode][:size], result[:size])) - e.append(ExprAff(mRDX[instr.mode][:size], result[size:size * 2])) + e.append(ExprAff(mRAX[size], result[:size])) + e.append(ExprAff(mRDX[size], result[size:size * 2])) elif a.size == 8: result = ExprOp('*', @@ -1498,10 +1486,10 @@ def imul(ir, instr, a, b=None, c=None): if b is None: if size in [16, 32, 64]: result = ExprOp('*', - mRAX[instr.mode][:size].signExtend(size * 2), + mRAX[size].signExtend(size * 2), a.signExtend(size * 2)) - e.append(ExprAff(mRAX[instr.mode][:size], result[:size])) - e.append(ExprAff(mRDX[instr.mode][:size], result[size:size * 2])) + e.append(ExprAff(mRAX[size], result[:size])) + e.append(ExprAff(mRDX[size], result[size:size * 2])) elif size == 8: dst = mRAX[instr.mode][:16] result = ExprOp('*', |