public static void GoFirst(int StopNumber) { IsGoFirst = true; IsEnd = false; ClearTables(); string line = ""; Result.Count = 0; if (Result.FileLength > 0) { for (int LineNumber = 0; LineNumber < Result.FileLength; LineNumber++) { line = File.ReadAllLines(Result.FilePath)[LineNumber]; Result result = new Result(LineNumber + 1, line); Result.Count++; AnalysisLexy.FormLexyTable(line); if (TableLexeme.Count > 0) { AnalysisSyntaxy.FormSentenceTable(); if (TableSentence.Item.Type != TableAsmWords.Types.пусто) { int CurrentOffset = AnalysisGrammar.CalculateOffset(); TableSegment.IncOffset(CurrentOffset); result.ModifyOffset(CurrentOffset); } if (TableLexeme.MnemName() == "END") { IsEnd = true; break; } } else//пустая строка { Result.Table.Rows.RemoveAt(Result.Items.Count - 1); Result.Items.RemoveAt(Result.Items.Count - 1); result = null; Result.Count--; } if (LineNumber == StopNumber) { LineNumber += 0;//@error: doesn't do anything } } } if (Result.Count == 0) { Errors.Add(16);//@error пустой исходный файл } else if (!IsEnd) { Errors.Add(17);//@error end is missing } }
public static void GoSecond(int StopNumber, string ListingName) { IsGoFirst = false; TableAssume.Clear(); string line = ""; Result.Count = 0; if (Result.FileLength > 0) { for (int LineNumber = 0; LineNumber < Result.FileLength; LineNumber++) { line = File.ReadAllLines(Result.FilePath)[LineNumber]; Result.Count++;//доступ к текущей строке результата AnalysisLexy.FormLexyTable(line); if (TableLexeme.Count > 0) { AnalysisSyntaxy.FormSentenceTable(); if (TableSentence.Item.Type != TableAsmWords.Types.пусто) { int CurrentOffset = AnalysisGrammar.CalculateOffset(); if (CurrentOffset != Result.Current().LineSize) { Errors.Add(19); //@error невідповідність зміщень першого та другого переглядів } if (Result.Current().Error == null) //ошибок нет { string CurrentCommand = AnalysisGrammar.CommandCreate(); Result.Items[Result.Count - 1].ModifyCode(CurrentCommand);//формирование команды } } } else//пустая строка { Result.Count--; } if (LineNumber == StopNumber) { LineNumber += 0;//@error: doesn't do anything } } } //формирование файла листинга try { Result.CreateListing(ListingName); } catch { MessageBox.Show("Не вдалося сформувати файл лістингу"); } Result.FileLength = 0; }
// СЧИТАЕМ КОЛИЧЕСТВО БАЙТ В ДИРЕКТИВЕ ****************************************************** public static int CountDirective() { int result = 0; AnalysisSyntaxy.DoOperands(); if (Result.Current().Error != null) { return(0); } switch (TableSentence.Item.Mnem) { case "SEGMENT": DoSegment(TableLexeme.Label().Name); break; case "ASSUME": DoAssume(); break; case "ENDS": TableSegment.ActiveSegmentNumber = 0; break; case "DB": result += CountData(); break; case "DW": result += 2; break; case "DD": result += 4; break; case "LABEL": DoLabel(); break; default: Result.Current().isOffset = false; break; } return(result); }
// СЧИТАЕМ КОЛИЧЕСТВО БАЙТ В ИНСТРУКЦИИ ****************************************************** public static int CountInstruction() { string MnemName = TableSentence.Item.Mnem; AnalysisSyntaxy.DoOperands(); if (Result.Current().Error != null) { return(0); } //if (TableSegment.ActiveSegmentNumber == 0 && !(MnemName == ".386") && !(MnemName == "ENDS") && !(MnemName == "END")) // Errors.Add(2);//@error команда вне сегмента TableCurrInstruct CurrInstr = new TableCurrInstruct(MnemName); CurrInstr.IncByteCount(TableInstruction.GetByName(MnemName).ByteCount, TableCurrInstruct.Types.пусто);//размер кода операции CountPrefix(CurrInstr); CountModRm(CurrInstr); CountSib(CurrInstr); CountOffset(CurrInstr); return(CurrInstr.ByteCount); }