На этом шаге мы рассмотрим способ ввода строки с клавиатуры.
Область, где будут размещаться вводимые значения, имеет специальную структуру. Во-первых, должна быть определена максимальная длина вводимого текста. Символы, превышающие максимальную длину, не сохраняются. Во-вторых, в списке параметров должно быть определенное поле, куда команда помещает действительную длину введенного текста в байтах.
Ниже приведен пример, в котором определен список параметров для области ввода. Здесь LABEL представляет собой директиву с атрибутом BYTE. Первый байт содержит максимальную длину вводимых данных. Так как это однобайтовое поле, то возможное максимальное значение его - шестнадцатеричное FF или 255. Второй байт необходим DOS для занесения в него действительного числа введенных символов. С третьего байта начинается поле, которое будет содержать введенные символы:
NAMEPAR LABEL BYTE ;Список параметров: MAXLEN DB 20 ;максимальная длина; ACTLEN DB ? ;реальная длина; NAMEFLD DB 20 DUP (?) ;введенные символы.
Так как в списке параметров директива LABEL не занимает места, то NAMEPAR и MAXLEN указывают на один и тот же адрес памяти. В трансляторе MASM для определения списка параметров в виде структуры может использоваться также директива STRUC.
Таким образом, в памяти под эту конструкцию будет отведено 22 байта:
Рис.1. Размещение структуры в памяти
Для запроса на ввод необходимо поместить в регистр AH номер функции - 10 (0AH), загрузить адрес списка параметров (NAMEPAR в нашем примере) в регистр DX и выполнить INT 21H:
MOV AH,0AH ;Запрос функции ввода. LEA DX,NAMEPAR ;Загрузить адрес списка параметров. INT 21H ;Вызвать DOS-прерывание.
Команда INT ожидает, пока пользователь не введет с клавиатуры текст, проверяя при этом, чтобы число введенных символов не превышало максимального значения, указанного в списке параметров (20 в нашем примере). Для указания конца ввода пользователь нажимает клавишу Enter. Код этой клавиши (0DH) также заносится в поле ввода (NAMEFLD в нашем примере). Если, например, пользователь ввел имя BROWN и нажал клавишу Enter, то список параметров будет содержать следующую информацию:
Рис.2. Размещение в структуре значения BROWN
Во второй байт списка параметров (ACTLEN в нашем примере) команда заносит длину введенного имени - 05. Код клавиши Enter находится по адресу NAMEFLD+5. Символ "#" использован здесь для индикации конца данных, так как 0DH не имеет отображаемого символа. В скобках указаны шестнадцатеричные значения. Поскольку максимальная длина в 20 символов включает 0DH, то действительная длина вводимого текста может быть только 19 символов.
На следующем шаге мы рассмотрим вывод одного символа на экран.