ГЛАВА 8 Экранные операции I: Основные свойства

__________

Ц е л ь: Объяснить требования для вывода информации на экран, а также

для ввода данных с клавиатуры.

ВВЕДЕНИЕ

________________________________________________________________

В предыдущих главах мы имели дело с программами, в которых данные

oпределялись в операндах команд (непосредственные данные) или

инициализировались в конкретных полях программы. Число практических

применений таких программ в действительности мало. Большинcтво программ

требуют ввода данных с клавиатуры, диска или модема и обеспечивают вывод

данных в удобном формате на экран, принтер или диск. Данные,

предназначенные для вывода на экран и ввода с клавиатуры, имеют ASCII

формат.

Для выполнения ввода и вывода используется команда INT (прерывание).

Существуют различные требования для указания системе какое действие (ввод

или вывод) и на каком устройстве необходимо выполнить. Данная глава

раскрывает основные требования для вывода информации на экран и ввода

данных с клавиатуры.

Все необходимые экранные и клавиатурные операции можно выполнить

используя команду INT 10H, которая передает управление непосредственно в

BIOS. Для выполнения некоторых более сложных операций существует

прерывание более высокого уровня INT 21H, которое сначала передает

управление в DOS. Например, при вводе с клавиатуры может потребоваться

подсчет введенных символов, проверку на максимальное число символов и

проверку на символ Return. Преpывание DOS INT 21H выполняет многие из этих

дополнительных вычислений и затем автоматически передает управление в

BIOS.

Материал данной главы подходит как для монохромных (черно-белых, BW),

так и для цветных видеомониторов. В гл. 9 и 10 приведен материал для

управления более совершенными экранами и для использования цвета.

КОМАНДА ПРЕРЫВАНИЯ: INT

________________________________________________________________

Команда INT прерывает обработку программы, передает управление в DOS

или BIOS для определенного действия и затем возвращает управление в

прерванную программу для продолжения обработки. Наиболее часто прерывание

используется для выполнения операций ввода или вывода. Для выхода из

программы на обработку прерывания и для последующего возврата команда INT

выполняет следующие действия:

- уменьшает указатель стека на 2 и заносит в вершину стека

содержимое флагового регистра;

- очищает флаги TF и IF;

- уменьшает указатель стека на 2 и заносит содержимое регистра

CS в стек;

- уменьшает указатель стека на 2 и заносит в стек значение

командного указателя;

- обеспечивает выполнение необходимых действий;

- восстанавливает из стека значение регистра и возвращает

управление в прерванную программу на команду, следующую после INT.

Этот процесс выполняется полностью автоматически. Необходимо лишь

определить сегмент стека достаточно большим для записи в него значений

регистров.

В данной главе рассмотрим два типа прерываний: команду BIOS INT 10H и

команду DOS INT 21H для вывода на экран и ввода с клавиатуры. В

последующих примерах в зависимости от требований используются как INT 10H

так и INT 21H.

УСТАНОВКА КУРСОРА

________________________________________________________________

Экран можно представить в виде двумерного пространства с адресуемыми

позициями в любую из которых может быть установлен курсор. Обычный

видеомонитор, например, имеет 25 строк (нумеруемых от 0 до 24) и 80

столбцов (нумеруемых от 0 до 79). В следующей таблице приведены некоторые

примеры положений курсора на экране:

________________________________________________________

Дес. формат Шест. формат

______________ ______________

Положение строка столбец строка столбец

________________________________________________________

Верхний левый угол 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 ;Строка 05

MOV DL,12 ;Столбец 12

INT 10H ;Передача управления в BIOS

Значение 02 в регистре AH указывает команде INT 10H на выполнение операции

установки курсора. Значение строки и столбца должны быть в регистре DX, а

номер экрана (или страницы) в регистре BH (обычно 0). Содержимое других

регистров несущественно. Для установки строки и столбца можно также

использовать одну команду MOV c непосредственным шест. значением:

MOV DX,050CH ;Строка 5, столбец 12

ОЧИСТКА ЭКРАНА

________________________________________________________________

Запросы и команды остаются на экране пока не будут смещены в

результате прокручивания ("скроллинга") или переписаны на этом же месте

другими запросами или командами. Когда программа начинает cвое выполнение,

экран может быть очищен. Очищаемая область экрана может начинаться в любой

позиции и заканчиваться в любой другой позиции с большим номером.

Начальное значение строки и столбца заносится в регистр 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, то очистка

перейдет вновь к началу экрана и вторично заполнит некоторые позиции

пробелами. Для монохромных экранов это не вызывает каких-либо

неприятностей, но для некоторых цветных мониторов могут возникнуть

серьезные ошибки.

ЭКРАННЫЕ И КЛАВИАТУРНЫЕ ОПЕРАЦИИ: БАЗОВАЯ ВЕРСИЯ DOS

________________________________________________________________

Обычно программы должны выдать на экран сообщение о завершении или об

обнаружении ошибки, отобразить запрос для ввода данных или для получения

указания пользователя. Рассмотрим сначала методы, применяемые в базовой

версии DOS, в последующих pазделах будут показаны расширенные методы,

введенные в DOS версии 2.0. Операции из базовой DOS работают во всех

версиях, хотя в руководстве по DOS рекомендуется применять расширенные

возможности для новых разработок. В базовой версии DOS команды вывода на

экран более сложны, но команды ввода с клавиатуры проще в использовании,

