Сист. прогр. Ч1 (Методические указания к выполнению лабораторных работ по СПО), страница 14
Описание файла
Файл "Сист. прогр. Ч1" внутри архива находится в следующих папках: Методические указания к выполнению лабораторных работ по СПО, сист прогр лабы. Документ из архива "Методические указания к выполнению лабораторных работ по СПО", который расположен в категории "". Всё это находится в предмете "операционные системы" из 7 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "операционные системы" в общих файлах.
Онлайн просмотр документа "Сист. прогр. Ч1"
Текст 14 страницы из документа "Сист. прогр. Ч1"
MOV AX,0601H ;Прокрутить на одну строку вверх
MOV BH,07 ;Атрибут: нормальный, черно-белый
MOV СХ,0000 ;Координаты от 00,00
MOV DX,184FH ;до 24,79 (весь экран)
INT 10Н ; Вы звать BIOS
Для прокрутки любого количества строк необходимо
установить соответствующее значение в регистре AL. Регистр ВН содержит атрибут для нормального или инвертированного отображения, мигания, установки цвета и т.д. Значения в регистрах СХ и DX позволяют прокручивать любую часть экрана. Ниже объясняется стандартный подход к прокрутке.
1. Определить в элементе ROW (строка) значение 0 для установки строки положения курсора.
2. Выдать текст и продвинуть курсор на следующую строку.
3. Проверить, находится ли курсор на последней строке (СМР ROW,22).
4. Если да, то увеличить элемент ROW (INC ROW) и выйти.
5. Если нет, то прокрутить экран на одну строку и, используя ROW, переустановить курсор.
АН = 07: Прокрутка экрана вниз. Для текстового режима прокрутка экрана вниз обозначает удаление нижних строк и вставку чистых строк сверху. Регистр АН должен содержать 07, значения остальных регистров аналогичны функции 06 для прокрутки вверх.
АН = 08: Чтение атрибута/символа в текущей позиции курсора.
Для чтения символа и байта-атрибута из дисплейного буфера как в текстовом, так и в графическом режиме используются следующие команды:
MOV АН,08 ;3апрос на чтение атрибута/символа
MOV BH,00 ;Страница 0 (для текстового режима)
IHT 10Н ;Вызвать BIOS
Данная функция возвращает в регистре AL значение символа, а в АН его атрибут. В графическом режиме функция возвращает 00 для не ASCII-кодов. Так как эта функция читает только один символ, то для символьной строки необходима организация цикла.
АН = 09: Вывод атрибута/символа в текущую позицию курсора.
Для вывода на экран символов в текстовом или графическом режиме с установкой мигания, инвертирования и т.д. можно воспользоваться следующими командами:
MOV АН,09 ;Функция вывода
MOV AL,символ ;Выводимый символ
MOV BH,страница ;Номер страницы (текстовой режим)
MOV BL,атрибут ;Атрибут или цвет
MOV CX,повторение ;Число повторений
INT 10Н ; Вызвать BIOS
В регистр AL должен быть помещен выводимый на экран символ. Значение в регистре СХ определяет число повторений символа на экране. Вывод на экран последовательности различных символов требует организации цикла. Данная функция не перемещает курсор. В следующем примере на экран выводится пять мигающих "сердечек" в инвертированном виде:
MOV АН,09 ;функция вывода
MOV AL,03H ;Черви (карточная масть)
MOV ВН,00 ;Страница 0 (текстовой режим)
MOV BL,0F0 ;Мигание, инверсия
MOV CX,05 ;Пять раз
INT 10H ;Вызвать BIOS
В текстовом (но не в графическом) режиме символы автоматически выводятся на экран и переходят с одной строки на другую. Для вывода на экран текста запроса или сообщения необходимо составить программу, которая устанавливает в регистре СХ значение 01 и в цикле загружает в регистр AL из памяти выводимые символы текста. Так как регистр СХ в данном случае занят, то нельзя использовать команду LOOP. Кроме того, при выводе каждого символа необходимо дополнительно продвигать курсор в следующий столбец (функция 02).
В графическом режиме регистр BL используется для определения цвета графики. Если бит 7 равен 0, то заданный цвет заменяет текущий цвет, если бит 7 равен 1, то происходит комбинация цветов с помощью команды XOR.
АН = 0А: Вывод символа в текущую позицию курсора.
Единственная разница между функциями 0А и 09 состоит в том, что функция 0А не устанавливает атрибут:
MOV AH.,0AH ;Функция вывода
MOV AL, символ ; Выводимый символ
MOV BH, страница ;Номер страницы (для текста)
MOV СХ, повторение ;Число повторений
INT 10Н ;Вызвать BIOS
Для большинства применений команда прерывания DOS INT
21Н более удобна.
АН = 0Е: Вывод в режиме телетайпа. Данная функция позволяет использовать монитор как простой терминал. Для выполнения этой функции необходимо установить в регистре АН шестнадцатеричное значение 0Е, в регистр AL поместить выводимый символ, цвет текста (в графическом режиме) занести в регистр BL и номер страницы для текстового режима - в регистр ВН, Звуковой сигнал (код 07Н), возврат на одну позицию (08Н), перевод строки (0АН) и возврат каретки (0DН) действуют, как команды для форматизации экрана. Данная функция автоматически продвигает курсор, переводит символы на следующую строку, выполняет прокрутку экрана и сохраняет текущие атрибуты экрана.
АН = 0F: Получение текущего видеорежима. Данная функция возвращает в регистре AL текущий видеорежим (см.функцию АН = 00), в регистре АН - число символов в строке (20, 40 или 80), в регистре ВН - номер страницы.
АН = 13: Вывод символьной строки (только для AT). Данная функция позволяет на компьютерах типа AT выводить на экран символьные строки с установкой атрибутов и перемещением курсора;
MOV АН,13Н ;4>-ция вывода на экран
MOV AL,сервис ;0, 1, 2 или 3
MOV ВН,страница ;
LEA BP,адрес ;Адрес строки в ES:BP
MOV CX,длина ;Длина строки
MOV DX,экран ;Координаты на экране
INT 10Н ;Вызвать BIOS
Значения в регистре AL указывают:
0 - использовать атрибут и не перемещать курсор;
1 - использовать атрибут и переместить курсор;
2 - вывести символ, затем атрибут и не перемещать
курсор;
3 - вывести символ, затем атрибут и переместить курсор.
ПРОГРАММА: МИГАНИЕ, ИНВЕРСИЯ, ПРОКРУТКА
Программа, приведенная на рис.8.3, принимает ввод имен с клавиатуры и выводит их на экран. Запрос выдается в инвертированном отображении, имена принимаются в нормальном отображении, а вывод имен осуществляется с 40-го столбца в той же строке с миганием и инвертированием:
Name? Francis Francis [мигание]
Столбец 0 Столбец 40
page 60,132
TITLE NMSCROLL (EXE) Инверсия,мигание,прокрутка
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG 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 АХ, 060Н
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
; Ввод имени с клавиатуры:
D1OINPT PROC NEAR
MOV AH,0AH
LEA DX, NAMEPAR
INT 21H
RET
D1OINPT ENDP
;Вывод с миганием и инверсией:
E10NAME PROC NEAR
LEA SI, NAMEFLD ;Адрес имени
MOV COL ,40 ;Установить столбец
E20:
CALL Q20CURS ;Установить курсор
MOV BL, OFOH ;Мигание и инверсия
CALL F10DISP ; Подпрограмма вывода
INC SI ; Следующий символ
INC COL ; Следующий столбец
DEC ACTNLEN ;Уменьшить счетчик
JNZ E20 ;Циклить n раз
CMP ROW, 20 ;Последняя строка
JAE E30 ; нет
INC ROW
RET
E30: MOV AX, 0601H ; да --
CALL Q1OCLR ; очистить экран
RET
E10NAME ENDP
;Вывод символа на экран:
F10DISP PROC NEAR ;Атрибут установлен
MOV АН., 09 ;Ф-ция вывода на экран
MOV AL, [SI] ;Получить символ
MOV BH, 00 ; Номер страницы
MOV CX , 01 ;0дин символ
INT 10H ; Вызов BIOS
RET
F10DISP ENDP
;Очистка экрана:
Q1OCLR PROC NEAR ;АХ установлен
MOV BH, 07 ;Нормальный ч/б
MOV CX, 0000
MOV DX, 184FH
IHT 10Н ; Вызов BIOS
RET
Q10CLR ENDP
; Установить курсор:
Q2QCURS PROC NEAR
MOV AH, 02
MOV BH, 00
MOV DH., ROW
MOV DL, COL
IHT 10H
RET
Q2OCURS ENDP
CODESG ENDS
END BEGIN
Рис.8.3. Мигание, инвертирование и прокрутка
Для управления положением курсора в программе определены переменные ROW (вертикальное перемещение вниз) и COL (горизонтальное перемещение вправо). Команда INT 10Н не перемещает курсор автоматически. Программа выводит имена сверху вниз, пока не достигнет 20-й строки. После этого выполняется прокрутка экрана вверх на одну строку для каждого нового запроса.
Для ввода имен в процедуре D10INPT используется команда DOS INT 21H. Для замены на BIOS INT 10Н необходимо:
1. Инициализировать счетчик для адреса области ввода и счетчик для длины имени.
2. Выполнить INT 10Н (функция 08) с значениями 08 в регистре АН и 00 в ВН. Функция возвращает каждый символ в регистре AL.
3. Если регистр AL не содержит символа RETURN и счетчик длины достиг максимального значения, выдать звуковой сигнал и выйти из процедуры.
4. Переслать содержимое AL в область ввода имени.
5. Если регистр AL содержит символ RETURN, выйти из процедуры.
6. Увеличить счетчик длины и адрес области ввода имени.
7. Переместить курсор на один столбец.
8. Перейти на п. 2.
При выходе из процедуры область ввода содержит имя и символ RETURN, а счетчик - число введенных символов.
РАСШИРЕННЫЙ ASCII-КОД
ASCII-коды от 128 до 255 (шестнадцатеричные 80-FF) представляют собой ряд специальных символов, полезных при формировании запросов, меню, специальных значков с экранными атрибутами. Например, используя следующие символы, можно нарисовать прямоугольник:
Шестнадцатеричный код Символ
DА Верхний левый угол
BF Верхний правый угол
С0 Нижний левый угол
D9 Нижний правый угол
C4 Горизонтальная линия
ВЗ Вертикальная линия
Следующие команды с помощью INT 10Н выводят горизонтальную линию на 25 позиций в длину:
MОV АН,09 ;Функция вывода на экран
MOV AL, 0C4H ;Горизонтальная линия
MOV ВН, 00 ;Страница О
MOV BL, 0FH ;Выделение яркостью
MOV CX, 25 ;25 повторений
INT 10H ;Вызвать BIOS
Напомним, что курсор в приведенном примере не перемещается. Вывод вертикальной линии должен включать цикл, в котором курсор перемещается вниз на одну строку и выводится символ ВЗН. Для штриховки могут быть полезны символы с точками внутри:
Шестнадцатеричный код Символ
B0 Одна четверть точек
(светлая штриховка)
B1 Половина точек (средняя штриховка)
B2 Три четверти точек (темная штриховка)
Можно извлечь много полезных идей, изучая программное обеспечение с профессионально организованным выводом, или самому изобрести оригинальные идеи для отображения информации.
ДРУГИЕ ОПЕРАЦИИ ВВОДА-ВЫВОДА В DOS
Ниже перечислены другие функции DOS, которые могут оказаться полезными в работе. Код функции устанавливается в регистре АН и затем выдается команда INT 21Н.
АН = 01: Ввод с клавиатуры с эхоотображением. Данная функция возвращает значение в регистре AL. Если содержимое AL не равно нулю, то оно представляет собой стандартный ASCII-символ, например букву или цифру. Нулевое значение в регистре AL свидетельствует о том, что на клавиатуре была нажата специальная функциональная клавиша, например Номе, F1 или PgUp. Для определения скэн-кода клавиш необходимо повторить вызов функции (см. "Функциональные клавиши" в последующих разделах). Данная функция реагирует на запрос Ctrl/Break.
АН = 02: Вывод символа. Для вывода символа на экран в текущую позицию курсора необходимо поместить код данного символа в регистр DL, Коды табуляции, возврата каретки и перевода строки действуют обычным образом.
АН = 07: Прямой ввод с клавиатуры без эхоотображения.
Данная функция работает аналогично функции 01 с двумя отличиями: введенный символ не отображается на экране, т.е. нет эха, и отсутствует реакция на запрос Ctrl/Break.
АН = 08: Ввод с клавиатуры без эхоотображения. Данная функция действует аналогично функции 01 с одним отличием: введенный символ не отображается на экране, т.е. нет эха.
АН = 0В: Проверка состояния клавиатуры. Данная функция возвращает шестнадцатеричное значение FF в регистре AL, если ввод с клавиатуры возможен, в противном случае - 00. Это средство связано с функциями 01, 07 и 08, которые не ожидают ввода с клавиатуры.
ВВОД С КЛАВИАТУРЫ ПО КОМАНДЕ BIOS INT 16H
Команда BIOS INT 16H выполняет специальную операцию, которая
в соответствии с кодом в регистре АЙ обеспечивает следующие
три функции ввода с клавиатуры.
АН = 00: Чтение символа. Данная функция помещает в регистр
AL очередной ASCII-символ, введенный с клавиатуры, и
устанавливает скэн-код в регистре АН. (Скэн-коды объясняются в
следующем разделе). Если на клавиатуре нажата одна из
специальных клавиш, например Номе или F1, то в регистр AL
заносится 00. Автоматическое эхо символа на экран по этой
функции не происходит.
АН = 01: Определение наличия введенного символа. Данная функция сбрасывает флаг нуля (ZF = 0), если имеется символ для чтения с клавиатуры; очередной символ и скэн-код будут помещены в регистры AL и АН соответственно и данный элемент останется в буфере.
АН = 02: Определение текущего состояния клавиатуры. Данная функция возвращает в регистре AL состояние клавиатуры из адреса памяти 417Н:
Бит