2591
.pdfпримерах в зависимости от требований используются как int 10h, так и int 21h.
4.12. Установка курсора
Экран можно представить в виде двумерного пространства с адресуемыми позициями, в любую из которых может быть установлен курсор. Обычный видеомонитор имеет 25 строк, нумеруемых от 0 до 24, и 80 столбцов, нумеруемых от 0 до 79. В следующей таблице приведены некоторые примеры положений курсора на экране.
|
|
|
|
Таблица 4.3 |
|
|
|
|
|
Положение |
Десятичный формат |
Шестнадцатеричный формат |
||
|
Строка |
Столбец |
Строка |
Столбец |
Верхний левый угол |
00 |
00 |
00 |
00 |
Верхний правый угол |
00 |
79 |
00 |
4F |
Центр экрана |
12 |
39/40 |
00 |
27/28 |
Нижний левый угол |
24 |
00 |
18 |
00 |
Нижний правый угол |
24 |
79 |
18 |
4F |
Команда int 10h включает в себя установку курсора в любую позицию и очистку экрана. Ниже приведен пример установки курсора на 5-ю строку и 12-й столбец:
mov ah,02 |
; запрос на установку курсора |
mov bh,00 |
; экран 0 |
mov dh,05 |
; строка 5 |
mov dl,12 |
; столбец 12 |
int 10h |
; передача управления в BIOS |
Значение 02 в регистре ah указывает команде int 10h на выполнение операции установки курсора. Значения строки и столбца должны быть в регистре dx, а номер экрана (или страницы) в регистре bh (обычно 0). Содержимое других регистров несущественно. Для установки строки и столбца можно также использовать одну команду mov c непосредственным шестнадцатеричным значением:
mov dx,050Ch ; строка 5, столбец 12
4.13. Очистка экрана
Запросы и команды остаются на экране пока не будут смещены в результате прокручивания ("скроллинга") или переписаны на этом же месте другими запросами или командами. Когда программа начинает cвое выполнение, экран может быть очищен. Очищаемая область экрана может начинаться в любой позиции и заканчиваться в любой другой позиции с большим номером. Начальное значение строки и столбца заносится в
31
регистр dx, значение 07 – в регистр bh и 0600H в ax. В следующем примере выполняется очистка всего экрана:
mov ax,0600h ; ah 06 (прокрутка), al 00 (весь экран) mov bh,07 ; нормальный атрибут (черно-белый) mov cx,0000 ; верхняя левая позиция
mov dx,184Fh ; нижняя правая позиция
int 10h ; передача управления в BIOS
Значение 06 в регистре ah указывает команде int 10h на выполнение операции очистки экрана. Эта операция очищает экран пробелами. Если установить нижнюю правую позицию больше, чем шестнадцатеричное 184F, то очистка перейдет вновь к началу экрана и вторично заполнит некоторые позиции пробелами. Для монохромных экранов это не вызывает каких-либо неприятностей, но для некоторых цветных мониторов могут возникнуть серьезные ошибки.
4.14. Экранные и клавиатурные операции: базовая версия DOS
Обычно программы должны выдать на экран сообщение о завершении или об обнаружении ошибки, отобразить запрос для ввода данных или для получения указания пользователя. Рассмотрим методы, применяемые в базовой версии DOS. Расширенные методы, введенные в последующих версиях DOS изучить при необходимости по учебникам [3, 6, 1] и др. Операции из базовой DOS работают во всех версиях DOS и в операционных системах, эмулирующих ее (т.е в Windows всех версий и др.), и поэтому студентам специальности 075500 их следует знать. Студентам, обучающимся другим специальностям, рекомендуется применять расширенные возможности для новых разработок. В базовой версии DOS команды вывода на экран более сложны, но команды ввода с клавиатуры проще в использовании, благодаря встроенным проверкам.
4.15. Вывод на экран: базовая версия DOS
Вывод на экран в базовой версии DOS описан в уч. пос., ч. 1. В процессе выполнения операции конец сообщения определяется по oграничителю ($).
mov ah,09 |
; запрос вывода на экран |
lea dx,nameprmp |
; загрузка адреса сообщения |
int 21h |
; вызов DOS |
Адрес поля nameprmp, загружаемый в dx по команде lea, является oтносительным, поэтому для вычисления абсолютного адреса данных DOS складывает значения регистров ds и dx (ds:dx).
32
4.16. Ввод данных с клавиатуры: базовая версия DOS
Процедура |
ввода данных с клавиатуры также описан в пособии к |
уч. пос., ч. 1. |
Для ввода, использующего базовую DOS, область ввода |
требует наличия cписка параметров, содержащего поля, которые необходимы при выполнении команды int.
; сегмент данных |
|
namepar label byte |
; список параметров |
maxlen db 20 |
; максимальная длина |
factlen db ? |
; реальная длина |
namefld db 20 dup (' ') |
; введенные символы |
Запрос на ввод (номер функции – 10 (шестнадцатеричное – 0ah)):
; сегмент кода |
|
mov ah,0ah |
; запрос функции ввода |
lea dx,namepar |
; загрузить адреса списка параметров |
int 21h |
; вызвать DOS |
4.17. Ввод единственного символа Enter
При вводе данных, превышающего по длине максимальное количество, указанное в списке параметров, возникает звуковой сигнал и система oжидает ввода только символа Enter. Если вообще не вводить данные, а только нажать клавишу Enter, то система примет ее и yстановит в списке параметров нулевую длину следующим образом (шестнадцатеричные значения): |14|00|0d|...
4.18. Замена символа Enter
Вводимые значения можно использовать для самых разных целей, например для печати сообщений, сохранения в таблице, записи на диск.
При этом, возможно, |
появится необходимость замены символа Enter |
||||
(шестнадцатеричное |
0d) |
в области |
namefld |
на символ |
пробела |
(шестнадцатеричное |
20). |
Поле |
factlen |
NAMELEN |
содержит |
действительную длину или отноcительный адрес кода 0d. Если, например, factlen содержит длину 5, то адрес кода 0d равен namefld+5. Можно занести эту длину в регистр bx для индексной адресации в поле namefld:
mov bh,00 |
; установить в регистре bx |
|
mov |
bl,factlen |
; значение 5 |
mov |
namefld[bx],20h |
; заменить 0d на пробел |
Третья команда mov заносит символ пробела (шестнадцатеричное 20) по адресу, oпределенному первым операндом: адрес поля namefld плюс содержимое регистра bx, т.е. namefld+5.
33
4.19. Очистка области ввода
Вводимые символы заменяют предыдущее содержимое области ввода и остаются там, пока другие символы не заменят их. Рассмотрим следующие три успешных ввода [6]:
|
|
|
|
Ввод |
|
|
|
Содержимое namepar (шестнадцатеричное) |
|
|
|||||||||||
1. |
B |
R |
O |
W |
N |
|
14 |
05 |
|
42 |
52 |
4f |
57 |
4e |
0d |
20 |
20 |
. |
. |
. |
20 |
2. |
H |
A |
M |
I |
L |
T O N |
14 |
08 |
|
48 |
41 |
4d |
49 |
4c |
54 |
4f |
4e |
0d |
. |
. |
20 |
3. |
A |
D |
A |
M |
S |
|
14 |
05 |
|
41 |
44 |
41 |
4d |
53 |
0d |
4f |
4e |
0d |
. |
. |
20 |
Имя HAMILTON заменяет более короткое имя BROWN. Но так как имя ADAMS короче имени HAMILTON, то оно заменяет только HAMIL. Код Enter заменяет символ T. Остальные буквы – ON oстаются после имени ADAMS. Для очистки поля namefld до ввода очередного имени может служить следующая программа:
mov cx,20 |
; установить 20 циклов |
mov si,0000 |
; начальная позиция поля |
b30: |
|
mov namefld[si],20h |
; переслать один пробел |
inc si |
; следующая позиция поля |
loop b30 |
; 20 циклов |
Вместо регистра si можно использовать di или bx. Более эффективный способ очистки поля, предполагающий пересылку слова из двух пробелов, требует только десять циклов. Однако, ввиду того что поле namefld определено как db (байтовое), необходимо изменить длину в команде пересылки, посредством операнда word, a также воспользоваться операндом ptr (указатель), как показано ниже:
mov cx,10 |
; установить 10 циклов |
|
lea |
si, namefld |
; начальный адрес |
b30: |
|
|
mov word ptr [si],2020h |
; переслать два пробела |
|
inc |
si |
; получить адрес |
inc |
si |
; следующего слова |
loop b30 |
; 10 циклов |
Команда mov по метке b30 обозначает пересылку слова из двух пробелов по адресу, находящемуся в регистре si. В последнем примеpе используется
команда |
lea для инициализации |
регистра si и несколько иной способ в |
команде |
mov по метке b30, так как нельзя закодировать, например, |
|
следующую команду: |
|
|
mov word ptr[namefld],2020h |
; неправильно |
|
|
|
34 |
Очистка входной области решает проблему ввода коротких имен, за которыми следуют предыдущие данные. Еще более эффективный cпособ предполагает очистку только тех байт, которые расположены после введенного имени.
4.20. Экранные и клавиатурные операции: расширенная версия DOS
Рассмотрим теперь расширенные возможности, введенные в DOS 2.0 (реализованные в стиле операционной системы UNIX). Если вы используете более младшую версию DOS, то не сможете выполнить примеры из данного подраздела. Расширенные возможности включают файловый номер (file handle), который yстанавливается в регистре bx, когда требуется выполнить операцию ввода\вывода. Существуют следующие стандартные файловые номера:
0Ввод (обычно с клавиатуры) CON
1Вывод (обычно на экран) CON
2Вывод по ошибке (на экран) CON
3Ввод/вывод на внешнее устройство AUX
4Вывод на печать LPT1 или PRN
Прерывание DOS для ввода/вывода – int 21h, необходимая функция запрашивается через регистр ah: шестнадцатеричное 3f – для ввода, шестнадцатеричное 40 – для вывода. В регистр cx заносится число байтов для ввода/вывода, а в регистр dx – адрес области ввода/вывода.
В результате успешного выполнения операции ввода/вывода очищается флаг переноса (cf) и в регистр ax устанавливается действительное число байтов, участвующих в операции. Иначе устанавливается флаг cf, а код ошибки (в данном случае 6) заносится в ax. Поскольку регистр ax может содержать как длину данных, так и код ошибки, то единственный способ определить наличие ошибки – проверить флаг cf, хотя ошибки чтения с клавиатуры и вывода на экран – явления крайне редкие. Аналогичным oбразом используются файловые номера для дисковых файлов.
4.21. Вывод на экран: расширенная версия DOS
Следующие команды иллюстрируют операцию вывода на экран в расширенной версии DOS:
DISAREA db 20 DUP(' ') ; область данных
... |
|
|
mov ah,40h |
; запрос на вывод |
|
mov bx,01 |
; устройство вывода |
|
mov cx,20 |
; максимальное число байтов |
|
lea |
dx,disarea |
; адрес области данных |
int |
21h |
; вызов DOS |
|
|
35 |
Команда 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
|
|
|
Фон |
|
|
Текст |
|
|
||
Атрибут |
BL |
R |
|
G |
B |
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