Beispiel #1
0
        public void Test_BitTricks_LegatosMultiplier()
        {
            /*
             * LDX #8    ; 1; load X immediate with the 8
             * LDA #0    ; 2; load A immediate with the 0
             * CLC       ; 3; set C to 0 LOOP
             * LOOP:   ROR F1    ; 4; rotate F1 right circular through C
             * BCC ZCOEF ; 5; branch to ZCOEF if C = 0
             * CLC       ; 6; set C to 0
             * ADC F2    ; 7; set A to A+F2+C and C to the carry ZCOEF
             * ZCOEF:  ROR A     ; 8; rotate A right circular through C
             * ROR LOW   ; 9; rotate LOW right circular through C
             * DEX       ;10; set X to X-1
             * BNE LOOP  ;11; branch to LOOP if Z = 0
             */

            #region Stateconfig
            Tools tools = this.CreateTools(0);
            tools.StateConfig.Set_All_Off();
            tools.StateConfig.CF = true;
            tools.StateConfig.ZF = true;

            tools.StateConfig.RAX = true;
            tools.StateConfig.RCX = true;
            tools.StateConfig.RDX = true;
            tools.StateConfig.R8  = true;
            tools.StateConfig.R9  = true;
            tools.StateConfig.R10 = true;
            #endregion

            string programStr =
                "           clc                                 " + Environment.NewLine +
                "           ror al, 1                           " + Environment.NewLine +
                "           jnc ZCOEF                           ";

            StaticFlow sFlow = new StaticFlow(tools);
            sFlow.Update(programStr);
            if (LogToDisplay)
            {
                Console.WriteLine(sFlow);
            }

            DynamicFlow dFlow = Runner.Construct_DynamicFlow_Backward(sFlow, tools);
            if (LogToDisplay)
            {
                Console.WriteLine("DynamicFlow:\n" + dFlow.ToString(sFlow));
            }

            State state = dFlow.Create_EndState;
        }
Beispiel #2
0
        public void Test_DynamicFlow_Forward_1()
        {
            Tools tools = CreateTools();

            tools.StateConfig.Set_All_Off();
            tools.StateConfig.RAX      = true;
            tools.StateConfig.RBX      = true;
            tools.Quiet                = true;
            tools.ShowUndefConstraints = false;

            string programStr =
                "           mov     rax,        0       ; line 0        " + Environment.NewLine +
                "           mov     rbx,        10      ; line 1        " + Environment.NewLine +
                "           mov     rbx,        rax     ; line 2        ";
            var sFlow = new StaticFlow(tools);

            sFlow.Update(programStr);
            if (logToDisplay)
            {
                Console.WriteLine(sFlow);
            }

            if (true)
            {
                DynamicFlow dFlow = Runner.Construct_DynamicFlow_Forward(sFlow, tools);
                if (logToDisplay)
                {
                    Console.WriteLine(dFlow.ToString(sFlow));
                }

                {
                    int           lineNumber    = 0;
                    IList <State> states_Before = new List <State>(dFlow.Create_States_Before(lineNumber));
                    Assert.AreEqual(1, states_Before.Count);
                    State state_Before = states_Before[0];

                    IList <State> states_After = new List <State>(dFlow.Create_States_After(lineNumber));
                    Assert.AreEqual(1, states_After.Count);
                    State state_After = states_After[0];

                    if (logToDisplay)
                    {
                        Console.WriteLine("Tree_Forward: Before lineNumber " + lineNumber + " \"" + sFlow.Get_Line_Str(lineNumber) + "\", we know:\n" + state_Before);
                    }
                    TestTools.AreEqual(Rn.RAX, "????????.????????.????????.????????.????????.????????.????????.????????", state_Before);
                    TestTools.AreEqual(Rn.RBX, "????????.????????.????????.????????.????????.????????.????????.????????", state_Before);

                    if (logToDisplay)
                    {
                        Console.WriteLine("Tree_Forward: After lineNumber " + lineNumber + " \"" + sFlow.Get_Line_Str(lineNumber) + "\", we know:\n" + state_After);
                    }
                    TestTools.AreEqual(Rn.RAX, 0, state_After);
                    TestTools.AreEqual(Rn.RBX, "????????.????????.????????.????????.????????.????????.????????.????????", state_After);
                }
                {
                    int           lineNumber    = 1;
                    IList <State> states_Before = new List <State>(dFlow.Create_States_Before(lineNumber));
                    Assert.AreEqual(1, states_Before.Count);
                    State state_Before = states_Before[0];

                    IList <State> states_After = new List <State>(dFlow.Create_States_After(lineNumber));
                    Assert.AreEqual(1, states_After.Count);
                    State state_After = states_After[0];

                    if (logToDisplay)
                    {
                        Console.WriteLine("Tree_Forward: Before lineNumber " + lineNumber + " \"" + sFlow.Get_Line_Str(lineNumber) + "\", we know:\n" + state_Before);
                    }
                    TestTools.AreEqual(Rn.RAX, 0, state_Before);
                    TestTools.AreEqual(Rn.RBX, "????????.????????.????????.????????.????????.????????.????????.????????", state_Before);

                    if (logToDisplay)
                    {
                        Console.WriteLine("Tree_Forward: After lineNumber " + lineNumber + " \"" + sFlow.Get_Line_Str(lineNumber) + "\", we know:\n" + state_After);
                    }
                    TestTools.AreEqual(Rn.RAX, 0, state_After);
                    TestTools.AreEqual(Rn.RBX, 10, state_After);
                }
                {
                    int           lineNumber    = 2;
                    IList <State> states_Before = new List <State>(dFlow.Create_States_Before(lineNumber));
                    Assert.AreEqual(1, states_Before.Count);
                    State state_Before = states_Before[0];

                    IList <State> states_After = new List <State>(dFlow.Create_States_After(lineNumber));
                    Assert.AreEqual(1, states_After.Count);
                    State state_After = states_After[0];

                    if (logToDisplay)
                    {
                        Console.WriteLine("Tree_Forward: Before lineNumber " + lineNumber + " \"" + sFlow.Get_Line_Str(lineNumber) + "\", we know:\n" + state_Before);
                    }
                    TestTools.AreEqual(Rn.RAX, 0, state_Before);
                    TestTools.AreEqual(Rn.RBX, 10, state_Before);

                    if (logToDisplay)
                    {
                        Console.WriteLine("Tree_Forward: After lineNumber " + lineNumber + " \"" + sFlow.Get_Line_Str(lineNumber) + "\", we know:\n" + state_After);
                    }
                    TestTools.AreEqual(Rn.RAX, 0, state_After);
                    TestTools.AreEqual(Rn.RBX, 0, state_After);
                }
            }
        }