Exemplo n.º 1
0
			public Encoding(ModRM modRM, Sib? sib = null, int displacement = 0)
			{
				this.Segment = null;
				this.AddressSizeOverride = false;
				this.BaseRegExtension = false;
				this.IndexRegExtension = false;
				this.ModRM = modRM;
				this.Sib = sib;
				this.Displacement = displacement;
			}
Exemplo n.º 2
0
			public Encoding(ImmutableLegacyPrefixList legacyPrefixes, Xex xex,
				ModRM modRM, Sib? sib = null, int displacement = 0)
			{
				this.Segment = legacyPrefixes.SegmentOverride;
				this.AddressSizeOverride = legacyPrefixes.HasAddressSizeOverride;
				this.BaseRegExtension = xex.BaseRegExtension;
				this.IndexRegExtension = xex.IndexRegExtension;
				this.ModRM = modRM;
				this.Sib = sib;
				this.Displacement = displacement;
			}
Exemplo n.º 3
0
		private readonly ulong immediate; // 8 bytes
		#endregion

		#region Constructors
		private Instruction(Builder builder)
		{
			legacyPrefixes = builder.LegacyPrefixes;
			xex = builder.Xex; // Validate if redundant with prefixes
			mainByte = builder.OpcodeByte;
			modRM = builder.ModRM.GetValueOrDefault();
			sib = builder.Sib.GetValueOrDefault(); // Validate if necessary
			displacement = builder.Displacement; // Validate with mod/sib
			immediate = builder.Immediate; // Truncate to size

			flags = 0;
			flags |= (Flags)((int)builder.DefaultAddressSize << (int)Flags.DefaultAddressSize_Shift);
			if (builder.ModRM.HasValue) flags |= Flags.HasModRM;
			flags |= (Flags)(builder.ImmediateSizeInBytes << (int)Flags.ImmediateSizeInBytes_Shift);
		}
Exemplo n.º 4
0
		public static DisplacementSize GetDisplacementSize(this ModRM modRM, Sib sib, AddressSize addressSize)
		{
			switch (modRM & ModRM.Mod_Mask)
			{
				case ModRM.Mod_IndirectDisplacement8:
					return DisplacementSize._8;
				case ModRM.Mod_IndirectLongDisplacement:
					return addressSize == AddressSize._16 ? DisplacementSize._16 : DisplacementSize._32;
				case ModRM.Mod_Direct: return 0;
			}

			// Mod = 0
			if (addressSize == AddressSize._16)
				return GetRM(modRM) == 6 ? DisplacementSize._16 : DisplacementSize._0;

			if (GetRM(modRM) == 5) return DisplacementSize._32;

			// 32-bit mode, mod = 0, RM = 6 (sib byte)
			return (sib & Sib.Base_Mask) == Sib.Base_Special ? DisplacementSize._32 : DisplacementSize._0;
		}
Exemplo n.º 5
0
		private void Write(Sib sib) => Write((byte)sib);