Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prakt2.doc
Скачиваний:
9
Добавлен:
12.02.2016
Размер:
204.8 Кб
Скачать

2. Посимвольний ввід шляхом звертання до драйвера bios за допомогою переривання int 16h

Команда BIOS INT 16H виконує спеціальну операцію, яка відповідно до коду в регістрі AH забезпечує наступні три функції вводу клавіатури.

AH=00: Читання символу. Дана функція поміщає в регістр AL черговий ASCII символ, введений із клавіатури, і встановлює скен код у регістрі AH.. Якщо на клавіатурі натиснута одна з спеціальних клавіш, наприклад, Номе або F1, то в регістр AL заноситься 00. Автоматичного еховідображення символу на екран не відбувається.

.code

mov ax,@data

mov ds,ax

MOV AH,00H

Int 16h

CMP AL,00

JZ exit

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

AH=01: Визначення наявності введеного символу. Дана функція скидає прапорець нуля (ZF=0), якщо є символ для читання з клавіатури; черговий символ і скен-код будуть поміщені в регістри AL і AH, відповідно і даний елемент залишиться в буфері.

AH=02: Визначення поточного стану клавіатури. Дана функція повертає в регістрі AL стан клавіатури з адреси пам’яті 417h:

Біт

Ознака

7

Стан вставки активний (Ins)

6

Стан фіксації верхнього регістра (Caps Lock) переключено

5

Стан фіксації цифрової клавіатури (Num Lock) переключено

4

Стан фіксації прокручування (Scroll Lock) переключено

3

Натиснута комбінація клавіш Alt/Shift

2

Натиснута комбінація клавіш Ctrl/Shift

1

Натиснута ліва клавіша Shift

0

Натиснута права клавіша Shift

3. Звертання до клавіатури, як до файлу.

Це здійснюється шляхом використання функцій 3Fh переривання 21h

При цьому у регістр CX заноситься кількість байт для вводу, а в регістр DX - адреса області вводу. У результаті успішного виконання операції вводу очищається прапорець переносу (CF) і в регістр AX встановлюється дійсна кількість байт, що беруть участь в операції. При неуспішній операції встановлюється прапорець CF, а код помилки (в даному випадку 6) заноситься в регістр AX. Оскільки регістр AX може містити як довжину даних, так і код помилки, то єдиний спосіб визначити наявність помилки – перевірити прапорець CF, хоча помилки читання із клавіатури й виводу на екран - не часті.

Нижче наведені команди, що ілюструють використання цієї функції вводу.

.data

INAREA DB 20 DUP (' ') ;Область вводу

.code

mov ax,@data

mov ds,ax

MOV AH,3FH ;Запит на ввід

MOV BX,00 ;Номер для клавіатури

MOV CX,20 ;Максимум байт для вводу

LEA DX,INAREA ;Адреса області увводу

INT 21H ;Виклик DOS

Команда LEA завантажує відносну адресу INAREA в регістр DX. Команда INT очікує, поки користувач не введе символи з клавіатури, але не перевіряє чи перевищує кількість введених символів максимальне значення в регістрі CX (20 в наведеному прикладі). Натискання клавіші Enter (код 0Dh) вказує на завершення вводу. Наприклад, після вводу тексту "PC Users Group" INAREA буде містити: PC Users Group,0Dh, 0Ah.

Після введеного тексту безпосередньо слідує символ повороту каретки (0Dh), що був введений, і символ кінця рядка (0Ah), що не був введений. Тому, максимальна кількість символів і розмір області вводу повинні передбачати місце для двох додаткових символів. Якщо буде введено менше символів ніж максимальне значення, то в пам'яті, після введених символів збережуться колишні значення. У результаті успішної операції буде очищений прапорець CF (що можна перевірити) і в регістрі AX буде встановлена кількість байт, введених із клавіатури. У попередньому прикладі це число буде рівним 14 плюс 2, тобто 16. Відповідним чином програма може визначити дійсну кількість введених символів. Така властивість може бути використана для відповідей зі змінною довжиною, наприклад імен.

Якщо вводити текст, що перевищує максимальну довжину, встановлену в регістрі CX, то будуть прийматися всі символи. Розглянемо ситуацію, коли регістр CX містить 08,а користувач уведе символи "PC Exchange". У результаті перші вісім символів "PC Excha" потраплять в область вводу без кодів повернення каретки й кінця рядка. У регістрі AX буде встановлена довжина 08. Наступна команда INT буде приймати дані не із клавіатури, а із власного буфера, оскільки там ще залишилися попередні дані. Таким чином, в область вводу будуть прийняті символи "ngе", символ повернення каретки й символ нового рядка, у регістрі AX буде встановлено значення 05. Обидві операції вводу є цілком нормальними і прапорець CF буде очищений.

Перший INT: PC Excha AX = 08

Другий INT: ngе,0D,0A AX = 05

Таким чином, програма може визначити факт закінчення вводу тексту, якщо у регістрі AX вийде значення менше, ніж у регістрі CX або якщо вмісти AX і CX рівні, але останні два символи в області вводу - 0Dh і 0Ah.

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

Вивід на екран можна здійснювати двома способами:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]