protected void OneByteOpcode(TargetReader reader, byte opcode)
{
if (OneByte_Has_ModRM [opcode] != 0)
DecodeModRM (reader);
if ((opcode >= 0x70) && (opcode <= 0x7f)) {
CallTarget = Address + reader.BinaryReader.ReadSByte () + 2;
type = Type.ConditionalJump;
} else if ((opcode >= 0xe0) && (opcode <= 0xe3)) {
CallTarget = Address + reader.BinaryReader.ReadSByte () + 2;
type = Type.ConditionalJump;
} else if ((opcode == 0xe8) || (opcode == 0xe9)) {
if ((RexPrefix & X86_REX_Prefix.REX_W) != 0) {
long offset = reader.BinaryReader.ReadInt32 ();
long long_target = Address.Address + offset + 5;
CallTarget = new TargetAddress (
Address.Domain, long_target);
} else if ((Prefix & X86_Prefix.ADDR) != 0) {
short offset = reader.BinaryReader.ReadInt16 ();
int short_target = (short)Address.Address + offset + 3;
CallTarget = new TargetAddress (
Address.Domain, short_target);
} else {
int offset = reader.BinaryReader.ReadInt32 ();
CallTarget = Address + offset + 5;
}
type = (opcode == 0xe8) ? Type.Call : Type.Jump;
} else if (opcode == 0xeb) {
CallTarget = Address + reader.BinaryReader.ReadSByte () + 2;
type = Type.Jump;
} else if (opcode == 0xc3) {
type = Type.Ret;
} else if (opcode == 0x55) { /* push %rbp */
type = Type.Interpretable;
} else if (opcode == 0xc2) {
Displacement = reader.BinaryReader.ReadInt16 ();
type = Type.Ret;
} else if (opcode == 0xff) {
DecodeGroup5 (reader);
} else if (opcode == 0x90) {
type = Type.Interpretable;
}
}