protected internal override uint InternalComputeSize(IAssemblingContext context) { if (m_address.OffsetElement != null && !context.IsPositioned(m_address.OffsetElement)) { return(6); // max size } int dispValue = GetDisplacementValue(context); uint dispCode = GetDisplacementCode(dispValue); uint dispSize = GetDisplacementSize(dispCode); if (m_address.Base == null) { if (m_address.Index == null) { return(5); // modrm + disp32 } else { return(6); // modrm + sib + disp32 } } else { if (m_address.Base == Register32.ESP) { return(2 + dispSize); // modrm + sib + ? } else { if (m_address.Base == Register32.EBP) { if (dispCode == 0) { return(3); // modrm + sib + disp8 } else { return(2 + dispSize); // modrm + sib + ? } } else { if (m_address.Index == null) { return(1 + dispSize); // modrm + ? } else { return(2 + dispSize); // modrm + sib + ? } } } } }
internal override uint ComputeSize(IAssemblingContext context) { if (!context.IsPositioned(this) || !context.IsPositioned(m_offsetElement)) { return(5); } UInt32 jmpAddress = context.GetRelativeMemoryAddress(this); UInt32 refAddress = context.GetRelativeMemoryAddress(m_offsetElement); int diff = (int)(refAddress - jmpAddress) + m_offsetValue; if (diff >= -126 && diff <= 129) { return(2); } else { return(5); } }