private static int DoOpConst() {//количество байт, выделенных под данные int byteCount = TableInstruction.GetByName(TableLexeme.MnemName()).ByteCount; int result = byteCount; int value; if (TableSentence.Item.Operands[1, 0] != 0) // есть второй операнд { Errors.Add(20); //@error слишком много операндов } if (TableSentence.Item.Operands[0, 1] == 1) //константа { TableLexeme lex = TableLexeme.GetByNumber(TableSentence.Item.Operands[0, 0]); //первая лексема первого операнда value = lex.NumberDex(); double f = Math.Pow(2, 8 * byteCount) - 1; uint j = Convert.ToUInt32(f); if (value > j) { Errors.Add(2);//@error too big number } TableOperand.GetByNumbers(10, isFirst).Modify(value, byteCount); } else//выражение { int FirstLex = TableSentence.Item.Operands[0, 0]; int LastLex = FirstLex + TableSentence.Item.Operands[0, 1] - 1; int Const = Calc.DoCalc(FirstLex, LastLex); result = LastLex - FirstLex; TableOperand.GetByNumbers(10, isFirst).Modify(Const, byteCount); } AnalysisGrammar.AddTableUser(byteCount); return(result); }
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 IncOffset(int num) { if (ActiveSegmentNumber != 0) { ActiveSegment().Offset += num; if (num > 0) { Table.Rows[ActiveSegmentNumber - 1][3] = ActiveSegment().Offset; } } else if (!(TableLexeme.MnemName() == ".386") && !(TableLexeme.MnemName() == "ENDS") && !(TableLexeme.MnemName() == "END")) { Errors.Add(4); //@error данные/команда вне сегмента } }
private static void DoOpText() { TableLexeme lex = TableLexeme.GetByNumber(TableSentence.Item.Operands[0, 0]);//первая лексема первого операнда int byteCount = TableInstruction.GetByName(TableLexeme.MnemName()).ByteCount; if (byteCount == 1) { byteCount *= lex.Length; } else { Errors.Add(14);//@error недопустимий аргумент директиви } TableOperand.GetByNumbers(11, isFirst).Modify(byteCount, -1); AnalysisGrammar.AddTableUser(1); }
private static void DoOpName(TableLexeme Lexeme) { TableUser user = TableUser.GetByName(Lexeme.Name); if (user != null) { TableOperand.GetByNumbers(4, isFirst).Modify(user.Number, -1); } else { TableOperand.GetByNumbers(5, isFirst).Modify(-1, -1); } if (TableLexeme.MnemName() == "DD") { AnalysisGrammar.AddTableUser(4); } else { AnalysisGrammar.AddTableUser(-1); } }