благодаря встроенным проверкам.

ВЫВОД НА ЭКРАН: БАЗОВАЯ ВЕРСИЯ DOS

________________________________________________________________

Вывод на экран в базовой версии DOS требует определения текстового

сообщения в области данных, установки в регистре AH значения 09 (вызов

функции DOS) и указания команды DOS INT 21H. В процессе выполнения

операции конец сообщения определяется по oграничителю ($), как это

показано ниже:

NAMPRMP DB 'Имя покупателя?','$'

.

.

MOV AH,09 ;Запрос вывода на экран

LEA DX,NAMPRMP ;Загрузка адреса сообщ.

INT 21H ;Вызов DOS

Знак ограничителя "$" можно кодировать непосредственно после cимвольной

строки (как показано в примере), внутри строки: 'Имя покупателя?$', или в

следующем операторе DB '$'. Используя данную операцию, нельзя вывести на

экран символ доллара "$". Кроме того, если знак доллара будет

отсутствовать в конце строки, то на экран будут выводиться все последующие

символы, пока знак "$" не встретиться в памяти.

Команда LEA загружает адрес области NAMPRMP в регистр DX для передачи

в DOS адреса выводимой информации. Адрес поля NAMPRMP, загружаемый в DX по

команде LEA, является oтносительным, поэтому для вычисления абсолютного

адреса данных DOS складывает значения регистров DS и DX (DS:DX).

ПРОГРАММА: ВЫВОД НА ЭКРАН НАБОРА СИМВОЛОВ КОДА ASCII

________________________________________________________________

Большинство из 256 кодов ASCII имеют символьное представление, и

могут быть выведены на экран. Шест. коды 00 и FF не имеют символов и

выводятся на экран в виде пробелов, хотя символ пробела имеет в ASCII

шест. код 20.

На рис.8.1 показана COM-программа, которая выводит на экран полный

набор символов кода ASCII. Программа вызывает три процедуры; B10CLR,

C10SET и D10DISP. Процедура B10CLR очищает экран, а процедура C10SET

устанавливает курсор в положение 00,00. Процедура D10DISP выводит

содержимое поля CTR, которое в начале инициализировано значением 00 и

затем yвеличивается на 1 при каждом выводе на экран, пока не достигнет

шест. значения FF.

__________

page 60,132

TITLE ALLASC (COM) Вывод на экран ASCII-символов 00-FF

CODESC SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:NOTHING

ORG 100H

BEGIN: JMP SHORT MAIN

CTR DB 00,'S'

; Основная процедура:

; ------------------

MAIN PROC NEAR

CALL B10CDR ;Очистить экран

CALL C10SET ;Установить курсор

CALL D10DISP ;Вывести символ на экран

RET

MAIN ENDP

; Очистка экрана:

; --------------

B10CLR PROC

MOV AX,0600H

MOV BH,07

MOV CX,0000 ;Левая верхняя позиция

MOV DX,184FH ;Правая нижняя позиция

INT 10H

RET

B10CLR ENDP

; Установка курсора в 00,00:

; -------------------------

C10SET PROC

MOV AN,02

MOV BN,00

MOV DX,0000

INT 10H

RET

C10SET ENDP

; Вывод на экран ASCII символов:

; -----------------------------

D10DISP PROC

MOV CX,256 ;256 итераций

LEA DX,CTR ;Адрес счетчика

D20

MOV AH,09 ;Функция вывода символа

INT 21H

INC CTR ;Увеличить счетчик

LOOP D20 ;Уменьшить CX,

; цикл, если не ноль

RET ;Вернуться

D10DISP ENDP

CODESG ENDS

END BEGIN

__________

Рис.8.1. Вывод на экран набора символов кода ASCII

Так как символ доллара не выводится на экран и кроме того коды от

шест.08 до шест.0D являются специальными управляющими cимволами, то это

приводит к перемещению курсора и другим управляющим воздействиям. Задание:

введите программу (рис.8.1), выполните ассемблирование, компоновку и

преобразование в COM-файл. Для запуска программы введите ее имя, например,

В:ASCII.COM.

Первая выведенная строка начинается с пробельного символа (шест.00),

двух "улыбающихся лиц" (шест.01 и 02) и трех карточных символов (шест.03,

04 и 05). Код 07 выдает звуковой сигнал. Код 06 должен отобразиться

карточным символом "пики", но управляющие символы от шест.08 до 0D сотрут

его. Код 0D является "возвратом каретки" и приводит к переходу на новую

(следующую)строку. Код шест.0E - представляется в виде музыкальной ноты.

Символы после шест.7F являются графическими.

Можно изменить программу для обхода управляющих символов. Ниже

приведен пример фрагмента программы, позволяющий обойти все символы между

шест.08 и 0D. Вы можете поэкспериментировать, oбходя только, скажем,

шест.08 (возврат на символ) и 0D (возврат каретки):

CMP CTR,08H ;Меньше чем 08?

JB D30 ; да - принять

CMP CTR,0DH ; Меньше/равно 0D?

JBE D40 ; да - обойти

D30:

MOV AH,40H ;Вывод символов < 08

... ; и > 0D

INT 21H

D40:

INC CTR

ВВОД ДАННЫХ С КЛАВИАТУРЫ: БАЗОВАЯ ВЕРСИЯ DOS

________________________________________________________________

Процедура ввода данных с клавиатуры проще, чем вывод на экран. Для

ввода, использующего базовую DOS, область ввода требует наличия cписка

