diff --git a/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs b/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs index 7015b5a..183e932 100644 --- a/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs +++ b/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs @@ -181,12 +181,10 @@ public class InstructionHandlerFactory _handlers.Add(new XorRegMemHandler(_codeBuffer, _decoder, _length)); _handlers.Add(new XorImmWithRm32Handler(_codeBuffer, _decoder, _length)); _handlers.Add(new XorImmWithRm32SignExtendedHandler(_codeBuffer, _decoder, _length)); - _handlers.Add(new XorEaxImmHandler(_codeBuffer, _decoder, _length)); // 16-bit handlers _handlers.Add(new XorRm16R16Handler(_codeBuffer, _decoder, _length)); _handlers.Add(new XorR16Rm16Handler(_codeBuffer, _decoder, _length)); - _handlers.Add(new XorAxImm16Handler(_codeBuffer, _decoder, _length)); _handlers.Add(new XorImmWithRm16Handler(_codeBuffer, _decoder, _length)); _handlers.Add(new XorImmWithRm16SignExtendedHandler(_codeBuffer, _decoder, _length)); @@ -195,6 +193,11 @@ public class InstructionHandlerFactory _handlers.Add(new XorR8Rm8Handler(_codeBuffer, _decoder, _length)); _handlers.Add(new XorAlImmHandler(_codeBuffer, _decoder, _length)); _handlers.Add(new XorImmWithRm8Handler(_codeBuffer, _decoder, _length)); + + // special treatment with xor-ing eax + // precise handlers go first + _handlers.Add(new XorAxImm16Handler(_codeBuffer, _decoder, _length)); + _handlers.Add(new XorEaxImmHandler(_codeBuffer, _decoder, _length)); } /// diff --git a/X86DisassemblerTests/TestData/xor_tests.csv b/X86DisassemblerTests/TestData/xor_tests.csv index 3a4e786..e2dc59c 100644 --- a/X86DisassemblerTests/TestData/xor_tests.csv +++ b/X86DisassemblerTests/TestData/xor_tests.csv @@ -64,3 +64,61 @@ RawBytes;Instructions # XOR with negative immediate value (sign-extended) 83F0FF;[{ "Mnemonic": "xor", "Operands": "eax, 0xFFFFFFFF" }] + +# 16-bit XOR tests (with 0x66 prefix) +# XOR AX, imm16 (opcode 0x35 with 0x66 prefix) +6635ABCD;[{ "Mnemonic": "xor", "Operands": "ax, 0xCDAB" }] + +# XOR r16, r/m16 (opcode 0x33 with 0x66 prefix) +6633D8;[{ "Mnemonic": "xor", "Operands": "bx, ax" }] +6633C9;[{ "Mnemonic": "xor", "Operands": "cx, cx" }] + +# XOR r/m16, r16 (opcode 0x31 with 0x66 prefix) +6631D8;[{ "Mnemonic": "xor", "Operands": "ax, bx" }] +6631C9;[{ "Mnemonic": "xor", "Operands": "cx, cx" }] + +# XOR r/m16, imm16 (opcode 0x81 /6 with 0x66 prefix) +6681F0ABCD;[{ "Mnemonic": "xor", "Operands": "ax, 0xCDAB" }] + +# XOR r/m16, imm8 (sign-extended) (opcode 0x83 /6 with 0x66 prefix) +6683F042;[{ "Mnemonic": "xor", "Operands": "ax, 0x42" }] +6683F0FF;[{ "Mnemonic": "xor", "Operands": "ax, 0xFFFF" }] + +# 8-bit XOR tests +# XOR r/m8, r8 (opcode 0x30) +30D8;[{ "Mnemonic": "xor", "Operands": "al, bl" }] +30C9;[{ "Mnemonic": "xor", "Operands": "cl, cl" }] + +# XOR r8, r/m8 (opcode 0x32) +32D8;[{ "Mnemonic": "xor", "Operands": "bl, al" }] +32C9;[{ "Mnemonic": "xor", "Operands": "cl, cl" }] + +# XOR r/m8, imm8 (opcode 0x80 /6) +80F042;[{ "Mnemonic": "xor", "Operands": "al, 0x42" }] +80F0FF;[{ "Mnemonic": "xor", "Operands": "al, 0xFF" }] + +# Self-XOR tests (zeroing registers) +31C0;[{ "Mnemonic": "xor", "Operands": "eax, eax" }] +31DB;[{ "Mnemonic": "xor", "Operands": "ebx, ebx" }] +31C9;[{ "Mnemonic": "xor", "Operands": "ecx, ecx" }] +31D2;[{ "Mnemonic": "xor", "Operands": "edx, edx" }] + +# XOR with different addressing modes +# XOR [ebp+0x8], eax (opcode 0x31) +31458;[{ "Mnemonic": "xor", "Operands": "dword ptr [ebp+0x8], eax" }] + +# XOR eax, [ebp+0x8] (opcode 0x33) +33458;[{ "Mnemonic": "xor", "Operands": "eax, dword ptr [ebp+0x8]" }] + +# XOR with other segment overrides +# XOR ss:[ebx+0x10], ecx (opcode 0x31 with SS override) +36314B10;[{ "Mnemonic": "xor", "Operands": "dword ptr ss:[ebx+0x10], ecx" }] + +# XOR ecx, ds:[ebx+0x10] (opcode 0x33 with DS override) +3E334B10;[{ "Mnemonic": "xor", "Operands": "ecx, dword ptr ds:[ebx+0x10]" }] + +# XOR ecx, es:[ebx+0x10] (opcode 0x33 with ES override) +26334B10;[{ "Mnemonic": "xor", "Operands": "ecx, dword ptr es:[ebx+0x10]" }] + +# XOR ecx, cs:[ebx+0x10] (opcode 0x33 with CS override) +2E334B10;[{ "Mnemonic": "xor", "Operands": "ecx, dword ptr cs:[ebx+0x10]" }]