/// <summary>
        /// Gets the value of the specified part of the register.
        /// </summary>
        /// <param name="type">The specific part of the register to get.</param>
        /// <returns></returns>
        public uint GetValue(RegisterSubType type)
        {
            switch (type)
            {
            case RegisterSubType.Full: return(Value);

            case RegisterSubType.LowWord: return(LowWord);

            case RegisterSubType.LowByte: return(LowByte);

            case RegisterSubType.HighByte: return(HighByte);

            default: throw new ArgumentException();
            }
        }
        /// <summary>
        /// Sets the specified part of the register to the specified value.
        /// </summary>
        /// <param name="type">The specific part of the register to set.</param>
        /// <param name="value">The value to set.</param>
        public void SetValue(RegisterSubType type, uint value)
        {
            switch (type)
            {
            case RegisterSubType.Full: Value = value; break;

            case RegisterSubType.LowWord: LowWord = (ushort)value; break;

            case RegisterSubType.LowByte: LowByte = (byte)value; break;

            case RegisterSubType.HighByte: HighByte = (byte)value; break;

            default: throw new ArgumentException();
            }
        }
Exemple #3
0
 /// <summary>
 /// Gets the value of the specified part of the register.
 /// </summary>
 /// <param name="type">The specific part of the register to get.</param>
 /// <returns></returns>
 public uint GetValue(RegisterSubType type)
 {
     switch (type)
     {
         case RegisterSubType.Full: return Value;
         case RegisterSubType.LowWord: return LowWord;
         case RegisterSubType.LowByte: return LowByte;
         case RegisterSubType.HighByte: return HighByte;
         default: throw new ArgumentException();
     }
 }
Exemple #4
0
 /// <summary>
 /// Sets the specified part of the register to the specified value.
 /// </summary>
 /// <param name="type">The specific part of the register to set.</param>
 /// <param name="value">The value to set.</param>
 public void SetValue(RegisterSubType type, uint value)
 {
     switch (type)
     {
         case RegisterSubType.Full: Value = value; break;
         case RegisterSubType.LowWord: LowWord = (ushort)value; break;
         case RegisterSubType.LowByte: LowByte = (byte)value; break;
         case RegisterSubType.HighByte: HighByte = (byte)value; break;
         default: throw new ArgumentException();
     }
 }
