public X86Instruction ReadNextInstruction()
{
long offset = BaseAddress + _reader.Position;
byte code1 = _reader.ReadByte();
var instruction = new X86Instruction(offset)
{
OpCode = ReadOpcode(code1)
};
if (instruction.OpCode.Mnemonics == null)
{
instruction.Operand1 = new X86Operand(code1);
return instruction;
}
var registerToken = instruction.OpCode.HasRegisterToken ? _reader.ReadByte() : (byte)0;
var mnemonicIndex = instruction.OpCode.HasOpCodeModifier ? (registerToken >> 3) & 7 : 0;
instruction.Mnemonic = instruction.OpCode.Mnemonics[mnemonicIndex];
instruction.Operand1 = ReadOperand(instruction.OpCode.OperandTypes1[mnemonicIndex],
instruction.OpCode.OperandSizes1[mnemonicIndex], instruction.OpCode.Op1, registerToken);
instruction.Operand2 = ReadOperand(instruction.OpCode.OperandTypes2[mnemonicIndex],
instruction.OpCode.OperandSizes2[mnemonicIndex], instruction.OpCode.Op1, registerToken);
return instruction;
}