private static void ClearTables() { if (TableAsmWords.Items.Count == 0)//создаем раз и навсегда { TableAsmWords.Create(); } if (TableRegister.Items.Count == 0) { TableRegister.Create(); } if (TableInstruction.Items.Count == 0) { TableInstruction.Create(); } if (TableOperand.ItemsFirst.Count == 0 && TableOperand.ItemsSecond.Count == 0) { TableOperand.Create(); } if (TableAssume.Item.Count == 0) { new TableAssume(); } if (Errors.Templates.Count == 0) { Errors.CreateTempl(); } Errors.Table.Clear(); Errors.Items.Clear(); Result.Items.Clear(); Result.Table.Clear(); TableSegment.Items.Clear(); TableSegment.Table.Clear(); TableUser.Items.Clear(); TableUser.Table.Clear(); }
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 void DoOpRegister(TableLexeme Lexeme) { int RegNum = TableRegister.GetByName(Lexeme.Name).Number; if (isAdress) { if (!TableOperand.GetByNumbers(6, isFirst).IsLexemePresent) { TableOperand.GetByNumbers(6, isFirst).Modify(RegNum, 32); } else { TableOperand.GetByNumbers(7, isFirst).Modify(RegNum, 32); } } else { TableOperand.GetByNumbers(1, isFirst).Modify(RegNum, 32); } }
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); }
private static void DoOpSegRegister(TableLexeme Lexeme) { int RegNum = TableRegister.GetByName(Lexeme.Name).Number; TableOperand.GetByNumbers(3, isFirst).Modify(RegNum, -1); }