1   2   3   4   5   6   7   8
Ім'я файлу: ЗВІТ КУРСАЧА - РЕЗИДЕНТНИЙ КАЛЬКУЛЯТОР.docx
Розширення: docx
Розмір: 511кб.
Дата: 05.11.2021
скачати

ВСТУП


Що таке резидентна програма? Зазвичай після завершення чергової програми MS-DOS звільняє місце в пам'яті, яке займала програма, щоб завантажити на це місце нову. Однак є спосіб залишити програму в пам'яті і після її завершення. Така програма буде постійно присутньою в пам'яті.

Для чого використовуються резидентні програми? Резидентні програми можуть перемикати на себе обробку переривань, наприклад, пов'язаних з виведенням на друк або зі зверненням до клавіатури. Можна зустріти безліч резидентних програм, призначених для завантаження шрифтів в пам'ять відеоконтролера, для друку тексту, що містить символи кирилиці, на принтері в графічному режимі. Всі ці програми зазвичай запускаються один раз при завантаженні комп'ютера через файл autoexec.bat. Інший приклад використання резидентних програм: резидентні калькулятори, довідкові бази даних або інтегровані системи, на зразок Borland SideKick. Такі програми теж зазвичай запускаються через файл autoexec.bat або при необхідності. Вони перехоплюють переривання, призначені для роботи з клавіатурою. Як тільки користувач натискає заздалегідь певну комбінацію клавіш, резидентна програма активізується. Поверх наявного на екрані зображення виводиться діалогове вікно резидентної програми.

Іноді резидентні програми використовують замість завантажуваних драйверів для обслуговування нестандартної апаратури. В цьому випадку резидентна програма може вбудувати свій обробник, через який всі прикладні програми зможуть звертаються до апаратури. Аналогічно працюють резидентні модулі деяких систем управління базами даних (СУБД). Прикладна програма посилає запити до бази даних через переривання, яке встановлюється при запуску такої СУБД.

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

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

Функції BIOS також далеко не всі рентерабельні. Резидентна програма може сміливо викликати хіба лише переривання INT 16h (яке призначене для роботи з клавіатурою). Якщо резидентній програмі потрібно вивести що-небудь на екран, то замість переривання INT 10h слід виконати безпосередню запис символів і їх атрибутів в відеопам'ять. Без прийняття спеціальних запобіжних заходів резидентна програма не може викликати багато функцій бібліотеки транслятора, так як останні викликають переривання MS-DOS.

РОЗДІЛ І


    1. Для чого потрібні резидентні програми

Існують програми, що залишаються в пам'яті комп'ютера після завершення своєї роботи. Ці програми носять назву резидентних або TSR-програм (від англійського словосполучення "Terminate and State Resident" - "завершитися і залишитися в пам'яті").

Резидентні програми - це програми, які постійно знаходяться в пам'яті програми допомоги (POP UP HELP), калькулятори, довідники і словники, програми копіювання і якісного друку екрану, русифікатори, віруси і багато іншого.

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

При активізації резидентної програми не має значення, яка програма виконується в цей момент, і немає необхідності завершувати її роботу.

Надалі будемо називати програму, яка виконує в момент активізації резидентної програми - основним процесом, а саму резидентну програму - фоновим процесом.

    1. Що таке «переривання»?

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

Процес переривання (надалі просто переривання) проходить в три стадії:

1) припинення виконання основного процесу;

2) обробка переривання;

3) повернення управління основного процесу.

Резидентна програма власне і здійснює обробку переривань. Тут слід зробити уточнення. Програміст пише програму, логічно аналізує ситуацію, що виникла - це обробка переривання на високому рівні. Для виконання дій з управління апаратурою (введення / виведення символу, читання з жорсткого диска і т. д.) Використовуються процедури базової системи введення / виводу BIOS (Base Input / Output System). Звернення до них з програми також називається перериванням, більш точно - сервісним перериванням.

