private void DecodeSingleRegister(ref x86Instruction instruction, byte registersToken)
{
x86Instruction result = instruction;
x86OpCode resultopcode = instruction.OpCode;
resultopcode._opcodeBytes[instruction.OpCode._variableByteIndex] = registersToken;
result.OpCode = resultopcode;
bool isGroupOpCode = MatchWithOpCodes(instruction.OpCode._opcodeBytes[0]).Length > 1;
int actualregister = registersToken % 8;
OperandType registerValueType = OperandType.Normal;
int addition = 0;
if (registersToken < 0x40)
{
//normal dword pointer
if (!isGroupOpCode && registersToken >= 0x8)
{
ProcessInvalidInstruction(instruction);
return;
}
registerValueType = OperandType.DwordPointer;
}
else if (registersToken >= 0x40 && registersToken < 0x80)
{
//dword pointer + sbyte addition
if (!isGroupOpCode && registersToken >= 0x48)
{
ProcessInvalidInstruction(instruction);
return;
}
registerValueType = OperandType.DwordPointer;
instruction.operandbytes = new byte[] { reader.ReadByte() };
instruction.OpCode._operandLength++;
addition = ASMGlobals.ByteToSByte(instruction.operandbytes[0]);
}
else if (registersToken >= 0x80 && registersToken < 0xC0)
{
//dword pointer + int addition
if (!isGroupOpCode && registersToken >= 0x88)
{
ProcessInvalidInstruction(instruction);
return;
}
registerValueType = OperandType.DwordPointer;
instruction.operandbytes = reader.ReadBytes(4);
instruction.OpCode._operandLength += 4;
addition = BitConverter.ToInt32(instruction.operandbytes, 0);
}
else if (registersToken >= 0xC0 && registersToken <= 0xFF)
{
// normal register -> do nothing.
if (!isGroupOpCode && registersToken >= 0xC8)
{
ProcessInvalidInstruction(instruction);
return;
}
}
else
{
// TODO: Invalid single register token.
}
if (instruction.OpCode._operandType.HasFlag(x86OperandType.Register8))
{
actualregister |= (byte)x86Register.Bit8Mask;
}
if (instruction.OpCode._operandType.HasFlag(x86OperandType.Register32Or8))
{
actualregister |= GetSingleRegisterMask(registersToken);
}
instruction.operand1 = new Operand((x86Register)actualregister, registerValueType, addition);
}