Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекції_СПр.docx
Скачиваний:
37
Добавлен:
21.08.2019
Размер:
947.09 Кб
Скачать
  1. Функції bios для роботи з консоллю.

  2. Функції bios для роботи з клавіатурою.

  3. Функції bios для роботи з екраном.

Навчальна мета: Засвоїти основні поняття застосування базової системи введення-виведення для роботи з периферійними пристроями.

Виховна мета: Допомогти студентам усвідомити вагому роль застосування базової системи введення-виведення для роботи з периферійними пристроями.

Актуальність: Донести до відома студентів, що на сьогоднішній день знання застосування базової системи введення-виведення для роботи з периферійними пристроями є основним для роботи системного адміністратора.

Мотивація: Мотивацією вивчати даний напрямок у курсі системного програмування може стати бажання отримати позицію системного програміста.

Функції BIOS для роботи з консоллю

ROM BIOS (Read Only Memory Basic Input Output System) являє собою сукупність програм в енергонезалежній пам'яті комп'ютера, однією із задач яких є усунення специфіки апаратних компонентів комп'ютера для функціонуючі на ньому програмного забезпечення, включаючи операційну систему. Обслуговування клавіатури й монітора виконують програми BIOS, називані драйверами. Структурно драйвери складаються з ряду підпрограм, називаних функціями, кожна з яких виконує певні дії. Звертання до функцій BIOS виробляється аналогічно звертанню до функцій MS DOS. Для роботи із клавіатурою й екраном BIOS містить два програмних переривання - 16h і 10h, звертання до яких, виходячи з вищесказаного, є звертанням до драйверів цих пристроїв. Для виклику цих переривань, як звичайно, використається команда INT - int 16h або int 10h. Для виконання певної операції в регістрі АН указується номер функції. При необхідності в інших регістрах може вказуватися додаткова (параметрична) інформація. Нижче розглянемо докладніше можливості BIOS для роботи з консоллю.

Функції BIOS для роботи із клавіатурою

Переривання 16 BIOS має функції для різних типів клавіатур: звичайної — 84 клавіші й двох типів розширеної клавіатури — 101\102 і 122-клавішної.З'ясувати функціональні можливості клавіатури дозволяє функція 09 h:

Вхід: АН - 09h. Вихід: AL = бітове поле, установлені біти якого позначають підтримувані функції: 7 - резерв; 6 - підтримка клавіатури з 122 клавішами (і функцій 20h-22h (int 16h)); 5 - підтримка розширеної клавіатури з 101-102 клавішами (і функцій 10h-12h (int 16h)); 4 - підтримка функції 0Ah (int 16h); 3 - підтримка функції 0З0бп (int 16h); 2 - підтримка функції 0305h (int 16h); 1 - підтримка функції 0304h (int 16h); 0 - підтримка функції 0З00 h (int 16h).

Перш ніж викликати цю функцію, необхідно впевнитися в тому, що вона підтримується даною версією BIOS. Зробити це можна, викликавши функцію 0С0h переривання int 15h.

Вхід: АН = COh одержати конфігурацію. Вихід: CF = 1 - BIOS не підтримує цю функцію; CF - 0 - у випадку успіху: ES:BX - адреса конфігураційної таблиці в ROM-пам'яті; АН = стан (Ооп - успіх; 8бп - функція не підтримується).

Формат конфігураційної ROM-таблиці:

Зсув

Розмір

Опис

00h

2 байти

Число байтів у цій таблиці

02h

1 байт

Модель BIOS

03h

1 байт

Підмодель BIOS

04h

1 байт

Видання BIOS: 0 — 1-я редакція, 1 — 2-я редакція й т.д.

05h

1 байт

1-й байт властивостей

06h

1 байт

2-й байт властивостей

07h

1 байт

3-й байт властивостей

08h

1 байт

4-й байт властивостей

09h

1 байт

5-й байт властивостей

Якщо в результаті цього виклику біт б другого байта властивостей установлений, то BIOS підтримує функцію 09h переривання int 16h, за допомогою якої визначаються функціональні можливості клавіатури.

Вхід: АН = 10h, 20h читання символу з очікуванням (для 101-102- і 122-клавиш-ных клавіатур відповідно). Вихід: для звичайних клавіш (АН = скан-код BIOS; AL = символ ASCII); для клавіш і комбінацій з розширеним кодом (АН = розширений ASCII-код; AL = 0); для додаткових клавіш (АН - розширений ASCII-код; AL = 0Eh). Для уведення рядка символів дані функції необхідно використати в циклі. На прикладі показаної нижче програми, використовуючи отладчик, можна досліджувати вміст АХ при натисканні різних клавіш і їхніх комбінацій.

;prg05_02.asm - програма на асемблері для уведення рядка ;з використань функції уведення символу 10h

