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; }
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); } } }