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; }
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; }
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); }
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; }
private void Write(Sib sib) => Write((byte)sib);