Вопрос 76. принципы организации вывода информации на экран ibm pc.

Практически любая программа, выполняемая на персональном компьютере фирмы IBM выводит информацию на экран видеодисплея. Существует два принципиально различных вида информации, представляемой на экране дисплея IBM/PC: текст (т.е. литеры алфавита и другие символы) и графика. Соответственно существует два режима вывода информации на дисплей : текстовый режим и графический. В текстовом режиме на экран выводятся только символы, хотя многие из этих символов можно использовать для построения простых линейных конструкций (т.н. псевдографика).

Графический режим используется главным образом для представления сложных изображений (схем, графиков, диаграмм, рисунков и т.п.), хотя и допускает возможность представления символов различного размера и формы.

Для организации текстового режима фирма IBM выбрала подход связанный с регенерацией изображения на основе образа экрана хранящегося в памяти. В этом случае компьютер и дисплей совместно используют некоторое пространство общей памяти. Электронные схемы дисплея постоянно производят опрос (считывание) памяти и сразу же отображают результаты на экране. При таком подходе компьютерная программа может осуществлять вывод информации на экран путем простого изменения содержимого памяти. Аналогично, считывание информации с экрана дисплея может осуществляться путем обычного считывания содержимого общей памяти. Таким образом, экран дисплея представляется фактически областью памяти и выборка/занесение информации из(в) память означает считывание или запись информации с(на) экран дисплея. При таком подходе возникает проблема конкуренции между процессором и видеоадаптером при обращении к оперативной памяти (т.к. видеоадаптер должен считывать всю карту экрана 60-70 раз в секунду). Фирма IBM решила эту проблему путем выделения дисплею своей собственной памяти и организовав доступ к этой памяти через два порта ввода-вывода. Такой подход обеспечивает возможность быстрого доступа к общему полю памяти и со стороны процессора и со стороны дисплея. В текстовом режиме экран разбивается на символьную сетку (обычно 25х80) в каждой ячейке которой может находится один символ. Образ дисплея в памяти представляет собой массив пар символ-цвет (где цвет определяет как цвет символа так и цвет

фона ячейки). Ниже приведена программа использующая для вывода строки на экран метод изменения

образа экрана в памяти (он находится по адресу B800h)

.model small

.data

somestr db 'Some string',0

.code

.startup

mov ax,0b800h

mov es,ax

mov di,80*2*10+30*2

mov si,0

met: mov al,somestr[si]

cmp al,0

jz progend

mov ah,7 ;атрибуты - текст серый, фон - чёрный

mov word ptr es:[di],ax

inc si

inc di

inc di

jmp met

progend:

mov ah,08h;ожидание нажатия клавиши

int 21h

.exit 0

end

При формировании изображения в графическом режиме используется принцип пиксельной (растровой) графики. Экран дисплея здесь разделяется на прямоугольную сетку, состоящую из множества мельчайших элементов изображения, называемых также пикселями или пэлами. Каждый пиксель обладает свойством светимости. Таким образом изображение синтезируется из множества отдельных точек. Размеры пикселей и расстояния между ними тщательно рассчитываются таким образом, чтобы промежутки между ними отсутствовали. Если группа смежных пикселей находится в возбужденном состоянии (т.е. светится), то они воспринимаются глазом не как совокупность

отдельных точек, а как сплошной участок. В отличие от систем векторной графики, в которых изображение генерируется с помощью последовательности команд (каждая команда рисует одну небольшую прямую), система растровой графики допускает использование хранимого в памяти образа экрана. В компьютере IBM/PC мы имеем дело именно с сиcтемой растровой графики; управление процессом построения изображения на экране дисплея осуществляется с помощью хранимого образа экрана. Все преимущества дисплеев с хранимыми образами экрана распространяются на растровый дисплей компьютера IBM/PC - и в первую очередь способность к считыванию и записи отображаемых данных непосредственно из памяти дисплея. Описание образа экрана в памяти зависит от используемого видеорежима. Обычно экран разбивается на совокупности чётных и нечётных строк, хранящиеся в

разных частях памяти. Одна строка экрана представляется в памяти последовательными значениями цветов пикселей этой строки. В более сложных случаях содержимое дисплея описывается в памяти битовыми полями количество которых зависит от количества цветов в палитре, а размер зависит от используемого разрешения. В свою очередь количество используемых цветов и разрешение зависит от типа видеосистемы и объёма памяти видеоадаптера.

Ниже текст лабы по выведению линии по диагонали экрана толщиной в ~20 пикселей в графическом режиме:

text segment 'code'

assume cs:text,ds:data

drow proc

mov ah,0ch

mov al,color

mov bh,0

mov cx,x

mov dx,y

int 10h

ret

drow endp

main proc

mov ax,data

mov ds,ax

mov ax,3523h

int 21h

mov word ptr old_23h,bx

mov word ptr old_23h+2,es

mov ax,2523h

mov dx,offset new_23h

push ds

push cs

pop ds

int 21h

pop ds

mov ax,351bh

int 21h

mov word ptr old_1bh,bx

mov word ptr old_1bh+2,es

mov ax,251bh

mov dx,offset new_1bh

push ds

push cs

pop ds

int 21h

pop ds

mov ah,08h ;программа не выгрузится из памяти

int 21h ;пока не будет нажата любая клавиша

lds dx,old_23h ;восстановление старых векторов

mov ax,2523h

int 21h

lds dx,old_1bh

mov ax,251bh

int 21h

mov ax,4c00h

int 21h

main endp

new_23h proc

push ax

push bx

push cx

push dx

push ds ;настройка ds на наши данные

mov ax,data

mov ds,ax

mov ah,4fh ;установка режима 800*600

mov al,02h

mov bx,103h

int 10h

mov ah,10h ; перекраска экрана

mov al,10h

mov bx,0

mov dh,35

mov ch,40

mov cl,10

int 10h

mov ah,10h ;цвет выводимой линии

mov al,10h

mov bx,100

mov dh,30

mov ch,10

mov cl,50

int 10h

mov color,100

mov x,1

mov y,599

mov ax,20

polosa:

push ax

mov cx,510

line:

push cx

call drow

pop cx

mov ax,cx

div k

cmp ah,0

je met

inc x

jmp ex

met: add x,2

ex:

dec y

loop line

pop ax

mov x,1

mov y,599

sub y,ax

dec ax

cmp ax,0

jne polosa

mov ah,08h

int 21h

mov ah,00

mov al,03h

int 10h

pop ds

pop dx

pop cx

pop bx

pop ax

iret

new_23h endp

new_1bh proc

push ax

push bx

push cx

push dx

mov ax,0600H ; ah=6 ->прокрутка вверх

mov cx,0000

mov dx,184FH

mov bh,224 ; здесь устанавливается цвет фона и шрифта !!!!!!!!!!!

int 10H ; очистка экрана

mov cx,5555

ddd:

push cx

mov cx,5555

ddd1: loop ddd1

pop cx

loop ddd

mov ax,0600H ; восстановление цвета

mov cx,0000

mov dx,184FH

mov bh,7

int 10H

pop dx

pop cx

pop bx

pop ax

iret

new_1bh endp

text ends

data segment

old_23h dd 0

old_1bh dd 0

k db 2

color db 0

x dw 0

y dw 0

data ends

end main


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