Сист. прогр. Ч1 (1085770), страница 13
Текст из файла (страница 13)
…………
MOV AH, 40H ;3апрос на вывод
MOV ВХ ,01 ;Выводное устройство
MOV CX,20 ; Макс, число байтов
LEA DX,DISAREA ;Адрес области данных
INT 21H ; Вызов DOS
Команда LEA загружает в регистр DX адрес DISAREA для возможности DOS локализовать информацию, предназначенную для вывода. В результате успешной операции флаг переноса очищается (это можно проверить), а в регистре АХ устанавливается число выведенных символов. Ошибка в данной операции может произойти, если установлен неправильный файловый номер. В этом случае будет установлен флаг CF и код ошибки (в данном случае 6) в регистре АХ. Поскольку регистр АХ может содержать или длину, или код ошибки, то единственный способ определить состояние ошибки - проверить флаг CF. ,
Упражнение: Вывод на экран
Воспользуемся отладчиком DEBUG для проверки внутренних эффектов прерывания. Загрузите DEBUG и после вывода на экран приглашения введите
А 100 для ввода ассемблерных команд (не машинных команд) по адресу 100. Не забудьте, что DEBUG предполагает, что все числа вводятся в шестнадцатиричном формате:
100 MOV AH,40
102 MOV BX,01
105 MOV CX,xx (введите длину вашего имени)
108 MOV DX,10E
10B INT 21
10D RET
10E DB ‘Ваше имя’
Программа устанавливает в регистре АН запрос на вывод и устанавливает значение 10Е в регистре DX - адрес DB, содержащий ваше имя в конце программы.
Когда вы наберете все команды, нажмите еще раз клавишу Return. С помощью команды U (U 100,10D) дисассемблируйте программу для проверки. Затем используйте команды R и Т для трассировки выполнения. При выполнении команды INT 21Н отладчик перейдет в BIOS, поэтому при достижении адреса 10В введите команду GO (G 10D) для перехода к команде RET. Ваше имя будет выведено на экран. С помощью команды Q вернитесь в DOS.
ВВОД С КЛАВИАТУРЫ В РАСШИРЕННОЙ ВЕРСИИ DOS
Ниже приведены команды, иллюстрирующие использование
функции ввода с клавиатуры в расширенной версии DOS:
INAREA DB 20 DUP (‘ ‘) ;0бласть ввода
MOV AH,3H ;3апрос на ввод
MOV BX, 00 ;Номер для клавиатуры
MOV CX,20 ;Макс. байт для ввода
LEA DX,INAREA ;Адрес области ввода
INT 21H ;Вызов DOS
Команда LEA загружает относительный адрес INAREA в регистр DX. Команда INT ожидает, пока пользователь не введет символы с клавиатуры, но не проверяет, превышает ли число введенных символов максимальное значение в регистре СХ (20 в приведенном примере). Нажатие клавиши Return (код 0D) указывает на завершение ввода. Например, после ввода текста "PC Users Group" INAREA будет содержать:
PC Users Group, 0DН, 0АН
После введенного текста непосредственно следует символ возврата каретки (0D), который был введен, и символ конца строки (0А), который не был введен. Вследствие данной особенности максимальное число символов и размер области ввода должны предусматривать место для двух дополнительных символов. Если будет введено символов меньше максимального значения, то область памяти за введенными символами сохранит прежнее значение.
В результате успешной операции очищается флаг CF (что можно проверить) и в регистре АХ устанавливается число байтов, введенных с клавиатуры. В предыдущем примере это число будет равно 14 плюс 2 для символов возврата каретки и перевода строки, т.е. 16. Соответствующим образом программа может определить действительное число введенных символов. Хотя данное свойство весьма тривиально для ответов типа YES или NO, оно может быть полезно для ввода строк с переменной длиной, таких, например, как имена.
Ошибка ввода может возникнуть, если определен неправильный номер файла. В этом случае устанавливается флаг CF и в регистр АХ помещается код ошибки (6 в данном случае). Так как регистр АХ .может содержать или длину введенных данных, или код ошибки, то единственный способ определения наличия ошибки - проверка флага CF.
Если вводить текст, который превышает максимальную длину, установленную в регистре СХ, то будут приниматься все символы. Рассмотрим ситуацию, когда регистр СХ содержит значение 08, а пользователь введет символы "PC Exchange". В результате первые восемь символов "PC Excha" попадут в область ввода без кодов возврата каретки и перевода строки, В регистре АХ будет установлена длина 08. Следующая команда INT будет принимать данные не с клавиатуры, а из собственного внутреннего буфера, поскольку там еще остались предыдущие данные. Таким образом, в область ввода будут приняты символы "nge", символ возврата каретки и символ перевода строки, в регистре АХ будет установлено значение 05. Обе операции ввода являются вполне нормальными и флаг CF будет очищен:
Первый /NT: PC Excha АХ = 08
Второй /NT: nge,0D,0A AX = 05
Программа может определить факт ввода законченного текста: а) если в регистре АХ получится значение меньше, чем в регистре СХ; 6) если содержимое АХ и СХ равно, но последние два символа в области ввода - 0D и 0А.
Встроенные в DOS проверки по функции 0АН для ввода с клавиатуры имеют более мощные средства. Их выбор для использования в программах является предпочтительным.
Упражнение: Ввод данных
Выполним упражнение, в котором можно проследить операцию ввода с клавиатуры с помощью отладчика DEBUG. Предполагаемая программа позволяет вводить до 12 символов, включая символы возврата каретки и перевода строки. Загрузите DEBUG и после вывода на экран приглашения введите А 100 для начала ввода ассемблерных команд начиная с адреса 100. Не забудьте, что DEBUG предполагает, что все числа вводятся в шестнадцатеричном формате:
100 MOV AH,3F
102 MOV BX, 00
105 MOV CX, 0C
108 MOV DX,10F
10В INT 21
10D JMP 100
10F DB ‘ ‘
Программа устанавливает регистры АН и ВХ для запроса на ввод с клавиатуры, заносит максимальную длину ввода в регистр СХ и загружает в регистр DX значение 10F - область DB в конце программы. В эту область будут помещаться вводимые символы.
Когда вы наберете все команды, нажмите еще раз Return. С помощью команды U (U 100,108) выполните дисассемблирование программы для проверки. Затем используйте команды R и Т для трассировки четырех команд MOV. Остановившись по адресу 10В, введите G 10D для выполнения команды INT (входить в BIOS не следует). Теперь отладчик позволит ввести данные, завершаемые клавишей Return. Проверьте содержимое регистра АХ, состояние флага CF и, используя команду D10F, просмотрите введенные данные в памяти. Для завершения работы введите команду Q.
ИСПОЛЬЗОВАНИЕ СИМВОЛОВ ВОЗВРАТА КАРЕТКИ, ПЕРЕВОДА СТРОКИ И ТАБУЛЯЦИИ ДЛЯ ВЫВОДА НА ЭКРАН
Один из способов получения более эффективного вывода на экран - использование управляющих символов возврата каретки, перевода строки и табуляции:
Десятичные ASCII Шестнадцатиричные
CR 13 0DН
LF 10 0АН
TAB 09 09Н
Эти символы при операциях . ввода-вывода выполняют одинаковые действия как в базовой, так и в расширенной версиях 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 ОDН
LF EQU 10 ; или EQU OAH
TAB EQU 09 ;или EQU 09H
MESSAGE DB TAB, 'PC Users Group Annual' DB 'Report', CR, LF
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
-
Команда INT 10Н передает управление в BIOS для ввода с клавиатуры или вывода на экран. Команда INT 21Н передает управление в DOS для выполнения некоторых более сложных действий при операциях ввода-вывода.
-
Будьте внимательны при использовании шестнадцатеричной нотации, например INT 21 и INT 21Н - это не одно и то же. Будьте внимательны при установке значений в регистры АХ, ВХ, СХ и DX для операций ввода-вывода.
-
При использовании INT 21Н в базовой версии DOS устанавливайте символ-ограничитель ($•) непосредственно в конце области вывода. Будьте осторожны при очистке области - не удалите символ-ограничитель. Отсутствие ограничителя может привести к непредвиденным эффектам на экране. Для ввода в базовой версии DOS тщательно определяйте список параметров. Экранные функции INT 21Н предполагают, что первый байт содержит максимальную длину ввода, а второй байт заполняется системой автоматически значением действительной длины введенных данных.
-
Для вывода на экран под управлением расширенной версии DOS устанавливайте в регистре АН значение 40Н, а в регистре ВХ - файловый номер 01.
-
Для ввода с клавиатуры под управлением расширенной версии DOS устанавливайте в регистре АН значение функции 3FH, а в регистре ВХ - файловый номер 00. Введенные в область ввода данные завершаются символами возврат каретки и перевод строки. Данная операция не контролирует ввод, превышающий по длине максимальное значение.
Экранные операции II: Расширенные возможности
В данном разделе приводятся более развитые возможности, обеспечивающие прокрутку данных на экране и установку байта-атрибута для подчеркивания, мигания, выделения яркостью. Материал первого раздела этой главы (по прерыванию BIOS 10H) подходит как для монохромных, так и для цветных дисплеев. Другие расширенные возможности включают использование скэн-кодов для определения нажатой клавиши или комбинации клавиш на клавиатуре.
Монохромный дисплей
Для работы монохромного дисплея имеется память объемом 4 Кбайт, начинающаяся по шестнадцатеричному адресу В0000 (дисплейный буфер). Эта память включает:
-
2 Кбайт для символов на экране (25 строк х 80 столбцов);
-
2 Кбайт для байтов-атрибутов, обеспечивающих
инвертирование, мигание, выделение яркостью и
подчеркивание.
Цветной/графический дисплей
Для работы стандартного цветного графического дисплея имеется
16 Кбайт памяти (дисплейный буфер), начинающейся по
шестнадцатиричному адресу В8000. Такой дисплей может являться
текстовым (для нормального ASCII-кода) или графическим и
работать как в цветном, так и в черно-белом (BW) режиме.
Дисплейный буфер обеспечивает экранные страницы,
пронумерованные от 0 до 3 для экрана на 80 столбцов и от 0 до
7 для экрана на 40 столбцов. Номер страницы по умолчанию - О,
но можно установить любую страницу в памяти. В следующей
главе будет подробно рассмотрено управление цветом и графикой.
БАЙТ-АТРИБУТ
Байт-атрибут как для монохромного, так и для графического дисплея в текстовом (не графическом) режиме определяет характеристики каждого отображаемого символа. Байт-атрибут имеет следующие 8 бит:
Фон Текст
А трибу т: BLRGB IRGB
Номер битов: 7654 3210
Буквы RGB представляют битовые позиции, управляющие соответственно красным (Red), зеленым (Green) и синим (Blue) лучом в цветном мониторе. Бит 7 (BL) устанавливает мигание, а бит 3 (I) - интенсивность свечения. На монохромных мониторах текст высвечивается зеленым или оранжевым на темном фоне, хотя в данной главе такое изображение называется черно-белым (BW).
Для модификации атрибутов можно комбинировать биты следующим образом:
Эффект выделения Фон Текст
RGB RGB
Неотображаемый (черный по черному) 000 000
Подчеркивание (не для цвета) 000 001
Нормальный (белый по черному) 000 111
Инвертированный (черный по белому) 111 000
Цветные мониторы не обеспечивают подчеркивания; вместо этого установка битов подчеркивания выбирает синий цвет для текста и получается отображение синим по черному. Ниже приведены некоторые атрибуты, основанные на комбинации битов фона, текста, мигания и выделения яркостью:
Двоичный код Эффект выделения
0000 0000 00Н Неотображаемый (для паролей)
0000 0111 07Н Белый по черному, нормальный
1000 0111 87Н Белый по черному, мигание
0000 1111 0FH Белый по черному, яркий
0111 0000 70Н Черный по белому, инверсия
1111 0000 F0H Черный по белому, инверсия, мигающий
Эти атрибуты подходят для текстового режима как для монохромных, так и для цветных дисплеев. В следующей главе будет показано, как выбирать конкретные цвета. Для генерации атрибута можно использовать команду INT 10Н. При этом регистр BL должен содержать значение байта-атрибута, а регистр АН -один из следующих кодов: 06 (прокрутка вверх), 07 (прокрутка вниз), 08 (ввод символа с атрибутом), 09 (вывод символа с атрибутом). Если программа установила некоторый атрибут, то он остается таким, пока программа его не изменит. Если установить значение байта-атрибута равным 00, то символ вообще не будет отображен.
ПРЕРЫВАНИЕ BIOS INT 10Н