/* Copyright (C) 2018 de4dot@gmail.com This file is part of Iced. Iced is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Iced is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Iced. If not, see . */ #if !NO_ENCODER namespace Iced.Intel { /// /// Memory operand /// public readonly struct MemoryOperand { /// /// Segment override or /// public readonly Register PrefixSegment; /// /// Base register or /// public readonly Register Base; /// /// Index register or /// public readonly Register Index; /// /// Index register scale (1, 2, 4, or 8) /// public readonly int Scale; /// /// Memory displacement, or ignored if is 0 /// public readonly int Displacement; /// /// 0 if no , else 1 (16/32/64-bit), 2 (16-bit), 4 (32-bit) or 8 (64-bit) /// public readonly int DisplSize; /// /// Memory size. The encoder uses this to check if it's broadcasted memory. The formatters use it to show the memory size info /// public readonly MemorySize Size; /// /// Constructor /// /// Base register or /// Index register or /// Index register scale (1, 2, 4, or 8) /// Memory displacement, or ignored if is 0 /// 0 if no , else 1 (16/32/64-bit), 2 (16-bit), 4 (32-bit) or 8 (64-bit) /// Memory size. The encoder uses this to check if it's broadcasted memory. The formatters use it to show the memory size info /// Segment override or public MemoryOperand(Register @base, Register index, int scale, int displacement, int displSize, MemorySize size, Register prefixSegment) { PrefixSegment = prefixSegment; Base = @base; Index = index; Scale = scale; Displacement = displacement; DisplSize = displSize; Size = size; } /// /// Constructor /// /// Base register or /// Index register or /// Index register scale (1, 2, 4, or 8) /// Memory size. The encoder uses this to check if it's broadcasted memory. The formatters use it to show the memory size info /// Segment override or public MemoryOperand(Register @base, Register index, int scale, MemorySize size, Register prefixSegment) { PrefixSegment = prefixSegment; Base = @base; Index = index; Scale = scale; Displacement = 0; DisplSize = 0; Size = size; } /// /// Constructor /// /// Base register or /// Memory displacement, or ignored if is 0 /// 0 if no , else 1 (16/32/64-bit), 2 (16-bit), 4 (32-bit) or 8 (64-bit) /// Memory size. The encoder uses this to check if it's broadcasted memory. The formatters use it to show the memory size info /// Segment override or public MemoryOperand(Register @base, int displacement, int displSize, MemorySize size, Register prefixSegment) { PrefixSegment = prefixSegment; Base = @base; Index = Register.None; Scale = 1; Displacement = displacement; DisplSize = displSize; Size = size; } /// /// Constructor /// /// Index register or /// Index register scale (1, 2, 4, or 8) /// Memory displacement, or ignored if is 0 /// 0 if no , else 1 (16/32/64-bit), 2 (16-bit), 4 (32-bit) or 8 (64-bit) /// Memory size. The encoder uses this to check if it's broadcasted memory. The formatters use it to show the memory size info /// Segment override or public MemoryOperand(Register index, int scale, int displacement, int displSize, MemorySize size, Register prefixSegment) { PrefixSegment = prefixSegment; Base = Register.None; Index = index; Scale = scale; Displacement = displacement; DisplSize = displSize; Size = size; } /// /// Constructor /// /// Base register or /// Memory displacement /// Memory size. The encoder uses this to check if it's broadcasted memory. The formatters use it to show the memory size info /// Segment override or public MemoryOperand(Register @base, int displacement, MemorySize size, Register prefixSegment) { PrefixSegment = prefixSegment; Base = @base; Index = Register.None; Scale = 1; Displacement = displacement; DisplSize = 1; Size = size; } /// /// Constructor /// /// Base register or /// Index register or /// Index register scale (1, 2, 4, or 8) /// Memory displacement, or ignored if is 0 /// 0 if no , else 1 (16/32/64-bit), 2 (16-bit), 4 (32-bit) or 8 (64-bit) public MemoryOperand(Register @base, Register index, int scale, int displacement, int displSize) { PrefixSegment = Register.None; Base = @base; Index = index; Scale = scale; Displacement = displacement; DisplSize = displSize; Size = MemorySize.Unknown; } /// /// Constructor /// /// Base register or /// Index register or /// Index register scale (1, 2, 4, or 8) public MemoryOperand(Register @base, Register index, int scale) { PrefixSegment = Register.None; Base = @base; Index = index; Scale = scale; Displacement = 0; DisplSize = 0; Size = MemorySize.Unknown; } /// /// Constructor /// /// Base register or /// Memory displacement, or ignored if is 0 /// 0 if no , else 1 (16/32/64-bit), 2 (16-bit), 4 (32-bit) or 8 (64-bit) public MemoryOperand(Register @base, int displacement, int displSize) { PrefixSegment = Register.None; Base = @base; Index = Register.None; Scale = 1; Displacement = displacement; DisplSize = displSize; Size = MemorySize.Unknown; } /// /// Constructor /// /// Index register or /// Index register scale (1, 2, 4, or 8) /// Memory displacement, or ignored if is 0 /// 0 if no , else 1 (16/32/64-bit), 2 (16-bit), 4 (32-bit) or 8 (64-bit) public MemoryOperand(Register index, int scale, int displacement, int displSize) { PrefixSegment = Register.None; Base = Register.None; Index = index; Scale = scale; Displacement = displacement; DisplSize = displSize; Size = MemorySize.Unknown; } /// /// Constructor /// /// Base register or /// Memory displacement public MemoryOperand(Register @base, int displacement) { PrefixSegment = Register.None; Base = @base; Index = Register.None; Scale = 1; Displacement = displacement; DisplSize = 1; Size = MemorySize.Unknown; } } } #endif