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; }
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++; } }
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.префікс); //нужно генерировать незаданный префикс } } }
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); }