Команда LEA загружает в регистр DX адрес DISAREA для возможности DOS
локализовать информацию, предназначенную для вывода. В результате успешной
операции флаг переноса очищается (это можно проверить), а в регистре AX
устанавливается число выведенных символов. Ошибка в данной операции может
произойти, если yстановлен неправильный файловый номер. В этом случае
будет установлен флаг CF и код ошибки (в данном случае 6) в регистре AX.
Поскольку регистр AX может содержать или длину, или код ошибки, то
единственный способ определить состояние ошибки - проверить флаг CF.
Упражнение: Вывод на экран
----------------------------
Воспользуемся отладчиком DEBUG для проверки внутренних эффектов
прерывания. Загрузите DEBUG и после вывода на экран приглашения введите A
100 для ввода ассемблерных команд (не машинных команд) по адpесу 100. Не
забудьте, что DEBUG предполагает, что все числа вводятся в
шестнадцатиричном формате:
100 MOV AH,40
102 MOV BX,01
105 MOV CX,хх (введите длину вашего имени)
108 MOV DX,10E
10B INT 21
10D RET
10E DB 'Ваше имя'
Программа устанавливает в регистре AH запрос на вывод и устанавливает
шест. значение 10F в регистре DX - адрес DB, содержащей ваше имя в конце
программы.
Когда вы наберете все команды, нажмите еще раз Return. С помощью
команды U (U 100,10D) дисассемблируйте программу для проверки. Затем
используйте команды R и T для трассировки выполнения. При выполнении
команды INT 21H отладчик перейдет в BIOS, поэтому при достижении адреса
10B введите команду GO (G 10D) для перехода к команде RET. Ваше имя будет
выведено на экран. С помощью команды Q вернитесь в DOS.
ВВОД С КЛАВИАТУРЫ: РАСШИРЕННЫЙ DOS
________________________________________________________________
Ниже приведены команды, иллюстрирующие использование функции ввода с
клавиатуры в расширенной версии DOS:
INAREA DB 20 DUP (' ') ;Область ввода
MOV AH,3FH ;Запрос на ввод
MOV BX,00 ;Номер для клавиатуры
MOV CX,20 ;Максимум байт для ввода
LEA DX,INAREA ;Адрес области ввода
INT 21H ;Вызов DOS
Команда LEA загружает относительный адрес INAREA в регистр DX.
Команда INT ожидает, пока пользователь не введет cимволы с клавиатуры, но
не проверяет превышает ли число введенных символов максимальное значение в
регистре CX (20 в приведенном примере). Нажатие клавиши Return (код шест.
0D) указывает на завершение ввода. Например, после ввода текста "PC Users
Group" INAREA будет содержать:
PC Users Group, шест.0D, шест.0A
После введенного текста непосредственно следует символ возврата
каретки (шест.0D), который был введен, и символ конца строки (шест.0A),
который не был введен. В силу данной особенности максимальное число
символов и размер области ввода должны предусматpивать место для двух
символов. Если будет введено cимволов меньше максимального значения, то
область памяти за введенными символами сохранит прежнее значение.
В результате успешной операции будет очищен флаг CF (что можно
проверить) и в регистре AX будет установлено число байт, введенных с
клавиатуры. В предыдущем примере это число будет равно 14 плюс 2 для
перевода каретки и конца строки, т.е. 16. Соответствующим образом
программа может определить действительное число введенных символов. Хотя
данное свойство весьма тривиально для ответов типа YES или NO, оно может
быть полезно для ответов с пеpеменной длиной, таких, например, как имена.
Ошибка ввода может возникнуть, если определен неправильный номер
файла. В этом случае будет установлен флаг CF и в регистр AX будет помещен
код ошибки (6 в данном случае). Так как регистр AX может содержать или
длину введенных данных, или код ошибки, то единственный способ определения
наличия ошибки - проверка флага CF.
Если вводить текст, который превышает максимальную длину,
yстановленную в регистре CX, то будут приниматься все символы. Рассмотрим
ситуацию, когда регистр CX содержит 08,а пользователь введет символы "PC
Exchange". В результате первые восемь символов "PC Excha" попадут в
область ввода без кодов возврата каретки и конца строки. В регистре AX
будет установлена длина 08. Следующая команда INT будет принимать данные
не с клавиатуры, а из собственного буфера, поскольку там еще остались
предыдущие данные. Таким образом, в область ввода будут приняты символы
"ngе", символ перевода каретки и символ новой строки, в регистре AX будет
установлено значение 05. Обе операции ввода являются вполне нормальными и
флаг CF будет очищен.
Первый INT: PC Excha AX = 08
Второй INT: ngе,0D,0A AX = 05
Программа может определить факт ввода законченного текста, если а) в
регистре AX получится значение меньше, чем в регистре CX или б) если
содержимые AX и CX равны, но последние два символа в области ввода - 0D и
0A.
Встроенные в DOS проверки по функции 0AH для ввода с клавиатуры имеют
более мощные средства. Их выбор для использования в программах является
предпочтительным.
Упражнение: Ввод данных
-------------------------
Выполним упражнение в котором можно проследить операцию ввода c
клавиатуры с помощью отладчика DEBUG. Предполагаемая программа позволяет
вводить до 12 символов, включая символы конца каретки и конца строки.
Загрузите DEBUG и после вывода на экран приглашения введите A 100 для
ввода ассемблерных команд, начиная c адреса 100. Не забудьте, что DEBUG
предполагает, что все числа вводятся в шестнадцатиричном формате.
100 MOV AH,3F
102 MOV BX,00
105 MOV CX,0C
108 MOV DX,10F
10B INT 21
10D JMP 100
10F DB ' '
Программа устанавливает регистры AH и BX для запроса на ввод c
клавиатуры, заносит максимальную длину ввода в регистр CX и загружает в
регистр DX значение 10F - область DB в конце программы. В эту область
будут помещаться вводимые символы.
Когда вы наберете все команды, нажмите еще раз Return. С помощью
команды U 100,108 выполните дисассемблирование программы для проверки.
Затем используйте команды R и T для трассировки четырех команд MOV.
Остановившись по адресу 10B, введите G 10D для выполнения команды INT
(входить в BIOS не следует). Теперь отладчик позволит ввести данные,
завершаемые клавишей Return. Проверьте содержимое регистра AX, состояние
флага CF и используя команду D 10F, просмотрите введенные данные в памяти.
Для завершения работы введите команду Q.
ИСПОЛЬЗОВАНИЕ СИМВОЛОВ ВОЗВРАТА КАРЕТКИ,
КОНЦА СТРОКИ И ТАБУЛЯЦИИ ДЛЯ ВЫВОДА НА ЭКРАН
________________________________________________________________
Один из способов получения более эффективного выводе на экран -
использование управляющих символов возврата каретки, перевода строки и
табуляции:
Десятичные ASCII Шестнадцатиричные
CR 13 0DH
LF 10 0AH
TAB 09 09H
Эти символы при операциях ввода-вывода выполняют одинаковые действия
как в базовой, так и в расширенной версиях DOS. Например:
MESSAGE DB 09,'PC Users Group Annual Report',13,10
MOV AH,40H ;Запрос на вывод
MOV BX,01 ;Номер файла
MOV CX,31 ;Длина текста
LEA DX,MESSAGE ;Адрес текста
INT 21H ;Вызов DOS
Использование директивы EQU для определения кодов делает программу
более понятной:
CR EQU 13 ;или EQU 0DH
LF EQU 10 ;или EQU 0AH
TAB EQU 09 ;или EQU 09H
MESSAGE DB TAB, 'PC Users Group Annual' DB 'Report', CR, LF
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
________________________________________________________________
- Команда INT 10Н передает управление в BIOS для ввода с клавиатуры
или вывода на экран. Команда INT 21H передает управление в DOS для
выполнения некоторых более сложных действий при операциях ввода-вывода.
- Будьте внимательны при использовании шестнадцатиричной нотации,
например INT 21 и INT 21H - это не одно и то же.
- Будьте внимательны при установке значений в регистры AХ, BX, CX и
DX для операций ввода-вывода.
- При использовании INT 21H в базовой версии DOS устанавливайте
символ-ограничитель ($) непосредственно в конце области вывода. Будьте
осторожны при очистке области - не удалите символ-ограничитель. Отсутствие
ограничителя может привести к непредвиденным эффектам на экране.
- Для ввода в базовой версии DOS тщательно определяйте список
параметров. Экранные функции INT 21H предполагают, что первый байт
содержит максимальную длину ввода, а второй байт заполняется системой
автоматически значением действительной длины введенных данных.
- Для вывода на экран под управлением расширенной версии DOS
устанавливайте в регистре AН значение 40Н, а в регистре BX - файловый
номер 01.
- Для ввода с клавиатуры под управлением расширенной версии DOS
устанавливайте в регистре АН значение функции 3FH, а в регистре BX -
файловый номер 00. Введенные в область ввода данные завершаются символами
возврат каретки и перевод строки. Данная операция не контролирует ввод,
превышающий по длине максимальное значение.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
________________________________________________________________
8.1. Какие шестнадцатиричные значения строки и столбца соответствуют
нижнему правому углу экрана 25х40?
8.2. Напишите команды для установки курсора по координатам: строка
12, столбец 8.
8.3. Напишите команды для очистки экрана, начиная с 0-го столбца 12-й
строки до 79-го столбца 22-й строки.
8.4. Составьте необходимые элементы данных и команды для вывода
запроса 'Введите дату (дд/мм/гг)'. За сообщением должен следовать звуковой
сигнал. Используйте для вывода: а) функцию базовой версии DOS, б) функцию
расширенной версии DOS и файловый номер.
8.5. Составьте необходимые элементы данных и команды для ввода с
клавиатуры в формате вопроса 8.4. Используйте для ввода: а) функцию
базовой версии DOS, б) функцию расширенной версии DOS и файловый номер.
8.6. Укажите стандартные файловые номера для ввода с клавиатуры,
обычного вывода на экран и вывода на принтер.
8.7. Введите в компьютер программу из рис.8.2 со следующими
изменениями, ассемблируйте ее, выполните компоновку и проверку работы: а)
вместо строки 12 середина строки 15; б) вместо очистки всего экрана
очистка только строк от 0 до 15.
8.8. Измените программу из рис.8.2 для использования ее в расширенной
версии DOS. Выполните ее ассемблирование, компоновку и проверку работы.
ГЛАВА 9 Экранные операции II: Расширенные возможности
__________________________________________________________________________
Ц е л ь: Показать более развитые возможности управления экраном,