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

Лабораторная работа №4 посимвольный ввод с клавиатуры. Анализ нажатия функциональных клавиш и комбинаций Теоретические сведения

DOS предоставляет ряд сервисных функций, обеспечивающих работу с клавиатурой. Для посимвольного ввода с клавиатуры наиболее часто используются следующие функции:

в AH

Описание

Вход

Выход

1h

Ввод символа из STDIN с ожиданием, с эхом, фильтрующий

-

AL = код символа

6h

Ввод символа из STDIN без ожидания, без эха, нефильтрующий

DL = 0FFh

ZF = 0, если символ готов; AL = код символа

7h

Ввод символа из STDIN с ожиданием, без эха, нефильтрующий

-

AL = код символа

8h

Ввод символа из STDIN с ожиданием, без эха, фильтрующий

-

AL = код символа

Независимо от работы текущей программы вводимая с клавиатуры информация попадает в буфер клавиатуры — область размером 16 слов в оперативной памяти. Если работающая программа не обрабатывает поступающую информацию, буфер заполняется по мере ввода, и после 15-ти нажатий на клавиши дальнейший ввод блокируется. Благодаря такому буферированию пользователь может вводить данные еще до того, как их запросила программа.

Функции 1, 6, 7, 8 обеспечивают ввод одного символа с устройства стандартного ввода STDIN (его код возвращается в AL). В качестве STDIN обычно выступает клавиатура (также может быть файл, устройства, подключенные к коммуникационным портам). Функции 1, 7 и 8 ожидают ввода символа: функция, получив управление, проверяет буфер клавиатуры, и если там нет символа, ожидает, пока он там не появится. Функция 6 работает без ожидания: если в буфере нет символа, она сразу возвращает управление в вызвавшую программу, установив предварительно флаг нуля ZF; если же символ в буфере обнаружен, функция сбрасывает ZF и помещает в AL код символа, как и другие функции. Кроме того, при вводе с клавиатуры с помощью функции 1 происходит отображение на экране введенного символа (эхо), другие функции эха на экран не дают. В описании функций также указано, осуществляет ли функция фильтрацию ввода. В случае фильтрации функция реагирует на нажатие управляющих комбинаций Ctrl-Break и Ctrl-C, осуществляя аварийное завершение программы.

Анализ введенной информации как правило осуществляется путем сравнения кода введенного символа в AL с каким-либо предопределенным значением и переход на соответствующий участок программы командой условного перехода.

Если требуется ввести строку символов, необходимо организовать цикл, содержащий команды запроса символа и, возможно, его проверки, обработки, выхода по нажатию определенной клавиши и т. п. Можно также воспользоваться специальной функцией ввода строки 0Ah int 21h (см. след. работу) или функцией файлового ввода, указывая в качестве дескриптора файла 0 (стандартное устройство ввода).

При нажатии на любую алфавитно-цифровую клавишу в буфер записывается два байта: скан-код, закрепленный за каждой клавишей клавиатуры, и ASCII-код символа, соответствующего нажатой клавише. Ряд клавиш, а также комбинаций клавиш, не имеют соответствующих ASCII-кодов, вместо этого за ними закреплены так называемые расширенные коды. При нажатии таких клавиш в буфер клавиатуры вместо ASCII-кода записывается 0 — признак расширенной клавиши. Этот нуль возвращается также любой вышеперечисленной функцией в регистре AL. Для получения же самого расширенного кода необходимо вызвать функцию ввода с клавиатуры еще раз (причем необязательно ту же самую). При этом запроса с клавиатуры осуществлено не будет, вызванная функция поместит в AL расширенный код и тут же вернет управление в вызвавшую программу. Расширенные коды возвращаются функциональными клавишами и их комбинациями с Alt, Ctrl и Shift, а также всеми алфавитно-цифровыми клавишами, вводимыми в комбинации с клавишей Alt.

В следующей таблице приведены значения расширенных кодов некоторых клавиш и комбинаций:

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

F1

3Bh

Alt-B

30h

Alt-O

18h

Alt-1

78h

left

4Bh

F2

3Ch

Alt-C

2Eh

Alt-P

19h

Alt-2

79h

right

4Dh

F3

3Dh

Alt-D

20h

Alt-Q

10h

Alt-3

7Ah

up

48h

F4

3Eh

Alt-E

12h

Alt-R

13h

Alt-4

7Bh

down

50h

F5

3Fh

Alt-F

21h

Alt-S

1fh

Alt-5

7Ch

Home

47h

F6

40h

Alt-G

22h

Alt-T

14h

Alt-6

7Dh

End

4Fh

F7

41h

Alt-H

23h

Alt-U

16h

Alt-7

7Eh

PgUp

49h

F8

42h

Alt-I

17h

Alt-V

2Fh

Alt-8

7Fh

PgDn

51h

F9

43h

Alt-J

24h

Alt-W

11h

Alt-9

80h

PgDn

51h

F10

44h

Alt-K

25h

Alt-X

2Dh

Alt--

82h

Shift-F10

5Dh

F11

85h

Alt-L

26h

Alt-Y

15h

Alt-=

83h

Ctrl-F10

67h

F12

86h

Alt-M

32h

Alt-Z

2Ch

Ins

52h

Alt-F10

71h

Alt-A

1Eh

Alt-N

31h

Alt-0

81h

Del

53h

Расширенные клавиши чаще всего используют для управления выполняющейся программой, а обычные алфавитно-цифровые — для ввода текстовой информации.

Ниже приведен пример, запрашивающий ввод в клавиатуры одного символа. Если этот символ – цифра (N = 0...9), на экран выдается сообщение ’Нажата цифра N’, после чего осуществляется выход из программы, иначе осуществляется повторный запрос символа. При нажатии F1 выводится справочное сообщение ’Нажимайте цифры’. Описание сегментов, команды инициализации DS и выхода из программы опущены для краткости.

; Данные

mes db 13, 10, 'Нажата '

num db ?, '$' ; ячейка для ASCII-кода

helpmes db 13, 10, 'Нажимайте цифры!$'

; Код

again: mov ah, 1 ; ввод с клавиатуры символа с эхом

int 21h

cmp al, 0 ; расширенная клавиша?

je function

cmp al, '1' ; проверка диапазона - нижняя граница

jb less

cmp al, '9' ; верхняя граница

ja greater

mov [num], al ; заносим код в сообщение

mov ah, 9 ; и выводим сообщение на экран

lea dx, mes

int 21h

jmp exit ; дело сделано - на выход

function: mov ah, 8 ; повторный вызов - получение расширенного кода

int 21h ; (8 - чтобы не засорять экран)

cmp al, 3Bh ; F1?

je help

greater:

less: jmp again ; если вышли за пределы диапазона – повторить

help: mov ah, 9 ; выводим помощь

lea dx, helpmes

int 21h

jmp again ; повторить ввод

exit:

Для простоты выход за верхнюю и нижнюю границы диапазона обрабатываются одинаково — повторно запрашивается ввод, поэтому метки greater и less указывают на одну и ту же команду (jmp again).

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