Exemple #5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="arg"></param>
        public InstructionArgument(Emulator env, string arg)
        {
            this.env = env;
            arg      = arg.Trim();

            if (arg.Contains("ptr"))
            {
                // get argument size
                // todo: default to dword if no size is specified
                if (arg.StartsWith("byte ptr ["))
                {
                    Size = 1;
                }
                else if (arg.StartsWith("word ptr ["))
                {
                    Size = 2;
                }
                else if (arg.StartsWith("dword ptr ["))
                {
                    Size = 4;
                }
                else if (arg.StartsWith("fword ptr ["))
                {
                    Size = 4;                                     // NYI
                }
                else
                {
                    throw new ArgumentException();
                }

                int lbi = arg.IndexOf('[');
                int rbi = arg.IndexOf(']');
                if (lbi > -1 && rbi > -1 && rbi > lbi)
                {
                    // get string inside brackets
                    string ptr = arg.Substring(lbi + 1, rbi - lbi - 1);

                    // replace registers with the values contained within
                    ptr = ptr.Replace("eax", env.Eax.Value.ToString());
                    ptr = ptr.Replace("ebx", env.Ebx.Value.ToString());
                    ptr = ptr.Replace("ecx", env.Ecx.Value.ToString());
                    ptr = ptr.Replace("edx", env.Edx.Value.ToString());
                    ptr = ptr.Replace("esi", env.Esi.Value.ToString());
                    ptr = ptr.Replace("edi", env.Edi.Value.ToString());
                    ptr = ptr.Replace("esp", env.Esp.Value.ToString());
                    ptr = ptr.Replace("ebp", env.Ebp.Value.ToString());
                    ptr = ptr.Replace("ax", env.Eax.Ax.ToString());
                    ptr = ptr.Replace("bx", env.Ebx.Bx.ToString());
                    ptr = ptr.Replace("cx", env.Ecx.Cx.ToString());
                    ptr = ptr.Replace("dx", env.Edx.Dx.ToString());
                    ptr = ptr.Replace("si", env.Esi.Si.ToString());
                    ptr = ptr.Replace("di", env.Edi.Di.ToString());
                    ptr = ptr.Replace("sp", env.Esp.Sp.ToString());
                    ptr = ptr.Replace("bp", env.Ebp.Bp.ToString());
                    ptr = ptr.Replace("al", env.Eax.Al.ToString());
                    ptr = ptr.Replace("ah", env.Eax.Ah.ToString());
                    ptr = ptr.Replace("bl", env.Ebx.Bl.ToString());
                    ptr = ptr.Replace("bh", env.Ebx.Bh.ToString());
                    ptr = ptr.Replace("cl", env.Ecx.Cl.ToString());
                    ptr = ptr.Replace("ch", env.Ecx.Ch.ToString());
                    ptr = ptr.Replace("dl", env.Edx.Dl.ToString());
                    ptr = ptr.Replace("dh", env.Edx.Dh.ToString());

                    // evaluate the resulting expression
                    Address = Expression.Evaluate(ptr);
                }
                else
                {
                    throw new ArgumentException();
                }

                Type = ArgumentType.Memory;
            }
            else if (arg == "eax")
            {
                Register     = env.Eax;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.Full;
                RegisterName = "eax";
                Size         = 4;
            }
            else if (arg == "ax")
            {
                Register     = env.Eax;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowWord;
                RegisterName = "ax";
                Size         = 2;
            }
            else if (arg == "ah")
            {
                Register     = env.Eax;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.HighByte;
                RegisterName = "ah";
                Size         = 1;
            }
            else if (arg == "al")
            {
                Register     = env.Eax;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowByte;
                RegisterName = "al";
                Size         = 1;
            }
            else if (arg == "ebx")
            {
                Register     = env.Ebx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.Full;
                RegisterName = "ebx";
                Size         = 4;
            }
            else if (arg == "bx")
            {
                Register     = env.Ebx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowWord;
                RegisterName = "bx";
                Size         = 2;
            }
            else if (arg == "bh")
            {
                Register     = env.Ebx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.HighByte;
                RegisterName = "bh";
                Size         = 1;
            }
            else if (arg == "bl")
            {
                Register     = env.Ebx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowByte;
                RegisterName = "bl";
                Size         = 1;
            }
            else if (arg == "ecx")
            {
                Register     = env.Ecx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.Full;
                RegisterName = "ecx";
                Size         = 4;
            }
            else if (arg == "cx")
            {
                Register     = env.Ecx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowWord;
                RegisterName = "cx";
                Size         = 2;
            }
            else if (arg == "ch")
            {
                Register     = env.Ecx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.HighByte;
                RegisterName = "ch";
                Size         = 1;
            }
            else if (arg == "cl")
            {
                Register     = env.Ecx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowByte;
                RegisterName = "cl";
                Size         = 1;
            }
            else if (arg == "edx")
            {
                Register     = env.Edx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.Full;
                RegisterName = "edx";
                Size         = 4;
            }
            else if (arg == "dx")
            {
                Register     = env.Edx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowWord;
                RegisterName = "dx";
                Size         = 2;
            }
            else if (arg == "dh")
            {
                Register     = env.Edx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.HighByte;
                RegisterName = "dh";
                Size         = 1;
            }
            else if (arg == "dl")
            {
                Register     = env.Edx;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowByte;
                RegisterName = "dl";
                Size         = 1;
            }
            else if (arg == "esi")
            {
                Register     = env.Esi;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.Full;
                RegisterName = "esi";
                Size         = 4;
            }
            else if (arg == "si")
            {
                Register     = env.Esi;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowWord;
                RegisterName = "si";
                Size         = 2;
            }
            else if (arg == "edi")
            {
                Register     = env.Edi;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.Full;
                RegisterName = "edi";
                Size         = 4;
            }
            else if (arg == "di")
            {
                Register     = env.Edi;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowWord;
                RegisterName = "di";
                Size         = 2;
            }
            else if (arg == "esp")
            {
                Register     = env.Esp;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.Full;
                RegisterName = "esp";
                Size         = 4;
            }
            else if (arg == "sp")
            {
                Register     = env.Esp;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowWord;
                RegisterName = "sp";
                Size         = 2;
            }
            else if (arg == "ebp")
            {
                Register     = env.Ebp;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.Full;
                RegisterName = "ebp";
                Size         = 4;
            }
            else if (arg == "bp")
            {
                Register     = env.Ebp;
                Type         = ArgumentType.Register;
                RegisterType = x86.RegisterSubType.LowWord;
                RegisterName = "bp";
                Size         = 2;
            }
            else
            {
                Type = ArgumentType.Immediate;

                // get immediate value
                if (arg.EndsWith("h"))
                {
                    Immediate = Convert.ToUInt32(arg.Substring(0, arg.Length - 1), 16);
                }
                else
                {
                    Immediate = Convert.ToUInt32(arg);
                }

                // get immediate size
                if ((uint)Immediate < byte.MaxValue)
                {
                    Size = 1;
                }
                else if ((uint)Immediate < ushort.MaxValue)
                {
                    Size = 2;
                }
                else
                {
                    Size = 4;
                }
            }
        }