diff --git a/X86Disassembler/X86/Handlers/String/StringInstructionHandler.cs b/X86Disassembler/X86/Handlers/String/StringInstructionHandler.cs index 0abe386..a943d35 100644 --- a/X86Disassembler/X86/Handlers/String/StringInstructionHandler.cs +++ b/X86Disassembler/X86/Handlers/String/StringInstructionHandler.cs @@ -23,7 +23,11 @@ public class StringInstructionHandler : InstructionHandler /// True if this handler can handle the opcode public override bool CanHandle(byte opcode) { - return IsStringInstruction(opcode); + // Check if the opcode is a string instruction + return opcode == 0xA4 || opcode == 0xA5 || // MOVS + opcode == 0xAA || opcode == 0xAB || // STOS + opcode == 0xAC || opcode == 0xAD || // LODS + opcode == 0xAE || opcode == 0xAF; // SCAS } /// @@ -37,52 +41,38 @@ public class StringInstructionHandler : InstructionHandler // Set the mnemonic instruction.Mnemonic = OpcodeMap.GetMnemonic(opcode); - // Set the operands - instruction.Operands = GetStringOperands(opcode); + // Set the operands based on the string operation + switch (opcode) + { + case 0xA4: // MOVSB + instruction.Operands = "byte ptr [edi], byte ptr [esi]"; + break; + case 0xA5: // MOVSD + instruction.Operands = "dword ptr [edi], dword ptr [esi]"; + break; + case 0xAA: // STOSB + instruction.Operands = "byte ptr [edi], al"; + break; + case 0xAB: // STOSD + instruction.Operands = "dword ptr [edi], eax"; + break; + case 0xAC: // LODSB + instruction.Operands = "al, byte ptr [esi]"; + break; + case 0xAD: // LODSD + instruction.Operands = "eax, dword ptr [esi]"; + break; + case 0xAE: // SCASB + instruction.Operands = "al, byte ptr [edi]"; + break; + case 0xAF: // SCASD + instruction.Operands = "eax, dword ptr [edi]"; + break; + default: + instruction.Operands = "??"; + break; + } return true; } - - /// - /// Checks if the opcode is a string instruction - /// - /// The opcode to check - /// True if the opcode is a string instruction - private bool IsStringInstruction(byte opcode) - { - return opcode == 0xA4 || opcode == 0xA5 || // MOVS - opcode == 0xAA || opcode == 0xAB || // STOS - opcode == 0xAC || opcode == 0xAD || // LODS - opcode == 0xAE || opcode == 0xAF; // SCAS - } - - /// - /// Gets the operands for a string instruction - /// - /// The string operation opcode - /// The operands string - private string GetStringOperands(byte stringOp) - { - switch (stringOp) - { - case 0xA4: // MOVSB - return "byte ptr [edi], byte ptr [esi]"; - case 0xA5: // MOVSD - return "dword ptr [edi], dword ptr [esi]"; - case 0xAA: // STOSB - return "byte ptr [edi], al"; - case 0xAB: // STOSD - return "dword ptr [edi], eax"; - case 0xAC: // LODSB - return "al, byte ptr [esi]"; - case 0xAD: // LODSD - return "eax, dword ptr [esi]"; - case 0xAE: // SCASB - return "al, byte ptr [edi]"; - case 0xAF: // SCASD - return "eax, dword ptr [edi]"; - default: - return "??"; - } - } }