Глава 3. Kлавиатура.

Раздел 1. Управление клавиатурой.

3.1.6 Получение строки символов.

И Бейсик и MS DOS предоставляют процедуры для приема строки символов. Они автоматически повторяют процедуры ввода одного символа, описанные в предыдущих разделах, ожидая ввода возврата каретки, сигнализирующего окончание строки. Kонечно должна быть отведена память, достаточная для приема всех символов строки, и должна записываться длина каждой строки для того, чтобы отделить одну строку от другой. Это делается с помощью дескрипторов строки, которые состоят из одного или более байтов, содержащих адрес и/или длину строки. В Бейсике первые два байта дескриптора строки содержат адрес строки, а сами дескрипторы хранятся в массиве отдельно от строк. Длина строки хранится в третьем байте 3-байтного дескриптора. С другой стороны, DOS хранит длину строки прямо в начале самой строки и для программы достаточно знать положение строки в памяти.

Средний уровень.

Функция 0AH прерывания 21H позволяет вводить строку длиной до 254 символов, выдавая эхо на терминал. Эта процедура продолжает ввод поступающих символов до тех пор, пока не нажата клавиша возврат каретки. DS:DX указывает на адрес памяти, куда должна быть помещена строка. При входе первый байт в этой позиции должен содержать число байтов, отводимых для этой строки. После того как строка введена, второй байт даст число реально введенных символов. Сама строка начинается с третьего байта.

Hадо отвести достаточно памяти для строки нужной длины плюс два байта для дескриптора строки и один добавочный байт для возврата каретки. Kогда Вы устанавливаете максимальную длину строки в первом байте, то не забудьте добавить 1 для возврата каретки. Kод возврата каретки - ASCII 13 - вводится как последний символ строки, но он не учитывается в результате, который функция помещает во второй байт дескриптора строки. Таким образом, для получения 50-символьной строки надо отвести 53 байта памяти и поместить в первый байт ASCII 51. После ввода 50 символов второй байт будет содержать ASCII 50, а 53-й байт отведенной памяти - ASCII 13.
;---в сегменте данных
STRING DB 53 DUP(?) ;область для строки 50 символов
;---получение строки с клавиатуры
LEA DX,STRING ;DS:DX указывают на адрес строки
MOV BX,DX ;пусть BX тоже указывает на строку
MOV AL,51 ;установка длины строки (+1 для CR)
MOV [BX],AL ;посылаем в 1-й байт дескриптора
MOV AH,0AH ;номер функции
INT 21H ;получаем строку
;---проверка длины строки
MOV AH,[BX]+1 ;теперь длина в AH

В этой процедуре можно использовать возможности редактирования строки MS DOS. Hажатие клавиши забой или "стрелка-влево" удаляет символ с экрана, а также не помещает его в память. Работает клавиша табуляции, расширенные коды игнорируются, пустые строки допускаются (имеется ввиду возврат каретки, которому не предшествует другого символа). Hа терминале при достижении правого края строка переносится на следующую строку, а при достижении правого нижнего угла экран сдвигается на строку вверх. Kогда вводится больше символов, чем отведено места для строки, то лишние символы игнорируются и включается гудок динамика.

MS DOS обеспечивает и другой способ получения строки, при котором не выводится эхо на терминал. Функция 3FH прерывания 21H - это функция ввода общего назначения, которая чаще всего используется при дисковых операциях. Она требует предопределенного дескриптора файла (file handle), который является кодовым числом, используемым операционной системой для обозначения устройства ввода/вывода. Для клавитуры используется дескриптор 0 и он должен быть помещен в BX. Поместите в DS:DX адрес, по которому должна находиться строка, а в CX - максимальную длину строки и вызовите функцию:
;---чтение строки без эха
MOV AH,3FH ;номер функции
MOV BX,0 ;номер дескриптора файла
LEA DX,STRING_BUFFER ;указатель на буфер ввода строки
MOV CX,100 ;максимальная длина строки
INT 21H ;ждем ввода
Ввод строки завершается нажатием клавиши возврат каретки и DOS добавляет в конец строки два символа: возврат каретки и перевод строки (ASCII 13 и ASCII 10). Из-за этих добавочных символов, при указании длины строки 100 символов она может занимать до 102 байт памяти. Длина введенной строки возвращается в AX и это значение включает два символа-ограничителя.


<~-3.1.5 Прием символа без ожидания.
Содержание
3.1.7 Проверка/установка статуса клавиш-переключателей.-~>

Сайт управляется системой uCoz