ГУАП
КАФЕДРА № 44
ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
ассистент |
А.Б. Бубликов |
|||
должность, уч. степень, звание |
подпись, дата |
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №2 |
Работа с адаптером дисплея в текстовом режиме |
по курсу: ИНТЕРФЕЙСЫ ПЕРИФЕРИЙНЫХ УСТРОЙСТВ |
РАБОТУ ВЫПОЛНИЛ(А)
СТУДЕНТ(КА) ГР. |
В8441 |
Тарасов Р.С. |
|||
подпись, дата |
инициалы, фамилия |
Санкт-Петербург 2011
Вариант 1. Написать программу, которая получает с клавиатуры код цвета и сторону квадрата и отображает в центре экрана квадрат с заданной длиной стороны и заданного цвета
Ниже перечислены использованные функции INT 10H стандартного видеосервиса ROM-BIOS:
AH сервис
--- ----------------------------------------------------------------------------
00H уст. видео режим. Очистить экран, установить поля BIOS, установить режим.
вход: AL=режим
AL Тип формат цвета адаптер адрес монитор
=== ======= ======= ============= ======= ==== =================
3 текст 80x25 16/8 CGA,EGA b800 Comp,RGB,Enhanced
--- ----------------------------------------------------------------------------
01H уст. размер/форму курсора (текст). курсор, если он видим, всегда мерцает.
вход: CH = начальная строка (0-1fH; 20H=подавить курсор)
CL = конечная строка (0-1fH)
--- ----------------------------------------------------------------------------
02H уст. позицию курсора. установка на строку 25 делает курсор невидимым.
вход: BH = видео страница
DH,DL = строка, колонка (считая от 0)
--- ----------------------------------------------------------------------------
09H писать символ/атрибут в текущей позиции курсора
вход: BH = номер видео страницы
AL = записываемый символ
CX = счетчик (сколько экземпляров символа записать)
BL = видео атрибут (текст) или цвет (графика)
(графические режимы: +80H означает XOR с символом на экране)
--- ----------------------------------------------------------------------------
Текст программы:
.MODEL SMALL
.STACK 100h
.DATA
Message1 DB 'Введите сторону квадрата в знакоместах: ','$'
Message2 DB 'Возможные цвета ',13,10
DB 9,'1 - синий',13,10
DB 9,'2 - зеленый',13,10
DB 9,'3 - голубой',13,10
DB 9,'4 - красный',13,10
DB 9,'5 - пурпурный',13,10
DB 9,'6 - коричневый',13,10
DB 9,'7 - серый',13,10
Message3 DB 'Введите цвет квадрата: ','$'
buff DB 6,7 dup (?)
sqsize DW ?
color DW ?
.CODE
main:
; подготовительные действия
mov ax,@Data ; устанавливаем регистры DS и ES
mov ds,ax ; таким образом, чтобы они указывали
mov es,ax ; на сегмент данных
; вводим значение стороны квадрата
sqs: mov ah,09h
lea dx,Message1
int 21h ; выводим приглашение на ввод размера
mov ah,0ah
mov dx,offset buff ; адрес буфера
int 21h ; принимаем строку
mov dl,0ah
mov ah,02
int 21h ; выводим перевод строки
mov si,offset buff+2 ; готовим параметр для процедуры интерпретации
call InInt ; переводим введенную строку в число
cmp ax,26 ; сторона д.б.не больше количества строк
jnl sqs
cmp ax,0 ; сторона д.б.не меньше нуля
jle sqs
mov sqsize,ax
; вводим значение цвета
sqc: mov ah,09h
lea dx,Message2
int 21h ; выводим приглашение на ввод цвета
mov ah,0ah
mov dx,offset buff ; адрес буфера
int 21h ; принимаем строку
mov dl,0ah
mov ah,02
int 21h ; выводим перевод строки
mov si,offset buff+2 ; готовим параметр для процедуры интерпретации
call InInt ; переводим введенную строку в число
cmp ax,8 ; цвет не больше 7
jnl sqc
cmp ax,0 ; цвет не меньше 0
jle sqc
shl ax,4 ; сдвигаем, т.к.это цвет фона
mov color,ax
mov ax,3 ; включаем текстовый видеорежим 25х80
int 10h ; с очисткой экрана
mov ah,1 ; выключаем текстовый курсор
mov ch,20h
int 10h
; отрисовываем квадрат
mov ax,25 ; вычисляем смещение левого верхнего угла
sub ax,sqsize
shr al,1
mov dh,al
mov cx,sqsize ; чтобы было больше похоже на квадрат,
shl cx,1 ; удваиваем количество знаков по горизонтали
mov ax,80
sub ax,cx
shr al,1
mov dl,al
mov si,sqsize ; инициализируем счетчик цикла
paint:
mov ah,2 ; выставляем курсор
xor bh,bh
int 10h
mov ah,9
mov al,20h ; грузим пробел
mov bx,color ; введенным цветом
mov cx,sqsize ; количество выводимых - сторона квадрата
shl cx,1 ; (удвоенная для большей пропорциональности)
int 10h
inc dh ; на строку ниже
dec si ; уменьшаем счетчик цикла
jnz paint
xor ah,ah ; ожидаем нажатия какой-нибудь клавиши
int 16h
; завершение работы программы
mov ax,4c00h
int 21h ; завершаем работу программы
;-------------------------------------------------------------------------
InInt proc near ; процедура интерпретации знаковых целых чисел
; параметры: si - смещение буфера
; результат возвращается в регистре ax
;-------------------------------------------------------------------------
push cx
push dx
push bx
push si
push di
; обрабатываем содержимое буфера
cmp byte ptr [si],"-" ; если первый символ минус
jnz ii1
mov di,1 ; устанавливаем флаг
inc si ; и пропускаем его
ii1:
xor ax,ax
mov bx,10 ; основание системы счичления
ii2:
mov cl,[si] ; берем символ из буфера
cmp cl,0dh ; это замыкающий 0?
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.