Міністерство освіти та науки України
НУ ”Львівська політехніка”
Методичні вказівки
до циклу лабораторних робіт
з курсу
“Системне програмування”
для студентів базового напрямку
6.0915 “Комп`ютерна інженерія”
Затверджено
на засіданні кафедри електронних
обчислюваних машин
Протокол № 14 від 2 квітня 1996 року

Львів – 1996
Методичні вказівки до циклу лабораторних робіт з курсу “Системне програмування”
для студентів базового напрямку “Комп`ютерна інженерія” /Упор. Л.О.Березко,
Т.В.Кицмей, Р.І.Беген. – Львів:НУЛП. – 21с.
Упорядники : Л.О.Березко,к.т.н., доц.
Т.В.Кицмей, к.ф.-м.н.,ст.викл.
Р.І.Беген, асист.

Відповідальний за випуск : А.О.Мельник, д.т.н.,проф.
Рецензенти : В.В.Троценко,к.т.н., доц.
К.М. Обельовська,к.т.н., доц.
Лабораторна робота №1
(4 години)
Назва роботи : Ввід інформації з клавіатури.
Мета роботи : Ознайомитись з можливостями організації вводу з клавіа-
тури в комп`ютерах сімейства ІВМ РС.
Загльні положення
Ввід інформації в комп`ютер може бути виконаний на трьох рівнях:
зверненням до функцій операційної системи (МS DOS);
зверненням до функцій BIOS;
фізичним безпосереднім доступом до апаратних засобів.
Перший рівень дозволяє пропускати клавіатурний ввід через через інста- льованні драйвери ,забезпечує контроль за клавішами Crtl-C ( Crtl–Break)
та стандартну для операційної системи обробку помилок .
Другий рівень дозволяє програмі слідкувати за натиском усіх, а не тільки
символьних клавіш , виконувати керування апаратурою клавіатури і інш.
Третій рівень – ( безпосередній доступ до буферу клавіатури )значно під-
вищує продуктивність програми. В деяких випадках необхідна імітація
натиску клавіш клавіатури з записом кодів безпосередньо у буфер. При
цьому фізично натиск клавіш не відбивається. Так будуються ,наприклад,
демонстрційні програми.
Коротко зупинимось на апаратних засобах персонального комп`ютера для
вводу з клавіатури. Клавіатура вміщує вбудований мікропроцесор. Він при
кожному натисканні клавіші визначає її порядковий номер ( скенд-код ) і
розміщує його в порт спеціальної електронної схеми – програмованого
переферійного інтерфейсу (ППІ). Скенд-код у перших 7 бітах вміщує
порядковий номер натиснутої клавіши, а восьмий біт дорівнє “о” , якщо
клавіша була натиснута (прямий скенд-код), та дорівнює “1”,якщо клавіша
була відпущена (зворотній скенд-код). Коли скенд-код записаний у порт 60h , схема ППІ видає сигнал “підтвердження” повідомляючи мікропроце- сор клавіатури про те, що код прийнято.
Якщо клавіша натиснута довше деякого часу затримки ( delay value ), мікропроцесор клавіатури починає генерувати з заданою частотою (typenic)
прямий скенд-код натиснутої клавіші.Коли скенд-код прийнятий схемою
ППІ,аппаратура комп`ютера генерує переривання 9.Стандартний обробник
переривання 9 – це програма ,що входить до BIOS ISR аналізує скенд-код,
та по спеціальним правилам перетворює його ( ISR – Interrupt Servise Routine – програма обслуговування переривання ).
Буфер BIOS для запису кодів клавіш займає 32 байта пам`яті з адреси
40:1ЕН (1086 в 10 с/г). Запис йнформації до буферу виконує ISR BIOS
переривання 9 , читаня – функції ISR BIOS переривання 16Н. Буфер
клавіатури розрахований на 15 натискань клавш , що генерують двохбайтні
коди , і тому має 30 байт для кодів клавіш та два додаткових байта , які
резервуються під двохбайтовий код для клавіші ENTER.
Буфер організовується як кільцева черга , доступ до якої виконується за
допомогою покажчика “голови” (head-pointer),адреса якого 40:1АН ( 1050
в с/г), та покажчика “хвоста” (tail pointer) адреса якого 40:1СН(1052 в с/г).
Значення, що записані у покажчиках дорівнюють зміщення до слова , де
буде записаний обробником переривання 9 код клавіші ,що буферизується,
т.т. перше вільне слово буфера.
Покажчик “годови” задає зміщення слова , яке буде повернуте запиту буферизованого вводу з клавіатури , зробленого операційного систимою
або BIOS.
Буфер для клавіатури – це класичний приклад використання кільцевого
кільцевого буферу для органіції асихронної взаємодії програм за схемою
“виробник-споживач”. Одна з програм (ISR BIOS переривання 9)“виробляє”
інформацію , тобто , вона є процесом–виробником. Програма , що
виконується , через функцію АН=00Н переривання 16Н BIOS “споживає”
інформацію,тобто є процесом-споживачем.Асинхронність взаємодії означає
що запис до буферу нової їнформації та читання з нього відбувається у випадкові,не зв`язані моменти часу. Тому що “виробник” постійно аналізує наявність переповнення буферу ,не відбувється перевизначення не прочи-
таних ще “споживачем” кодів клавіатури . Тобто при переповненні буферу “виробник” блокується до того часу , доки “споживач” не прочитає одне
або декілька слів з буферу .Якщо ж буфер пустий і виконується спроба читання інформації, функція АН=00Н переривання 16Н BIOS переходить до
безконечного циклу , умовою якого є нерівність між собою покажчиків
“голови” і “хвоста”. Фактично , біжуча програма , що виконує ввід з
клавіатури, блокується , не даючи “споживати” неіснуючу ще інформацію.
Перший рівень вводу з клавіатури
Послідовність дій системи при вводі з клавіатури така:
функція MS-DOS викликає драйвер клавіатури,передаючи йому запит
на ввід одного символу з буферу клавіатури;
драйвер,виконуючи запит, звертається до потрібної функції перерива-
ння 16Н BIOS;
ISR BIOS переривання 16Н читає з буферу клавіатури потрібне слово
та передає його в драйвер;
драйвер повертає байт (звичайно молодший) в MS-DOS.
Таким чином , функції MS-DOS та функції бібліотеки Turbo C, що спираються на них,слабо залежать від особливостей апаратури, оскільки система ізольована від неї двома шарами програмного забезпечення –
драйверами та BIOS.
Для вводу з клавіатури використовується такі функції MS-DOS:
АН = 01Н – ввід з очікуванням з стандартного пристрою вводу (клавіатури);
АН = 06Н – ввід-вивід з консолі;
АН = 07Н – ввід з консолі з очікуванням без “відлуння” на екран;
АН = 08Н – подібна до попередньої , крім реакції на натискання Crtl-Break (викликається переривання 23Н);
АН = ОАН – буферизований ввід рядка з консолі;
АН = ОВН – перевірка стану стандартного вводу;
АН = ОСН – ввід з клавіатури з чисткою буфера;
АН = 3FH – функція префіксного читання з файлу або пристрою.
Бібліотечні функції Turbo C для роботи з файлами можна поділити на дві
групи: потокові та префіксні. Потокові функції виконують додаткову буферизацію інформації, що приводить до подвійної буферизації інфор-
мації: на рівні бібліотечної функції та на рівні MS-DOS. Префіксні
функції не виконують додаткову буферизацію , а одразу звертаються до
префіксних функцій MS-DOS. Початкові функції більш ефективні при
перенесенні інформації між файлом та Сі-програмою по символам та рядкам. Префіксні функції – блок-орієнтовані функції і їх використа ння дає виграш в продуктивності при перенесені одразу цілої групи
байтів за одне звертання до функції. Розглянуті функції MS-DOS для вводу
з клавіатури можна викликати одразу з Сі-програми через такі функції Тurbo C, як geninterrupt(), int86(), intr(), та інші ,або нявно функціями вводу
Turbo C. Bелика група функцій Turbo C для вводу з клавіатури – це функції
потокового та префіксного вводу. Використовуючи функції вводу, прототи-
пи яких розміщені у файлі stdio.h, неможливо виконати , наприклад, не
відображення символів і т.ін. Для виконання таких дій використовуються
функції Turbo C,прототипи яких ро