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; }
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; }