diff --git a/X86Disassembler/X86/Handlers/Add/AddEaxImmHandler.cs b/X86Disassembler/X86/Handlers/Add/AddEaxImmHandler.cs index bb575a9..3f45c8a 100644 --- a/X86Disassembler/X86/Handlers/Add/AddEaxImmHandler.cs +++ b/X86Disassembler/X86/Handlers/Add/AddEaxImmHandler.cs @@ -34,56 +34,25 @@ public class AddEaxImmHandler : InstructionHandler /// True if the instruction was successfully decoded public override bool Decode(byte opcode, Instruction instruction) { - // Save the original position for raw bytes calculation - int startPosition = Decoder.GetPosition(); - // Set the mnemonic instruction.Mnemonic = "add"; - // Check if we have enough bytes for the immediate value - if (startPosition + 4 > Length) - { - // Not enough bytes for the immediate value - instruction.Operands = "eax, ??"; - - // Set the raw bytes to just the opcode - instruction.RawBytes = new byte[] { opcode }; - - return true; // Still return true as we've set a valid mnemonic and operands - } + int position = Decoder.GetPosition(); - // Check for special cases where the immediate value might be part of another instruction - // For example, if the next byte is 0x83 (Group 1 sign-extended immediate) - // or 0xEB (JMP rel8), it's likely the start of a new instruction - byte nextByte = CodeBuffer[startPosition]; - if (nextByte == 0x83 || nextByte == 0xEB) + // Check if we have enough bytes for the immediate value + if (position + 3 >= Length) { - // This is likely the start of a new instruction, not part of our immediate value - instruction.Operands = "eax, ??"; - - // Set the raw bytes to just the opcode - instruction.RawBytes = new byte[] { opcode }; - - return true; + return false; // Not enough bytes for the immediate value } // Read the 32-bit immediate value uint imm32 = Decoder.ReadUInt32(); - // Set the operands - instruction.Operands = $"eax, 0x{imm32:X8}"; + // Format the immediate value + string immStr = $"0x{imm32:X}"; - // Set the raw bytes - byte[] rawBytes = new byte[5]; // opcode + 4 bytes for immediate - rawBytes[0] = opcode; - for (int i = 0; i < 4; i++) - { - if (startPosition + i < Length) - { - rawBytes[i + 1] = CodeBuffer[startPosition + i]; - } - } - instruction.RawBytes = rawBytes; + // Set the operands + instruction.Operands = $"eax, {immStr}"; return true; } diff --git a/X86Disassembler/X86/Handlers/Add/AddImmToRm32SignExtendedHandler.cs b/X86Disassembler/X86/Handlers/Add/AddImmToRm32SignExtendedHandler.cs index 9a67354..48ec17b 100644 --- a/X86Disassembler/X86/Handlers/Add/AddImmToRm32SignExtendedHandler.cs +++ b/X86Disassembler/X86/Handlers/Add/AddImmToRm32SignExtendedHandler.cs @@ -45,95 +45,32 @@ public class AddImmToRm32SignExtendedHandler : InstructionHandler /// True if the instruction was successfully decoded public override bool Decode(byte opcode, Instruction instruction) { - // Save the original position for raw bytes calculation - int startPosition = Decoder.GetPosition(); - // Set the mnemonic instruction.Mnemonic = "add"; - if (startPosition >= Length) + int position = Decoder.GetPosition(); + + if (position >= Length) { - instruction.Operands = "??"; - instruction.RawBytes = new byte[] { opcode }; - return true; + return false; } // Read the ModR/M byte var (mod, reg, rm, destOperand) = ModRMDecoder.ReadModRM(); - // Track the bytes needed for this instruction - int bytesNeeded = 1; // ModR/M byte - - // Process SIB byte if needed - byte sib = 0; - if (mod != 3 && rm == RegisterIndex.Si) // SIB byte present - { - if (startPosition + bytesNeeded >= Length) - { - instruction.Operands = "??"; - instruction.RawBytes = new byte[] { opcode, CodeBuffer[startPosition] }; - return true; - } - sib = CodeBuffer[startPosition + bytesNeeded]; - bytesNeeded++; // SIB byte - } - - // Handle displacement - int dispSize = 0; - if (mod == 0 && rm == RegisterIndex.Di) // 32-bit displacement - { - dispSize = 4; - } - else if (mod == 1) // 8-bit displacement - { - dispSize = 1; - } - else if (mod == 2) // 32-bit displacement - { - dispSize = 4; - } - - // Check if we have enough bytes for the displacement - if (startPosition + bytesNeeded + dispSize >= Length) - { - instruction.Operands = "??"; - instruction.RawBytes = new byte[] { opcode, CodeBuffer[startPosition] }; - return true; - } - - bytesNeeded += dispSize; // Add displacement bytes - - // Set the decoder position to after the ModR/M byte - Decoder.SetPosition(startPosition + 1); - // Get the position after decoding the ModR/M byte - int newPosition = Decoder.GetPosition(); + position = Decoder.GetPosition(); - // Read the immediate value - if (newPosition >= Length) + // Check if we have enough bytes for the immediate value + if (position >= Length) { - instruction.Operands = $"{destOperand}, ??"; - - // Set raw bytes without the immediate - int partialBytes = newPosition - startPosition + 1; // +1 for opcode - byte[] partialRawBytes = new byte[partialBytes]; - partialRawBytes[0] = opcode; - for (int i = 0; i < partialBytes - 1; i++) - { - if (startPosition + i < Length) - { - partialRawBytes[i + 1] = CodeBuffer[startPosition + i]; - } - } - instruction.RawBytes = partialRawBytes; - - return true; + return false; } // Read the immediate value as a signed byte and automatically sign-extend it to int int signExtendedImm = (sbyte)Decoder.ReadByte(); - // Format the immediate value as a 32-bit hex value + // Format the immediate value string immStr; if (signExtendedImm < 0) { @@ -142,26 +79,13 @@ public class AddImmToRm32SignExtendedHandler : InstructionHandler } else { - // For positive values, use the regular format + // For positive values, use the regular format with leading zeros immStr = $"0x{signExtendedImm:X8}"; } // Set the operands instruction.Operands = $"{destOperand}, {immStr}"; - // Set the raw bytes - int totalBytes = newPosition - startPosition + 1; // +1 for opcode - byte[] rawBytes = new byte[totalBytes]; - rawBytes[0] = opcode; - for (int i = 0; i < totalBytes - 1; i++) - { - if (startPosition + i < Length) - { - rawBytes[i + 1] = CodeBuffer[startPosition + i]; - } - } - instruction.RawBytes = rawBytes; - return true; } } diff --git a/X86Disassembler/X86/Handlers/Int3Handler.cs b/X86Disassembler/X86/Handlers/Nop/Int3Handler.cs similarity index 100% rename from X86Disassembler/X86/Handlers/Int3Handler.cs rename to X86Disassembler/X86/Handlers/Nop/Int3Handler.cs