Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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;
        }