Функції MS DOS для роботи з консоллю Програмування, уроки та приклади
Цінність програми прямо пропорційна вазі її «видачі». Прикладна Мерфологія
Функції MS DOS до роботи з консоллю зосереджені в обробнику переривання int 21h. Вони є набором засобів роботи з консоллю, що займає проміжне положення між програмами користувача і засобами BIOS. Для більшої ефективності деякі з функцій BIOS можна комбінувати з функціями MS DOS. Як приклад такої корисної взаємодії можна навести використання можливостей BIOS щодо роботи з курсором. Як буде видно з наведеного нижче матеріалу, серед функцій MS DOS таких засобів немає. За виконання конкретних практичних завдань можна знайти й інші корисні приклади взаємодії.
Функції MS DOS для введення даних із клавіатури
Для введення даних із клавіатури можна використовувати два види функцій: універсальну функцію 3fh (введення з файлу) та групу спеціалізованих функцій MS DOS введення з клавіатури. Докладно використання функції 3fh для введення даних розглядається в розділі 7, а тут зосередимося на другій групі функцій, в яку входить сім функцій, що відрізняються один від одного такими характеристиками:
- очікуванням введення за відсутності символу в буфері клавіатури або лише перевіркою буфера на наявність символів для введення;
- кількістю символів, що вводяться; наявністю відлуння при введенні, тобто дублюванням символу, що вводиться з клавіатури на екрані;
- сприйнятливістю до поєднання клавіш Ctrl+C (код 03h).
Читання з луною символ з клавіатури (10h int 21h)
Функція 01h дозволяє ввести один символ із клавіатури. Якщо символу немає, то функція очікує на його введення. Символ відображається на екрані (відлуння). Вхід: АН = 01h - читання символу з луною. " Вихід: AL =ASCII код символу або 0. На виході функція поміщає в регістр AL ASCII код символу або 0. Наявність нуля в регістрі AL говорить про те, що в буфері клавіатури знаходиться розширений ASCII код і необхідно повторити виклик функції з тим, щоб прочитати його другий байт. Також функція 01h перевіряє наявність у буфері символів натискання комбінації Ctrl+C (Ctrl+Break), при виявленні яких здійснюється виклик переривання int 23h. Для введення кількох символів цю функцію необхідно використовувати у циклі.
:prg05_06.asm - програма введення кількох символів функцією 01h 21h ;. .data string db 5 dup (0) len_string =$-string adr_string dd string .code . movcx.len_sthng lesdi.adr_string ml: mov ah.01h int 21h cmpal.0 розширений код. jnem2 обробляємо розширений код jmp m3 ni2: stosb .формуємо рядок символів mЗ: loop ml
Перевіряючи роботу програми, замість введення чергового символу введіть комбінацію Ctrl+C і перегляньте реакцію програми.
Пряме введення з луною символу з клавіатури (06h int 21h)
Функція 06h дозволяє також ввести один символ з клавіатури. Але, на відміну від функції 01h, вона не очікує введення за відсутності символу в буфері. Символ відображається на екрані (відлуння). Вхід: АН = 06h - читання символу з луною без очікування; DL = 0ffn - ознака того, що функція 06h використовується для введення; якщо DL <> 0ffn, то функція використовується для виведення символу (див. нижче). Вихід: якщо ZF=O, AL=ASCII-код символу; якщо ZF-1, то символу буфері немає. Результати цієї функції необхідно оцінювати насамперед за значенням прапора ZF. Якщо ZF=O, то функція помістила в регістр AL ASCII код символу або 0. Наявність нуля в регістрі AL говорить про те, що в буфері клавіатури знаходиться розширенийASCII-код і необхідно повторити виклик функції для того, щоб прочитати його другий байт. Функція 06h не перевіряє наявність у буфері символів натискання комбінації Ctrl+C (Ctrl+Break).
Читання відлуння символ з клавіатури (07h int 21h)
Функція 07h аналогічна функції 01h, за винятком того, що вводить символ з клавіатури без очікування його введення, без відлуння та без перевірки натискання комбінації Ctrl+C (Ctrl+Break). Вхід: АН = 07h - читання символу без луни. Вихід: AL = код ASCII символу або 0 (див. опис функції 01h int 21h). Наявність нуля в регістрі AL говорить про те, що в буфері клавіатури знаходиться розширений ASCII-код і необхідно повторити виклик функції для того, щоб прочитати його другий байт.
Читання відлуння символ з клавіатури (08h int 21h)
Функція 08h подібна до функції 01h, за винятком того, що вводить символ з клавіатури без відображення його на екрані (без відлуння). Вхід: АН = 08h - читання символу без луни. Вихід: AL = ASCII-код символу або 0 (див. опис функції 01h int 21h). Наявність нуля в регістрі AL говорить про те, що в буфері клавіатури знаходиться розширений ASCII-код і необхідно повторити виклик функції для того, щоб прочитати його другий байт. Функція перевіряє натискання комбінації Ctrl+C (Ctrl+Break), за наявності якого викликається переривання int 23h.
Введення рядка символів із клавіатури (0ah int 21h)
Функція 0ah вводить рядок символів у буфер пам'яті спеціального формату. Якщо символів у буфері клавіатури немає, то функція очікує їхнього введення. Кінець введення – натискання клавіші Enter (0dh). Формат буфера:
- перший байт буфера містить кількість символів для введення з урахуванням символу 0dh, що завершує введення;
- другий байт містить реальну кількість введених символів, але вже не враховуючизавершального символу 0dh;
- починаючи з третього байта міститься рядок введених символів із завершальним символом 0dh, максимальна довжина рядка – 254 символи.
;prg05_07.asm - програма введення рядка функцією OAh int 21h buf_Oahstruc len_bufdb 11 :довжина buf_0ah len_in db 0 дійсна довжина введеного слова (без урахування Odh) buf буфер для введення (з урахуванням Odh) ends .data buf buf_0ah<> adr_bufdd buf .code . :вводимо 10 символів з клавіатури Ids dx,adr_buf movah.Oah int 21h обробка введеного рядка
Отримати стан клавіатури (0Bh int 21h)
Функція 0Bh перевіряє наявність у буфері символу для введення. Вхід: АН = 0Bh - перевірка стану клавіатури. Вихід: AL = 0ffh - буфер клавіатури містить символ для введення; AL = 0 - буфер клавіатури порожній. Ця функція формує лише логічний результат — є символ у буфері або буфер порожній, тому виклик функції 0Bh необхідно комбінувати з однією з функцій вилучення символу з буфера введення. Використання цієї функції зручне для програм, керування якими виконується з клавіатури, - типу командного процесора. У процесі своєї роботи вони чекають введення користувачем управляючих команд, у зв'язку з чим періодично перевіряють вхідний буфер. Функція проводить перевірку натискання комбінації Ctrl+C (Ctrl+Break), за наявності якого викликається переривання int 23h.
Введення з клавіатури із попереднім очищенням буфера (ОСh int 21h)
функція 0Ch виконує введення, очищаючи попередньо буфер клавіатури. Це зручно для запобігання читанню з буфера символів, що залишилися там, можливо, введених помилково або випадково. Функція гарантує, що програма отримає саме ті дані, які запровадивоператор. Важливо, що функція 0Ch виконує лише очищення буфера, введення символу здійснює одна з функцій, номер якої вказується в регістрі AL при виклику цієї функції/ Вхід: АН = 0Ch - введення з клавіатури з попереднім очищенням; AL = номер функції (01h, 06h, 07h, 08h, 0ah). Вихід: визначається функцією, зазначеною в AL під час виклику функції. Функція проводить перевірку натискання комбінації Ctrl+C (Ctrl+Break), за наявності якого викликається переривання int 23h.
Функції MS DOS для виведення даних на екран
Для виведення даних на екран можна використовувати два види функцій: універсальну функцію 40h (виведення у файл) та групу спеціалізованих функцій MS DOS виведення на екран. Використання функції 40h вже розглядалося у розділі, присвяченому роботі з файлами. Матеріал, наведений нижче, присвячений другій групі функцій - функцій MS DOS для виведення символів на екран. До групи входять три функції. Розглянемо їх.
Виведення символу на екран (02h int 21h)
Функція 02h дає змогу вивести один символ на екран. Вхід: АН» 02h - виведення символу; DL = символ виведення. Функція 02h перевіряє наявність у клавіатурному буфері символів натискання комбінації Ctrl+C (Ctrl+Break), при виявленні яких здійснюється виклик переривання int 23h. У процесі виведення функція реагує на керуючі символи, такі як 0dh (повернення каретки), 0ah (переведення рядка), 08h (курсор назад на один символ), 07h (звуковий сигнал) і т.д. Для того, щоб вивести рядок необхідно використовувати цикл.
Пряме виведення символу на екран (06h int 21h)
Функція 06h відображає один символ на екрані. Ця функція універсальна, тому що "використовується і для введення (див. вище), і для виведення символу. Вхід: АН = 06h - виведення символу на екран; DL = символ для виведення (за винятком)0ffn). Функція 06h не перевіряє наявність у буфері символів натискання комбінації Ctrl+C (Ctrl+Break). Порядок використання цієї функції аналогічний порядку використання функції 02h.
Виведення рядка на екран (09h int 21h)