параметров, содержащего поля, которые необходимы при выполнении команды

INT. Во-первых, должна быть определена максимальная длина вводимого

текста. Это необходимо для предупреждения пользователя звуковым сигналом,

если набран слишком длинный текст; символы, превышающие максимальную длину

не принимаются. Во-вторых, в списке параметров должно быть определенное

поле, куда команда возвращает действительную длину введенного текста в

байтах.

Ниже приведен пример, в котором определен список параметров для

области ввода. LABEL представляет собой директиву с атрибутом BYTE. Первый

байт содержит максимальную длину вводимых данных. Так как это однобайтовое

поле, то возможное максимальное значение его - шест.FF или 255. Второй

байт необходим DOS для занесения в него действительного числа введенных

символов. Третьим байтом начинается поле, которое будет содержать

введенные символы.

NAMEPAR LABEL BYTE ;Список параметров:

MAXLEN DB 20 ; Максимальная длина

ACTLEN DB ? ; Реальная длина

NAMEFLD DB 20 DUP (' ') ; Введенные символы

Так как в списке параметров директива LABEL не занимает места, то

NAMEPAR и MAXLEN указывают на один и тот же aдрес памяти. В трансляторе

MASM для определения списка параметров в виде структуры может

использоваться также директива STRUC. Однако, в связи с тем, что ссылки на

имена, определенные внутри, требуют специальной адресации, воздержимся

cейчас от рассмотрения данной темы до гл.24 "Директивы ассемблера".

Для запроса на ввод необходимо поместить в регистр AH номер функции -

10 (шест. 0AH), загрузить адрес списка параметров (NAMEPAR в нашем

примере) в регистр DX и выполнить INT 21H:

MOV AH,0AH ;Запрос функции ввода

LEA DX,NAMEPAR ;Загрузить адреса списка параметров

INT 21H ;Вызвать DOS

Команда INT ожидает пока пользователь не введет с клавиатуры текст,

проверяя при этом, чтобы число введенных cимволов не превышало

максимального значения, указанного в списке параметров (20 в нашем

примере). Для указания конца ввода пользователь нажимает клавишу Return.

Код этой клавиши (шест. 0D) также заносится в поле ввода (NAMEFLD в нашем

примере). Если, например, пользователь ввел имя BROWN (Return), то cписок

параметров будет содержать информацию:

дес.: |20| 5| В| R| O| W| N| #| | | | | ...

шест.: |14|05|42|52|4F|57|4E|0D|20|20|20|20| ...

Во второй байт списка параметров (ACTLEN в нашем примере) команда

заносит длину введенного имени - 05. Код Return находится по адресу

NAMEFLD +5. Символ # использован здесь для индикации конца данных, так как

шест. 0D не имеет отображаемого символа. Поскольку максимальная длина в 20

символов включает шест.0D, то действительная длина вводимого текста может

быть только 19 символов.

ПРОГРАММА: ВВОД И ВЫВОД ИМЕН

________________________________________________________________

EXE-программа, приведенная на рис. 8.2, запрашивает ввод имени, затем

отображает в середине экрана введенное имя и включает звуковой сигнал.

Программа продолжает запрашивать и отображать имена, пока пользователь не

нажмет Return в ответ на очередной запрос. Рассмотрим ситуацию, когда

пользователь ввел имя TED SMITH:

1. Разделим длину 09 на 2 получим 4, и

2. Вычтем это значение из 40, получим 36

Команда SHR в процедуре E10CENT сдвигает длину 09 на oдин бит вправо,

выполняя таким образом деление на 2. Значение бит 00001001 переходит в

00000100. Команда NEG меняет знак +4 На -4. Команда ADD прибавляет

значение 40, получая в регистре DL номер начального столбца - 36. При

установке курсора на строку 12 и столбец 36 имя будет выведено на экран в

следующем виде:

Строка 12: TED SMITH

| |

Столбец: 36 40

В процедуре E10CODE имеется команда, которая устанавливает cимвол

звукового сигнала (07) в области ввода непосредственно после имени:

MOV NAMEFLD[BX],07

Предшествующая команда устанавливает в регистре BX значение длины, и

команда MOV затем, комбинируя длину в регистре BX и адрес поля NAMEFLD,

пересылает код 07. Например, при длине имени 05 код 07 будет помещен по

адресу NAMEFLD+05 (замещая значение кода Return). Последняя команда в

процедуре E10CODE устанавливает ограничитель "$" после кода 07. Таким

образом, когда процедура F10CENT выводит на экран имя, то генериpуется

также звуковой сигнал.

__________

page 60,132

TITLE CTRNAME (EXE) Ввод имен и вывод в центр экрана

;--------------------------------------------------------

STSCKSG SEGMENT PARA STACK 'Stack'

DW 32 DUP(?)

STACKSG ENDS

;--------------------------------------------------------

DATASG SEGMENT PARA 'Data'

NAMEPAR LABEL BYTE ;Имя списка параметров:

MAXNLEN DB 20 ; макс. длина имени

NAMELEN DB ? ; число введенных символов

NAMEFLD DB 20 DUP(' '),'$' ;имя и ограничитель для вывода на экран

PRIMPT DB 'Name? ', '$'

DATASG ENDS

;--------------------------------------------------------

CODESG SEGMENT PARA 'Code"

BEGIN PROC FAR

ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASC

PUSH DS

SUB AX,AX

PUCH AX

