From acfce8ea555382e72fdc373d65f57430e32f916c Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Mon, 27 Aug 2018 15:10:58 -0600 Subject: [PATCH] Added handling of SSE movs for x86 --- plasma/lib/arch/x86/output.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/plasma/lib/arch/x86/output.py b/plasma/lib/arch/x86/output.py index 50e6f9e..7794c58 100644 --- a/plasma/lib/arch/x86/output.py +++ b/plasma/lib/arch/x86/output.py @@ -30,7 +30,8 @@ X86_INS_MOVSW, X86_INS_MOVSD, X86_INS_MOVSQ, X86_INS_LODSB, X86_INS_LODSW, X86_INS_LODSD, X86_INS_LODSQ, X86_INS_CMPSB, X86_INS_CMPSW, X86_INS_CMPSD, X86_INS_CMPSQ, X86_INS_SCASB, - X86_INS_SCASW, X86_INS_SCASD, X86_INS_SCASQ, X86_INS_XADD, X86_PREFIX_LOCK) + X86_INS_SCASW, X86_INS_SCASD, X86_INS_SCASQ, X86_INS_XADD, X86_PREFIX_LOCK, + X86_INS_MOVSS, X86_INS_MOVAPD, X86_INS_MOVAPS, X86_INS_MOVUPS, X86_INS_MOVUPD) from plasma.lib.output import OutputAbs from plasma.lib.arch.x86.utils import (inst_symbol, is_call, is_jump, is_ret, @@ -65,9 +66,12 @@ INST_MOVS = {X86_INS_MOVSB, X86_INS_MOVSW, X86_INS_MOVSD, X86_INS_MOVSQ} INST_CMPS = {X86_INS_CMPSB, X86_INS_CMPSW, X86_INS_CMPSD, X86_INS_CMPSQ} INST_SCAS = {X86_INS_SCASB, X86_INS_SCASW, X86_INS_SCASD, X86_INS_SCASQ} +INST_MOV_SSE = {X86_INS_MOVSD, X86_INS_MOVSS, X86_INS_MOVAPD, X86_INS_MOVAPS, X86_INS_MOVUPS, X86_INS_MOVUPD} REP_PREFIX = {X86_PREFIX_REPNE, X86_PREFIX_REP} +def is_sse_movd(i): + return i.id == X86_INS_MOVSD and i.bytes[0] == 0xF2 class Output(OutputAbs): def _operand(self, i, num_op, hexa=False, show_deref=True, @@ -415,9 +419,10 @@ def _sub_asm_inst(self, i, tab=0): self._add(" += D ? -{0} : {0}".format(i.operands[0].size)) return - if i.id in INST_MOVS: + # Be sure to differentiate between the SSE instruction MOVSD and the non SSE move string + if i.id in INST_MOVS and not is_sse_movd(i): self._operand(i, 0) - self._add(" = ") + self._add("( = ") self._operand(i, 1) self._new_line() self._tabs(tab) @@ -431,6 +436,12 @@ def _sub_asm_inst(self, i, tab=0): self._add(" += D ? -{0} : {0}".format(i.operands[0].size)) return + if i.id in INST_MOV_SSE: + self._operand(i, 0) + self._add(" = ") + self._operand(i, 1) + return + if is_imm: self._section("!") self._add("mov ")