Beispiel #1
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
            }
        }
Beispiel #2
0
        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;
        }
Beispiel #3
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);
        }
Beispiel #4
0
        // СЧИТАЕМ КОЛИЧЕСТВО БАЙТ В ИНСТРУКЦИИ ******************************************************

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