MOV AX,DATASC

MOV DS,AX

MOV ES,AX

CALL Q10CLR ;Очистить экран

A20LOOP:

MOV DX,0000 ;Установить курсор в 00,00

CALL Q20CURS

CALL B10PRMP ;Выдать текст запроса

CALL D10INPT ;Ввести имя

CALL Q10CLR ;Очистить экран

CMP NAMELEN,00 ;Имя введено?

JE A30 ; нет - выйти

CALL E10CODE ;Установить звуковой сигнал

; и ограничитель '$'

CALL F10CENT ;Центрирование и вывод

JMP A20LOOP

A30:

RET ;Вернуться в DOS

BEGIN ENDP

; Вывод текста запроса:

; --------------------

B10PRMP PROC NEAR

MUV AN,09 ;Функция вывода на экран

LEA DX,PROMPT

INT 21H

RET

B10PRMP ENDP

; Ввод имени с клавиатуры:

; -----------------------

D10INPT PROC NEAR

MOV AN,0AN ;Функция ввода

LEA DX,NAMEPAR

INT 21H

RET

D10INPT ENDP

; Установка сигнала и ограничителя '$':

; ------------------------------------

E10CODE PROC NEAR

MOV BN,00 ;Замена символа Return (0D)

MOV BL,NAMELEN ; на зв. сигнал (07)

MOV NAMEFLD[BX],07

MOV NAMEFLD[BX+1],'$' ;Установить ограничитель

RET

E10CODE ENDP

; Центрирование и вывод имени на экран:

; ------------------------------------

F10CENT PROC NEAR

MOV DL,NAMELEN ;Определение столбца:

SHR DL,1 ; разделить длину на 2,

NEG DL ; поменять знак,

ADD DL,40 ; прибавить 40

MOV DH,12 ;Центральная строка

CALL Q20CURS ;Установить курсор

MOV AN,09

LEA DX,NAMEFLD ;Вывести имя на экран

INT 21H

RET

F10CENT ENDP

; Очистить экран:

; --------------

Q10CLR PROC NEAR

MOV AX,0600H ;Функция прокрутки экрана

MOV BH,30 ;Цвет (07 для ч/б)

MOV CX,0000 ;От 00,00

MOV DX,184FH ;До 24,79

INT 10H ;Вызов BIOS

RET

Q10CLR

; Установка курсора (строка/столбец):

; ----------------------------------

Q20CURS PROC NEAR ;DX уже установлен

MOV AH,02 ;Функция установки курсора

MOV BH,00 ;Страница #0

INT 10H ;Вызов BIOS

RET

Q20CURS ENDP

CODESG ENDS

END BEGIN

__________

Рис.8.2. Ввод и отображение имен.

Ввод единственного символа Return

-----------------------------------

При вводе имени, превышающего по длине максимальное значение,

указанное в списке параметров, возникает звуковой сигнал и система oжидает

ввода только символа Return. Если вообще не вводить имя, а только нажать

клавишу Return, то система примет ее и yстановит в списке параметров

нулевую длину следующим образом:

Список параметров (шест.): |14|00|0D|...

Для обозначения конца вводимых имен пользователь может просто нажать

Return в ответ на очередной запрос на ввод имени. Прогpамма определяет

конец ввода по нулевой длине.

Замена символа Return

-----------------------

Вводимые значения можно использовать для самых разных целей,

например: для печати сообщений, сохранения в таблице, записи на диск. При

этом, возможно, появится необходимость замены символа Return (шест.0D) в

области NAMEFLD на символ пробела (шест.20). Поле NAMELEN содержит

действительную длину или отноcительный адрес кода 0D. Если, например,

NAMELEN содержит длину 05, то адрес кода 0D равен NAMEFLD+5. Можно занести

эту длину в регистр BX для индексной адресации в поле NAMEFLD:

MOV BH,00 ;Установить в регистре BX

MOV BL,NAMELEN ; значение 0005

MOV NAMEFLD[BX],20H ;Заменить 0D на пробел

Третья команда MOV заносит символ пробела (шест.20) по адресу,

oпределенному первым операндом: адрес поля NAMEFLD плюс содержимое

регистра BX, т.е. NAMEFLD+5.

Очистка области ввода

-----------------------

Вводимые символы заменяют предыдущее содержимое области ввода и

остаются там, пока другие символы не заменят их. Рассмотрим следующие три

успешных ввода имен:

Ввод NAMEPAR (шест.)

1. BROWN |14|05|42|52|4F|57|4E|0D|20|20|20| ... |20|

2. HAMILTON |14|08|48|41|4D|49|4C|54|4F|4E|0D| ... |20|

3. ADAMS |14|05|41|44|41|4D|53|0D|4F|4E|0D| ... |20|

Имя HAMILTON заменяет более короткое имя BROWN. Но, так как имя ADAMS

короче имени HAMILTON, то оно заменяет только HAMIL. Код Return заменяет

символ 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 по метке В30, так как нельзя закодировать, например, следующую

команду:

MOV WORD PTR[NAMEFLD],2020H ;Неправильно

Очистка входной области решает проблему ввода коротких имен, за

которыми следуют предыдущие данные. Еще более эффективный cпособ

предполагает очистку только тех байт, которые расположены после введенного

имени.

ЭКРАННЫЕ И КЛАВИАТУРНЫЕ ОПЕРАЦИИ: РАСШИРЕННАЯ ВЕРСИЯ 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 устанавливается действительное число

