Пример #1
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;
        }
Пример #2
0
        private static void DoAssume()
        {
            int i = 0;

            Result.Current().isOffset = false;
            while (TableSentence.Item.Operands[i, 0] != 0)
            {
                string reg  = TableLexeme.GetByNumber(TableSentence.Item.Operands[i, 0]).Name;
                string name = TableLexeme.GetByNumber(TableSentence.Item.Operands[i, 0] + 2).Name;
                TableAssume.Modify(reg, name);
                i++;
            }
        }
Пример #3
0
        private static void CountPrefix(TableCurrInstruct CurrInstr)
        {
            if (CurrInstr.Name != "PUSH" && CurrInstr.Name != "CMP" && CurrInstr.Name != "MOV" && CurrInstr.Name != "JMP")
            {
                return;//префикса быть не может
            }
            bool isFirstOp          = CurrInstr.Name == "MOV" ? false : true;
            int  DefaultRegisterNum = 3;//ds

            int MultipliedRegister   = TableOperand.GetByNumbers(8, isFirstOp).MainAttr;
            int FirstAdressRegister  = TableOperand.GetByNumbers(6, isFirstOp).MainAttr;
            int SecondAdressRegister = TableOperand.GetByNumbers(7, isFirstOp).MainAttr;

            if (MultipliedRegister != 4 && MultipliedRegister != 5)         //множитель не при ebp esp
            {
                if (FirstAdressRegister == 4 || FirstAdressRegister == 5 || //ebp или esp есть
                    SecondAdressRegister == 4 || SecondAdressRegister == 5)
                {
                    DefaultRegisterNum = 2;//ss
                }
            }
            if (TableOperand.GetByNumbers(3, isFirstOp).IsLexemePresent)
            {
                int PrefReg = TableOperand.GetByNumbers(3, isFirstOp).MainAttr;
                if (PrefReg != DefaultRegisterNum)
                {
                    CurrInstr.IncByteCount(1, TableCurrInstruct.Types.префікс); //префикс задан явно и не совпадает по умолчанию
                }
            }
            else //префикс не задан явно
            if (TableOperand.GetByNumbers(4, isFirstOp).IsLexemePresent)    //є ідентиф користувача
            {
                int    userNumber   = TableOperand.GetByNumbers(4, isFirstOp).MainAttr; //номер рядка в таблиці користувача
                string logicSegment = TableUser.GetByNumber(userNumber).ActiveSeg;      //ім'я логічного сегменту
                string userRegister = TableAssume.GetByName(logicSegment);              //имя регистра логического сегмента
                var    Register     = TableRegister.GetByName(userRegister);            //сам регистр

                if (Register != null && Register.Number != DefaultRegisterNum)
                {
                    CurrInstr.IncByteCount(1, TableCurrInstruct.Types.префікс);    //нужно генерировать незаданный префикс
                }
            }
        }
Пример #4
0
        private static string CreatePrefix(TableCurrInstruct CurrInstr)
        {
            bool isFirstOp          = CurrInstr.Name == "MOV" ? false : true;
            int  DefaultRegisterNum = 3;//ds

            int MultipliedRegister   = TableOperand.GetByNumbers(8, isFirstOp).MainAttr;
            int FirstAdressRegister  = TableOperand.GetByNumbers(6, isFirstOp).MainAttr;
            int SecondAdressRegister = TableOperand.GetByNumbers(7, isFirstOp).MainAttr;

            if (MultipliedRegister != 4 && MultipliedRegister != 5)         //множитель не при ebp esp
            {
                if (FirstAdressRegister == 4 || FirstAdressRegister == 5 || //ebp или esp есть
                    SecondAdressRegister == 4 || SecondAdressRegister == 5)
                {
                    DefaultRegisterNum = 2;//ss
                }
            }
            string Prefix         = "";
            TableOperand OperPref = TableOperand.GetByNumbers(3, isFirstOp);
            if (OperPref.IsLexemePresent)                                               //задан явно == не совпадает по умолчанию
            {
                Prefix = TableRegister.GetByNumbers(OperPref.MainAttr, 2).PrefixString; //нужный префикс
                // CurrInstr.Prefix = Prefix;
            }
            else //префикс не задан явно
            {
                int    userNumber   = TableOperand.GetByNumbers(4, isFirstOp).MainAttr;//номер рядка в таблиці користувача
                string logicSegment = TableUser.GetByNumber(userNumber).ActiveSeg; //ім'я логічного сегменту
                string userRegister = TableAssume.GetByName(logicSegment);         //имя регистра логического сегмента
                var    Register     = TableRegister.GetByName(userRegister);       //сам регистр

                if (Register != null && Register.Number != DefaultRegisterNum)     //нужно генерировать незаданный префикс
                {
                    Prefix = Register.PrefixString;
                    // CurrInstr.Prefix = Prefix;
                }
            }
            return(Prefix);
        }