namespace X86Disassembler.X86.Operands; /// /// Represents an immediate value operand in an x86 instruction /// public class ImmediateOperand : Operand { /// /// Gets or sets the immediate value /// public ulong Value { get; set; } /// /// Initializes a new instance of the ImmediateOperand class /// /// The immediate value /// The size of the value in bits public ImmediateOperand(long value, int size = 32) { Type = OperandType.ImmediateValue; // For negative values in 32-bit mode, convert to unsigned 32-bit representation if (value < 0 && size == 32) { Value = (ulong)(uint)value; // Sign-extend to 32 bits, then store as unsigned } else { Value = (ulong)value; } Size = size; } /// /// Returns a string representation of this operand /// public override string ToString() { // Mask the value based on its size ulong maskedValue = Size switch { 8 => Value & 0xFF, 16 => Value & 0xFFFF, 32 => Value & 0xFFFFFFFF, _ => Value }; string format; if (maskedValue == 0) { format = "X2"; } else if (maskedValue <= 0xFF) { format = "X2"; } else if (maskedValue <= 0xFFFF) { format = "X4"; } else { format = "X8"; } return $"0x{maskedValue.ToString(format)}"; } }