байт, участвующих в операции. При неуспешной oперации устанавливается флаг

CF, а код ошибки (в данном случае 6) заносится в регистр AX. Поскольку

регистр AX может содержать как длину данных, так и код ошибки, то

единственный способ определить наличие ошибки - проверить флаг CF, хотя

ошибки чтения с клавиатуры и вывода на экран - явления крайне редкие.

Аналогичным oбразом используются файловые номера для дисковых файлов,

здесь oшибки ввода/вывода встречаются чаще.

Можно использовать эти функции для перенаправления ввода-вывода на

другие устройства, однако эта особенность здесь не рассматpивается.

ВЫВОД НА ЭКРАН: РАСШИРЕННАЯ ВЕРСИЯ DOS

________________________________________________________________

Следующие команды иллюстрируют операцию вывода на экран в расширенной

версии DOS:

DISAREA DB 20 DUP(' ') ;Область данных

...

MOV AH,40H ;Запрос на вывод

MOV BX,01 ;Выводное устройство

MOV CX,20 ;Максимальное число байт

LEA DX,DISAREA ;Адрес области данных

INT 21H ;Вызов DOS

Команда 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: Расширенные возможности

__________

Ц е л ь: Показать более развитые возможности управления экраном,

включая прокрутку, инвертирование, мигание, а также использование

скэн-кодов для ввода с клавиатуры.

ВВЕДЕНИЕ

________________________________________________________________

В гл.8 были показаны основные возможности системы для управления

выводом на экран и ввода с клавиатуры. В данной главе приводятся более

развитые возможности, обеспечивающие прокрутку данных на экране и

установку байта-атрибута для подчеркивания, мигания, выделения яркости.

Материал первого раздела этой главы (по прерыванию BIOS 10) подходит, как

для монохромных, так и для цветных дисплеев. Другие расширенные

возможности включают использование cкэн-кодов для определения нажатой

клавиши или комбинации клавишей на клавиатуре.

Монохромный дисплей

---------------------

Для работы монохромного дисплея имеется память объемом 4К,

начинающаяся по адресу шест. B0000 (дисплейный буфер). Эта память

обеспечивает:

- 2К для символов на экране(25 строк х 80 столбцов);

- 2К для байтов-атрибутов, обеспечивающих инвертирование,

мигание, выделение яркостью и подчеркивание.

Цветной/графический дисплей

-----------------------------

Для работы стандартного цветного графического дисплея имеется 16

Кбайт памяти (дисплейный буфер), начинающийся по адресу шест.B8000. Такой

дисплей может являться текстовым (для нормального ASCII-кода) или

графическим и работать как в цветном, так и в черно-белом (BW) режиме.

Дисплейный буфер обеспечивает экpанные страницы, пронумерованные от 0 до 3

для экрана на 80 cтолбцов и от 0 до 7 для экрана на 40 столбцов. Номер

страницы по умолчанию - 0. В следующей главе будет подробно рассмотрено

управление цветом и графикой.

БАЙТ АТРИБУТОВ

________________________________________________________________

Байт атрибутов, как для монохромного, так и для графического дисплея

в текстовом (не графическом) режиме определяет характеристики каждого

отображаемого символа. Байт-атрибут имеет следующие 8 бит:

Фон Текст

Атрибут: 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бразом:

Эффект выделения Фон Текст

RGB RGB

Неотображаемый (черный по черному) 000 000

Подчеркивание (не для цвета) 000 001

Нормальный (белый по черному) 000 111

Инвертированный (черный по белому) 111 000

Цветные мониторы не обеспечивают подчеркивания; вместо этого

установка бит подчеркивания выбирает синий цвет для текста и получается

отображение синим по черному. Ниже приведены некоторые атрибуты,

основанные на комбинации битов фона, текста, мигания и выделения яркостью:

Двоичный Шест. Эффект выделения

код код

0000 0000 00 Неотображаемый (для паролей)

0000 0111 07 Белый по черному (нормальный)

1000 0111 87 Белый по черному (мигание)

0000 1111 0F Белый по черному (яркий)

0111 0000 70 Черный по белому (инвертированый)

1111 0000 F0 Черный по белому (инверт. мигающий)

Эти атрибуты подходят для текстового режима, как для монохромных, так

и для цветных дисплеев. В следующей главе будет показано, как выбирать

конкретные цвета. Для генерации атрибута можно использовать команду INT

10H. При этом регистр BL должен содержать значение байта-атрибута, а

регистр AH один из следующих кодов: 06 (прокрутка вверх), 07 (прокрутка

вниз), 08 (ввод атрибута или символа), 09 (вывод атрибута или символа).

Если программа установила некотоpый атрибут, то он остается таким, пока

программа его не изменит. Если установить значение байта атрибута равным

шест.00, то символ вообще не будет отображен.

ПРЕРЫВАНИЕ BIOS INT 10H

________________________________________________________________

Прерывание INT 10H обеспечивает управление всем экраном. В регистре

AH устанавливается код, определяющий функцию прерывания. Команда cохраняет

содержимое регистров BX, CX, DX, SI и BP. Ниже описывается все возможные

функции.

AH=00: Установка режима. Данная функция позволяет переключать цветной

монитор в текстовый или графический режим. Установка pежима для

выполняемой в текущий момент программы осуществляется c помощью INT 10H.

При установке происходит очистка экрана. Содержимое регистра AL может быть

