From 2344010d26266705c541809f7d73f25bf3bae643 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Mon, 12 Nov 2007 21:02:33 -0800 Subject: [PATCH] Fix disassembly of XCHG "REX.B 90" in 64-bit mode is "xchg eax,r8d" not "nop"; equivalent situation for "REX.WB 90" (xchg rax,r8). --- assemble.c | 15 +++++++++++++++ disasm.c | 12 ++++++++++++ insns.dat | 2 +- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/assemble.c b/assemble.c index b6b447e2..a56887ec 100644 --- a/assemble.c +++ b/assemble.c @@ -54,6 +54,10 @@ * \311 - indicates fixed 32-bit address size, i.e. optional 0x67. * \312 - (disassembler only) marker on LOOP, LOOPxx instructions. * \313 - indicates fixed 64-bit address size, 0x67 invalid. + * \314 - (disassembler only) invalid with REX.B + * \315 - (disassembler only) invalid with REX.X + * \316 - (disassembler only) invalid with REX.R + * \317 - (disassembler only) invalid with REX.W * \320 - indicates fixed 16-bit operand size, i.e. optional 0x66. * \321 - indicates fixed 32-bit operand size, i.e. optional 0x66. * \322 - indicates that this instruction is only valid when the @@ -965,6 +969,11 @@ static int64_t calcsize(int32_t segment, int64_t offset, int bits, has_prefix(ins, PPS_ASIZE, P_A32)) return -1; break; + case 0314: + case 0315: + case 0316: + case 0317: + break; case 0320: length += (bits != 16); break; @@ -1491,6 +1500,12 @@ static void gencode(int32_t segment, int64_t offset, int bits, ins->rex = 0; break; + case 0314: + case 0315: + case 0316: + case 0317: + break; + case 0320: if (bits != 16) { *bytes = 0x66; diff --git a/disasm.c b/disasm.c index f89114d5..686caed5 100644 --- a/disasm.c +++ b/disasm.c @@ -584,6 +584,18 @@ static int matches(const struct itemplate *t, uint8_t *data, return false; else a_used = true; + } else if (c == 0314) { + if (prefix->rex & REX_B) + return false; + } else if (c == 0315) { + if (prefix->rex & REX_X) + return false; + } else if (c == 0316) { + if (prefix->rex & REX_R) + return false; + } else if (c == 0317) { + if (prefix->rex & REX_W) + return false; } else if (c == 0320) { if (osize != 16) return false; diff --git a/insns.dat b/insns.dat index 48a9c5ff..c297fbf0 100644 --- a/insns.dat +++ b/insns.dat @@ -773,7 +773,7 @@ NEG rm8 \1\xF6\203 8086 NEG rm16 \320\1\xF7\203 8086 NEG rm32 \321\1\xF7\203 386 NEG rm64 \324\1\xF7\203 X64 -NOP void \1\x90 8086 +NOP void \314\1\x90 8086 NOP rm16 \320\2\x0F\x1F\200 P6 NOP rm32 \321\2\x0F\x1F\200 P6 NOP rm64 \324\2\x0F\x1F\200 X64 -- 2.11.4.GIT