public void Step(Action onStepComplete) { SetRunMode(false); SetAddressToPC(); _process.StandardInput.WriteLine("continue"); _process.StandardOutput.ReadLine(); AwaitOnThread(onFinish: () => { ExecutionState = new BasmExecutionState(ExecutionState.ProgramCounter + 1, ExecutionState); onStepComplete(); }); }
public void BreakExecution() { Thread execThread = _execThread; if (execThread != null) { execThread.Abort(); _execThread = null; _isInRunMode = false; _process.StandardInput.WriteLine("run"); string output = _process.StandardOutput.ReadLine(); output = _process.StandardOutput.ReadLine(); ExecutionState = ParseExecutionState(output); ExecutionState = new BasmExecutionState(ExecutionState.ProgramCounter + 1, ExecutionState); } }
private void AwaitOnThread(Action onFinish) { Debug.Assert(_execThread == null, "ExecuteOnThread called when another thread is observing the program"); _execThread = new Thread(() => { _process.StandardOutput.ReadLine(); // wait for the program to halt _process.StandardInput.WriteLine("read"); _process.StandardOutput.ReadLine(); // Адр Знчн СК РА РК РД А C Адр Знчн string line = _process.StandardOutput.ReadLine(); // final program state ExecutionState = ParseExecutionState(line); _execThread = null; onFinish(); }); _execThread.Start(); }
public void StartSuspended() { Debug.Assert(_process == null); var info = new ProcessStartInfo("java"); info.Arguments = " -jar -Dmode=cli -Dfile.encoding=UTF-8 C:\\bcomp.jar"; info.RedirectStandardInput = true; info.RedirectStandardOutput = true; info.UseShellExecute = false; info.CreateNoWindow = true; info.StandardOutputEncoding = Encoding.UTF8; _process = new Process(); _process.StartInfo = info; _process.Start(); string code = _sourceFile.GetContents(); _process.StandardInput.WriteLine("asm"); _process.StandardInput.WriteLine(code); _process.StandardInput.WriteLine("end"); string line = ""; while (!line.StartsWith("Программа начинается с адреса")) { line = _process.StandardOutput.ReadLine(); } ExecutionState = new BasmExecutionState( programCounter: uint.Parse(Regex.Match(line, "Программа начинается с адреса\\s*([0-9A-Fa-f]+)").Groups[1].Value, NumberStyles.HexNumber) ); ProcessId = new AD_PROCESS_ID() { ProcessIdType = (uint)enum_AD_PROCESS_ID.AD_PROCESS_ID_SYSTEM, dwProcessId = (uint)_process.Id }; }
public StackFrame(SourceFileContext context, BasmExecutionState execState) { _context = context; _execState = execState; }