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