private static void CountModRm(TableCurrInstruct CurrInstr) { if (CurrInstr.Name == "MOV") { if (TableOperand.GetByNumbers(1, true).MainAttr != 0) { CurrInstr.IncByteCount(1, TableCurrInstruct.Types.модрм); } else if (TableOperand.TypeSecond == TableOperand.Types.Адресний_вираз) { CurrInstr.IncByteCount(1, TableCurrInstruct.Types.модрм); } return; } if (CurrInstr.Name == "JMP") { if (TableOperand.GetByNumbers(4, true).IsLexemePresent)//визначений ідентифікатор { TableUser.Types userType = TableUser.GetByNumber(TableOperand.GetByNumbers(4, true).MainAttr).Type; if (userType != TableUser.Types.Far) { CurrInstr.IncByteCount(1, TableCurrInstruct.Types.модрм); } } return; } if (TableInstruction.GetByName(CurrInstr.Name).ModRM) { CurrInstr.IncByteCount(1, TableCurrInstruct.Types.модрм); } }
private static string CreateOffset(TableCurrInstruct CurrInstr) { string Offset = ""; int UserNumber = 0; if (TableOperand.TypeFirst >= TableOperand.Types.Мітка && TableOperand.TypeFirst <= TableOperand.Types.Адресний_вираз) { UserNumber = TableOperand.GetByNumbers(4, true).MainAttr; } if (TableOperand.TypeSecond >= TableOperand.Types.Мітка && TableOperand.TypeSecond <= TableOperand.Types.Адресний_вираз) { UserNumber = TableOperand.GetByNumbers(4, false).MainAttr; } if (UserNumber > 0) { Offset = Convert.ToString(TableUser.GetByNumber(UserNumber).Offset, 16); Offset = CheckCharCount(Offset, 8); if (CurrInstr.Name == "JMP" && !CurrInstr.IsModRm) { Offset += " ----"; } } return(Offset.ToUpper()); }
private static string CreateUser(TableLexeme Lexeme, int ByteCount) { TableUser User = TableUser.GetByName(Lexeme.Name); string result = Convert.ToString(Convert.ToInt32(User.Offset), 16).ToUpper(); result = CheckCharCount(result, ByteCount); return(result); }
public static void AddTableUser(int byteCount) {//if username present if (TableSentence.Item.NameOrLabelNumber != 0 && LookOver.IsGoFirst && TableSegment.ActiveSegment() != null) { string userName = TableLexeme.Label().Name; int userOffset = TableSegment.ActiveSegment().Offset; if (TableUser.GetByName(userName) != null) { Errors.Add(13);//@error user name already exists in the table } else { new TableUser(userName, userOffset, TableSegment.ActiveSegmentNumber, byteCount); } } }
private static string FormUserLine(TableUser user) { string Line = " " + user.Name; Line = CheckSpaceCount(Line, 18); Line += OffsetToHex(user.Offset); Line = CheckSpaceCount(Line, 27); Line += user.ActiveSeg; Line = CheckSpaceCount(Line, 36); Line += user.Type.ToString().ToUpper(); TableUser user1 = TableUser.GetByNumber(user.Number + 1); if (user1 != null && user.ActiveSeg != user1.ActiveSeg) { Line += "\n"; } return(Line); }
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 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); } }
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 string FormUserLine(TableUser user) { string Line = " " + user.Name; Line = CheckSpaceCount(Line, 18); Line += OffsetToHex(user.Offset); Line = CheckSpaceCount(Line, 27); Line += user.ActiveSeg; Line = CheckSpaceCount(Line, 36); Line += user.Type.ToString().ToUpper(); TableUser user1 = TableUser.GetByNumber(user.Number + 1); if (user1 != null && user.ActiveSeg != user1.ActiveSeg) Line += "\n"; return Line; }