.data

string db 5 dup (0) len_string =$-string adr_stringdd string

.code

mov cx,len_string

les di.adr_string ml: mov ah.O10h

int 16h

stosb

loop ml

Програма вводить 5 символів і зберігає їх у рядку str.

Перевірка наявності символу (01h, 11h, 21h int 16h)

Вхід: АН = Olh перевірка наявності символу (для 84-клавішної клавіатури). Вихід: якщо ZF=O, те регістри АН і AL містять: для звичайних клавіш (АН = скан-код BIOS; AL = символ ASCII); для клавіш і комбінацій з розширеним ASCII-кодом (АН = розширений ASCII-код; AL = 0); якщо ZF=1, то буфер порожній.

Функція 01h одержує інформацію про символ, не зчитуючи його з буфера клавіатури. Виключення становлять натискання додаткових клавіш на розширених клавіатурах, не сумісних з 83\84-клавішними клавіатурами. У процесі перевірки функцією O1h вони віддаляються з буфера. Тому при роботі з розширеними клавіатурами необхідно використати функції 11h і 21h.

Вхід: АН = llh, 21h перевірка наявності символу (для 101-102- і 122-клавішних клавіатур відповідно). Вихід: якщо ZF=O, те регістри АН і AL містять: для звичайних клавіш (АН = BIOS скан-код; AL - символ ASCII); для клавіш і комбінацій з розширеним кодом (АН = розширений ASCII-код; AL = 0); для додаткових клавіш (АН = розширений ASCII-код; AL = 0eh); якщо ZF=0, то буфер порожній. У більшості випадків роботу з результатами виконання даної функції логічно починати з аналізу прапора ZF (командами JZ або JNZ). Що ж стосується вмісту регістра АХ, те воно аналогічно містимо00h int 16h :пересилаємо його: stosb jmpml

Одержання стану прапорів клавіатури (02h, 12h, 22h int 16h)

BIOS надає функцію 02h для одержання стану світлових індикаторів клавіатури й деяких керуючих клавіш.

Вхід: АН = 02h одержати стан прапорів клавіатури (для 84-клавішної клавіатури). Вихід: AL = бітове поле, установлені біти якого відповідають стану наступних прапорів: 7 — режим вставки активний; 6 — індикатор CapsLock включений; 5 — індикатор NumLock включений; 4 — індикатор ScrollLock включений; 3 — натиснута клавіша Alt (будь-яка клавіша Alt на 101-102-клавішній клавіатурі); 2 — натиснута клавіша Ctrl (будь-яка клавіша Ctrl на 101-102-клавішній клавіатурі); 1 — натиснута ліва клавіша Shift; 0 — натиснута права клавіша Shift.

Підтримка розширених клавіатур здійснюється функціями 12h і 22h BIOS.

Вхід: АН = 12h, 22h одержати стан прапорів клавіатури (для 101-102- і 122-клавішних клавіатур). Вихід: AL = перше бітове поле, установлені біти якого відповідають стану прапорів, що повертають у регістрі AL функцією 02п; АН = друге бітове поле, установлені біти якого відповідають наступному стану прапорів: 7 — натиснута клавіша SysReq (SysRq); 6 - натиснута клавіша CapsLock; 5 — натиснута клавіша NumLock; 4 — натиснута клавіша Scrolllock; 3 — натиснута права клавіша Alt; 2 — натиснута права клавіша Ctrl; 1 — натиснуто ліву клавішу Alt; 0 — натиснута ліва клавіша Ctrl. Крім цього, стан даних прапорів можна прочитати з оперативної пам'яті по адресах: 0040h:0017h (AL) і O040h:0010h (АН).

Запис символу в буфер клавіатури (05h int 16h)

Вхід: АН = 05h запис символу в буфер клавіатури: СН = скан-код; CL = символ ASCII. Вихід: AL = стан: 00h — успішний запис; Olh — помилка (буфер клавіатури заповнений).

За допомогою цієї функції можна здійснювати перевірку для програм, які очікують уведення із клавіатури. Сам буфер клавіатури організований за принципом кільця, має розмір 16 байт і займає в пам'яті діапазон адрес 0040h:001Eh...0040h:003Dh. В комірці 0040h:001Ah зберігається адреса початку буфера, а в комірці 0040h: 00,1Ch - адреса кінця. Якщо вміст цих комірок рівний, то буфер порожній. Одному символу в буфері відповідає слово, у якому перший байт - скан-код клавіші, а другий - символ ASCII. Досліджувати дану функцію можна з використанням операції зчеплення (|) MS DOS. Для цього оформимо фрагмент коду для визначення наявності символу в буфері і його уведенні у вигляді окремої програми.

У командний рядок MS DOS необхідно ввести рядок:

prog_1.exe | prog_2.exe >p.txt

У результаті всіх цих дій буде створений файл p.txt, що і буде містити рядок str з файлу prog_1.asm.

функції BIOS для роботи з екраном

Робота з екраном засобами BIOS виробляється за допомогою набору функцій переривання 10h. За допомогою цих функцій підтримуються текстовий і графічний режими роботи монітора. У даному розділі будуть розглянуті деякі функції виводу тексту в текстовому режимі.

Установка відеорежиму (00h int 10h)

Будь-який дисплейний адаптер підтримує кілька текстових і графічних режимів. Перемикання між цими режимами виконується за допомогою функції 00h int 10h.

Вхід: АН = 00h установити відеорежим: AL - номер відеорежиму (якщо біт 7 регістра AL = 0, то екран очищається, у зворотному випадку (AL. 7=1) уміст екрана не змінюється).

Установка позиції курсору (02h int 10h)

Функція 02h дозволяє змінити позицію курсору й зробити її початкової для наступного виводу. Помітимо, що серед функцій MS DOS немає подібної функції й функцію 02h int 10h BIOS можна використати в комбінації з функціями MS DOS для організації форматованого виводу на екран.

Вхід: АН = 02h - установити позицію курсору: ВН = номер відеосторінки (залежить від використовуваного відеорежиму); DH = рядок (00h - верх); DL = до-" лонка (00h - лівого).

Одержання позиції курсору (03h int 10h)

Функція 03h дозволяє одержати поточну позицію курсору. Аналогічно сказанному вище, серед функцій MS-DOS немає подібної функції й функцію 03h > int 10h BIOS також можна використати в комбінації з функціями MS-DOS.

Вхід: АН = 03h — одержати позицію курсору; ВН - номер відеосторінки (залежить від використовуваного відеорежиму). Вихід: DH = рядок поточної позиції курсору (00h - верх); DL - колонка поточної позиції (00h - ліва); СН = номер початкового рядка курсору; CL = номер останнього рядка курсору.

Запис символу і його атрибута у відеопам'ять (09h int 10h)

Функція 09h призначена для запису ASCII-коду символу і його атрибута безпосередньо у відеопам'ять, причому зробити це можна з кількістю повторень, заданих у регістрі СХ.

Вхід: АН = 09h — запис символу і його атрибута в поточну позицію курсору: ВН = номер відеосторінки; AL = ASCII-код символу; BL = байт-атрибут; СХ = число повторень. Для виводу одного символу вміст регістра СХ повинне бути дорівнює 1. У текстовому режимі для СХ>1 вивід здійснюється до кінця поточного рядка, після чого переходить на інший рядок. Кодування байта-атрибута в цій і іншій функціях виробляється у відповідності з наступними таблицями.

Номера битов

Значення

7

Миготливий символ

6..4

Колір фону

3

Символ яскравого кольору

2..0

Символ кольору

 

Біти

Кольори

Яскравий колір

000b

Чорний

Темно-сірий

001b

Синій

Ясно-синій

010b

Зелений

Ясно-зелений

011b

Голубой

Світло-блакитний

100b

Червоний

Ясно-червоний

101b

Пурпурний

Світло-пурпурний

110b

Коричневий

Жовтий

111b

Ясно-сірий

Білий

Читання символу і його атрибута з відеопам'яті (08h int 10h)

У пам'яті відеоадаптера кожний символ представлений двома байтами, що містять ASCII-код символу і його байт-атрибут. Функція 08h BIOS дозволяє прочитати код символу і його атрибут безпосередньо з відеопам'яті.

Вхід: АН = 08h — читання символу і його атрибута в поточній позиції курсору; ВН = номер відеосторінки. Вихід: AL = ASCII-код символу; АН = байт-атрибут. Нижче наведена програма, що встановлює курсор у задану позицію.

:prg05_04.asm. устанавливающая курсор у задану позицію.

.code main:

xorbh.bh

mov dh.10

movdl.10

movah.02h

int 10h установили позицію курсору (10.10) записуємо символ і атрибут у відеопам'ять

moval. "a"

mov bl,10001100b :атрибут - яскраво-червоний миготливий

movcx.5 ;повторити 5 разів

movah.09h

int 10h :прочитаємо символ з поточної позиції відеопам'яті:

mov ah,08h

int 10h : з'ясуємо поточну позицію курсору

хог bh.bh

mov ап.ОЗn

kint 10h установили позицію курсору (10.10) 

:всі результати дивимося в отладчике

Важливо відзначити, що поточна позиція курсору після виконання функцій 08h і 09h залишилася незмінною. Звідси треба важливий вивід про те, що при використанні цих функцій необхідно також піклуватися й про рух курсору функцією 02h. BIOS надає функцію 0Eh, що виводить символ у режимі телетайпа, що припускає автоматичне коректування поточної позиції курсору після виводу символу.

