private void DecodeDoubleRegisters(ref x86Instruction instruction, byte registersToken)
{
x86Instruction result = instruction;
x86OpCode resultopcode = instruction.OpCode;
if (resultopcode._variableByteIndex == -1)
return;
resultopcode._opcodeBytes[instruction.OpCode._variableByteIndex] = registersToken;
result.OpCode = resultopcode;
// lea instructions has got different notations.
bool isLEA = instruction.OpCode.IsBasedOn(x86OpCodes.Lea);
x86Register register1;
x86Register register2;
DecodeRegisterPair(instruction, registersToken, out register1, out register2);
// one register is a dword pointer
if (registersToken <= 0x3F)
{
instruction.operand1 = new Operand(register1, OperandType.DwordPointer);
instruction.operand2 = new Operand(register2, OperandType.Normal);
}
// one register is a dword pointer with an sbyte addition
else if (registersToken > 0x3F && registersToken < 0x7F)
{
instruction.operandbytes = reader.ReadBytes(1);
instruction.code._operandLength++;
instruction.operand1 = new Operand(register1, isLEA ? OperandType.LeaRegister : OperandType.DwordPointer, ASMGlobals.ByteToSByte(instruction.operandbytes[0]));
instruction.operand2 = new Operand(register2, OperandType.Normal);
}
// one register is a dword pointer with an int32 addition
else if (registersToken >= 0x80 && registersToken <= 0xBF)
{
instruction.operandbytes = reader.ReadBytes(4);
instruction.code._operandLength += 4;
int addition = BitConverter.ToInt32(instruction.operandbytes, 0);
instruction.operand1 = new Operand(register1, isLEA ? OperandType.LeaRegister : OperandType.DwordPointer, addition);
instruction.operand2 = new Operand(register2, OperandType.Normal);
}
// normal multiple registers.
else if (registersToken >= 0xC0 && registersToken <= 0xFF)
{
instruction.operand1 = new Operand(register1, isLEA ? OperandType.LeaRegister : OperandType.Normal);
instruction.operand2 = new Operand(register2, OperandType.Normal);
}
}