Материалы сайта
Это интересно
Керiвництво программиста
Додаток Б Емулятор Керівництво програміста ДП 7.091501-037-99.010ДБ Аркушів 6 Донецьк 1999 Дане керівництво містить опис основних модулей операційної частини програмного емулятора і інструкції по модернізації і розширенню функцій даного емулятора. Необхідність в модернізації може виникнути, наприклад, при доповненні команд функцією підрахунку тактів виконання або при доданні нових команд, реалізованих в процесорах наступної ґенерації, або при реалізації емуляції яких-нибудь блоків процесора. Є можливість також змінити місце дислокації оперативної пам'яті емулятора або збільшити її розмір. Изначально пам'ять ємністю один мегабайт знаходиться в розширеній пам'яті і доступна через драйвер HIMEM. SYS. І, нарешті, можна доопрацювати емулятор, ввівши в нього периферійні прилади. 1 Опис модулей Операційна частина перебує з п'ятьох модулей, що виконають певні функції по дешифрації і виконанню команд процесора ,що емулюється. 1 Модуль “STRUCTS. CPP” Модуль містить реалізацію засобів класів, що виконують програмну емуляцію функціональних блоків процесора. В якості інтерфейсу з іншими модулями служить файл “command. hpp”, в якому містяться оголошення згаданих вище класів і основних типів даних. В модулі містяться глобальні змінні, що також служать для зв'язку з іншими модулями. Глобальні змінні. В модулі проголошені наступні глобальні змінні: . int identify. Идентификатор сегментного регістру. При створенні примірників об'єктів типу сегментного регістру відбувається перенесення вмісту цієї змінної в внутрішнє поле ідентифікатора регістру і збільшення змінної на одиницю. В результаті в кожному примірникові класу міститься унікальний ідентифікатор; . int stop. Прапор останова емулятора. При виникненні ситуації останова процесора цей прапор встановлюється в одиницю і емуляція припиняється; . ulong ercode. Код помилки виключення. При виникненні ситуації виключення в стек при викликові обрабника заноситься код помилки, що допомагає локалізувати джерело виключення; . int error. Номер виключення. В нормальній ситуації змінна містить -1. При виникненні виключення в неї заноситься номер виключення; . char cpl. Поточний рівень привілей програми. При межсегментної передачі керування в якості поточного рівня привілей програми виступає рівень запитання селектора; . int tekseg. При відкритті перед командою префіксу зміни сегменту в цю змінну записується код сегментного регістру; . int page. Поточний розмір сторінки пам'яті при сторінковій адресації. Використовується механізмом трансляції сторінок для перетворення лінійної адреси в фізичний; . int ad, od. Поточний розмір адреси і операнда. Перед дешифрацієй команди беруться з біта розрядності кодового сегменту. За наявності відповідних префіксів можуть змінюватися на протилежні; . ulong cr0, cr2, cr3. Системні регістри; . _gdt gdtr. Регістр глобальної таблиці дескрипторів; . _idt idtr. Регістр таблиці переривань. . _reg ron [8]. Файл регістрів загального призначення; . _seg srg [6]. Файл сегментних регістрів. Виконує роль блоку сегментації; . _ldt ldtr. Регістр локальної таблиці дескрипторів; . _tss tr. Регістр сегменту стану задачі; . _eflag eflag. Регістр прапорів. Процедури і функції. В модулі містяться наступні допоміжні процедури: . int mode (). Вертає поточний режим процесора, аналізуючи вміст системного регістру CR0 і регістру прапорів; . ulong conv_adr (_op, int). Вираховує виконавчу адресу операнда на підставі переданої складеної адреси і поточної розрядність адреси; . int cccc (uchar, char*). Виконує перевірку умови, код якого передається в якості параметру. Вертає результат перевірки і мнемонічну позначку умови. 2 Модуль “CONTROL. CPP” Модуль містить процедури і функції, що беруть участь в процесах дешифрації і виконання команд процесора і початкової ініціалізації масиву команд. В модулі також містяться оголошення і реалізації деяких груп команд. Змінні. Ці змінні хоч і проголошені як глобальні використовуються тільки всередині модуля. Модуль містить наступні змінні: . _command* mas [256]. Масив команд. Містить покажчики на примірники класів дешифрацію і виконання 256 команд ,що реалізують і груп; . _decoder cmds [2]. Черга команд. Перед виконанням команди з індексом 0 виробляється дешифрація команди з індексом 1. Після виконання команда 1 позичає місце команди 0. Процедури і функції. В модулі містяться наступні процедури і функції: . void init (). Процедура ініціалізації масиву команд. Дана процедура викликається один раз при старті емулятора для створення примірників класів, що реалізують дешифрацію і виконання команд процесора; . void int_call (int). Процедура виконує виклик обрабника переривання, номер якого передається їй в якості параметру; . int step (_decoder*). Функція виробляє дешифрацію префіксів команди і виклик засобу deasm () класу, що реалізує цю команду. Вертає заповнену структуру команди і ознака помилки в випадку її виникнення; . int exec_com (). Функція виробляє виконання команди шляхом виклика засобу die () класу, що реалізує команду. 3 Модулі “MEM. CPP”, “COM_ANDS. CPP”, “COM_MOVS. CPP” В модулі “MEM. CPP” знаходиться реалізація засобів класу _mem, що здійснює операції обміну з пам'яттю і приладами введення-висновку. В інших модулях знаходиться реалізація засобів deasm () і die () класів команд. В модулі “COM_ANDS. CPP” зібрані аріфметичнф, логічні команди і команди зрушень, а в модулі “COM_MOVS. CPP” зібрані команди пересилки і керування. 2 Інструкції по модернізації і розширенню функцій емулятора Додання нових команд. Для введення в емулятор нової команди необхідно створити клас, що реалізує цю команду. Клас повинен спадкуватися від базового класу _command і мати свої реалізації засобу deasm () для дешифрацфї і засобу die () для виконання команди. Оголошення класу слідує помістити в файл “command. h”. Коли засіб deasm () одержує керування, всі префікси вже дешифровані і проведені необхідні корегування полий структури команди, що передається в якості параметру. Для необхідності дешифрації пост-байтів треба викликати засіб mod () при цьому локальний покажчик зміщення відносно почала команди повинен вказувати на пост-байт. В якості параметру засобу необхідно передати номер операнда, що заповнюється. В поле strcom структури необхідно занести мнемонику команди без операндів, а покажчик зміщення встановити за останній байт команди. Для читання безпосередніх операндів необхідно використати відповідні засоби структури. В поле *p необхідно занести покажчик на об'єкт типу класу команди. В якості параметру слідує повернути ознаку помилки в випадку її виникнення. Засіб die () викликається для безпосереднього виконання команди. В якості параметру в нього передається покажчик на структуру команди, що була попередно дешифрована засобом deasm (). Для одержання операндів з пам'яті або запису їхн в пам'ять слідує використати відповідні засоби класу _seg. Реалізацію засобів бажано розмістити в файлі “COM_ANDS. CPP” або “COM_MOVS. CPP”. Зміна реалізації пам'яті емулятора. Якщо виникне необхідність в зміні реалізації пам'яті емулятора, наприклад, реалізувати її в вигляді файлу на диску, слідує переписати або внести зміни в реалізацію засобів класу _mem, що знаходиться в модулі “MEM. CPP”. Додання емуляції периферійних приладів. Емулятор периферійного влаштування слідує розмістити в додатковому модулі і створити необхідний інтерфейс з іншими модулями. Також слідує доопрацювати клас _mem, доповнивши його засобами звертання до портів, і використати ці засоби в реалізації команд звертання до портів.