diff options
| author | serpilliere <devnull@localhost> | 2014-08-18 13:10:47 +0200 |
|---|---|---|
| committer | serpilliere <devnull@localhost> | 2014-08-18 13:10:47 +0200 |
| commit | 0fe850655ae78f8619277204d4ae8bb9b1f9705d (patch) | |
| tree | 47171ccc82f17f5587d5847fe7a71f72570eef60 | |
| parent | 78ff130268616a02e55eb4890baf2087fc5bc780 (diff) | |
| download | miasm-0fe850655ae78f8619277204d4ae8bb9b1f9705d.tar.gz miasm-0fe850655ae78f8619277204d4ae8bb9b1f9705d.zip | |
x86 arch: fix movsxd 32/64 bit
| -rw-r--r-- | miasm2/arch/x86/arch.py | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py index 657ba679..2fed2301 100644 --- a/miasm2/arch/x86/arch.py +++ b/miasm2/arch/x86/arch.py @@ -3257,6 +3257,30 @@ class bs_op_mode_no64(bsi): return opmode == self.mode +class bs_mode64(bsi): + def encode(self): + if self.parent.mode != 64: + return False + return super(bs_mode64, self).encode() + + def decode(self, v): + if self.parent.mode != 64: + return False + return True + +class bs_modeno64(bsi): + def encode(self): + if self.parent.mode == 64: + return False + return super(bs_mode64, self).encode() + + def decode(self, v): + if self.parent.mode == 64: + return False + return True + + + bs_opmode16 = bs(l=0, cls=(bs_op_mode,), mode = 16, fname="fopmode") bs_opmode32 = bs(l=0, cls=(bs_op_mode,), mode = 32, fname="fopmode") bs_opmode64 = bs(l=0, cls=(bs_op_mode,), mode = 64, fname="fopmode") @@ -3269,6 +3293,9 @@ bs_admode64 = bs(l=0, cls=(bs_ad_mode,), mode = 64, fname="fadmode") bs_opmode16_no64 = bs(l=0, cls=(bs_op_mode_no64,), mode = 16, fname="fopmode") bs_opmode32_no64 = bs(l=0, cls=(bs_op_mode_no64,), mode = 32, fname="fopmode") +bs_mode64 = bs(l=0, cls=(bs_mode64,), fname="fopmode") +bs_modeno64 = bs(l=0, cls=(bs_modeno64,), fname="fopmode") + # class ia32_call(mn_x86): # fields = [bs8(0xff)] + rmmod(d3) # conv_name = {16:'CBW', 32:'CWDE', 64:'CDQE'} @@ -3575,10 +3602,7 @@ addop("movsd", [bs8(0xa5), bs_opmode32]) addop("movsq", [bs8(0xa5), bs_opmode64]) addop("movsx", [bs8(0x0f), bs("1011111"), w8, sx] + rmmod(rmreg, rm_arg_sx)) -# addop("movsxd", [bs8(0x63), sxd] + rmmod(rmreg, rm_arg_sxd)) -type("movsxd", (mn_x86,), { - "fields": [bs8(0x63), sxd] + rmmod(rmreg, rm_arg_sxd), - "modes": [64], 'alias': False}) +addop("movsxd", [bs8(0x63), sxd, bs_mode64] + rmmod(rmreg, rm_arg_sxd)) addop("movups", [bs8(0x0f), bs8(0x10), xmm, no_xmm_pref] + rmmod(rmreg, rm_arg)) |