Пример #1
0
        public int GetAddress(int memoperand)
        {
            var RegOffset = new Nbit(4);
            var MemPoint  = new Nbit(28);

            RegOffset.Value = memoperand >> 28;
            MemPoint.Value  = memoperand;
            var i1 = (RegOffset.Value != 15 ? MRT.Registers[RegOffset.Value] : 0) + (int)MemPoint;

            return(i1);
        }
Пример #2
0
        public static int ParseMemAddress(int reg, int shifset)
        {
            var RegOffset = new Nbit(4)
            {
                Value = reg
            };
            var MemPoint = new Nbit(28)
            {
                Value = shifset
            };

            return(RegOffset.Value << 28 | MemPoint.Value);
        }
Пример #3
0
        public static Operand Parse(string s)
        {
            var o = new Operand();

            o.OperandType = char.IsDigit(s[0]) ? OperandType.imm : (s[0] == '[' ? OperandType.Mem : OperandType.Reg);
            switch (o.OperandType)
            {
            case OperandType.Reg:
                o.Value = Registers.GetHasheCode(s);
                break;

            case OperandType.imm:
                int c;
                if (s.Length > 2 && s[1] == 'x')
                {
                    s       = s.Substring(2);
                    o.Value = int.Parse(s, NumberStyles.AllowHexSpecifier);
                    c       = s.Length;
                }
                else
                {
                    o.Value = int.Parse(s, NumberStyles.Integer);
                    c       = 32;
                }

                o.DataType = c == 1
                        ? DataType.Hex
                        : (c == 2 ? DataType.Byte : (c <= 4 ? DataType.Word : DataType.DWord));
                break;

            case OperandType.Mem:
                Nbit a = new Nbit(4, -1), b = new Nbit(28, 0);
                var  d = s.Substring(1, s.Length - 2).Split(new[] { '+' }, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < d.Length; i++)
                {
                    if (d[i][0] == '0')
                    {
                        b.Value = int.Parse(d[i].Substring(2), NumberStyles.AllowHexSpecifier);
                    }
                    else
                    {
                        a.Value = Registers.GetHasheCode(d[i]);
                    }
                }
                o.Value = a.Value << 28 | b.Value;
                break;
            }
            return(o);
        }
Пример #4
0
        public static int MemOperandType(string s)
        {
            int  r = 0;
            Nbit a = new Nbit(4, -1), b = new Nbit(28, 0);
            var  d = s.Split(new[] { '+' }, StringSplitOptions.RemoveEmptyEntries);

            for (int i = 0; i < d.Length; i++)
            {
                if (IsNumbre(d[i], out r))
                {
                    b.Value = r;
                }
                else
                {
                    a.Value = Registers.GetHasheCode(d[i]);
                }
            }
            return(a.Value << 28 | b.Value);
        }
Пример #5
0
        public override string ToString()
        {
            switch (OperandType)
            {
            case OperandType.Reg:
                return(Registers.GetName(Value));

            case OperandType.Mem:
                Nbit   a = new Nbit(4, Value >> 28), b = new Nbit(28, Value);
                string c = "[";
                if (a.Value != 15)
                {
                    c += Registers.GetName(a.Value) + (b.Value != 0 ? "+" : "");
                }
                c += a.Value != 15 && b.Value == 0 ? "]" : "0x" + b.Value.ToString("x7") + "]";
                return(c);

            case OperandType.imm:
                c = "0x";
                switch (DataType)
                {
                case DataType.Hex:
                    return(c + ((byte)(Value & 0xf)).ToString("x1", CultureInfo.InvariantCulture));

                case DataType.Byte:
                    return(c + ((byte)Value).ToString("x2", CultureInfo.InvariantCulture));

                case DataType.Word:
                    return(c + ((short)Value).ToString("x4", CultureInfo.InvariantCulture));

                case DataType.DWord:
                    return(c + Value.ToString("x8", CultureInfo.InvariantCulture));
                }
                break;
            }
            return("");
        }
Пример #6
0
        public static int MemOperandType(int reg, int offset)
        {
            Nbit a = new Nbit(4, reg), b = new Nbit(28, offset);

            return(a.Value << 28 | b.Value);
        }