From 9096267f731bd365a4ad440bf78380fb90f1c45b Mon Sep 17 00:00:00 2001 From: bird_egop Date: Wed, 16 Apr 2025 21:20:40 +0300 Subject: [PATCH] Added OrRm32R32Handler for OR r/m32, r32 (opcode 09) instruction and registered it in InstructionHandlerFactory. This fixes failing OR instruction tests. --- .../X86/Handlers/InstructionHandlerFactory.cs | 11 +++ .../X86/Handlers/Or/OrRm32R32Handler.cs | 79 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 X86Disassembler/X86/Handlers/Or/OrRm32R32Handler.cs diff --git a/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs b/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs index 3950867..633a4a4 100644 --- a/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs +++ b/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs @@ -66,6 +66,7 @@ public class InstructionHandlerFactory RegisterArithmeticImmediateHandlers(); // Group 1 instructions (including 0x83) RegisterAddHandlers(); RegisterAndHandlers(); + RegisterOrHandlers(); // Register OR handlers RegisterArithmeticUnaryHandlers(); // Empty, kept for consistency RegisterNegHandlers(); // Register NEG handlers RegisterMulHandlers(); // Register MUL handlers @@ -213,6 +214,7 @@ public class InstructionHandlerFactory _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)); } @@ -481,6 +483,15 @@ public class InstructionHandlerFactory // IMUL r/m32 handler (F7 /5) _handlers.Add(new ImulRm32Handler(_decoder)); + + // IMUL r32, r/m32 handler (0F AF /r) + _handlers.Add(new ImulR32Rm32Handler(_decoder)); + + // IMUL r32, r/m32, imm8 handler (6B /r ib) + _handlers.Add(new ImulR32Rm32Imm8Handler(_decoder)); + + // IMUL r32, r/m32, imm32 handler (69 /r id) + _handlers.Add(new ImulR32Rm32Imm32Handler(_decoder)); } /// diff --git a/X86Disassembler/X86/Handlers/Or/OrRm32R32Handler.cs b/X86Disassembler/X86/Handlers/Or/OrRm32R32Handler.cs new file mode 100644 index 0000000..3d42e31 --- /dev/null +++ b/X86Disassembler/X86/Handlers/Or/OrRm32R32Handler.cs @@ -0,0 +1,79 @@ +namespace X86Disassembler.X86.Handlers.Or; + +using Operands; + +/// +/// Handler for OR r/m32, r32 instruction (0x09) +/// +public class OrRm32R32Handler : InstructionHandler +{ + /// + /// Initializes a new instance of the OrRm32R32Handler class + /// + /// The instruction decoder that owns this handler + public OrRm32R32Handler(InstructionDecoder decoder) + : base(decoder) + { + } + + /// + /// Checks if this handler can decode the given opcode + /// + /// The opcode to check + /// True if this handler can decode the opcode + public override bool CanHandle(byte opcode) + { + return opcode == 0x09; + } + + /// + /// Decodes an OR r/m32, r32 instruction + /// + /// The opcode of the instruction + /// The instruction object to populate + /// True if the instruction was successfully decoded + public override bool Decode(byte opcode, Instruction instruction) + { + // Set the instruction type + instruction.Type = InstructionType.Or; + + if (!Decoder.CanReadByte()) + { + return false; + } + + // Read the ModR/M byte + // For OR r/m32, r32 (opcode 09): + // - The r/m field (with mod) specifies the destination operand + // - The reg field specifies the source operand + var (mod, reg, rm, destOperand) = ModRMDecoder.ReadModRM(); + + // Create the register operand for the reg field + var regOperand = OperandFactory.CreateRegisterOperand(reg); + + // Set the structured operands based on addressing mode + if (mod == 3) // Direct register addressing + { + // Create the register operand for the r/m field + var rmOperand = OperandFactory.CreateRegisterOperand(rm); + + // Set the structured operands + instruction.StructuredOperands = + [ + rmOperand, // Destination is r/m + regOperand // Source is reg + ]; + } + else // Memory addressing + { + // Set the structured operands + instruction.StructuredOperands = + [ + destOperand, // Destination is r/m (memory) + regOperand // Source is reg + ]; + } + + return true; + } +}