следующим:

00 40 х 25 черно-белый текстовый режим

01 40 х 25 стандартный i6-цветовой текстовый режим

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 16-цветовой графический режим (EGA)

0E 640 х 200 16-цветовой графический режим (EGA)

0F 640 х 350 черно-белый графический режим (EGA)

10 640 х 350 64-цветовой графический режим (EGA)

EGA (Enhanced Graphics Adapter) - обозначает усовершенствованный

графический адаптер. Следующий пример показывает установку стандартного

16-цветового текстового режима:

MOV AH,00 ;Функция установки режима

MOV AL,03 ;Стандартный цветной текст 80 х 25

INT 10H ;Вызвать BIOS

Для определения типа адаптера, установленного в системе, служит

прерывание BIOS INT 11H. Данная команда возвращает в регистре AX значение,

в котором биты 5 и 4 указывают на видеорежим:

01 40 х 25 черно-белый режим в цветном адаптере

10 80 х 25 черно-белый режим в цветном адаптере

11 80 х 25 черно-белый режим в черно-белом адаптере

Программа, работающая с неизвестным типом монитора, может провеpить

тип по регистру AX после INT 11H и затем установить необходимый режим.

AH=01: Установка размера курсора. Курсор не является символом из

набора ASCII-кодов. Компьютер имеет собственное аппаратное обеспечение для

управления видом курсора. Для этого имеется специальная обработка по INT

прерыванию. Обычно символ курсоpа похож на символ подчеркивания. Используя

INT 10H, можно управлять вертикальным размером курсора: биты 4-0 в

регистре CH для верхней линии сканирования, а биты 4-0 в регистре CL - для

нижней. Можно установить любой pазмер курсора по вертикали: от 0 до 13 для

монохромных и EGA монитоpов и от 0 до 7 для большинства цветных мониторов.

Приведем пример для увеличения размера курсора от его верхней до нижней

линии сканирования:

MOV AH,01 ;Установить размер курсора

MOV CH,00 ;Верхняя линия сканирования

MOV CL,13 ;Нижняя линия сканирования

INT 10H ;Вызвать BIOS

В результате выполнения этих команд курсор превратится в сплошной

мигающий прямоугольник. Можно установить любой размер курсора между

верхней и нижней границами, например, 04/08, 03/10 и т.д. Курсор сохраняет

свой вид, пока программа не изменит его. Использование размеров 12/13 (для

моно) и 6/7 (для цвета) переводит курсор в его нормальный вид.

AH=02: Установка позиции курсора. Эта функция устанавливает курcор в

любую позицию на экране в соответствии с координатами cтроки и столбца.

Номер страницы обычно равен 0, но может иметь значение от 0 до 3 при 80

столбцах на экране. Для установки позиции курсора необходимо занести в

регистр AH значение 02, в регистр BH номер страницы и в регистр DX

координаты строки и столбца:

MOV AH,02 ;Установить положение курсора

MOV BH,00 ;Страница 0

MOV DH,строка ;Строка

MOV DL,столбец ;Столбец

INT 10H ;Вызвать BIOS

AH=03: Чтение текущего положения курсора. Программа может определить

положение курсора на экране (строку и столбец), а также pазмер курсора,

следующим образом:

MOV AH,03 ;Определить положение курсора

MOV BH,00 ;Установить страницу 0

INT 10H ;Вызвать BIOS

После возврата регистр DH будет содержать номер строки, а регистр DL

- номер столбца. В регистре CH будет верхняя линия cканирования, а в

регистре CL - нижняя.

AH=04: Чтение положения светового пера. Данная функция используeтся в

графическом режиме для определения положения светового пеpа.

AH=05: Выбор активной страницы. Новая страница устанавливается для

цветных текстовых режимов от 0 до 3. Для режима 40 х 25 возможно

устанавливать до 8 страниц (от 0 до 7), а для режима 80 х 25 - до 4

страниц (от 0 до 3).

MOV AH,05 ;Установить активную страницу

MOV AL,страница ;Номер страницы

INT 10H ;Вызвать BIOS

AH=06: Прокрутка экрана вверх. Когда программа пытается выдать текст

на строку ниже последней на экране, то происходит переход на верхнюю

строку. Даже если с помощью прерывания будет специфициpован нулевой

столбец, все равно предполагается новая строка, и нижние строки на экране

будут испорчены. Для решения этой проблемы используется прокрутка экрана.

Ранее код 06 использовался для очистки экрана. В текстовом режиме

установка в регистре AL значения 00 приводит к полной прокрутке вверх

всего экрана, очищая его пробелами. Установка ненулевого значения в

регистре AL определяет количество строк прокрутки экрана вверх. Верхние

строки уходят с экрана, а чистые строки вводятся снизу. Следующие команды

выполняют прокрутку всего экрана на одну строку:

MOV AX,0601H ;Прокрутить на одну строку вверх

MOV BH,07 ;Атрибут: нормальный, черно-белый

MOV CX,0000 ;Координаты от 00,00

MOV DX,184FH ; до 24,79 (полный экран)

INT 10H ;Вызвать BIOS

Для прокрутки любого количества строк необходимо установить

соответствующее значение в регистре AL. Регистр BH содержит атрибут для

нормального или инвертированного отображения, мигания, установки цвета и

т.д. Значения в регистрах CX и DX позволяют прокручивать любую часть

экрана. Ниже объясняется стандартный подход к прокрутке:

