Вивантаження резидентної програми з пам’яті

Робота зроблена в 2000 році

Вивантаження резидентної програми з пам'яті - Курсовий Проект, розділ Програмування - 2000 рік - Системи програмування та операційні системи Вивантаження Резидентної Програми З Пам'яті. Слід зауважити, що в Dos відсут.

Вивантаження резидентної програми із пам'яті. Слід зазначити, що у DOS відсутні засоби вивантаження резидентних програм.

Єдиний передбачений при цьому механізм - перезавантаження комп'ютера. Проте практично більшість резидентних програмних продуктів мають вбудовані засоби вивантаження. Зазвичай вивантаження резидентної програми здійснюється відповідною командою, що подається з клавіатури та сприймається резидентною програмою.

Для цього резидентна програма повинна перехоплювати переривання, що надходять з клавіатури, та виловлювати команди розвантаження. Інший, боже простий спосіб полягає у запуску деякої програми, яка за допомогою, наприклад, мультиплексного переривання 2Fh передає резидентній програмі команду вивантаження. Найчастіше як вивантажувальну використовують саму резидентну програму, точніше, її другу копію, яка, якщо її запустити в певному режимі, не тільки не намагається залишитися в пам'яті, але, навпаки, вивантажує з пам'яті свою першу копію.

Вивантаження резидентної програми з пам'яті можна здійснити різними способами. Найбільш простий - звільнити блоки пам'яті, які займає програма власне програма та її оточення за допомогою функції DOS 49h. Інший, більш складний - використовувати в програмі, що вивантажує, функцію завершення 4Ch, змусивши її завершити не саму вивантажувальну, а резидентну програму, та ще після цього повернути управління в вивантажувальну.

У будь-якому випадку перед звільненням пам'яті необхідно відновити всі вектори переривань,перехоплені резидентною програмою. Слід наголосити, що відновлення векторів становить у загальному випадку значну і іноді навіть нерозв'язну проблему. По-перше, старий вміст вектора, який зберігається десь у полях даних резидентної програми, неможливо витягти зовні, з іншої програми, оскільки немає жодних способів визначити, де саме його сховала резидентна програма у процесі ініціалізації.

Тому надійно можна вивантажити лише останню із завантажених резидентних програм. У нашій програмі підфункція переривання 00h 2Fh служить для перевірки на повторну установку, а підфункція 01h - для вивантаження. До секції ініціалізації додано рядки збереження старого вмісту вектора 09h. Це виконується так само, як і для вектора 2Fh - за допомогою функції DOS 35h. Старий вектор зберігається в осередку old09h, що розміщується в резидентній частині програми.

Оскільки вивантаження програми виконується за допомогою переривання 2Fh, текст обробника переривання ускладнюється. Резидентний обробник переривання 2Fh насамперед перевіряє номер функції, що надійшов у регістрі АН. Якщо цей номер відрізняється від F1h, управління передається наступному обробнику ланцюжком. Далі аналізується вміст регістру AL. Якщо AL00h, виконуються дії захисту від повторного завантаження.

Оскільки дії програми при запуску залежать від того, введена команда запуску з параметром чи ні, наявність хвоста в PSP аналізується на самому початку секції ініціалізації. При запуску програми типу СОМ всі сегментні регістри вказують початку PSP. Байт з довжиною хвоста можливо, нульовий міститься в регістр CL і порівнюється з нулем.

Якщо в ньому 0, команда запуску була введена без параметрів та ініціалізація програми продовжується звичайнимчином. Якщо хвіст має ненульову довжину, то починається його аналіз. Обнуленням регістру СН довжина хвоста розширюється весь регістр СГ, що необхідно організації циклу. Регістр DI налаштовується перший байт хвоста, а регістр SI початку поля tail з очікуваної формою параметра. Регістр AL готується до виконання команди сканування рядка. Команда scasb порівнює у циклі байти хвоста з вмістом AL кодом пропуску.

Порівняння ведеться до тих пір, поки не буде знайдено перший символ, відмінний від пробілу. Ця операція необхідна через те, що оператор при введенні команди вивантаження може відокремити параметр команди від самої команди будь-яким числом прогалин, які потраплять у хвіст команди PSP і завадять аналізувати введений параметр. Вихід із циклу виконання команди scasb здійснюється, коли команда проаналізувала перший після пробілу символ.

Після цього регістр DI вказує другий символ параметра. Команда dec DI коригує покажчик DI, спрямовуючи його на перший символ введеного параметра. Далі командою порівняння рядків cmpsb здійснюється порівняння трьох символів хвоста, що залишилися. Якщо символи збігаються з параметром off, записаним у програмі, встановлюється прапорець запиту на розвантаження. Якщо результат порівняння виявився негативним, прапор запиту не встановлюється і, отже, неправильний параметр не сприймається.

У будь-якому випадку здійснюється перехід на продовження програми, яка починає перевіряти, чи не встановлена ​​вже ця програма в пам'яті. Якщо програма ще не встановлена, введений параметр не має сенсу. Ініціалізація здійснюється звичайним чином зберігаються та встановлюються вектори і програма завершується із залишенням у пам'яті. За наявності в пам'яті резидентної копії цієї програмиздійснюється перехід на мітку installed, де насамперед перевіряється, чи встановлено прапор запиту на розвантаження.

Якщо прапорець скинутий, виводиться повідомлення про неможливість повторного завантаження і програма завершується з кодом повернення 1. Якщо прапорець запиту встановлено, виконується вивантаження програми, яка полягає у виклику мультиплексного переривання 2Fh з функцією F1h і підфункцією 01h. Резидентний обробник цього переривання, включений до нашої резидентної програми, відпрацює цю підфункцію, відновить вектори і звільнить зайняті програмою блоки пам'яті.

Після повернення керування з обробника до поточної програми буде виведено повідомлення про успішне вивантаження і програма буде завершена функцією 4Ch з нульовим кодом повернення. Складена нами програма не позбавлена ​​недоліків. Так, у ній аналізуються завжди лише 3 значущі символи хвоста. Таким чином, програма буде вивантажена і під час введення команди имя.com onset. Інший недолік полягає в тому, що результат порівняння записаного в програмі хвоста з введеним з клавіатури параметром буде позитивним тільки якщо з клавіатури введені малі літери.

Команда ім'я OFF не призведе до вивантаження програми. По-справжньому слід було включити до програми перед аналізом хвоста перетворення символів параметра в великі літери. 2.4.