Відмінністю програм обробки переривань від стандартних підпрограм, є те, що система перед їх викликом поміщає в стек регістр слова стану процесора (PSW) для його відновлення в кінці переривання, а управління завжди передається за допомогою непрямої адресації.

    1. Апаратні та сервісні переривання

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

Такі переривання називаються асинхронними або апаратними. Вони генеруються системою MS DOS при отриманні від устаткування сигналу про будь-яку подію. Апаратні переривання нумеруються в порядку пріоритету виклику від 0-го до 15-го для IBM PC / AT і від 0-го до 7-го для IBM PC / XT. Всі ці переривання, крім 2-го (IRQ2), можуть бути заборонені ("маскуватися") шляхом скидання прапора "I" в регістрі слова стану процесора (біт 7), і потім знову дозволені зворотною дією. Не рекомендується надовго (більше 1/18 секунди реального часу) забороняти переривання, так як це призведе до відставання системних годин від абсолютного часу.

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

    1. Як викликати сервісне переривання?

Кожне переривання має унікальний порядковий номер. В інструкціях по MS DOS і BIOS для кожного переривання описані дії, що виконуються комп'ютером. Наприклад, щоб прочитати символ, що вводиться з клавіатури, необхідно здійснити переривання з номером 16H і функцією 00H.

За командою MOV AH, 00H номер функції завантажується в регістр AH. За командою INT 16H відбувається переривання, і символ, введений з клавіатури, поміщається в регістр AL. У таблиці наведено приклади апаратних і сервісних переривань для IBM PC / AT.



Рис.1.1 «Таблиця апаратних і сервісних переривань»

Деякі з цих переривань доповнюють один одного. При натисканні клавіші на клавіатурі, системою генерується апаратне переривання INT 09H (IRQ 1), при обробці якого сканкод натиснутоюклавіші поміщається в буфер клавіатури, а одна з функцій сервісного переривання INT 16H дозволяє вважати цей код з буфера клавіатури і повертає ASCII-код символу, відповідного утримуючи клавішу.

В оперативній пам'яті комп'ютера перші 256 * 2 слів зарезервовані для зберігання сегментних адрес програм обробки переривань. Наприклад, адреса програми обробки переривання від клавіатури INT 16H знаходиться в осередках 16H * 2 (базова адреса сегмента) і в 16H * 2 + 1 (зміщення). Зарезервоване поле адрес програм носить спеціальну назву - область векторів переривань. При виникненні події, що викликає переривання, система читає відповідні вектора події переривання і викликає програму обробки переривання, вміщену за адресою, на який вказує цей вектор. Процес обробки переривання вважається завершеним, коли програма обробки переривання засилає в порт з адресою 20H мікросхеми контролера переривань код 20H.

Розробники апаратури персонального комп'ютера дотримувалися ідеології "відкритої архітектури". До комп'ютера можна підключати безліч периферійних пристроїв, а змінювати стратегію управління цими пристроями дуже просто - досить помістити в область векторів переривань адреса програми, яка обслуговує новий пристрій.

Таким же точно чином встановлюються в систему і скільки-небудь програми.

Працювати з векторами переривань можна двома способами. Перший спосіб - це пряма запис і читання оперативної пам'яті в області векторів переривань. Другий і більш зручний спосіб - використання сервісного переривання DOS INT 21H, функція 35H якого дозволяє вважати вектор переривання в двухсловний елемент пам'яті, а функція 25H дозволяє встановити потрібний вектор переривання за адресою, вміщеної в двухсловний елемент пам'яті.

    1. Структура резидентної програми

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

Допоміжна частина виконує наступні дії:

1) зберігає вектори "захоплюваних" переривань у внутрішніх змінних;

2) встановлює ці вектори за адресою резидентної частини програми;

3) ініціалізує внутрішні змінні резидентної частини;

4) завершує роботу програми без видалення резидентної частини з пам'яті комп'ютера.

