ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Системи програмування та операційні системи
         

     

    Інформатика, програмування

    Міністерство освіти України Одеська державна академія холоду Інститут інформаційних технологій

    Кафедра «Інформаційних систем»

    Розробка резидентного обробника переривань від клавіатури

    Курсовий проект з дисципліни

    «Системи програмування та операційні системи»

    Керівник Ненов А. Д. Виконавець

    Ст. гр. 333А Лазанюк А. С.

    зач. книжка № 983214

    Захищений з оцінкою _____________________

    (особистий підпис)

    _______________

    р. Одеса 2000

    Зміст:

    1. Завдання ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .2

    2. Короткі теоретичні відомості

    2.1. Резидентний обробник переривань ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 3

    2.2. Захист резидентної програми від повторної установки ... ... ... ... ... ... ... ... ... ... ... ... ... .. 5

    2.3. Вивантаження резидентної програми з пам'яті ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 8

    2.4. Перехоплення переривань ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 11

    2.5. Оброблювач переривань ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 12

    2.6. Переривання від зовнішніх пристроїв ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 12

    2.7. Резидентний обробник переривань від клавіатури з підключенням до системного обробника ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .14

    3. Опис програми

    3.1. Опис для користувача ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 19

    3.2. Опис для програміста ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .20

    3.3. Лістинг програми ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. ... .24

    3.4. Рекомендації щодо поліпшення ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 32

    4. Список використаної літератури ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. ... .33

    1. Завдання

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

    2. Короткі теоретичні відомості

    2.1. Резидентний обробник переривань

    Великий клас програм, що забезпечують функціонування обчислювальної системи (драйвери пристроїв, програми шифрування та захисту даних, русифікатори, що обслуговують програми типу електронних блокнотів або калькуляторів тощо), повинні постійно знаходитися в пам'яті й швидко реагувати на запити користувача або на якісь події, що відбуваються в обчислювальній системі. Такі програми носять назви програм, резидентних у пам'яті (Terminate and Stay Resident, TSR), або просто резидентних програм. Зробити резидентної можна як програму типу СОМ, так і програму типу

    ЕХЕ, але через те, що резидентна програма повинна бути максимально компактною, найчастіше як резидентних використовують програми типу СОМ.

    Розглянемо типову структуру резидентної програми та системні засоби залишення її в пам'яті після ініціалізації (рис. 2.1).

    text segment 'code'

    assume CS: text, DS : text

    org 100h main proc

    jmp init ; Перехід на секцію ініціалізації

    ; Дані резидентної секції програми

    . . .

    entry: ; Текст резидентної секції програми

    . . .

    main endp

    init proc ; Секція ініціалізації

    . . .

    mov DX, (init-main +10 Fh)/16 ; Paзмер в параграфах

    mov АН, 3100h ; функція "Завершити і залишити в

    int 21h ; пам'яті "init endp text ends

    end main

    Рис 2.1. Типова структура резидентної програми.

    Програма пишеться у форматі СОМ, тому в ній передбачається тільки один сегмент, з яким зв'язуються сегментні регістри CS і DS; на початку сегмента резервується l00h байт дня PSP.

    При запуску програми з клавіатури управління передається (у відповідності з параметром директиви end) на початок процедури main. Командою jmp одразу ж здійснюється перехід на секцію ініціалізації, яка може бути оформлена у вигляді окремої процедури або входити до складу процедури main. У секції ініціалізації, зокрема, готуються умови для роботи програми вже в ре-зідентном стані. Останніми рядками секції ініціалізації викликається функція DOS 31h, яка виконує завершення програми з залишенням в пам'яті зазначеної її частини. Ця функція не може залишати резидентними програми розміром більше 64 Кб, але багато програм, написані на асемблері, відповідають цій умові. Так як резидентні програми зменшують обсяг основної пам'яті, їх завжди пишуть на асемблері і оптимізують для досягнення мінімального розміру.

    Розмір резидентної частини програми (у параграфах) передається DOS в регістрі DX. Опрі-ділити розмір резидентної секції можна, наприклад, наступним чином. До різниці зсувів mil-main, яка дорівнює довжині резидентної частини програми в байтах, додається розмір PSP (l00h) і ще число 15 (Fh) для того, щоб після цілочисельного поділу на 16 результат був заокруглений в більшу сторону.

    З метою економії пам'яті секція ініціалізації розташовується я кінці програми і відкидається при її завершення.

      

    Точка входу ® main

    при завантаженні jmp init

    . Резидентні

    : поля даних резидентна частина

    Точка входу ® entry програми

    при виклику. Резидентні

    : коди

    iret

    init

    . Секція

    : ініціалізації Завершення програми

    Функція DOS 31h ® з складанням у пам'яті

    її резидентної частини

    Рис. 2.2 Взаємодія елементів резидентної програми.

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

    На рис. 2.2 показані елементи резидентної програми та їх взаємодія.

    Будь-яка резидентна програма має принаймні дві точки входу. При запуску з клавіатури програми типу. СОМ керування завжди передається на перший байт після PSP (IP = l00h). Тому практично завжди першою командою резидентної програми є команда jmp, що передає керування на початок секції ініціалізації.

    Після відпрацювання функції DOS 31h програма залишається в пам'яті в пасивному стані. Для того, щоб активізувати резидентну програму, їй треба якось передати управління і, можливо, параметри. Викликати до життя резидентну програму можна різними способами, але найбільш вживаною є механізм апаратних чи програмних переривань. У цьому випадку в секції ініціалізації необхідно заповнити відповідний вектор адресою резидентної частини програми (точка entry на рис. 2.2). Адреса entry утворює другу точку входу в програму, через яку здійснюється її активізація. Очевидно, що резидентна секція програми повинна закінчуватися командою виходу з переривання iret.

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

    Після запуску програми вона залишається в пам'яті і, активізуючись фактично апаратними переривань від клавіатури (а більше точно - програмою BIOS, керуючі апаратними переривань від клавіатури). 2.2. Захист резидентної програми від повторної установки

    Як правило, в секції ініціалізації завантажуються вектори переривань, через які буде активізуватися програма. Останніми рядками секції ініціалізації викликається функція DOS 31h, яка виконує завершення програми з залишенням в пам'яті її резидентної частини.

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

    Найбільш поширеним методом захисту резидентної програми від повторної установки є використання переривання 2Fh, спеціально призначеного для зв'язку з резидентними програмами. Коли Ви робите цього переривання в регістрі АН задається номер функції (від 00h до FFh), а в регістрі AL - номер підфункції (у тому ж діапазоні). 00h - 7Fh зарезервовано для DOS/Windows 0B8h - 0BFh зарезервовано для мережевих функцій 0C0h - 0FFh відводиться для програм.

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

    Таким чином, обробник переривання 2Fh резидентної програми повинен, перш за все, перевірити номер функції в регістрі АН; при виявленні "своєї" функції обробник аналізує вміст регістру AL і виконує витребувані дії, після чого командою iret передасть управління викликала його програмі. Якщо, проте, обробник виявив в регістрі АН "чужу" функцію, він повинен командою jmp CS: old_2fh передати управління по ланцюжку тому обробникові, адреса якого був раніше у векторі 2Fh. У результаті виклик int 2Fh з будь-якої програми буде проходити по ланцюжку через всі завантажені резидентні програми, поки не досягне "своєї" програми або не поверне управління в викликала програму через обробник DOS (який, очевидно, завжди буде самим останнім у ланцюжку).

    Природно, для комунікації з резидентної програмою повинен бути встановлений деякий інтерфейс. Зазвичай при перевірці на повторну установку резидентна програма, якщо вона вже знаходиться в пам'яті, повертає в регістрі AL значення FFh, що є ознакою заборони вторинної завантаження. Іноді для більшої надійності ідентифікації "своєї" функції резидентна програма, крім значення FFh в регістрі AL, повертає ще якісь обумовлені заздалегідь коди в інших регістрах. Часто через додаткові регістри передасться символьна інформація, наприклад, ім'я програми. У цьому випадку, якщо що викликала програма з ім'ям DUMP.COM (тобто друга копія резидентної програми, яка з'ясовує, чи можна їй залишитися резидентного в пам'яті) отримує після виклику int 2Fh в регістрі AL значення FFh, а в регістрах СХ і DX символьні коди 'DU' і 'МР', вона може бути впевнена, що її перша копія вже знаходиться в пам'яті. Якщо ж в регістрі AL повернувся код FFh, а в регістрах СХ і DX-коди, наприклад, 'ОК' і 'RB', це, швидше за все означає, що закріплена за нашою програмою функція мультиплексного переривання вусі використовується інший резидентну програму. У цьому випадку варто змінити функцію, щоб не порушувати конфліктних ситуацій.

    У резидентну частину варто включити обробник переривання 2Fh. Його розташування в межах тексту програми не має особливого значення, ми помістили його на початку резидентної частини. Секція ініціалізації зазнала великих змін. Вона повинна починатися з виклику переривання 2Fh з відповідною функцій для перевірки на повторну установку. Якщо перша копія програми вже завантажена, поточну програму потрібно завершити не функція 3th (завершити і залишити в пам'яті), а звичайною функцією завершення 4Ch. Якщо ж нашої програми в пам'яті немає, то в секції ініціалізації, крім заповнення її "робочого" вектора, в даному випадку 03h, слід також встановити наш обробник мультиплексного переривання.

    Серед функцій мультиплексного переривання, призначених для прикладних програм, ми довільно вибрали для нашої програми функцію F1h, а для перевірки на повторну установку підфункції 00h. Резидентний обробник переривання 2Fh, що входить в нашу програму, перевіряє номери функції і підфункції і при виявленні будь-яких інших кодів передає управління наступного обробникові цього переривання. Якщо ж викликана функція F1h з підфункції 00h, оброблювач встановлює в регістрі AL значення FFh ( "я вже завантажений") і повертає керування в викликала програму командою iret.

    Секція ініціалізації починається з перевірки на повторну установку. Після завантаження в регістр АН номера функції (F1h), а в регістр AL -- номера підфункції (00h), викликається переривання 2Fh. Після повернення з переривання аналізується вміст регістру AL Якщо обробник повернув значення FFh, програма повинна завершитися без залишення в пам'яті. Ці дії виконуються по мітці installed. Якщо повернуто інше значення, ініціалізація продовжується (для надійності варто було перевірити, чи повернуто саме 0). Зберігається старе вміст вектора 2Fh, встановлюється наш обробник цього переривання, після чого виконуються всі дії по встановленню, передбачені в попередньому варіанті програми динамічного дампа. При переході на мітку installed на екран виводиться повідомлення про неможливість повт?? рной установки і виконується функція завершення 4Сh з кодом повернення 01h. Останнє, звичайно, має символічний характер, оскільки цей код надалі не аналізується. 2.3. Вивантаження резидентної програми з пам'яті

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

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

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

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

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

    За мітці uninstall здійснюється збереження використовуваних далі регістрів (що робиться швидше для краси, ніж за потребою) та функції DOS 25h відновлюється з осередків old_09h і old_2Fh оригінал вміст відповідних векторів. Далі з комірки із зсувом 2Ch щодо початку PSP в регістр ES завантажується адреса оточення програми. Сегментний адреса вивільняється блоку пам'яті - єдиний параметр, необхідний для виконання функції DOS 49h. Розмір вивільняється блоку DOS відомий, він зберігається в блоці управління пам'яттю (МСВ). Далі звільняється блок пам'яті з самою програмою. Сегментний адресу цього блоку (адреса PSP) знаходиться в регістрі CS. Нарешті, командою iret управління передасться в програму, що викликала переривання 2Fh.

    Функція 49h DOS сповіщає про те, що даний блок пам'яті вільний і може надалі використовуватись DOS. Це, однак, не заважає виконуватися завершальним рядках програми (в даному випадку - команді iret), оскільки звільнення пам'яті не руйнує її вмісту. Наша резидентна програма фізично зітреться лише після того, як в пам'ять буде завантажена чергова виконувана програма.

    Якщо програма запускається з клавіатури з вказівкою яких-небудь параметрів (імен файлів, ключів, які визначають режим роботи програми та ін.), то DOS, завантаживши програму в пам'ять, поміщає всі символи, введені після імені програми (так званий хвіст команди) префікс програмного сегмента програми, починаючи з відносного адреси 80h. Хвіст команди міститься в PSP в цілком певному форматі. У байт за адресою 80h DOS заносять число символів у хвості команди (включаючи пробіл, що розділяє на командному рядку саму команду і її хвіст). Далі (починаючи з байти за адресою 81h) дотримуються всі символи, введені з клавіатури до натиснення клавіші. Завершується хвіст колом повернення каретки (13).

    До даних секції ініціалізації додалася рядок з очікуваним хвостом команди і байтовий прапор запиту на розвантаження.

    Оскільки дії програми при її запуску залежать від того, введена чи команда запуску з параметром чи ні, наявність хвоста в 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. Перехоплення переривань

    В архітектурі процесорів 80х86 передбачені особливі випадки, коли процесор припиняє (перебиває) виконання поточної програми і негайно передає керування програмі-оброблювачеві, спеціально написаної для обробки подібної ситуації. Такі особливі ситуації поділяються на дві тина: переривання і виключення, в залежності від того, чи викликало цю ситуацію яке-небудь зовнішній пристрій або виконується процесором команда. Винятки далі діляться на три типи: помилки, пастки і зупинився, в залежності від того, коли по відношенню до що викликала їх команди вони відбуваються. Помилки з'являються перед виконанням команди, тому обробник такого виключення отримає як адресу повернення адреса помилкової команди (починаючи з процесорів 80286). Пастки відбуваються відразу після виконання команди, так що обробник отримує в як адресу повернення адреса наступної команди. І нарешті, зупинитися можуть виникати в будь-який момент і взагалі не передбачати повернення коштів управління в програму.

    Команда INT (а також INTO і INT3) використовується в програмах як раз для того, щоб викликати обробники переривань (або виключень). Фактично вони є винятками пастки, оскільки адреса повернення, який передасться обробникові, вказує на наступну команду, але так як ці команди були введені до поділу особливих ситуацій на переривання і виключення, їх практично завжди називають командами виклику переривань. З огляду на те, що обробники переривань і виключень в DOS зазвичай не розрізняють механізм виклику, за допомогою команди INT можна передавати управління, як на обробники переривань, так і винятків. Як показано в розділі 4, програмні переривання, тобто передача керування за допомогою команди INT, є основним засобом виклику процедур DOS і BIOS, тому що на відміну від дзвінка через команду CALL тут не потрібно знати адреси викликається процедури - достатньо лише номери. З іншого боку інтерфейсу розглянемо, як будується обробник програмного переривання. 2.5. Обробники переривань

    Коли в реальному режимі виконується команда INT, управління передається за адресою, що зчитується із спеціального масиву, таблиці векторів переривань, що починається в пам'яті за адресою 0000h: 0000h. Кожен елемент такого масиву представляє собою дальній адреса обробника переривання в форматі сегмент: зсув або 4 нульових байтів, якщо обробник не встановлено. Команда INT поміщає в стек регістр прапорів і дальній адреса повернення, тому, щоб завершити обробник, треба виконати команди popf і retf або одну команду iret, яка в реальному режимі повністю їм аналогічна.

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

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

    Зазвичай обробники переривань застосовують з метою обробки переривання від зовнішніх пристроїв або з метою обслуговування запитів інших програм. 2.6. Переривання від зовнішніх пристроїв

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

    - IRQ1 (INT 9) - переривання клавіатури, викликається при кожному натисканні і відпуску клавіші на клавіатурі. Стандартний оброблювач цього переривання виконує досить багато функцій, починаючи з перезавантаження по Ctrl-Alt-Del і закінчуючи приміщенням коду клавіші в буфер клавіатури BIOS.

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

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

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

    Зрозуміло, обробка переривань не повинна займати багато часу: якщо переривання відбувається досить часто (наприклад, переривання послідовного порту може відбуватися 28 800 разів на секунду), його обробник обов'язково повинен виконуватися за більш короткий час. Якщо, наприклад, обробник переривання таймера буде виконуватися 1/32, 4 секунди, тобто половину часу між переривань, вся система стане працювати в дві рази повільніше. А якщо ще одна програма з таким же довгим обробником перехопить це переривання, система зупиниться зовсім. Саме тому обробники переривань прийнято писати виключно на асемблері.

    2.7. Резидентний обробник переривань від клавіатури з підключенням до системного обробника

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

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

       IRQ INT Адреса системного

       Апаратне Контролер Мікро-обробника int09h

     переривання переривань Вектор09 процесор з вектора 09

       на IRQ1

    IRQ7 Запуск систем Натискання або обробника int09h

    відпускання Байт прапорів

    будь-якої клавіші Системний клавіатури

       Контроллер Порт 60h обробник [40h: 17h]

     клавіатури скан-код int09h | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |

        Клавіатура

     Ins

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status