about summary refs log tree commit diff stats
path: root/miasm2
diff options
context:
space:
mode:
authorserpilliere <devnull@localhost>2014-06-25 14:20:41 +0200
committerserpilliere <devnull@localhost>2014-06-25 14:20:41 +0200
commite8ab9dba9d49d5200f30aa6e7302f093c0a393d6 (patch)
treef03543122fc264c8ca005b5da78ba652095cdea7 /miasm2
parent664d19065919f0c9270d3960e4917de9000e9ca6 (diff)
downloadmiasm-e8ab9dba9d49d5200f30aa6e7302f093c0a393d6.tar.gz
miasm-e8ab9dba9d49d5200f30aa6e7302f093c0a393d6.zip
x86 arch: fix prefix/rex encoding, add mnemo
Diffstat (limited to 'miasm2')
-rw-r--r--miasm2/arch/x86/arch.py51
1 files changed, 48 insertions, 3 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py
index b8991887..e90859d8 100644
--- a/miasm2/arch/x86/arch.py
+++ b/miasm2/arch/x86/arch.py
@@ -797,8 +797,6 @@ class mn_x86(cls_mn):
 
     def encodefields(self, decoded):
         v = super(mn_x86, self).encodefields(decoded)
-        if hasattr(self, 'prefixed'):
-            v = self.prefixed.default + v
 
         rex = 0x40
         if self.g1.value is None:
@@ -816,6 +814,10 @@ class mn_x86(cls_mn):
             rex |= 0x1
         if rex != 0x40 or self.rex_p.value == 1:
             v = chr(rex) + v
+
+        if hasattr(self, 'prefixed'):
+            v = self.prefixed.default + v
+
         if self.g1.value & 1:
             v = "\xf0" + v
         if self.g1.value & 2:
@@ -3572,10 +3574,26 @@ addop("movups",
       [bs8(0x0f), bs8(0x10), xmm, no_xmm_pref] + rmmod(rmreg, rm_arg))
 addop("movsd", [bs8(0x0f), bs("0001000"), swapargs, xmm, pref_f2]
       + rmmod(rmreg, rm_arg), [xmm, rm_arg])
-addop("movss", [bs8(0x0f), bs8(0x10), xmm, pref_f3] + rmmod(rmreg, rm_arg))
+addop("movss", [bs8(0x0f), bs("0001000"), swapargs, xmm, pref_f3] +
+      rmmod(rmreg, rm_arg), [rmreg, rm_arg])
 addop("movupd", [bs8(0x0f), bs8(0x10), xmm, pref_66] + rmmod(rmreg, rm_arg))
 
 
+addop("movd", [bs8(0x0f), bs('011'), swapargs, bs('1110'), mm, no_xmm_pref] +
+      rmmod(rmreg, rm_arg), [rmreg, rm_arg])
+addop("movd", [bs8(0x0f), bs('011'), swapargs, bs('1110'), xmm, pref_66] +
+      rmmod(rmreg, rm_arg), [rmreg, rm_arg])
+
+addop("movq", [bs8(0x0f), bs('011'), swapargs, bs('1111'), mm, no_xmm_pref] +
+      rmmod(rmreg, rm_arg), [rmreg, rm_arg])
+
+addop("movq", [bs8(0x0f), bs8(0x7e), xmm, pref_f3] +
+      rmmod(rmreg, rm_arg), [rmreg, rm_arg])
+addop("movq", [bs8(0x0f), bs8(0xd6), xmm, pref_66] +
+      rmmod(rmreg, rm_arg), [rm_arg, rmreg])
+
+
+
 addop("addss", [bs8(0x0f), bs8(0x58), xmm, pref_f3] + rmmod(rmreg, rm_arg))
 addop("addsd", [bs8(0x0f), bs8(0x58), xmm, pref_f2] + rmmod(rmreg, rm_arg))
 
@@ -3827,6 +3845,33 @@ addop("movaps", [bs8(0x0f), bs("0010100"), swapargs, xmm]
 addop("movaps", [bs8(0x0f), bs("0010100"), swapargs, xmm]
       + rmmod(rmreg, rm_arg) + [bs_opmode64], [rmreg, rm_arg])
 
+addop("xgetbv", [bs8(0x0f), bs8(0x01), bs8(0xd0)])
+
+addop("pand", [bs8(0x0f), bs8(0xdb), mm, no_xmm_pref] +
+      rmmod(rmreg, rm_arg), [rmreg, rm_arg])
+addop("pand", [bs8(0x0f), bs8(0xdb), xmm, pref_66] +
+      rmmod(rmreg, rm_arg), [rmreg, rm_arg])
+
+addop("por", [bs8(0x0f), bs8(0xeb), mm, no_xmm_pref] +
+      rmmod(rmreg, rm_arg), [rmreg, rm_arg])
+addop("por", [bs8(0x0f), bs8(0xeb), xmm, pref_66] +
+      rmmod(rmreg, rm_arg), [rmreg, rm_arg])
+
+
+addop("movdqu", [bs8(0x0f), bs("011"), swapargs, bs("1111"), xmm, pref_f3]
+      + rmmod(rmreg, rm_arg), [rmreg, rm_arg])
+addop("movdqa", [bs8(0x0f), bs("011"), swapargs, bs("1111"), xmm, pref_66]
+      + rmmod(rmreg, rm_arg), [rmreg, rm_arg])
+
+addop("cvtss2sd", [bs8(0x0f), bs8(0x5a), xmm, pref_f3]
+      + rmmod(rmreg, rm_arg))
+addop("cvtsd2ss", [bs8(0x0f), bs8(0x5a), xmm, pref_f2]
+      + rmmod(rmreg, rm_arg))
+
+
+#addop("pand", [bs8(0x0f), bs8(0xdb), xmm, pref_66])# + rmmod(rmreg, rm_arg))
+
+
 mn_x86.bintree = factor_one_bit(mn_x86.bintree)
 # mn_x86.bintree = factor_fields_all(mn_x86.bintree)
 """