using X86Disassembler.X86.Operands; namespace X86Disassembler.X86.Handlers.Imul; /// /// Handler for IMUL r32, r/m32, imm32 instruction (0x69 /r id) /// public class ImulR32Rm32Imm32Handler : InstructionHandler { /// /// Initializes a new instance of the ImulR32Rm32Imm32Handler class /// /// The instruction decoder that owns this handler public ImulR32Rm32Imm32Handler(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) { // IMUL r32, r/m32, imm32: opcode 69 /r id return opcode == 0x69; } /// /// Decodes an IMUL r32, r/m32, imm32 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) { instruction.Type = InstructionType.IMul; // Read ModR/M: reg = destination, r/m = source var (_, reg, _, operand) = ModRMDecoder.ReadModRM(); var destOperand = OperandFactory.CreateRegisterOperand(reg); // Read imm32 (4 bytes) uint imm32 = Decoder.ReadUInt32(); var immOperand = OperandFactory.CreateImmediateOperand(imm32); instruction.StructuredOperands = [ destOperand, operand, immOperand ]; return true; } }