2025-04-14 22:08:50 +03:00
|
|
|
namespace X86Disassembler.X86.Operands;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Base class for all memory operands in an x86 instruction
|
|
|
|
/// </summary>
|
|
|
|
public abstract class MemoryOperand : Operand
|
|
|
|
{
|
|
|
|
/// <summary>
|
|
|
|
/// Gets or sets the segment override (if any)
|
|
|
|
/// </summary>
|
|
|
|
public string? SegmentOverride { get; set; }
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Initializes a new instance of the MemoryOperand class
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="size">The size of the memory access in bits</param>
|
|
|
|
/// <param name="segmentOverride">Optional segment override</param>
|
|
|
|
protected MemoryOperand(int size = 32, string? segmentOverride = null)
|
|
|
|
{
|
|
|
|
Size = size;
|
|
|
|
SegmentOverride = segmentOverride;
|
|
|
|
}
|
2025-04-15 02:32:14 +03:00
|
|
|
|
2025-04-15 02:29:32 +03:00
|
|
|
/// <summary>
|
|
|
|
/// Gets the size prefix string for display (e.g., "byte ptr", "word ptr", "dword ptr")
|
|
|
|
/// </summary>
|
|
|
|
/// <returns>The size prefix string</returns>
|
|
|
|
protected string GetSizePrefix()
|
|
|
|
{
|
2025-04-16 21:44:02 +03:00
|
|
|
// Use size-based prefix
|
2025-04-15 02:29:32 +03:00
|
|
|
string sizePrefix = Size switch
|
|
|
|
{
|
|
|
|
8 => "byte ptr ",
|
|
|
|
16 => "word ptr ",
|
|
|
|
32 => "dword ptr ",
|
2025-04-16 21:44:02 +03:00
|
|
|
48 => "fword ptr ",
|
2025-04-15 02:29:32 +03:00
|
|
|
64 => "qword ptr ",
|
|
|
|
_ => ""
|
|
|
|
};
|
|
|
|
|
|
|
|
// If we have a segment override, include it in the format "dword ptr es:[reg]"
|
|
|
|
if (SegmentOverride != null)
|
|
|
|
{
|
|
|
|
return $"{sizePrefix}{SegmentOverride}:";
|
|
|
|
}
|
|
|
|
|
|
|
|
return sizePrefix;
|
2025-04-14 22:08:50 +03:00
|
|
|
}
|
|
|
|
}
|