Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

118

кодировками символов. Скан-код — это, по сути, заводской идентификатор клавиши, который никогда не изменяется. Например, в английской раскладке на клавише со скан-кодом 11h изображена буква W, в русской раскладке этой же клавише соответствует буква Ц, во французской раскладке на этой клавише изображена буква Z, на японских и китайских клавиатурах изображены соответствующие иероглифы (на сайте Microsoft http://www.microsoft.com/globaldev/reference/keyboards.mspx можно увидеть практически все известные в мире национальные раскладки). Таким образом, скан-код однозначно идентифицирует клавишу, но не позволяет определить, какую букву (латинскую, русскую и пр.) в нижнем или верхнем регистре вводит пользователь. Длина генерируемого скан-кода клавиши может быть от 1 до 6 байт, который можно получить чтением порта ввода-вывода 0x60. Например, все "серые клавиши" имеют префикс 0E0h. Так, клавиша <Ins> при нажатии создаст пару скан-кодов: 0E0h, 52h.

Расширенные

ASCII-коды — это

коды

функциональных

и различных

комбинаций клавиш, которые не имеют представляющего

их

символа

ASCII. Расширенные коды имеют длину 2 байта, причем

первый байт

всегда

равен

0.

Второй байт —

номер

расширенного

кода,

список

которых

приведен

в табл. П2.8. Некоторые расширенные коды совпадают со

скан-кодами соответствующих клавиш. Например, код 0h 41h

является кодом

клавиши <F7>. Начальный ноль позволяет программе определить, что данный код принадлежит расширенному набору ASCII.

Эхо — под этим словом понимается "отображение символов на экране". Например, если в описании функции сказано, что она выполняет ввод символа с эхо, то это означает, что вводимый символ будет отображаться на экране. Без эха вводимый символ не будет видно на экране.

DOS предоставляет 7 функций для ввода данных с клавиатуры. Кроме этих семи функций DOS позволяет обращаться к клавиатуре, как к файлу, с помощью функции 3Fh прерывания INT 21h. В BIOS также имеет несколько функций, вызываемые по прерыванию INT 16h, для ввода данных с клавиатуры. Далее приведено описание всех этих функций.

6.3.1. Функции DOS

01h (INT 21h) — ввод символа с эхо

Функция DOS 01h прерывания INT 21h

Входные данные:

AH=01h

Возвращаемые значения:

AL = ASCII-код символа или 0. Если AL=0, повторный вызов этой функции возвратит в AL расширенный ASCII-код символа.

Примечание. Если считывается комбинация клавиш <Ctrl>+<C> или <Ctrl>+<Break>, то выполняется прерывание INT 23h.

Для чтения расширенных ASCII-кодов необходимо обращаться к данной функции дважды. При первом обращении в AL возвращается значение 0, что указывает на наличие расширенного кода.

06h (INT 21h) — ввод-вывод через консоль

Данная функция способна выполнять как ввод, так и вывод с консоли (без ожидания) — это зависит от передаваемых значениях в регистре DL при вызове.

Входные данные:

AH=06h

DL = запрошенная функция. Если DL=00h–0FEh, то запрашивается вывод. Если

DL=0FFh.

Возвращаемые значения:

Если при вызове DL=00h–0FEh, то ничего не возвращается.

http://www.sklyaroff.ru

119

Если при вызове DL=0FFh и была нажата клавиша, то ее код записывается в AL и сбрасывается флаг нуля (ZF=0).

Если при вызове DL=FFh и не была нажата клавиша, то ZF=0 и AL=00h.

Примечание. При использовании данной функции в случае ввода <Ctrl>+<C> или <Ctrl>+<Break> какого-либо специального действия не производится.

Для чтения расширенных ASCII-кодов необходимо обращаться к данной функции дважды. При первом обращении в AL возвращается значение 0, что указывает на наличие расширенного кода.

07h (INT 21h) — нефильтрованный ввод без эхо

Входные данные:

AH=07h

Возвращаемые значения:

AL = ASCII-код символа, полученный от стандартного устройства ввода.

Примечание. При использовании данной функции в случае ввода <Ctrl>+<C> или <Ctrl>+<Break> какого-либо специального действия не производится.

Для чтения расширенных ASCII-кодов необходимо обращаться к данной функции дважды. При первом обращении в AL возвращается значение 0, что указывает на наличие расширенного кода.

08h (INT 21h) — ввод символа без эхо

Входные данные:

AH=08h

Возвращаемые значения:

AL = ASCII-код символа или 0. Если AL=0, повторный вызов этой функции возвратит в AL расширенный ASCII-код символа.

Примечание. Если считывается комбинация клавиш <Ctrl>+<C> или <Ctrl>+<Break>, то выполняется прерывание INT 23h.

Для чтения расширенных ASCII-кодов необходимо обращаться к данной функции дважды. При первом обращении в AL возвращается значение 0, что указывает на наличие расширенного кода.

0Ah (INT 21h) — буферизированный ввод с клавиатуры

Входные данные:

AH=0Ah

DS:DX=адрес входного буфера

Возвращаемые значения:

В буфер помещается введенная строка.

Примечание. Перед вызовом этой функции необходимо подготовить буфер, в первом байте которого должно быть указано максимальное число вводимых символов от 1 до 254 (включая возврат каретки, CR), а остальное содержимое буфера можно использовать как подсказку для ввода.

После выполнения функции начиная с третьего байта буфер будет содержать символы введенной строки, включая последний символ возврата каретки 0Dh. В первом байте буфера будет максимальное число символов, определенное перед вызовом функции, а во втором байте буфера — фактическое число введенных символов (без кода возврата каретки).

Символы считываются до нажатия клавиши <Enter> или до тех пор, пока в буфер не будет помещено на один символ меньше, чем это определено максимальным числом символов. В последнем случае будет звучать сигнал на каждую очередную попытку ввода, пока не будет нажата клавиша <Enter>.

При вводе строки можно использовать клавиши редактирования: <Esc> — начинает ввод сначала;

http://www.sklyaroff.ru

120

<F3> — выводит на экран подсказку для ввода; <F5> — сохраняет текущую строку как подсказку; <Backspace> — стирает предыдущий символ.

Если считывается комбинация клавиш <Ctrl>+<C> или <Ctrl>+<Break>, то выполняется прерывание INT 23h.

Кроме перечисленных, DOS предоставляет служебные функции для работы с клавиатурой:

0Bh (INT 21h) — проверить состояние ввода

Проверяет, имеется ли символ с устройства стандартного ввода.

Входные данные:

AH=0Bh

DS:DX=адрес входного буфера

Возвращаемые значения:

AL=00h — если символ отсутствует;

AL=FFh — если имеется по крайней мере один символ.

Примечание. Эту функцию удобно использовать перед вызовом функций 01h, 07h и 08h, чтобы не ждать нажатия клавиши.

Если считывается комбинация клавиш <Ctrl>+<C> или <Ctrl>+<Break>, то выполняется прерывание INT 23h.

Пример использования:

....

 

mov ah,0bh

; номер функции

int 21h

; переход в MS-DOS

or al,al

; есть ли символ?

jnz ready

; перейти, если символ присутствует

...

 

0Ch (INT 21h) — очистить буфер и считать символ

Данная функция очищает буфер клавиатуры, затем вызывает функцию ввода, заданную в регистре AL, поэтому вызванная функция ввода будет ждать ввода с клавиатуры, а не использовать нажатый ранее и еще не обработанный символ. Часто функцию 0Ch используют для запроса согласия у пользователя перед выполнением действия, например: "Отформатировать диск Y/N?".

Входные данные:

AH=0Ch

AL=номер функции ввода, которая будет активирована после очистки буфера, допускаются следующие значения:

01h — ввод с клавиатуры;

06h — ввод с консоли;

07h — нефильтрующий ввод без эхо-вывода;

08h — ввод без эхо-вывода; 0Ah — буферизированный ввод.

Возвращаемые значения:

Зависит от вызванной функции

Примечание.

Наличие или отсутствие во время выполнения данной функции проверки кода <Ctrl>+<C> и <Ctrl>+<Break> зависит от номера функции, помещенного в регистр

AL.

3Fh (INT 21h) — чтение из файла или устройства