1 2 3 4 5 6 7 8 Ім'я файлу: ЗВІТ КУРСАЧА - РЕЗИДЕНТНИЙ КАЛЬКУЛЯТОР.docx Розширення: docx Розмір: 511кб. Дата: 05.11.2021 скачати 3.7. Переривання INT 13hОброблювач переривання INT 13h складений на мові асемблера. Його єдине призначення - збільшення значення прапора unsafe_flag при кожному виклику переривання INT 13h і зменшення при поверненні з цього переривання. Коли програма TSRDEMO буде робити спробу активізації під час обробки переривання INT 13h, вона перевірить значення прапора unsafe_flag. Якщо воно не буде дорівнює 0, активізація неможлива, так як в даний момент часу виконується обробка переривання INT 13h. Оригінальний текст обробника переривання INT 13h представлений нижче: _new_int13 proc far push ax push ds mov ax, DGROUP mov ds, ax inc word ptr _unsafe_flag pop ds pop ax pushf call cs: old_int13 push ax push ds mov ax, DGROUP mov ds, ax dec word ptr _unsafe_flag pop ds pop ax ret 2 _new_int13 endp Для забезпечення можливості адресації глобальної змінної unsafe_flag регістр DS встановлюється на сегмент даних програми TSRDEMO. Адреса старого обробника переривання INT 13h знаходиться у змінній old_int13, куди він записується функцією get_int_13. Ця функція викликається з функції tsrinit. РОЗДІЛ ІV4.1. Вивантаження резидентної програми з пам'ятіДля вивантаження програми TSRDEMO з пам'яті її потрібно запустити з параметром u. Що відбувається в цьому випадку? Функція main викликає функцію unload. Та, в свою чергу, намагається виконати видалення копії програми TSRDEMO з пам'яті, викликаючи для цього функцію tsrunload. Залежно від успіху цієї операції функція unload виводить на екран відповідне повідомлення. Функція tsrunload складена на мові асемблера. Коротко про те, що робить ця функція. Перш за все, вона зберігає вміст регістрів SS: SP і DS в глобальних змінних. Потім вона завантажує адресу точки входу ExitTSR в регістри BX: DX і викликає переривання INT 2Fh, передаючи в регістрі AX команду вивантаження програми з пам'яті - значення FF01h. Тепер в справу включається оброблювач переривання INT 2Fh, встановлений завантаженої резидентної програмою TSRDEMO. Ось відповідний фрагмент цього обробника: else if (ax == 0xff01) {ExitAddress = ((long) bx << 16) + dx; if (! tsr_already_active) {_enable (); tsr_exit (); ax = 0xFFFF; tsr_already_active = -ax;}} Отриманий адресу зберігається в глобальній змінній ExitAddress, слідом за чим викликається функція tsr_exit. Ця функція встановлює стек, зарезервований для роботи при активізації програми, слідом за чим намагається відновити перепризначення при установці вектори переривань. Для відновлення використовується функція RestoreIntVect, яка перевіряє, чи не були змінені вектори переривання ще раз, наприклад, інший резидентну програму, запущеної після програми TSRDEMO. Якщо все вектори переривань вдалося відновити, резидентную програму можна видалити з пам'яті. Для цього використовується простий спосіб: резидентна програма робиться поточної, після чого її робота завершується за допомогою функції 4Ch переривання INT 21h. Це стандартний спосіб завершення роботи програми, при якому MS-DOS видаляє всі пов'язані з нею блоки пам'яті. При неможливості відновлення векторів переривання резидентна програма залишається в пам'яті, але активізації не піддається через те що слово пам'яті, відведений для прапора tsr_already_active, записується значення -FFFFh. РОЗДІЛ VПРОГРАМНА РЕАЛІЗАЦІЯ ІНДИВІДУАЛЬНОГО ЗАВДАННЯ 5.1. Постановка задачіСтворення резидентного калькулятора. 5.2. Аналіз задачіРеалізація резидентного калькулятора як програми, яка знаходиться в пам'яті комп'ютера для виклику її гарячими клавішами. 5.3. Інтерфейс користувачаІнтерфейс резидентного калькулятора на рис.1. Рис.1 «Інтерфейс резидентного калькулятора» 5.4. Інструкція користувачаЗавантажити на комп’ютер емулятор операційної системи MS-DOS; Запустити емуляцію MS-DOS; В консолі прописати шлях до файлу TSRDEMO.EXE, який запускає програму; Відкрити програму прописавши в консолі «TSRDEMO.EXE» нажавши клавішу Enter. 1 2 3 4 5 6 7 8 |