Ejemplo n.º 1
0
        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.модрм);
            }
        }
Ejemplo n.º 2
0
        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());
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
                }
            }
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
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.префікс);    //нужно генерировать незаданный префикс
                }
            }
        }
Ejemplo n.º 7
0
        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);
            }
        }
Ejemplo n.º 8
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);
        }
Ejemplo n.º 9
0
 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;
 }