Функции DOS для ввода с клавиатуры

Функция 01h (т.е. прерывание 21h при значении AH=01h) вы­полняет ввод с клавиатуры одного символа. Если в момент вызова функции в буфере клавиатуры были символы (т.е. были нажатия клавиш до этого), то берется символ из буфера, в противном слу­чае система ждет, пока не будет нажата клавиша. Код введенного символа помещается в регистр AL. Введенный символ отобража­ется на экране (как говорят, выполняется эхо-отображение).

Например, пусть на клавиатуре была нажата клавиша «F». Тогда после вызова:

mov ah,01h
int 21h

в регистре AL будет содержаться число 46h, которое является кодом буквы F в коде ASCII.

Функция 01h проверяет также, не нажимал ли пользователь в ходе работы программы комбинацию клавиш Ctrl+C (или Ctrl+Break).

В этом случае управление передается на подпрограмму обра­ботки Ctrl+C, которая обычно прекращает выполнение программы пользователя.

Если на клавиатуре была нажата одна из клавиш, которым не соответствует никакой код ASCII (будем называть такие клавиши несимвольными; к ним относятся, например, Home, Ins, Page Up, F1, F10, стрелка) или комбинация из клавиши Alt, Ctrl, Shift с дру­гой клавишей, то функция 01h возвращает в регистре AL значение 0. В этих случаях следует еще раз вызвать ту же функцию, тогда будет выдан так называемый расширенный код данной клавиши или комбинации, согласно специальной таблице расширенных кодов.

Функция 08h работает аналогично 01h, за исключением того, что не выполняется эхо-отображение введенного символа.

Функция 07h работает аналогично 01h, за исключением того, что не выполняется эхо-отображение и не проверяется нажатие Ctrl+C.

Функция 06h может выполнять как ввод с клавиатуры, так и вывод на экран. Если в момент вызова регистр DL содержит зна­чение 0FFh, то данная функция выполняет ввод без ожидания. Это означает следующее. Если буфер клавиатуры содержит какие-либо символы (т.е. клавиши ранее нажимались), то флаг нуля ZF сбра­сывается в 0, а символ из буфера заносится в AL. Если же буфер пуст (нажатий не было), то устанавливается ZF=1, при этом значе­ние в AL не играет роли. Таким образом, эта функция не ждет, пока будет нажата клавиша, а сразу выдает какой-то результат.

Функция 06h не выполняет эхо-отображения и не проверяет нажатие Ctrl+C.

Функция 0Bh не выполняет ввод символа, а только проверяет, есть ли символы в буфере. Если есть, то устанавливается AL=0ffh, если нет, то – AL=00h. Выполняется также проверка на Ctrl+C.

Функция 0Ah выполняет буферизованный ввод строки с кла­виатуры. При этом символы вводятся один за другим, как при многократном применении функции 01h до тех пор, пока не будет введен код 0Dh (код клавиши Enter), завершающий строку. В ходе ввода строки пользователь может редактировать строку и, в част­ности, использовать забой. При вводе выполняется также про­верка на Ctrl+C.

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

Например. Пусть требуется ввести строку длиной не более 10 символов. При этом в сегменте данных можно описать буфер, например таким образом:

BUFFER db 11;Первый байт буфера
ENTERED db (?);Число введенных символов
STRING db 11 dup (?);Введенные символы

Сам же ввод выполняется командами:

lea DX,BUFFER;Адрес буфера - в DX
mov AH,0Ah;Номер функции - в AH
int 21h;Вызов функции

Пусть при этом пользователь набрал 6 символов: «Hallo!» и нажал клавишу Enter. После вызова функции в байте entered будет число 6, в первых 6 байтах массива STRING будут коды введенных символов, в седьмом байте – код 0Dh, а оставшиеся 4 байта будут иметь неопределенные значения.

Функция 0Ch вначале очищает буфер клавиатуры (т.е. «забывает» предыдущие нажатия клавиш), а потом выполняет любую из функций 01h, 06h, 07h, 08h или 0Ah. Номер этой функ­ции задается в регистре AL. Если задано иное число, то выполня­ется только очистка буфера. Кроме того, всегда выполняется проверка на Ctrl+C.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: