diff options
| author | serpilliere <devnull@localhost> | 2014-08-12 14:02:07 +0200 |
|---|---|---|
| committer | serpilliere <devnull@localhost> | 2014-08-12 14:02:07 +0200 |
| commit | 78ff130268616a02e55eb4890baf2087fc5bc780 (patch) | |
| tree | dde790b07a3a712e4f8591cacf245b3871f7a9c9 | |
| parent | 0b526f3725bfa78444c2f2d8f6167793de579029 (diff) | |
| download | miasm-78ff130268616a02e55eb4890baf2087fc5bc780.tar.gz miasm-78ff130268616a02e55eb4890baf2087fc5bc780.zip | |
x86: add les/lds. Fix call/ret far
| -rw-r--r-- | miasm2/arch/x86/arch.py | 7 | ||||
| -rw-r--r-- | miasm2/arch/x86/sem.py | 25 | ||||
| -rw-r--r-- | test/arch/x86/arch.py | 16 |
3 files changed, 42 insertions, 6 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py index 2d49135a..657ba679 100644 --- a/miasm2/arch/x86/arch.py +++ b/miasm2/arch/x86/arch.py @@ -3533,8 +3533,13 @@ addop("jmpf", [bs8(0xff), stk] + rmmod(d5)) addop("lahf", [bs8(0x9f)]) addop("lar", [bs8(0x0f), bs8(0x02)] + rmmod(rmreg)) -# XXX TODO LDS LES ... addop("lea", [bs8(0x8d)] + rmmod(rmreg)) +addop("les", [bs8(0xc4)] + rmmod(rmreg)) +addop("lds", [bs8(0xc5)] + rmmod(rmreg)) +addop("lss", [bs8(0x0f), bs8(0xb2)] + rmmod(rmreg)) +addop("lfs", [bs8(0x0f), bs8(0xb4)] + rmmod(rmreg)) +addop("lgs", [bs8(0x0f), bs8(0xb5)] + rmmod(rmreg)) + addop("leave", [bs8(0xc9)]) addop("lodsb", [bs8(0xac)]) diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index dd0d9e11..c78c9c36 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -1036,8 +1036,6 @@ def retf(ir, instr, a=None): a = a.zeroExtend(s) - e.append(ExprAff(myesp, (myesp + (ExprInt_fromsize(s, (s / 8)) + a)))) - c = myesp if ir.do_stk_segm: c = ExprOp('segm', SS, c) @@ -1048,6 +1046,7 @@ def retf(ir, instr, a=None): c = ExprOp('segm', SS, c) e.append(ExprAff(CS, ExprMem(c, size=16))) + e.append(ExprAff(myesp, (myesp + (ExprInt_fromsize(s, (2*s) / 8) + a)))) return meip, e, [] @@ -2622,7 +2621,7 @@ def cmpxchg(ir, instr, a, b): def lds(ir, instr, a, b): e = [] e.append(ExprAff(a, ExprMem(b.arg, size=a.size))) - e.append(ExprAff(ds, ExprMem(b.arg + ExprInt_from(a, 2), + e.append(ExprAff(DS, ExprMem(b.arg + ExprInt_from(b.arg, a.size/8), size=16))) return None, e, [] @@ -2630,7 +2629,7 @@ def lds(ir, instr, a, b): def les(ir, instr, a, b): e = [] e.append(ExprAff(a, ExprMem(b.arg, size=a.size))) - e.append(ExprAff(es, ExprMem(b.arg + ExprInt_from(a, 2), + e.append(ExprAff(ES, ExprMem(b.arg + ExprInt_from(b.arg, a.size/8), size=16))) return None, e, [] @@ -2638,7 +2637,21 @@ def les(ir, instr, a, b): def lss(ir, instr, a, b): e = [] e.append(ExprAff(a, ExprMem(b.arg, size=a.size))) - e.append(ExprAff(ss, ExprMem(b.arg + ExprInt_from(a, 2), + e.append(ExprAff(SS, ExprMem(b.arg + ExprInt_from(b.arg, a.size/8), + size=16))) + return None, e, [] + +def lfs(ir, instr, a, b): + e = [] + e.append(ExprAff(a, ExprMem(b.arg, size=a.size))) + e.append(ExprAff(FS, ExprMem(b.arg + ExprInt_from(b.arg, a.size/8), + size=16))) + return None, e, [] + +def lgs(ir, instr, a, b): + e = [] + e.append(ExprAff(a, ExprMem(b.arg, size=a.size))) + e.append(ExprAff(GS, ExprMem(b.arg + ExprInt_from(b.arg, a.size/8), size=16))) return None, e, [] @@ -3085,6 +3098,8 @@ mnemo_func = {'mov': mov, "lds": lds, "les": les, "lss": lss, + "lfs": lfs, + "lgs": lgs, "lahf": lahf, "sahf": sahf, "lar": lar, diff --git a/test/arch/x86/arch.py b/test/arch/x86/arch.py index be4d63cd..5a87012f 100644 --- a/test/arch/x86/arch.py +++ b/test/arch/x86/arch.py @@ -1733,6 +1733,22 @@ reg_tests = [ (m32, "00000000 MOVDQA DWORD PTR [ESP], XMM0", "660f7f0424"), + (m32, "00000000 LES EDI, DWORD PTR [ESI]", + "C43E"), + (m32, "00000000 LDS EDI, DWORD PTR [ESI]", + "C53E"), + (m32, "00000000 LSS EDI, DWORD PTR [ESI]", + "0FB23E"), + (m32, "00000000 LFS EDI, DWORD PTR [ESI]", + "0FB43E"), + (m32, "00000000 LGS EDI, DWORD PTR [ESI]", + "0FB53E"), + + (m16, "00000000 LES SI, WORD PTR [BX+SI]", + "C430"), + (m16, "00000000 LDS SI, WORD PTR [BX+SI]", + "C530"), + #### MMX/SSE/AVX operations #### |