Реалізація цих дій на низькому рівні є:

1) виклик 35-й функції переривання DOS INT 21H (GET VECTOR), яка дозволяє зберегти вектор переривання в двухсловной мітці;

2) виклик 25-й функції переривання DOS INT 21H (SET VECTOR), яка дозволяє встановити вектор переривання за відомою адресою;

3) присвоєння початкових значень внутрішнім змінним залежно від їх призначення в програмі;

4) виклик переривання DOS 27H (KEEP), яке дозволяє завершити виконання програми без видалення резидентної частини з пам'яті комп'ютера.

З того моменту як резидентна частина програми знаходиться в ОЗУ, і на неї вказує вектор "захопленого" переривання, вона може бути активізована шляхом виклику цього переривання.

Побудова резидентної частини може здійснюватися за трьома схемами виконання.



Рис.1.2 «Схеми виконання резидентної частини»

У схемі "А" спочатку викликається системна обробка, а потім проводиться додаткова призначена для користувача обробка, написана програмістом. Ця схема підходить в тому випадку, коли програміст хоче чимось доповнити системну обробку. Наприклад, можна змусити машину міняти після натискання клавіш Ctrl-Alt атрибути яскравості символів на протилежні.

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

Схема "C" повністю виключає системну обробку і замінює її користувальницької. При необхідності взагалі виключити обробку даного переривання резидентная частина повинна складатися лише з операторів засилання в порт 20H сигналу про кінець переривання (код 20H) та оператора повернення IRET.

    1. Активізація резидентних програм гарячими клавішами

Найпоширенішим способом активізації резидентних програм по перериванню є виклик по так званим "гарячим" клавішах ( "hot keys"), т. д. За заздалегідь встановленою комбінації клавіш.

Найлегше обробляти поєднання клавіш Ctrl, Alt, LeftShift і RightShift. Резидентна програма, яка викликається за "гарячим клавішам", зазвичай встановлюється на переривання INT 09H, хоча може встановлюватися і на переривання INT 16H. На початку резидентної частини необхідно перевірити байт пам'яті, що знаходиться за адресою 0000: 0417H, в якому зберігаються бітові прапори стану клавіатури, т. Е. Інформація про натиснутих в даний момент керуючих клавішах. Якщо значення біта дорівнює 1 (біт "зведений"), значить відповідна клавіша в даний момент натиснута або включений відповідний режим.



Рис. 1.3 «Виклик програми гарячими клавішами»

Деяким саморозміщувані програмами для нормальної роботи необхідно захоплювати більше одного вектора переривань. Прикладом таких програм є русифікатори. Ці програми перехоплюють переривання INT 09H і з його допомогою відстежують момент зміни режимів "Рус / Лат" по "гарячим" клавішах, а також перехоплюють функцію 00H переривання INT 10H для завантаження в знакогенератор шрифтів різних розмірів при зміні одного режиму відео на інший (наприклад, при зміні текстового режиму 25 * 80 зі шрифтом 8 * 14 точок на текстовий режим 42 * 80 зі шрифтом 8 * 8 точок).

    1. Особливості програмування

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

Якщо регістри не будуть відновлені, то нормальний повернення в основний процес не відбудеться. Це швидше за все призведе до краху системи. Така помилка досить часто допускається програмістами, початківцями працювати над написанням резидентних програм.

В резидентних програмах необхідно акуратно працювати зі стеком, так як при недостатньому його розмірі буде псуватися пам'ять, що знаходиться після резидентної програми.

До непередбачуваних наслідків призводить також незбалансованість операторів PUSH (покласти в стек) і POP (витягти з стека).

Все скільки-небудь програми обробки переривань повинні закінчуватися командою IRET, так як вона крім повернення здійснює відновлення слова стану процесора (PSW).

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

1   2   3   4   5   6   7   8

скачати

© Усі права захищені
написати до нас