Запис символу у відеопам'ять (0Ah int 10h)

Функція 0Ah призначена для запису ASCII-коду символу з поточним значенням атрибута в даній позиції безпосередньо у відеопам'ять, причому зробити це можна з кількістю повторень, заданих у регістрі СХ.

Вхід: АН = 0Ah — запис символу в поточну позицію курсору; ВН = номер відеосторінки; AL = ASCII-код символу; СХ = число повторень.

Аналогічно функції 09h поточна позиція курсору не змінюється.

Запис символу в режимі телетайпа (0Eh int 10h)

Функція 0Eh виводить символ у поточну позицію курсору з автоматичним її зсувом (на відміну від функцій 09h і 0Ah).

Вхід: АН = 0Eh — запис символу в поточну позицію курсору; ВН = номер відеосторінки; AL ¦¦ ASCII-код символу; СХ = число повторень. Запис символу в останню позицію рядка автоматично переводить курcop у першу позицію наступного рядка.

Вивід рядка (13h int 10h)

Ця функція з'явилася в BIOS комп'ютерів архітектури AT.

Вхід: АН = 13h вивід рядка (AT); AL = режим запису: біт 0 - після виводу курсор у кінець рядка; біт 1 - кожний символ у рядку представлений двома байтами: байтом з ASCII-кодом і байтом-атрибутом; біт 2..7 - резерв; ВН = номер відеосторінки; BL = байт атрибут, якщо рядок містить тільки символи (AL. 1=0); СХ = число символів у рядку; DH, DL = рядок і стовпець початку виводу рядка; ES: ВР - адреса в пам'яті початку рядка.

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

Переміщення у вікні нагору (06h int 10h)

Функція 06h дозволяє визначити на екрані вікно, у якому можливо прокрутити певну кількість рядків нагору. При такім прокручуванні верхні рядки зникають і знизу додаються порожні рядки.

Вхід: АН = 06h — переміщення рядків у вікні нагору; AL = число рядків для заповнення знизу; ВН = атрибут символів (кольори) у рядку для заповнення; СН і CL = рядок і стовпець верхнього лівого кута вікна; DH і DL = рядок і стовпець нижнього правого кута вікна.

Рядки для заповнення знизу мають кольори, певний у ВН. Якщо вказати AL=0, то вікно очиститься й заповниться рядками з кольорами, заданим байтом-атрибутом у ВН. Нижче наведена програма виводу декількох рядків на екран, після чого вона визначає вікно на екрані й прокручує його на кілька рядків нагору.

:prg05_05.asm - програма для роботи з вікном на екрані.

.data

String db "dfsh3453637869uioraepBBan"

Ien_str1ng »$-string

adr_stringdd string

. code

..........

movcx,25 ml: mov al ,1 :після виводу - курсор у кінець рядка

xorbh.bh :номер відеосторінки

movbl.7 : атрибут push ex

mov cx,len_string :довжина виведеного рядка

les bp.adr_string :адреса рядка в парі ES:BP

mov ah,l3h

int l0h

incdh ;рядок початку виводу

incdl : стовпець початку виводу pop ex

loop ml ¦.визначаємо й прокручиваем вікно нагору

mov al.4:4 рядка

mov bh. 0

mov ch, 5

mov cl .5.

mov dh. 10

mov dl.30

mov ah.06h

int 10h

Помітьте, що функція 06h досить гнучко працює з курсором. Переміщення у вікні вниз (07h int 10h) Функція 07h дозволяє визначити на екрані вікно, у якому можливо прокрутити певну кількість рядків униз. При такому прокручуванні нижні рядки зникають і зверху додаються порожні рядки.

Вхід: АН = 07h — переміщення рядків у вікні вниз; AL = число рядків для заповнення зверху; ВН = атрибут символів (кольори) у рядку для заповнення; СН і CL - рядок і стовпець верхнього лівого кута вікна; DH і DL = рядок і стовпець нижнього правого кута вікна.

Рядки для заповнення зверху мають кольори, певний у ВН. Якщо вказати А1_=0, то вікно очиститься й заповниться рядками з кольорами, заданим у ВН. Структура байта атрибута аналогічна описаної вище.

Контрольні запитання:

  1. Функції BIOS для роботи з консоллю

  2. Функції BIOS для роботи із клавіатурою

  3. Формат конфігураційної ROM-таблиці:

  4. Перевірка наявності символу (01h, 11h, 21h int 16h)

  5. Запис символу в буфер клавіатури (05h int 16h)

  6. Функції BIOS для роботи з екраном

Лекція 23 «Робота з портами засобами операційної системи»