Mono.Debugger.Architectures.X86_Instruction.DecodeGroup5 C# (CSharp) Method

DecodeGroup5() protected method

protected DecodeGroup5 ( TargetReader reader ) : void
reader Mono.Debugger.Backend.TargetReader
return void
        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;
        }