1. Определить в элементе ROW (строка) значение 0 для установки

строки положения курсора.

2. Выдать текст и продвинуть курсор на следующую строку.

3. Проверить, находится ли курсор на последней строке (CMP

ROW,22).

4. Если да, то увеличить элемент ROW (INC ROW) и выйти.

5. Если нет, то прокрутить экран на одну строку и, используя ROW

переустановить курсор.

AH=07: Прокрутка экрана вниз. Для текстового режима прокрутка экрана

вниз обозначает удаление нижних строк и вставка чистых строк сверху.

Регистр AH должен содержать 07, значения остальных регистpов аналогичны

функции 06 для прокрутки вверх.

AH=08: Чтение атрибута/символа в текущей позиции курсора. Для чтения

символа и байта атрибута из дисплейного буфера, как в текстовом, так и в

графическом режиме используются следующие команды:

MOV AH,08 ;Запрос на чтение атр./симв.

MOV BH,00 ;Страница 0 (для текстового реж.)

INT 10H ;Вызвать BIOS

Данная функция возвращает в регистре AL значение символа, а в AH - его

атрибут. В графическом режиме функция возвращает шест.00 для не

ASCII-кодов. Так как эта функция читает только один cимвол, то для

символьной строки необходима организация цикла.

AH=09: Вывод атрибута/символа в текущую позицию курсора. Для вывода

на экран символов в текстовом или графическом режиме с установкой мигания,

инвертирования и т.д. можно воспользоваться следующими командами:

MOV AH,09 ;Функция вывода

MOV AL,символ ;Выводимый символ

MOV BH,страница ;Номер страницы (текст.реж.)

MOV BL,атрибут ;Атрибут или цвет

MOV CX,повторение ;Число повторений символа

INT 10H ;Вызвать BIOS

В регистр AL должен быть помещен выводимый на экран символ. Значение в

регистре CX определяет число повторений символа на экране. Вывод на экран

последовательности различных символов требует организации цикла. Данная

функция не перемещает курсор. В следующем примере на экран выводится пять

мигающих "сердечек" в инвертированном виде:

MOV AH,09 ;Функция вывода

MOV AL,03H ;Черви (карточная масть)

MOV BH,00 ;Страница 0 (текст. режим)

MOV BL,0F0H ;Мигание, инверсия

MOV CX,05 ;Пять раз

INT 10H ;Вызвать BIOS

В текстовом (но не в графическом) режиме символы автоматически

выводятся на экран и переходят с одной строки на другую. Для вывода на

экран текста запроса или сообщения необходимо составить программу, которая

устанавливает в регистре CX значение 01 и в цикле загружает в регистр AL

из памяти выводимые символы текста. Так как регистр CX в данном случае

занят, то нельзя использовать команду LOOP. Кроме того, при выводе каждого

символа необходимо дополнительно продвигать курсор в следующий столбец

(функция 02).

В графическом режиме регистр BL используется для определения цвета

графики. Если бит 7 равен 0, то заданный цвет заменяет текущий цвет точки,

если бит 7 равен 1, то происходит комбинация цветов с помощью команды XOR.

AH=0A: Вывод символа в текущую позицию курсора. Единственная разница

между функциями 0A и 09 состоит в том, что функция 0A не устанавливает

атрибут:

MOV AH,0AH ;Функция вывода

MOV AL,символ ;Выводимый символ

MOV BH,страница ;Номер страницы (для текста)

MOV CX,повторение ;Число повторений символа

INT 10H ;Вызвать BIOS

Для большинства применений команда прерывания DOS INT 21H более

удобна.

AH=0E: Вывод в режиме телетайпа. Данная функция позволяет

использовать монитор, как простой терминал. Для выполнения этой функции

необходимо установить в регистре AH шест. значение 0E, в pегистр AL

поместить выводимый символ, цвет текста (в графическом режиме) занести в

регистр BL и номер страницы для текстового режима - в регистр BH. Звуковой

сигнал (код 07H), возврат на одну позицию (08H), конец строки (0AH) и

возврат каретки (0DH) действуют, как команды для форматизации экрана.

Данная функция автоматически продвигает курсор, переводит символы на

следующую cтроку, выполняет прокрутку экрана и сохраняет текущие атрибуты

экрана.

AH=0F: Получение текущего видео режима. Данная функция возвращает в

регистре AL текущий видео режим (см.функцию AH=00), в pегистре AH - число

символов в строке (20, 40 или 80), в регистре BH - номер страницы.

AH=13: Вывод символьной строки (только для AT). Данная функция

позволяет на компьютерах типа AT выводить на экран символьные строки с

установкой атрибутов и перемещением курсора:

MOV AH,13H ;Функция вывода на экран

MOV AL,сервис ;0, 1, 2 или 3

MOV BH,страница ;

LEA BP,адрес ;Адрес строки в ES:BP

MOV CX,длина ;Длина строки

MOV DX,экран ;Координаты на экране

INT 10H ;Вызвать BIOS

Возможен следующий дополнительный сервис:

0 - использовать атрибут и не перемещать курсор;

1 - использовать атрибут и переместить курсор;

2 - вывести символ, затем атрибут и не перемещать курсор;

3 - вывести символ, затем атрибут и переместить курсор.

ПРОГРАММА: МИГАНИЕ, ИНВЕРСИЯ И ПРОКРУТКА

________________________________________________________________

Программа, приведенная на рис. 9.1, принимает ввод имен с клавиатуры

