private static byte ComputeRegOrMemSibToken(X86Operand operand)
{
// Mechanism:
// http://ref.x86asm.net/coder32.html#sib_byte_32
// SIB-byte:
// mul | scaled_reg | reg
// -----+------------+-------
// 7 6 | 5 4 3 | 2 1 0
var token = ComputeRegisterToken((X86Register)operand.Value);
if (operand.ScaledIndex == null)
token |= 0x20;
else
{
token |= (byte)(ComputeRegisterToken(operand.ScaledIndex.Register) << 3);
switch (operand.ScaledIndex.Multiplier)
{
case 1:
break;
case 2:
token |= 0x40;
break;
case 4:
token |= 0x80;
break;
case 8:
token |= 0xC0;
break;
default:
throw new ArgumentException("Operand has an invalid scaled index multiplier.", "operand");
}
}
return token;
}