Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра САПР
Звіт
Про виконання
Лабораторної роботи №9
Тема: Програмування виводу інформації на екран з МП Intel 8086(80286)
Виконала:
студентка групи КН-3
Львів – 2008
Тема: Програмування виводу інформації на екран з МП Intel 8086(80286).
Мета: Вивчити основні можливості керування екраном в текстовому та графічному режимах.
Завдання
Написати програму, яка в графічному режимі виводить заяву з проханням перевести студента на 4-й курс. Кожне слово заяви повинно виділятися іншим кольором. За допомогою клавіш вліво і вправо повинні циклічно мінятися кольори слів.
Короткі теоретичні відомості
Вибір графічного режиму можна виконати за допомогою функції 00h переривання 10h
00H встановити відео режим. Очистити екран:
Вхід: AL=режим
AL Тип Формат Кольори
═══ ══════ ══════ ═════════════
0 текст 40x25 16/8 чорно-білий
1 текст 40x25 16/8
2 текст 80x25 16/8 чорно-білий
3 текст 80x25 16/8
4 графіка 320x200 4
5 графіка 320x200 4 чорно-білий
6 графіка 640x200 2
7 текст 80x25 3 (b/w/bold)
0dH графіка 320x200 16
0eH графіка 640x200 16
0fH графіка 640x350 3 (b/w/bold)
10H графіка 640x350 4 или 16
Вивід слів на дисплей здійснюю функцією 9 переривання 10h:
09H писати символ/атрибут в поточній позиції курсору
Вход: BH = номер відео сторінки
AL = символ, що записується
CX = лічильник (скільки копій символу записати)
BL = відео атрибут кольору
В текстовому режимі для VGA-адаптерів використовується 32 KB пам’яті, в CGA-адаптерів – 16 KB, а в EGA тільки 4 KB.
Крім того, відеобуфер в останньому починається з адреси 0b000h, в решти адаптерів – з адреси 0b800h.
VGA-адаптери при включені комп’ютера встановлюють режим 7 на монохромному дисплеї і 3 на кольоровому.
Екранна пам’ять для текстового режиму знаходиться за адресою починаючи з 0b00h:0000h
(для CGA, EGA, VGA адаптерів). Кожній позиції на екрані відповідає слово. В молодшому байті знаходиться код символа, а в старшому – колір(колір символа, фону, ознака мигання).
Перші чотири біти байта кольору дають колір символа (всього може бути 16 кольорів).
Колір фону визначається бітами 6-4 (всього 8 кольорів). Якщо біт 7 рівний 1, то символ мигає. Об’єм відеопам’яті для текстового режиму 32 KB. Відеопам’ять забезпечує екранні сторінки (0-3) для екрану на 80 стовпчиків та 8 сторінок (0-7) для екрана на 40 стовпчиків.
Усі екранні операції виконуються за допомогою команди переривання int 10h, яка передає керування BIOS.
В графічних режимах курсор невідображається на екрані, однак він має свою позицію.
При використані графічних режимів VGA адреса початку відеобуфера A000:0000.
Функція AH=03h 10h переривання дозволяє визначити поточний режим роботи відеоадаптера.
В BL повертає номер поточного режиму.
BIOS також надає функції читання і запису точки на екрані в графічних режимах.
Функція AH=0Ch 10h переривання виводить точку на екран. В BH – номер відеосторінки, DX – номер рядка, CX – номер стовпця, AL – номер кольору.
Функція AH=0Dh 10h переривання дозволяє отримати колір точки в AL, координати якої задані в DX – номер рядка, CX – номер стовпця, BH – номер відеосторінки.
Функція AH=01h 10h Встановлення розміру курсора. Біти 4-0 в регістрі CH визначають розмір у вертикальному напрямку, а біти 4-0 в регістрі CL – для горизонтального напрямку. Можна встановити будь-який розмір курсора по вертикалі: від 0 до 14 для монохромних та від 0 до 7 для більшості кольорових моніторів.
Функція AH=02h 10h Встановлення позиції курсора. Ця функція встановлює курсор на екрані у відповідності з координатами стрічки та стовпчика. В регістрі BH – номер сторінки DH – стрічка DL – стовпчик.
Функція AH=04h 10h Читання місцезнаходження світлового пера.
Функція AH=05h 10h Вибір активної сторінки. AL – сторінка.
Функція AH=06h 10h Прокрутка екрана вверх. В регістр AL заноситься кількість сторінок, BH – атрибут, DX – координати.
Функція AH=07h 10h Прокрутка екрана вниз.
Функція AH=08h 10h Читання атрибута символа в біжучій позиції курсора.
Функція AH=0Аh 10h Вивід символа в біжучу позицію курсора. AL – символ, BH – сторінка, CX – кількість символів.
Функція AH=13h 10h Вивід символьної стрічки. Дана функція дозволяє виводити на екран символьні стрічки з встановленням і переміщенням курсора. AL – сервіс, BH – сторінка, BX – адреса рядка, CX – довжина, DX – екран.
Організувати вивід на екран, окрім використання 10- го переривання BIOS, можна за допомогою 21 – го переривання DOS. Для цього необхідно в регістрі AH записати 09, в DX – адреса рядка, який необхідно вивести на термінал.
Код програми
.8086
code segment
org 100h
assume cs:code,ds:code,es:code,ss:code
start:
mov ax,0eh ;встановлення графічного відеорежиму і очистка відеосторінки
int 10h
begin:
lea bx,dur ; привоєння bx адреси початку слова з даними про нього
call vuvid ; вивід слова у свою позицію з атрибутами символів
lea bx,inst
call vuvid
lea bx,IKN
call vuvid
lea bx,pas
call vuvid
lea bx,stud
call vuvid
lea bx,grp
call vuvid
lea bx,KN
call vuvid
lea bx,vlad
call vuvid
lea bx,zaj
call vuvid
lea bx,pros
call vuvid
lea bx,perev
call vuvid
lea bx,men
call vuvid
lea bx,na
call vuvid
lea bx,chetv
call vuvid
lea bx,kyrs
call vuvid
lea bx,data
call vuvid
lea bx,pidp
call vuvid
mov ah,10h ;очікування клавіші
int 16h
lea bx,dur
mov cx,17
cmp ah,4bh ; клавіша - стрілка вліво?
jnz next ; ні - прехід на перевірку стрілки вправо
call vlivo ; процедура заміни кольорів по циклу вправо
jmp begin ; на початок виведення слів
next: cmp ah,4dh ; клавіша - стрілка вправо?
jnz endof ; ні - вихід з програми
call vpravo ; процедура заміни кольорів по циклу вліво
jmp begin ; на початок виведення слів
endof: mov ax,03h
int 10h
mov ah,4ch
int 21h
dur db 9,47,0,1,'Durektory' ; довжина слова, ст, ряд, атрибут, слово
inst db 9,47,1,2,'Instutyty'
IKN db 4,57,1,3,'IKNI'
pas db 15,47,2,4,'Pasichnuky V.V.'
stud db 9,47,3,5,'Stydentku'
grp db 5,56,3,6,'grypu'
KN db 5,62,3,7,'KN-33'
krav db 14,47,4,8,'Ivastchyk T.O.'
zaj db 6,33,7,9,'Zajava'
pros db 6,5,9,10,'Proshy'
perev db 9,12,9,11,'perevestu'
men db 4,22,9,12,'mene'
na db 2,27,9,13,'na'
chetv db 3,30,9,14,'4-i'
kyrs db 5,34,9,15,'kyrs.'
data db 9,8,11,1,'5.05.2009'
pidp db 5,49,11,2,'Tanja'
vuvid proc
mov cl,byte ptr [bx] ; - довжина слова
inc bx
mov dx,[bx] ; - позиція звідки писати слово
push bx
mov ah,02h ;встановлення курсору у відповідну позицію
mov bh,0
int 10h
pop bx
add bx,2
xor dx,dx
mov dl,byte ptr [bx] ; атрибут символу
inc bx
mov di,dx ; атрибут символа і відеосторінка
cycl:
push cx ;цикл виводу рядка посимвольно з атрибутом
push bx
mov ah,09h
mov cx,1 ;кі-сть раз вивести
mov al,[bx]
mov bx,di ; 0 - відеосторінка bl - атрибут
int 10h
mov ah,03h
mov bh,0
int 10h
add dx,1 ;перестановка курсору на 1 позицію вправо
mov ah,02h
mov bh,0
int 10h
pop bx
inc bx ;наступний символ
pop cx
loop cycl
ret
vuvid endp
vlivo proc
mov cx,17
c1:
xor ax,ax
mov al,byte ptr [bx]
add bx,3
add byte ptr [bx],1
and byte ptr [bx],0fh
cmp byte ptr [bx],0
jnz nen
add byte ptr [bx],1
nen: add bx,ax
add bx,1
loop c1
ret
vlivo endp
vpravo proc
mov cx,17
c2:
xor ax,ax
mov al,byte ptr [bx]
add bx,3
sub byte ptr [bx],1
and byte ptr [bx],0fh
cmp byte ptr [bx],0
jnz nenul
sub byte ptr [bx],1
and byte ptr [bx],0fh
nenul:
add bx,ax
add bx,1
loop c2
ret
vpravo endp
code ends
end start
lst – код
Turbo Assembler Version 4.1 01/12/09 13:25:42 Page 1
l9.ASM
1 .8086
2 0000 code segment
3 org 100h
4 assume cs:code,ds:code,es:code,ss:code
5 0100 start:
6 0100 B8 000E mov ax,0eh ;встановлення графічного відеорежиму і очистка відеосторінки
7 0103 CD 10 int 10h
8 0105 begin:
9 0105 BB 0193r lea bx,dur ; привоєння bx адреси початку слова з даними про нього
10 0108 E8 0142 call vuvid ; вивід слова у свою позицію з атрибутами символів
11 010B BB 01A0r lea bx,inst
12 010E E8 013C call vuvid
13 0111 BB 01ADr lea bx,IKN
14 0114 E8 0136 call vuvid
15 0117 BB 01B5r lea bx,pas
16 011A E8 0130 call vuvid
17 011D BB 01C8r lea bx,stud
18 0120 E8 012A call vuvid
19 0123 BB 01D4r lea bx,grp
20 0126 E8 0124 call vuvid
21 0129 BB 01DDr lea bx,KN
22 012C E8 011E call vuvid
23 012F BB 01E6r lea bx,vlad
24 0132 E8 0118 call vuvid
25 0135 BB 01F6r lea bx,zaj
26 0138 E8 0112 call vuvid
27 013B BB 0200r lea bx,pros
28 013E E8 010C call vuvid
29 0141 BB 020Ar lea bx,perev
30 0144 E8 0106 call vuvid
31 0147 BB 0217r lea bx,men
32 014A E8 0100 call vuvid
33 014D BB 021Fr lea bx,na
34 0150 E8 00FA call vuvid
35 0153 BB 0225r lea bx,chetv
36 0156 E8 00F4 call vuvid
37 0159 BB 022Cr lea bx,kyrs
38 015C E8 00EE call vuvid
39 015F BB 0235r lea bx,data
40 0162 E8 00E8 call vuvid
41 0165 BB 0242r lea bx,pidp
42 0168 E8 00E2 call vuvid
43
44 016B B4 10 mov ah,10h ;очікування клавіші
45 016D CD 16 int 16h
46
47 016F BB 0193r lea bx,dur
48 0172 B9 0011 mov cx,17
49 0175 80 FC 4B cmp ah,4bh ; клавіша - стрілка вліво?
50 0178 75 05 jnz next ; ні - прехід на перевірку стрілки вправо
51 017A E8 0109 call vlivo ; процедура заміни кольорів по циклу вправо
52 017D EB 86 jmp begin ; на початок виведення слів
53
54 017F 80 FC 4D next: cmp ah,4dh ; клавіша - стрілка вправо?
55 0182 75 06 jnz endof ; ні - вихід з програми
56 0184 E8 011F call vpravo ; процедура заміни кольорів по циклу вліво
57 0187 E9 FF7B jmp begin ; на початок виведення слів
Turbo Assembler Version 4.1 01/12/09 13:25:42 Page 2
l9.ASM
58
59 018A B8 0003 endof: mov ax,03h
60 018D CD 10 int 10h
61
62 018F B4 4C mov ah,4ch
63 0191 CD 21 int 21h
64
65 0193 09 2F 00 01 44 75 72+ dur db 9,47,0,1,'Durektory' ; довжина слова, ст, ряд, атрибут, слово
66 65 6B 74 6F 72 79
67 01A0 09 2F 01 02 49 6E 73+ inst db 9,47,1,2,'Instutyty'
68 74 75 74 79 74 79
69 01AD 04 39 01 03 49 4B 4E+ IKN db 4,57,1,3,'IKNI'
70 49
71 01B5 0F 2F 02 04 50 61 73+ pas db 15,47,2,4,'Pasichnuky V.V.'
72 69 63 68 6E 75 6B 79+
73 20 56 2E 56 2E
74 01C8 08 2F 03 05 53 74 79+ stud db 8,47,3,5,'Stydentku'
75 64 65 6E 74 61
76 01D4 05 38 03 06 67 72 79+ grp db 5,56,3,6,'grypu'
77 70 75
78 01DD 05 3E 03 07 4B 4E 2D+ KN db 5,62,3,7,'KN-33'
79 33 36
80 01E6 0C 2F 04 08 4B 72 61+ vlad db 13,47,4,8,'Ivastchuk T.O.'
81 76 63 69 61 20 56 2E+
82 56 2E
83 01F6 06 21 07 09 5A 61 6A+ zaj db 6,33,7,9,'Zajava'
84 61 76 61
85 0200 06 05 09 0A 50 72 6F+ pros db 6,5,9,10,'Proshy'
86 73 68 79
87 020A 09 0C 09 0B 70 65 72+ perev db 9,12,9,11,'perevestu'
88 65 76 65 73 74 75
89 0217 04 16 09 0C 6D 65 6E+ men db 4,22,9,12,'mene'
90 65
91 021F 02 1B 09 0D 6E 61 na db 2,27,9,13,'na'
92 0225 03 1E 09 0E 34 2D 69 chetv db 3,30,9,14,'4-i'
93 022C 05 22 09 0F 6B 79 72+ kyrs db 5,34,9,15,'kyrs.'
94 73 2E
95 0235 09 08 0B 01 35 2E 30+ data db 9,8,11,1,'5.05.2009'
96 35 2E 32 30 30 39
97 0242 08 31 0B 02 4B 72 61+ pidp db 8,49,11,2,'Tanja'
98 76 65 63 6A
99
100 024D vuvid proc
101
102 024D 8A 0F mov cl,byte ptr [bx] ; - довжина слова
103 024F 43 inc bx
104 0250 8B 17 mov dx,[bx] ; - позиція звідки писати слово
105
106 0252 53 push bx
107 0253 B4 02 mov ah,02h ;встановлення курсору у відповідну позицію
108 0255 B7 00 mov bh,0
109 0257 CD 10 int 10h
110 0259 5B pop bx
111
112 025A 83 C3 02 add bx,2
113 025D 33 D2 xor dx,dx
114 025F 8A 17 mov dl,byte ptr [bx] ; атрибут символу
Turbo Assembler Version 4.1 01/12/09 13:25:42 Page 3
l9.ASM
115 0261 43 inc bx
116
117 0262 8B FA mov di,dx ; атрибут символа і відеосторінка
118 0264 cycl:
119 0264 51 push cx ;цикл виводу рядка посимвольно з атрибутом
120 0265 53 push bx
121 0266 B4 09 mov ah,09h
122
123 0268 B9 0001 mov cx,1 ;кі-сть раз вивести
124 026B 8A 07 mov al,[bx]
125 026D 8B DF mov bx,di ; 0 - відеосторінка bl - атрибут
126 026F CD 10 int 10h
127
128 0271 B4 03 mov ah,03h
129 0273 B7 00 mov bh,0
130 0275 CD 10 int 10h
131
132 0277 83 C2 01 add dx,1 ;перестановка курсору на 1 позицію вправо
133 027A B4 02 mov ah,02h
134 027C B7 00 mov bh,0
135 027E CD 10 int 10h
136
137 0280 5B pop bx
138 0281 43 inc bx ;наступний символ
139 0282 59 pop cx
140 0283 E2 DF loop cycl
141
142 0285 C3 ret
143 0286 vuvid endp
144
145 0286 vlivo proc
146
147 0286 B9 0011 mov cx,17
148 0289 c1:
149 0289 33 C0 xor ax,ax
150 028B 8A 07 mov al,byte ptr [bx]
151 028D 83 C3 03 add bx,3
152 0290 80 07 01 add byte ptr [bx],1
153 0293 80 27 0F and byte ptr [bx],0fh
154 0296 80 3F 00 cmp byte ptr [bx],0
155 0299 75 03 jnz nen
156 029B 80 07 01 add byte ptr [bx],1
157 029E 03 D8 nen: add bx,ax
158 02A0 83 C3 01 add bx,1
159 02A3 E2 E4 loop c1
160 02A5 C3 ret
161 02A6 vlivo endp
162
163 02A6 vpravo proc
164
165 02A6 B9 0011 mov cx,17
166 02A9 c2:
167 02A9 33 C0 xor ax,ax
168 02AB 8A 07 mov al,byte ptr [bx]
169 02AD 83 C3 03 add bx,3
170 02B0 80 2F 01 sub byte ptr [bx],1
171 02B3 80 27 0F and byte ptr [bx],0fh
Turbo Assembler Version 4.1 01/12/09 13:25:42 Page 4
l9.ASM
172 02B6 80 3F 00 cmp byte ptr [bx],0
173 02B9 75 06 jnz nenul
174 02BB 80 2F 01 sub byte ptr [bx],1
175 02BE 80 27 0F and byte ptr [bx],0fh
176 02C1 nenul:
177 02C1 03 D8 add bx,ax
178 02C3 83 C3 01 add bx,1
179 02C6 E2 E1 loop c2
180 02C8 C3 ret
181 02C9 vpravo endp
182 02C9 code ends
183 end start
Turbo Assembler Version 4.1 01/12/09 13:25:42 Page 5
Symbol Table
Symbol Name Type Value
??DATE Text "01/12/09"
??FILENAME Text "l9 "
??TIME Text "13:25:42"
??VERSION Number 040A
@CPU Text 0101H
@CURSEG Text CODE
@FILENAME Text L9
@WORDSIZE Text 2
BEGIN Near CODE:0105
C1 Near CODE:0289
C2 Near CODE:02A9
CHETV Byte CODE:0225
CYCL Near CODE:0264
DATA Byte CODE:0235
DUR Byte CODE:0193
ENDOF Near CODE:018A
GRP Byte CODE:01D4
IKN Byte CODE:01AD
INST Byte CODE:01A0
KN Byte CODE:01DD
KRAV Byte CODE:01E6
KYRS Byte CODE:022C
MEN Byte CODE:0217
NA Byte CODE:021F
NEN Near CODE:029E
NENUL Near CODE:02C1
NEXT Near CODE:017F
PAS Byte CODE:01B5
PEREV Byte CODE:020A
PIDP Byte CODE:0242
PROS Byte CODE:0200
START Near CODE:0100
STUD Byte CODE:01C8
VLIVO Near CODE:0286
VPRAVO Near CODE:02A6
VUVID Near CODE:024D
ZAJ Byte CODE:01F6
Groups & Segments Bit Size Align Combine Class
CODE 16 02C9 Para none
Результати
Після натиснення клавіші «стрілка вправо»:
Висновки
На цій лабораторній роботі я навчилася програмувати вивід інформації з допомогою МП Intel 8086(80286).