protected void DecodeGroup5(TargetReader reader)
{
if ((ModRM.Reg == 2) || (ModRM.Reg == 3))
type = Type.IndirectCall;
else if ((ModRM.Reg == 4) || (ModRM.Reg == 5))
type = Type.IndirectJump;
else
return;
int displacement = 0;
bool dereference_addr;
int register;
int index_register = -1;
if ((ModRM.R_M == 5) || (ModRM.R_M == 13)) {
/* Special meaning in mod == 00 */
if (ModRM.Mod == 0) {
if (Is64BitMode) {
displacement = reader.BinaryReader.ReadInt32 ();
register = -1;
is_ip_relative = true;
} else {
CallTarget = reader.ReadAddress ();
return;
}
} else {
register = DecodeRegister (ModRM.R_M);
}
} else if ((ModRM.R_M == 4) || (ModRM.R_M == 12)) {
/* Activate SIB byte if mod != 11 */
if (ModRM.Mod != 3) {
SIB = new X86_SIB (this, reader.ReadByte ());
if ((ModRM.Mod == 0) &&
((SIB.Base == 5) || (SIB.Base == 13))) {
displacement = reader.BinaryReader.ReadInt32 ();
CallTarget = new TargetAddress (
reader.AddressDomain, displacement);
return;
}
if (SIB.Index != 4) {
index_register = DecodeRegister (SIB.Index);
}
register = DecodeRegister (SIB.Base);
} else {
register = DecodeRegister (ModRM.R_M);
}
} else {
register = DecodeRegister (ModRM.R_M);
}
if (ModRM.Mod == 0) {
dereference_addr = true;
} else if (ModRM.Mod == 1) {
displacement = reader.BinaryReader.ReadSByte ();
dereference_addr = true;
} else if (ModRM.Mod == 2) {
displacement = reader.BinaryReader.ReadInt32 ();
dereference_addr = true;
} else if (ModRM.Mod == 3) {
displacement = 0;
dereference_addr = false;
} else {
// Can never happen
throw new InvalidOperationException ();
}
Register = register;
IndexRegister = index_register;
Displacement = displacement;
DereferenceAddress = dereference_addr;
}