int 21h ; вызов DOS
Команда lea загружает в регистр dx адрес disarea для возможности DOS локализовать информацию, предназначенную для вывода. В результате успешной операции флаг переноса очищается, а в регистре ax устанавливается число выведенных символов. Ошибка в данной операции может произойти, если yстановлен неправильный файловый номер. В этом случае будут установлены флаг cf и код ошибки (в данном случае 6) в регистре ax. Поскольку регистр ax может содержать или длину, или код ошибки, то единственный способ определить состояние ошибки – проверить флаг cf.
4.22. Ввод с клавиатуры: расширенная версия 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, 0dh, 0ah.
После введенного текста непосредственно следует символ возврата каретки (0dh), который был введен, и символ конца строки (0ah), который не вводился. В силу данной особенности максимальное число символов и размер области ввода должны предусматpивать место для двух символов. Если будет введено cимволов меньше максимального значения, то область памяти за введенными символами сохранит прежнее значение.
В результате успешной операции будет очищен флаг cf (что можно проверить) и в регистре ax будет установлено число байтов, введенных с клавиатуры. В предыдущем примере это число будет равно 14 плюс 2 для перевода каретки и конца строки, т.е. 16. Соответствующим образом программа может определить действительное число введенных символов. Хотя данное свойство весьма тривиально для ответов типа YES или NO, оно может быть полезно для ответов с пеpеменной длиной, таких, например, как имена.
36
Ошибка ввода может возникнуть, если определен неправильный номер файла. В этом случае будет установлен флаг 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 равны, но последние два символа в области ввода – 0dh и 0ah.
Встроенные в DOS проверки по функции 0ah для ввода с клавиатуры имеют более мощные средства. Их выбор для использования в программах является предпочтительным.
4.23.Использование символов возврата каретки, конца строки
итабуляции для вывода на экран
Один из способов получения более эффективного вывода на экран – использование управляющих символов возврата каретки, перевода строки и табуляции.
|
|
|
Таблица 4.4 |
|
Кодировка управляющих символов |
||
|
|
|
|
Управляющие символы |
|
Десятичные ASCII |
Шестнадцатеричные |
CR (возврат каретки) |
|
13 |
0dh |
LF (перевод строки) |
|
10 |
0ah |
TAB (табуляция) |
|
09 |
09h |
Эти символы при операциях ввода-вывода выполняют одинаковые действия как в базовой, так и в расширенной версиях DOS. Например:
message db 09,'PC Users Group Annual Report',13,10
; сегмент кода-----------------------------------------------------
37
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 4.24. Экранные операции: расширенные возможности
Здесь приводятся возможности, обеспечивающие прокрутку данных на экране и установку байта-атрибута для подчеркивания, мигания, выделения яркости.
4.25. Монохромный дисплей
Для работы монохромного дисплея имеется память объемом 4К, начинающаяся по адресу B0000h (дисплейный буфер). Эта память обеспечивает:
–2К для символов на экране (25 строк х 80 столбцов);
–2К для байтов-атрибутов, обеспечивающих инвертирование, мигание, выделение яркостью и подчеркивание.
4.26. Цветной графический дисплей
Для работы стандартного цветного графического дисплея имеется 16 Кб памяти (дисплейный буфер, начинающийся по адресу B8000h). Такой дисплей может являться текстовым (для нормального ASCII-кода) или графическим и работать как в цветном, так и в черно-белом (BW) режиме.
Дисплейный буфер обеспечивает экpанные страницы, пронумерованные от 0 до 3 для экрана на 80 cтолбцов. Номер страницы по умолчанию – 0. У Абеля [6] подробно рассмотрено управление цветом и графикой.
Байт атрибутов, как для монохромного, так и для графического дисплея в текстовом (не графическом) режиме определяет характеристики каждого отображаемого символа. Байт-атрибут имеет следующие 8 битов:
38
|
|
|
|
|
|
|
|
Таблица 4.5 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Фон |
B |
|
Текст |
|
|||
Атрибут |
BL |
R |
|
G |
I |
R |
|
G |
B |
|
Номер битов |
7 |
6 |
|
5 |
4 |
3 |
2 |
|
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
Буквы RGB представляют собой битовые позиции, управляющие красным (red), зеленым (green) и синим (blue) лучом в цветном мониторе. Бит 7 (BL) устанавливает мигание, а бит 3 (I) – уровень яркости. На монохромных мониторах текст высвечивается зеленым или оранжевым на темном фоне. Обычно такое изображение называется черно-белым (BW).
Для модификации атрибутов можно комбинировать биты следующим oбразом:
|
|
Таблица 4.6 |
|
|
|
|
|
Эффект выделения |
Фон |
Текст |
|
RGB |
RGB |
||
|
|||
Неотображаемый (черный по черному) |
000 |
000 |
|
Подчеркивание (не для цвета) |
000 |
001 |
|
Нормальный (белый по черному) |
000 |
111 |
|
Инвертированный (черный по белому) |
111 |
000 |
Цветные мониторы не обеспечивают подчеркивания; вместо этого установка бита подчеркивания выбирает синий цвет для текста и получается отображение синим по черному. Ниже приведены некоторые атрибуты, основанные на комбинации битов фона, текста, мигания и выделения яркостью
|
|
Таблица 4.7 |
|
|
|
Двоичный код |
Шестнадцатеричный код |
Эффект выделения |
0000 0000 |
00 |
Неотображаемый (для паролей) |
0000 0111 |
07 |
Белый по черному (нормальный) |
1000 0111 |
87 |
Белый по черному (мигание) |
0000 1111 |
0F |
Белый по черному (яркий) |
0111 0000 |
70 |
Черный по белому (инвертированный) |
1111 0000 |
F0 |
Черный по белому (инверт. мигающий) |
Эти атрибуты подходят для текстового режима, как для монохромных, так и для цветных дисплеев. В [6] показано, как выбирать конкретные цвета. Для генерации атрибута можно использовать команду int 10h. При этом регистр bl должен содержать значение байта-атрибута, а регистр ah − один из следующих кодов: 06 (прокрутка вверх), 07 (прокрутка вниз), 08 (ввод атрибута или символа), 09 (вывод атрибута или символа).
39
Если программа установила некотоpый атрибут, то он остается таким, пока программа его не изменит. Если установить значение байта-атрибута равным шестнадцатеричному 00, то символ вообще не будет отображен.
4.27. Прерывание BIOS int 10h
Прерывание int 10h обеспечивает управление всем экраном. В регистре ah устанавливается код, определяющий функцию прерывания. Команда cохраняет содержимое регистров bx, cx, dx, si и bp. Ниже описываются все возможные функции.
ah=00: Установка режима. Данная функция позволяет переключать цветной монитор в текстовый или графический режим. Установка pежима для выполняемой в текущий момент программы осуществляется c помощью int 10h. При установке происходит очистка экрана. Содержимое регистра al может быть следующим
|
|
|
|
Таблица 4.8 |
|
|
|
|
|
Значение al |
|
|
|
Режим |
00 |
40 х 25 черно-белый текстовый режим |
|||
01 |
40 х 25 |
стандартный текстовый режим (16 цветов) |
||
02 |
80 х 25 |
черно-белый текстовый режим |
||
03 |
80 х 25 |
стандартный текстовый режим (16 цветов) |
||
04 |
320 |
х 200 стандартный графический режим (4 цвета) |
||
05 |
320 |
х 200 черно-белый графический режим |
||
06 |
640 |
х 200 черно-белый графический режим |
||
07 |
80 х 25 |
черно-белый стандартный монохромный |
||
08 – 0A |
форматы для модели PCjr |
|||
0D |
320 |
х 200 |
графический режим EGA (16 цветов) |
|
0E |
640 |
х 200 |
графический режим EGA (16 цветов) |
|
0F |
640 |
х 350 |
черно-белый графический режим EGA |
|
10 |
640 |
х 350 |
графический режим EGA (64-цвета) |
|
EGA (Enhanced Graphics Adapter) обозначает усовершенствованный графический адаптер. Следующий пример показывает установку стандартного 16-цветового текстового режима:
mov |
ah,00 |
; функция установки режима |
mov |
al,03 |
; стандартный цветной текст 80 х 25 |
int 10h |
; вызвать BIOS |
|
Для определения типа адаптера, установленного в системе, служит прерывание BIOS int 11h. Данная команда возвращает в регистре ax значение, в котором биты 5 и 4 указывают на видеорежим.
40