namespace X86Disassembler.X86.Operands; /// /// Represents a memory operand with scale, index, and base in an x86 instruction (e.g., [eax+ecx*4+0x8]) /// public class ScaledIndexMemoryOperand : MemoryOperand { /// /// Gets or sets the base register /// public RegisterIndex? BaseRegister { get; set; } /// /// Gets or sets the index register /// public RegisterIndex IndexRegister { get; set; } /// /// Gets or sets the scale factor (1, 2, 4, or 8) /// public int Scale { get; set; } /// /// Gets or sets the displacement value /// public long Displacement { get; set; } /// /// Initializes a new instance of the ScaledIndexMemoryOperand class /// /// The index register /// The scale factor (1, 2, 4, or 8) /// The optional base register /// The displacement value /// The size of the memory access in bits /// Optional segment override public ScaledIndexMemoryOperand(RegisterIndex indexRegister, int scale, RegisterIndex? baseRegister = null, long displacement = 0, int size = 32, string? segmentOverride = null) : base(size, segmentOverride) { Type = OperandType.MemoryIndexed; IndexRegister = indexRegister; Scale = scale; BaseRegister = baseRegister; Displacement = displacement; } /// /// Returns a string representation of this operand /// public override string ToString() { string baseRegPart = BaseRegister != null ? $"{ModRMDecoder.GetRegisterName(BaseRegister.Value, 32)}+" : ""; string indexPart = $"{ModRMDecoder.GetRegisterName(IndexRegister, 32)}*{Scale}"; string dispPart = ""; if (Displacement != 0) { string sign = Displacement > 0 ? "+" : ""; dispPart = $"{sign}0x{Math.Abs(Displacement):X}"; } return $"{GetSizePrefix()}[{baseRegPart}{indexPart}{dispPart}]"; } }