Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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
            }
        }
Ejemplo n.º 3
0
 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 данные/команда вне сегмента
     }
 }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
            }
        }