Функция 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.