diff --git a/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs b/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs index 633a4a4..6b72cb1 100644 --- a/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs +++ b/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs @@ -64,20 +64,21 @@ public class InstructionHandlerFactory // Register handlers in order of priority (most specific first) RegisterArithmeticImmediateHandlers(); // Group 1 instructions (including 0x83) - RegisterAddHandlers(); - RegisterAndHandlers(); - RegisterOrHandlers(); // Register OR handlers + RegisterAddHandlers(); // ADD instructions + RegisterAndHandlers(); // AND instructions + RegisterOrHandlers(); // OR instructions + RegisterXorHandlers(); // XOR instructions + RegisterCmpHandlers(); // CMP instructions + RegisterTestHandlers(); // TEST instructions + + // Register arithmetic unary instructions RegisterArithmeticUnaryHandlers(); // Empty, kept for consistency - RegisterNegHandlers(); // Register NEG handlers - RegisterMulHandlers(); // Register MUL handlers - RegisterNotHandlers(); // Register NOT handlers - RegisterImulHandlers(); // Register IMUL handlers - RegisterDivHandlers(); // Register DIV handlers - RegisterIdivHandlers(); // Register IDIV handlers - RegisterCmpHandlers(); - RegisterXorHandlers(); - RegisterOrHandlers(); - RegisterTestHandlers(); + RegisterNotHandlers(); // NOT instructions + RegisterNegHandlers(); // NEG instructions + RegisterMulHandlers(); // MUL instructions + RegisterImulHandlers(); // IMUL instructions + RegisterDivHandlers(); // DIV instructions + RegisterIdivHandlers(); // IDIV instructions RegisterDataTransferHandlers(); RegisterJumpHandlers(); RegisterCallHandlers(); @@ -108,16 +109,16 @@ public class InstructionHandlerFactory private void RegisterArithmeticImmediateHandlers() { // ADC handlers - _handlers.Add(new AdcImmToRm32Handler(_decoder)); - _handlers.Add(new AdcImmToRm32SignExtendedHandler(_decoder)); + _handlers.Add(new AdcImmToRm32Handler(_decoder)); // ADC r/m32, imm32 (opcode 81 /2) + _handlers.Add(new AdcImmToRm32SignExtendedHandler(_decoder)); // ADC r/m32, imm8 (opcode 83 /2) // SBB handlers - _handlers.Add(new SbbImmFromRm32Handler(_decoder)); - _handlers.Add(new SbbImmFromRm32SignExtendedHandler(_decoder)); + _handlers.Add(new SbbImmFromRm32Handler(_decoder)); // SBB r/m32, imm32 (opcode 81 /3) + _handlers.Add(new SbbImmFromRm32SignExtendedHandler(_decoder)); // SBB r/m32, imm8 (opcode 83 /3) // SUB handlers - _handlers.Add(new SubImmFromRm32Handler(_decoder)); - _handlers.Add(new SubImmFromRm32SignExtendedHandler(_decoder)); + _handlers.Add(new SubImmFromRm32Handler(_decoder)); // SUB r/m32, imm32 (opcode 81 /5) + _handlers.Add(new SubImmFromRm32SignExtendedHandler(_decoder)); // SUB r/m32, imm8 (opcode 83 /5) } /// @@ -206,17 +207,20 @@ public class InstructionHandlerFactory /// private void RegisterOrHandlers() { - // Add OR handlers - _handlers.Add(new OrImmToRm8Handler(_decoder)); - _handlers.Add(new OrImmToRm32Handler(_decoder)); - _handlers.Add(new OrImmToRm32SignExtendedHandler(_decoder)); + // Add OR immediate handlers + _handlers.Add(new OrImmToRm8Handler(_decoder)); // OR r/m8, imm8 (opcode 80 /1) + _handlers.Add(new OrImmToRm32Handler(_decoder)); // OR r/m32, imm32 (opcode 81 /1) + _handlers.Add(new OrImmToRm32SignExtendedHandler(_decoder)); // OR r/m32, imm8 (opcode 83 /1) - _handlers.Add(new OrR8Rm8Handler(_decoder)); - _handlers.Add(new OrRm8R8Handler(_decoder)); - _handlers.Add(new OrR32Rm32Handler(_decoder)); - _handlers.Add(new OrRm32R32Handler(_decoder)); // New handler for OR r/m32, r32 (opcode 09) - _handlers.Add(new OrAlImmHandler(_decoder)); - _handlers.Add(new OrEaxImmHandler(_decoder)); + // Add OR register handlers + _handlers.Add(new OrR8Rm8Handler(_decoder)); // OR r8, r/m8 (opcode 0A) + _handlers.Add(new OrRm8R8Handler(_decoder)); // OR r/m8, r8 (opcode 08) + _handlers.Add(new OrR32Rm32Handler(_decoder)); // OR r32, r/m32 (opcode 0B) + _handlers.Add(new OrRm32R32Handler(_decoder)); // OR r/m32, r32 (opcode 09) + + // Add OR immediate with accumulator handlers + _handlers.Add(new OrAlImmHandler(_decoder)); // OR AL, imm8 (opcode 0C) + _handlers.Add(new OrEaxImmHandler(_decoder)); // OR EAX, imm32 (opcode 0D) } /// @@ -348,15 +352,19 @@ public class InstructionHandlerFactory /// private void RegisterMovHandlers() { - // Add MOV handlers - _handlers.Add(new MovRegMemHandler(_decoder)); - _handlers.Add(new MovMemRegHandler(_decoder)); - _handlers.Add(new MovRegImm32Handler(_decoder)); - _handlers.Add(new MovRegImm8Handler(_decoder)); - _handlers.Add(new MovEaxMoffsHandler(_decoder)); - _handlers.Add(new MovMoffsEaxHandler(_decoder)); - _handlers.Add(new MovRm32Imm32Handler(_decoder)); - _handlers.Add(new MovRm8Imm8Handler(_decoder)); + // Add MOV register/memory handlers + _handlers.Add(new MovRegMemHandler(_decoder)); // MOV r32, r/m32 (opcode 8B) + _handlers.Add(new MovMemRegHandler(_decoder)); // MOV r/m32, r32 (opcode 89) + + // Add MOV immediate handlers + _handlers.Add(new MovRegImm32Handler(_decoder)); // MOV r32, imm32 (opcode B8+r) + _handlers.Add(new MovRegImm8Handler(_decoder)); // MOV r8, imm8 (opcode B0+r) + _handlers.Add(new MovRm32Imm32Handler(_decoder)); // MOV r/m32, imm32 (opcode C7 /0) + _handlers.Add(new MovRm8Imm8Handler(_decoder)); // MOV r/m8, imm8 (opcode C6 /0) + + // Add MOV memory offset handlers + _handlers.Add(new MovEaxMoffsHandler(_decoder)); // MOV EAX, moffs32 (opcode A1) + _handlers.Add(new MovMoffsEaxHandler(_decoder)); // MOV moffs32, EAX (opcode A3) } /// @@ -364,11 +372,13 @@ public class InstructionHandlerFactory /// private void RegisterPushHandlers() { - // Add PUSH handlers - _handlers.Add(new PushRegHandler(_decoder)); - _handlers.Add(new PushImm32Handler(_decoder)); - _handlers.Add(new PushImm8Handler(_decoder)); - _handlers.Add(new PushRm32Handler(_decoder)); // Add handler for PUSH r/m32 (FF /6) + // Add PUSH register handlers + _handlers.Add(new PushRegHandler(_decoder)); // PUSH r32 (opcode 50+r) + _handlers.Add(new PushRm32Handler(_decoder)); // PUSH r/m32 (opcode FF /6) + + // Add PUSH immediate handlers + _handlers.Add(new PushImm32Handler(_decoder)); // PUSH imm32 (opcode 68) + _handlers.Add(new PushImm8Handler(_decoder)); // PUSH imm8 (opcode 6A) } /// @@ -376,8 +386,8 @@ public class InstructionHandlerFactory /// private void RegisterPopHandlers() { - // Add POP handlers - _handlers.Add(new PopRegHandler(_decoder)); + // Add POP register handlers + _handlers.Add(new PopRegHandler(_decoder)); // POP r32 (opcode 58+r) } /// @@ -385,18 +395,21 @@ public class InstructionHandlerFactory /// private void RegisterAndHandlers() { - // Add AND handlers - _handlers.Add(new AndImmToRm8Handler(_decoder)); - _handlers.Add(new AndImmWithRm32Handler(_decoder)); - _handlers.Add(new AndImmToRm32Handler(_decoder)); - _handlers.Add(new AndImmToRm32SignExtendedHandler(_decoder)); + // Add AND immediate handlers + _handlers.Add(new AndImmToRm8Handler(_decoder)); // AND r/m8, imm8 (opcode 80 /4) + _handlers.Add(new AndImmWithRm32Handler(_decoder)); // AND r/m32, imm32 (opcode 81 /4) + _handlers.Add(new AndImmToRm32Handler(_decoder)); // AND r/m32, imm32 (opcode 81 /4) + _handlers.Add(new AndImmToRm32SignExtendedHandler(_decoder)); // AND r/m32, imm8 (opcode 83 /4) - _handlers.Add(new AndR8Rm8Handler(_decoder)); - _handlers.Add(new AndRm8R8Handler(_decoder)); - _handlers.Add(new AndR32Rm32Handler(_decoder)); - _handlers.Add(new AndMemRegHandler(_decoder)); - _handlers.Add(new AndAlImmHandler(_decoder)); - _handlers.Add(new AndEaxImmHandler(_decoder)); + // Add AND register handlers + _handlers.Add(new AndR8Rm8Handler(_decoder)); // AND r8, r/m8 (opcode 22) + _handlers.Add(new AndRm8R8Handler(_decoder)); // AND r/m8, r8 (opcode 20) + _handlers.Add(new AndR32Rm32Handler(_decoder)); // AND r32, r/m32 (opcode 23) + _handlers.Add(new AndMemRegHandler(_decoder)); // AND r/m32, r32 (opcode 21) + + // Add AND immediate with accumulator handlers + _handlers.Add(new AndAlImmHandler(_decoder)); // AND AL, imm8 (opcode 24) + _handlers.Add(new AndEaxImmHandler(_decoder)); // AND EAX, imm32 (opcode 25) } ///