0
mirror of https://github.com/sampletext32/ParkanPlayground.git synced 2025-06-20 08:18:36 +03:00

Fixed several instruction handling issues: 1) Added proper handling for zero displacements in memory operands, 2) Fixed large unsigned displacement values display, 3) Added CmpEaxImmHandler for CMP EAX, imm32 instruction, 4) Fixed JP and JNP conditional jump instruction types

This commit is contained in:
bird_egop
2025-04-16 19:43:03 +03:00
parent 193f9cd2d8
commit db96af74ff
13 changed files with 271 additions and 47 deletions

View File

@ -0,0 +1,60 @@
using X86Disassembler.X86.Operands;
namespace X86Disassembler.X86.Handlers.Cmp;
/// <summary>
/// Handler for CMP EAX, imm32 instruction (opcode 3D)
/// </summary>
public class CmpEaxImmHandler : InstructionHandler
{
/// <summary>
/// Initializes a new instance of the CmpEaxImmHandler class
/// </summary>
/// <param name="decoder">The instruction decoder that owns this handler</param>
public CmpEaxImmHandler(InstructionDecoder decoder)
: base(decoder)
{
}
/// <summary>
/// Checks if this handler can decode the given opcode
/// </summary>
/// <param name="opcode">The opcode to check</param>
/// <returns>True if this handler can decode the opcode</returns>
public override bool CanHandle(byte opcode)
{
// CMP EAX, imm32 is encoded as 3D
return opcode == 0x3D;
}
/// <summary>
/// Decodes a CMP EAX, imm32 instruction
/// </summary>
/// <param name="opcode">The opcode of the instruction</param>
/// <param name="instruction">The instruction object to populate</param>
/// <returns>True if the instruction was successfully decoded</returns>
public override bool Decode(byte opcode, Instruction instruction)
{
// Set the instruction type
instruction.Type = InstructionType.Cmp;
// Check if we have enough bytes for the immediate value
if (!Decoder.CanReadUInt())
{
return false;
}
// Read the immediate value
uint imm32 = Decoder.ReadUInt32();
// Set the structured operands
// CMP EAX, imm32 has two operands: EAX and the immediate value
instruction.StructuredOperands =
[
OperandFactory.CreateRegisterOperand(RegisterIndex.A),
OperandFactory.CreateImmediateOperand(imm32)
];
return true;
}
}