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):X2}";
}
return $"{GetSizePrefix()}[{baseRegPart}{indexPart}{dispPart}]";
}
}