- •О десский национальный морской университет
- •7.080401 "Информационные управляющие системы и технологии",
- •7.080402 "Информационные технологии проектирования"
- •Введение
- •Лабораторная работа №1 структура ехе-программы на ассемблере. Подготовка к выполнению Теоретические сведения
- •Задание
- •Лабораторная работа №2 использование служебных подпрограмм. Циклы. Формирование и вывод на экран строки ascii- символов Теоретические сведения
- •Inc al ; увеличиваем al (код символа) на 1
- •Задание
- •Лабораторная работа №3 управление курсором при выводе. Вложенные циклы. Формирование и вывод на экран таблицы символов ascii Теоретические сведения
- •Задание
- •Лабораторная работа №4 посимвольный ввод с клавиатуры. Анализ нажатия функциональных клавиш и комбинаций Теоретические сведения
- •Задание
- •Лабораторная работа №5 ввод с клавиатуры и обработка символьных строк (пароль) Теоретические сведения
- •Задание
- •Лабораторная работа №6 процедуры. Табличная трансляция. Перевод двоичных данных в символьную форму Теоретические сведения
- •Задание
- •Лабораторная работа №7 работа с файлами Теоретические сведения
- •Задание
Лабораторная работа №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).