示例#1
0
        public void GetSetBlBhTest()
        {
            var registers = new Registers();

            registers.Set(Reg8.bl, 15);
            registers.Set(Reg8.bh, 16);
            Assert.AreEqual(15, registers.Get(Reg8.bl));
            Assert.AreEqual(16, registers.Get(Reg8.bh));
        }
示例#2
0
    private static long Solve(Registers registers, string[] lines)
    {
        int i = 0;

        while (i < lines.Length)
        {
            string[] splits = lines[i].Split(" ");
            string   inst   = splits[0];
            switch (inst)
            {
            case "cpy":
            {
                string src     = splits[1];
                string destReg = splits[2];
                int    value   = char.IsDigit(src[0]) ? int.Parse(src) : registers.Get(src);
                registers.Set(destReg, value);
                i++;
                break;
            }

            case "inc":
            {
                string reg = splits[1];
                registers.Transform(reg, v => v + 1);
                i++;
                break;
            }

            case "dec":
            {
                string reg = splits[1];
                registers.Transform(reg, v => v - 1);
                i++;
                break;
            }

            case "jnz":
            {
                string cmpValueRaw = splits[1];
                int    cmpValue    = char.IsDigit(cmpValueRaw[0]) ? int.Parse(cmpValueRaw) : registers.Get(cmpValueRaw);
                int    jmpAmount   = cmpValue == 0 ? 1 : int.Parse(splits[2]);
                i += jmpAmount;
                break;
            }
            }
        }

        return(registers.Get("a"));
    }
示例#3
0
        public void GetSetAlTest()
        {
            var registers = new Registers();

            registers.Set(Reg8.al, 4);
            Assert.AreEqual(4, registers.Get(Reg8.al));
        }
示例#4
0
        public void GetSetAhTest()
        {
            var registers = new Registers();

            registers.Set(Reg8.ah, 8);
            Assert.AreEqual(8, registers.Get(Reg8.ah));
        }
示例#5
0
        protected ulong getValue(Registers regs, Stack stack, string expr, uint size = 4)
        {
            if (expr[0] == '%') // register
            {
                return(regs.Get(expr.Substring(1)));
            }

            if (expr[0] == '$') // number
            {
                return((ulong)long.Parse(expr.Substring(1)));
            }

            int leftBracket  = expr.IndexOf('(');
            int rightBracket = expr.IndexOf(')');

            if (leftBracket != -1 && rightBracket > leftBracket) // memory address pointed by register
            {
                int    disp     = (leftBracket == 0 ? 0 : int.Parse(expr.Substring(0, leftBracket)));
                string baseExpr = expr.Substring(leftBracket + 1, rightBracket - leftBracket - 1);
                uint   baseAddr = (uint)getValue(regs, stack, baseExpr);
                uint   realAddr = (uint)(baseAddr + disp);
                return(stack.MemGet(realAddr, size));
            }
            throw new ArgumentException("Unrecognized expression: " + expr);
        }
示例#6
0
        public void GetSetClChCxTest()
        {
            var registers = new Registers();

            registers.Set(Reg8.ch, 0x23);
            registers.Set(Reg8.cl, 0x42);
            Assert.AreEqual(0x2342, registers.Get(Reg16.cx));
        }
示例#7
0
文件: Stack.cs 项目: cleb/x86il
        public void PushValue(ushort Value)
        {
            var sp = registers.Get(Reg16.sp) - 2;

            BinaryHelper.Write16Bit(memory, (registers.Get(Segments.ss) << 4) + sp, Value);
            registers.Set(Reg16.sp, (ushort)sp);
        }
示例#8
0
    private static long Solve(Registers registers, string[] lines)
    {
        List <Command> commands = lines.Select(Parse).ToList();

        int j = 0;
        int i = 0;

        while (i < commands.Count)
        {
            int iStart = i;
            j++;
            Command c = commands[i];

            switch (c.Type)
            {
            case CommandType.Copy:
            {
                int value = c.Arg1IsInt ? int.Parse(c.Arg1) : registers.Get(c.Arg1);
                if (c.Arg2IsString)
                {
                    registers.Set(c.Arg2, value);
                }
                i++;
                break;
            }

            case CommandType.Increment:
            {
                if (c.Arg1IsString)
                {
                    registers.Transform(c.Arg1, v => v + 1);
                }
                i++;
                break;
            }

            case CommandType.Decrement:
            {
                if (c.Arg1IsString)
                {
                    registers.Transform(c.Arg1, v => v - 1);
                }
                i++;
                break;
            }

            case CommandType.JumpNotZero:
            {
                int cmpValue  = c.Arg1IsInt ? int.Parse(c.Arg1) : registers.Get(c.Arg1);
                int jmpAmount = cmpValue == 0
                            ? 1
                            : c.Arg2IsInt
                                ? int.Parse(c.Arg2)
                                : registers.Get(c.Arg2);
                i += jmpAmount;
                break;
            }

            case CommandType.Toggle:
            {
                int offsetValue = c.Arg1IsInt ? int.Parse(c.Arg1) : registers.Get(c.Arg1);
                int targetIdx   = i + offsetValue;
                if (targetIdx >= 0 && targetIdx < commands.Count)
                {
                    Command tgt = commands[targetIdx];
                    switch (tgt.Type)
                    {
                    case CommandType.Increment:
                        commands[targetIdx] = new Command(CommandType.Decrement, tgt.Arg1);
                        break;

                    case CommandType.Decrement:
                    case CommandType.Toggle:
                        commands[targetIdx] = new Command(CommandType.Increment, tgt.Arg1);
                        break;

                    case CommandType.Copy:
                        commands[targetIdx] = new Command(CommandType.JumpNotZero, tgt.Arg1, tgt.Arg2);
                        break;

                    case CommandType.JumpNotZero:
                        commands[targetIdx] = new Command(CommandType.Copy, tgt.Arg1, tgt.Arg2);
                        break;
                    }
                }

                i++;
                break;
            }
            }
        }

        return(registers.Get("a"));
    }
示例#9
0
 private byte readProgramByte(int offset = 0)
 {
     return(memory[registers.Get(FcRegister.C) + offset]);
 }