и выводит их на экран. Запрос выдается в инвертированном отображении,

имена принимаются в нормальном отображении, а вывод имен осуществляется с

40 столбца в той же строке с миганием и инвертированием:

Name? Francis Bacon Francis Bacon [мигание]

| |

Столбец 0 Столбец 40

Для управления положением курсора в программе определены переменные

ROW (вертикальное перемещение вниз) и COL (горизонтальное перемещение

вправо). Команда INT 10H не перемещает курсор автоматически. Программа

выводит имена сверху вниз, пока не достигнет 20-й строки. После этого

выполняется прокрутка экрана вверх на одну строку для каждого нового

запроса.

__________

page 60,132

TITLE NMSCROLL (EXE) Инвертирование, мигание, прокрутка

; -------------------------------------------------------

STACKSG SEGMENT PARA STACK 'Stack'

DW 32 DUP(?)

STACKSG SEGMENT PARA STACK 'Stack'

DW 32 DUP(?)

STACKG ENDS

; -------------------------------------------------------

DATASG SEGMENT PARA 'Data'

NAMEPAR LABEL BYTE ;Имя списка параметров:

MAXNLEN DB 20 ; макс. длина имени

ACTNLEN DB ? ; число введенных символов

NAMEFLD DB 20 DUP(' ') ; имя

COL DB 00

COUNT DB ?

PROMPT DB 'Name? '

ROW DB 00

DATASG ENDS

; -------------------------------------------------------

CODESG SEGMENT PARA 'Code'

BEGIN PROC FAR

ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG

PUSH DS

SUB AX,AX

PUSH DS

MOV AX,DATASG

MOV ES,AX

MOV AX,0600H

CALL Q10CLR ;Очистить экран

A20LOOP:

MOV COL,00 ;Установить столбец 0

CALL Q20CURS

CALL B10PRMP ;Выдать текст запроса

CALL D10INPT ;Ввести имя с клавиатуры

CMP ACTNLEN,00 ;Нет имени? (т.е. конец)

JNE A30

MOV AX,0600H

CALL Q10CLR ;Если да, то очистить экран,

RET ; и завершить программу

A30:

CALL E10NAME ;Вывести имя на экран

JMP A20LOOP

BEGIN ENDP

; Вывод текста запроса:

; --------------------

B10PRMP PROC NEAR

LEA SI,PROMPT ;Адрес текста

MOV COUNT,05

B20:

MOV BL,70H ;Видеоинверсия

CALL F10DISP ;Подпрограмма вывода

INC SI ;Следующий символ в имени

INC COL ;Следующий столбец

CALL Q20CURS

DEC COUNT ;Уменьшение счетчика

JNZ B20 ;Повторить n раз

RET

B10PRMP ENDP

; вод имени с клавиатуры:

; ----------------------

D10INPT PROC NEAR

MOV AN,0AH

LEA DX,NAMEPAR

INT 21H

RET

D10INPT ENDP

; Вывод имени с миганием и инверсией:

; ----------------------------------

E10NAME PROC NEAR

LEA SI,NAMEFLD ;Адрес имени

MOV COL,40 ;Установить столбец

E20:

CALL Q20CURS ;Установить курсор

MOV BL,0FOH ;Мигание и инверсия

CALL F10DISP ;Подпрограмма вывода

INS SI ;Следующий символ в имени

INS COL ;Следующий столбец на экране

DES ACTNLEN ;Уменьшить счетчик длины

JNZ E20 ;Циклить n раз

CMP ROW,20 ;Последняя строка экрана?

JAE E30 ; нет

INC ROW

RET

E30: MOV AX,0601H ; да --

CALL Q10CLR ; очистить экран

RET

E10NAME ENDP

; Вывод символа на экран:

; ----------------------

F10DISP PROC NEAR ;BL (атрибут) уже установлен

MOV AN,09 ;Функция вывода на экран

MOV AL,[SI] ;Получить символ из имени

MOV BH,00 ;Номер страницы

MOV CX,01 ;Один символ

INT 10H ;Вызов BIOS

RET

F10DISP ENDP

; Очистка экрана:

; --------------

Q10CLR PROC NEAR ;AX установлен при вызове

MOV BH,07 ;Нормальный ч/б

MOV CX 0000

MOV DX,184FH

INT 10H ;Вызов BIOS

RET

Q10CLR ENDP

; Установить курсор (строка/столбец):

; ----------------------------------

Q20CURS PROC NEAR

MOV AN,02

MOV BH,00

MOV DH,ROW

MOV DL,COL

INT 10H

RET

Q20CURS ENDP

CODESG ENDS

END BEGIN

__________

Рис.9.1. Мигание, инвертирование и прокрутка.

Для ввода имен в процедуре D10INPT используется команда DOS INT 21H.

Для замены на BIOS INT 10H необходимо:

1. Инициализировать счетчик для адреса области ввода и счетчик

для длины имени.

2. Выполнить INT 10H (функция 08) с 08 в регистре AH и 00 в BH.

Функция возвращает каждый символ в регистре AL.

3. Если регистр AL не содержит символа RETURN и счетчик длины

достиг максимального значения, выдать звуковой сигнал и выйти из

процедуры.

4. Переслать содержимое AL в область ввода имени.

5. Если регистр AL содержит символ RETURN, выйти из процедуры.

6. Увеличить счетчик длины и адрес области ввода имени.

Наши рекомендации