Практикум_СП
.pdfПрограма виведення монохромного зображення дворядковим методом.
model |
small |
;модель пам'яті, що використовує програма ехе |
||||||
dataseg |
stack |
256 |
;розмір стеку |
|
|
|
|
|
|
|
;початок сегменту даних |
|
|
|
|||
Line1•••••db"••ЫЬЬЬ",0dh,0ah,'$';0dh – команда повернення |
|
|||||||
;каретки |
|
|
|
|
|
|
|
|
Line2•••••db"•ЫЫЫЫЫЫЫЬ",0dh,0ah,'$' |
|
|
|
|
||||
Line3•••••db"•ЫЬЫЯЫЫЫЫЬ",0dh,0ah,'$' |
|
|
|
|
||||
Line4•••••db"•ЫЫЫ•ЫЫЫЫЫЬЬЬЬЬЬЬЬ",0dh,0ah,'$' |
|
|
|
|
||||
Line5•••••db"•••••ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЯЫЫЬ",0dh,0ah,'$' |
|
|
- |
|||||
Line6•••••db"•••••ЫЫЫЫЫЫЫЫЫЫЫЫЫЫ••ЯЫЫ",0dh,0ah,'$'••; 0ah |
||||||||
;команда переведення каретки |
|
|
|
|
|
|
||
Line7•••••db"••••••ЫЫЫЫЫЫЫЫЫЫЫЫЫЬЬ•ЫЫ",0dh,0ah,'$' |
|
|
|
|||||
Line8•••••db"••••••ЫЫЫЯ•••••ЯЯЫЫЫЫ•ЯЯ",0dh,0ah,'$' |
|
|
|
|||||
Line9•••••db"••••ЬЫЫЯ•••••••••••ЫЫЫ",0dh,0ah,'$' |
|
|
|
|||||
Line10•••db"ЬЬ••ЫЫЯ•••••••••••••ЫЫ•ЬЬ",0dh,0ah,'$' |
|
|
|
|||||
Line11•••db"ЫЫЫЫЫЯ•••••••••••ЫЫЫЫЫ",0dh,0ah,'$' |
|
|
|
|||||
Line12•••db"••ЯЯЫЫЫЫЫЬЬЬЬЬЬЬЫЫЫЫЫЯЯ",0dh,0ah,'$' ;кінець |
|
|||||||
;сегменту даних |
|
|
|
|
|
|
|
|
Line13•••db"••••••••ЯЯЯЯЯЯЯЯЯ",0dh,0ah,'$' |
|
|
|
|
||||
codeseg |
|
|
;початок сегменту коду |
|
|
|||
start: |
mov |
ax,@data |
;призначення |
регістру |
АХ |
як |
||
|
||||||||
;регістру даних |
ds,ax |
;переміщення даних з АХ у DS |
|
|||||
|
mov |
|
||||||
|
mov |
ah,9 |
;номер функції |
DOS |
– |
виведення |
||
;повідомлення |
dx,offset Line1 |
;переміщення |
даних |
з |
||||
|
mov |
|||||||
;сегменту даних у регістр DX |
|
;виклик переривання DOS |
|
|||||
|
int |
21h |
|
|
||||
|
mov |
ah,9 |
|
|
|
|
|
|
|
mov |
dx,offset Line2 |
|
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
|
mov |
dx,offset Line3 |
|
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
|
mov |
dx,offset Line4 |
|
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
|
mov |
dx,offset Line5 |
|
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
|
mov |
dx,offset Line6 |
|
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
|
mov |
dx,offset Line7 |
|
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
|
mov |
dx,offset Line8 |
|
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
31
mov |
dx,offset Line9 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line10 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line11 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line12 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line13 |
|
int |
21h |
;вихід з програми |
mov |
ah,4ch |
|
int |
21h |
;завершення програми |
end start |
|
А тепер поглянемо, як змінюється розмір файлу у цих двох випадках. Виконавши компіляцію обох початкових модулів, як показано на
рисунку 4.5, ми побачимо, що порядкове виведення малюнків займає менше місця на диску. Файл strok.asm є порядковим, а dvostr – дворядковим:
Рисунок 4.5 Порівняння розмірів файлів початкових модулів. Пропонуємо спробувати спосіб скорочення тексту програми. Замість
того, щоб використовувати багато змінних, можна однією командою вивести зображення одразу. Ось модифікований текст програми, створеної студентом 411-ОКС-04 групи Яворським Володимиром, який застосовує всього одну змінну.
.model small |
;модель пам'яті що використовує програма ехе |
|
stack |
256 |
;розмір стеку |
32
.data |
equ |
00Dh |
;початок сегмету |
д |
||
CR |
; |
код |
повернення |
каретки |
||
LF |
equ |
00Ah |
; |
код |
переведення каретки |
BegMsg |
db |
CR,LF,LF |
|
|
;каретки |
db' |
ЫЬЬЬ', |
CR,CR,LF ;0dh - команда повернення |
|
db' ЫЫЫЫЫЫЫЬ', CR,CR,LF |
|
|||
|
|
|||
|
db' ЫЬЫЯЫЫЫЫЬ', CR,CR,LF |
|
||
|
db' ЫЫЫ ЫЫЫЫЫЬЬЬЬЬЬЬЬ', CR,CR,LF |
|
||
|
db' |
ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЯЫЫЬ', CR,CR,LF |
;0ah - |
|
|
db' |
ЫЫЫЫЫЫЫЫЫЫЫЫЫЫ ЯЫЫ', CR,CR,LF |
||
;команда переведення каретки |
|
|
||
|
db' |
ЫЫЫЫЫЫЫЫЫЫЫЫЫЬЬ ЫЫ', CR,CR,LF |
|
|
|
db' |
ЫЫЫЯ |
ЯЯЫЫЫЫ ЯЯ', CR,CR,LF |
|
|
db' |
ЬЫЫЯ |
ЫЫЫ', CR,CR,LF |
|
|
db'ЬЬ |
ЫЫЯ |
ЫЫ ЬЬ', CR,CR,LF |
|
|
db'ЫЫЫЫЫЯ |
ЫЫЫЫЫ', CR,CR,LF |
;кінець |
|
|
db' |
ЯЯЫЫЫЫЫЬЬЬЬЬЬЬЫЫЫЫЫЯЯ', CR,CR,LF |
;сегменту даних
db' ЯЯЯЯЯЯЯЯЯ', CR,LF,'$'
.code ;початок сегмету коду
.startup
lea |
dx,BegMsg |
; |
Адреса стартового |
;повідомлення в DX |
ah,09 ; |
Функція 09h |
– виведення рядка |
mov |
|||
int |
21h |
; Виклик Dos |
|
mov |
ah,4ch |
;вихід з програми |
|
int |
21h |
;завершення програми |
|
end |
|
33
Практична робота № 5
Тема: Створення псевдографіки. Кольорові зображення.
Мета роботи: Навчитися створювати псевдографічні малюнки у текстовому режимі за допомогою виведення на екран повідомлень з заданими атрибутами тексту.
Теоретична частина
Для створення кольорових зображень, можна використовувати два способи:
а) порядкове виведення; б) дворядкове виведення;
На відміну від монохромних зображень порядкове виведення застосовується тоді, коли потрібно скоротити розмір виконуваного фалу або ж листингу, а дворядкове виведення займає набагато більше часу на розробку та створення листингу не говорячи вже про його розміри. У кольорових зображеннях з використанням дворядкового методу застосовується кодування кольору фону та кольору самого символу, що ускладнює написання сегменту даних та займає багато часу, тому ми розглянемо тільки порядкове виведення.
Приведений далі листинг виводить кольорове зображення. Для виводу на екран повідомлення застосовується функція DOS – вивід рядка на екран. Вона викликається за допомогою переміщення числа 9 у регістр AH. Введіть листинг за допомогою будь якого текстового редактора, наприклад Блокнот чи
RullNote.
model small stack 256
dataseg |
db"••••••••ЫЫЫЫЫ",0dh,0ah,'$' |
Line1 |
|
Line2 |
db"•••••••ЫЫЫЫЫЫЫ",0dh,0ah,'$' |
Line3 |
db"••••••ЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
Line4 |
db"•••••ЫЫЫЫЫЫЫ••ЫЫ",0dh,0ah,'$' |
Line5 |
db"••••ЫЫЫЫЫЫЫЫ•••ЫЫ",0dh,0ah,'$' |
Line6 |
db"•••ЫЫЫЫЫЫЫЫЫЫ•••ЫЫ",0dh,0ah,'$' |
Line7 |
db"••ЫЫЫЫЫЫЫЫЫЫЫЫ•••ЫЫ",0dh,0ah,'$' |
Line8 |
db"•ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
Line9 |
db"•Ы•••••••ЫЫЫ",0dh,0ah,'$' |
Line10 |
db"•Ы••••••",'$' |
Line11 |
db"ЫЫЫЫЫ",0dh,0ah,'$' |
Line12 |
db"ЫЫЫ••••",'$' |
Line13 |
db"ЫЫЫЫЫЫЫ",0dh,0ah,'$' |
Line14 |
db"•Ы••••",'$' |
Line15 |
db"ЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
Line16 |
db"•••••ЫЫЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
Line17 |
db"•••••Ы•ЫЫЫ•ЫЫЫ•Ы",0dh,0ah,'$' |
Line18 |
db"•••••ЫЫЫ•ЫЫЫ•ЫЫЫ",0dh,0ah,'$' |
Line19 |
db"•••••ЫЫЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
Line20 |
db"••••••ЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
34
Line21 |
db"•••••••ЫЫЫЫЫЫЫ",0dh,0ah,'$' |
Line22 |
db"••••••••ЫЫЫЫЫ",0dh,0ah,'$' |
Line23 |
db"•••••••••ЫЫЫ",0dh,0ah,'$' |
Line24 |
db"••••••••••Ы",0dh,0ah,'$' |
Line25 |
db"••••••••••Ы",0dh,0ah,'$' |
Line26 |
db"••••••••••Ы",0dh,0ah,'$' |
Line27 |
db"•••••••ЫЫЫЫЫЫЫ",0dh,0ah,'$' |
codeseg |
|
start: |
|
mov |
ax,@data |
mov |
ah,9 |
dx,offset Line5 |
|
|
mov |
ds,ax |
|
mov |
|
|
mov |
ah,9 |
|
int |
21h |
|
|
mov |
ah,9 |
||
|
mov |
bl,00000100b |
|
||
|
mov |
cx,0dh |
|
mov |
bl,00000100b |
|
int |
10h |
|
mov |
cx,12h |
|
mov |
ah,9 |
|
int |
10h |
|
|
mov |
ah,9 |
||
|
mov |
dx,offset Line1 |
|
||
|
int |
21h |
|
mov |
dx,offset Line6 |
|
mov |
ah,9 |
|
int |
21h |
|
|
mov |
ah,9 |
||
|
mov |
bl,00000100b |
|
||
|
mov |
cx,0eh |
|
mov |
bl,00000100b |
|
int |
10h |
|
mov |
cx,13h |
|
mov |
ah,9 |
|
int |
10h |
|
|
mov |
ah,9 |
||
|
mov |
dx,offset Line2 |
|
||
|
int |
21h |
|
mov |
dx,offset Line7 |
|
mov |
ah,9 |
|
int |
21h |
|
|
mov |
ah,9 |
||
|
mov |
bl,00000100b |
|
||
|
mov |
cx,0fh |
|
mov |
bl,00000100b |
|
int |
10h |
|
mov |
cx,14h |
|
mov |
ah,9 |
|
int |
10h |
|
|
mov |
ah,9 |
||
|
mov |
dx,offset Line3 |
|
||
|
int |
21h |
|
mov |
dx,offset Line8 |
|
mov |
ah,9 |
|
int |
21h |
|
|
mov |
ah,9 |
||
|
mov |
bl,00000100b |
|
||
|
mov |
cx,10h |
|
mov |
bl,00000100b |
|
int |
10h |
|
mov |
cx,14h |
|
mov |
ah,9 |
|
int |
10h |
|
|
mov |
ah,9 |
||
|
mov |
dx,offset Line4 |
|
||
|
int |
21h |
|
mov |
dx,offset Line8 |
|
mov |
ah,9 |
|
int |
21h |
|
|
mov |
ah,9 |
||
|
mov |
bl,00000100b |
|
||
|
mov |
cx,11h |
|
mov |
bl,00000101bmov |
|
int |
10h |
bl,00001101b |
|
35
mov |
cx,0ch |
10h |
|
mov |
cx,09h |
|
int |
|
int |
10h |
|
|
mov |
ah,9 |
|
mov |
ah,9 |
|
mov |
dx,offset Line9 |
|
mov |
dx,offset Line15 |
|
int |
21h |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
ah,9 |
|
mov |
bl,00000101b |
|
mov |
bl,00001101b |
|
mov |
cx,04h |
|
mov |
cx,10h |
|
int |
10h |
|
int |
10h |
|
mov |
ah,9 |
|
mov |
ah,9 |
|
mov |
dx,offset Line10 |
|
mov |
dx,offset Line16 |
|
int |
21h |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
ah,9 |
|
mov |
bl,00001101b |
|
mov |
bl,00001101b |
|
mov |
cx,05h |
|
mov |
cx,10h |
|
int |
10h |
|
int |
10h |
|
mov |
ah,9 |
|
mov |
ah,9 |
|
mov |
dx,offset Line11 |
|
mov |
dx,offset Line17 |
|
int |
21h |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
ah,9 |
|
mov |
bl,00000101b |
|
mov |
bl,00001101b |
|
mov |
cx,06h |
|
mov |
cx,10h |
|
int |
10h |
|
int |
10h |
|
mov |
ah,9 |
|
mov |
ah,9 |
|
mov |
dx,offset Line12 |
|
mov |
dx,offset Line18 |
|
int |
21h |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
ah,9 |
|
mov |
bl,00001101b |
|
mov |
bl,00001101b |
|
mov |
cx,07h |
|
mov |
cx,10h |
|
int |
10h |
|
int |
10h |
|
mov |
ah,9 |
|
mov |
ah,9 |
|
mov |
dx,offset Line13 |
|
mov |
dx,offset Line19 |
|
int |
21h |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
ah,9 |
|
mov |
bl,00000101b |
|
mov |
bl,00001101b |
|
mov |
cx,08h |
|
mov |
cx,0fh |
|
int |
10h |
|
int |
10h |
|
mov |
ah,9 |
|
mov |
ah,9 |
|
mov |
dx,offset Line14 |
mov |
mov |
dx,offset Line20 |
|
int |
21h |
ah,9 |
dx,offset Line24 |
|
|
mov |
ah,9 |
|
mov |
|
|
|
int |
21h |
36
int 21h
mov |
ah,9 |
mov |
ah,9 |
|
mov |
bl,00000101b |
|||
mov |
bl,00001101b |
mov |
cx,0bh |
|
mov |
cx,0eh |
int |
10h |
|
int |
10h |
mov |
ah,9 |
|
mov |
ah,9 |
|||
mov |
dx,offset Line25 |
|||
mov |
dx,offset Line21 |
int |
21h |
|
int |
21h |
mov |
ah,9 |
|
mov |
ah,9 |
|||
mov |
bl,00000101b |
|||
mov |
bl,00001101b |
mov |
cx,0bh |
|
mov |
cx,0dh |
int |
10h |
|
int |
10h |
mov |
ah,9 |
|
mov |
ah,9 |
|||
mov |
dx,offset Line26 |
|||
mov |
dx,offset Line22 |
int |
21h |
|
int |
21h |
mov |
ah,9 |
|
mov |
ah,9 |
|||
mov |
bl,00000101b |
|||
mov |
bl,00001101b |
mov |
cx,0eh |
|
mov |
cx,0ch |
int |
10h |
|
int |
10h |
mov |
ah,9 |
|
mov |
ah,9 |
|||
mov |
dx,offset Line27 |
|||
mov |
dx,offset Line23 |
int |
21h |
|
int |
21h |
mov |
ah,4ch |
|
mov |
ah,9 |
|||
int |
21h |
|||
mov |
bl,00000101b |
end start. |
|
|
mov |
cx,0bh |
|
|
|
int |
10h |
|
|
Створіть початковий текст програми та збережіть його у папці c:\tasm\bin під ім’ям PictCol.asm. Після отримання початкового модуля, його потрібно скомпілювати, для цього викличте командний рядок з меню Пуск, або за допомогою ярлику на робочому столі, та введіть таку команду: tasm PictCol.asm. Після цього, якщо на екрані з’явилося повідомлення про успішне компілювання, введіть наступну команду: tlink /x /t PictCol.obj. Запустіть скомпільовану програму на виконання за допомогою команди PictCol.com. При правильному виконанні команд на екрані з’явиться кольорове зображення.
Розглянемо атрибути повідомлення. У регістр BL поміщується код кольору символу та його атрибути. Перші три біти (0-2) задають колір символу, біт номер 3 задає яскравість. Наступні три біти (4-6) відповідають за колір фону символу. І, нарешті, останній біт (7) дозволяє символу мерехтіти. У даному тексті програми наочно показано як задаються атрибути символів, для наочності задання атрибуту виконано у бінарній системі числення. Також
37
можна задавати ці ж атрибути у гексакодах. У таблиці 5.1 наведено коди кольорів, які використовуються для задання атрибутів символів.
Використовуючи набуті навички, напишіть програму виведення на екран кольорового зображення відповідно малюнку індивідуального завдання. варіантом, варіант малюнка вказаний у таблиці нижче.
Таблиця № 5.1 Кольори атрибутів символів.
|
|
|
Біти |
|
|
|
Значення |
|
|
||
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
|
|
|
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Чорний |
|
|
|
|
|
|
|
0 |
0 |
0 |
1 |
Синій |
|
|
|
|
|
|
|
0 |
0 |
1 |
0 |
Зелений |
|
|
|
|
|
|
|
0 |
0 |
1 |
1 |
Блакитний |
|
|
|
|
|
|
|
0 |
1 |
0 |
0 |
Червоний |
|
|
|
|
|
|
|
0 |
1 |
0 |
1 |
Пурпурний |
|
|
|
|
|
|
|
0 |
1 |
1 |
0 |
Коричневий |
|
|
|
|
|
|
|
0 |
1 |
1 |
1 |
Світло-сірий |
|
|
|
|
|
|
|
1 |
0 |
0 |
0 |
Темно-сірий |
|
|
|
|
|
|
|
1 |
0 |
0 |
1 |
Світло-синій |
|
|
|
|
|
|
|
1 |
0 |
1 |
0 |
Ясно-зелений |
|
|
|
|
|
|
|
1 |
0 |
1 |
1 |
Ясно-блакитний |
|
|
|
|
|
|
|
1 |
1 |
0 |
0 |
Світло-червоний |
|
|
|
|
|
|
|
1 |
1 |
0 |
1 |
Ясно-пурпурний |
|
|
|
|
|
|
|
1 |
1 |
1 |
0 |
Жовтий |
|
|
|
|
|
|
|
1 |
1 |
1 |
1 |
Білий |
|
|
|
Мерехтіння |
|
фонуКолір |
|
Яскравість |
|
Колір символу |
|
Примітка: |
Коди |
кольорів |
|
|
|
|
|
символів |
збігаються |
з |
|||||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
кодами |
кольорів |
|
фону |
|
|
|
|
|
|
|
|
символів. Тому у таблиці |
|||
|
|
|
|
|
|
|
|
показані |
тільки |
|
коди |
|
|
|
|
|
|
|
|
кольорів. |
|
|
|
|
|
|
|
|
|
|
|
Атрибути символів |
|
|
|
|
|
|
|
|
|
|
|
Атрибути фону |
|
|
38
Контрольні питання:
1.Які методи кодування кольорових зображень ви знаєте?
2.Чим відрізняються методи кодування кольорових зображень від монохромних?
3.Що дає змогу символу мерехтіти на екрані монітора?
4.Яку функцію має регістр BL у MS DOS?
5.Яку функцію виконує регістр СХ у MS DOS?
Індивідуальні завдання:
1. За власним варіантом створіть програму, яка виводитиме кольорове зображення на екран. Студенти, номери варіантів яких парні, створюють програму типу СОМ, а студенти, що мають непарні варіанти - типу ЕХЕ. Варіанти завдань приведені у таблиці 5.2. Приклад виконання індивідуального завдання наведено у Додатку 5.1.
39
Таблиця 5.2 Варіанти кольорових зображень.
|
|
|
|
1 |
2 |
3 |
4 |
|
|
|
|
5 |
6 |
7 |
8 |
|
|
|
|
9 |
10 |
11 |
12 |
|
|
|
|
13 |
14 |
15 |
16 |
40