private X86Operand ReadOperand(X86OperandType method, X86OperandSize size, byte opcode, byte registerToken)
{
switch (method)
{
case X86OperandType.OpCodeRegister:
return new X86Operand(GetRegisterFromToken((byte)(opcode & 7), GetRegisterSize(size)));
case X86OperandType.Register:
return new X86Operand(GetRegisterFromToken((byte)((registerToken >> 3) & 7),
GetRegisterSize(size)));
case X86OperandType.RegisterOrMemoryAddress:
return GetRegOrMemOperand32(registerToken, size);
case X86OperandType.ImmediateData:
return new X86Operand(ReadImmediateData(size));
case X86OperandType.MemoryAddress:
return new X86Operand(GetOperandType(size), _reader.ReadUInt32());
case X86OperandType.RegisterAl:
return new X86Operand(X86Register.Al);
case X86OperandType.RegisterCl:
return new X86Operand(X86Register.Cl);
case X86OperandType.RegisterDx:
return new X86Operand(X86Register.Dx);
case X86OperandType.RegisterEax:
return new X86Operand(X86Register.Eax);
case X86OperandType.ImmediateOne:
return new X86Operand(1);
case X86OperandType.RelativeOffset:
return new X86Operand((ulong)(Convert.ToInt64(ReadSignedImmediateData(size)) + BaseAddress + _reader.Position));
case X86OperandType.None:
return null;
}
throw new NotSupportedException("Unrecognized or unsupported addressing method.");
}