Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2591

.pdf
Скачиваний:
2
Добавлен:
07.01.2021
Размер:
25.15 Mб
Скачать

примерах в зависимости от требований используются как 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]