about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorserpilliere <devnull@localhost>2014-08-18 13:10:47 +0200
committerserpilliere <devnull@localhost>2014-08-18 13:10:47 +0200
commit0fe850655ae78f8619277204d4ae8bb9b1f9705d (patch)
tree47171ccc82f17f5587d5847fe7a71f72570eef60
parent78ff130268616a02e55eb4890baf2087fc5bc780 (diff)
downloadmiasm-0fe850655ae78f8619277204d4ae8bb9b1f9705d.tar.gz
miasm-0fe850655ae78f8619277204d4ae8bb9b1f9705d.zip
x86 arch: fix movsxd 32/64 bit
-rw-r--r--miasm2/arch/x86/arch.py32
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))