Міністерство освіти та науки України
Кіровоградський Національний Технічний Університет
Факультет автоматики, енергетики та програмування
Кафедра програмного забезпечення
Дисципліна: “Програмування на мові ASM-86”
Курсова робота
на тему: “Реалізація функцій бібліотеки графіки длявиводу тексту у графічному режимі (OutTextXY, SetTextStyle)”
Виконав: ст. гр. ПЗ02 — 1
Антипенко П.С.
Перевірив: викладач
Приходькін Н.А.
Кіровоград 2004 р.
Зміст
Вступ
1. Призначення та область використання програми
1.1 Постановка задачі
1.2 Обґрунтування вибору методів розв’язання задачі
1.3 Алгоритм програми
2. Системні вимоги
3. Інструкція користувача
4. Висновок
5. Використана література
Додатки
Вступ
Становлення високоефективної світової економіки, неможливо безрозвиненого ринку програмних засобів і засобів зв’язку. Тепер комп’ютеривідіграють у житті людини велику роль, бо в ті часи коли ще не булокомп’ютерів, людина витрачала свій час на ручну роботу, в той час щоб робитищось інше. На сучасному етапі комп’ютери, комп’ютерні засоби є найбільшрозвиненні та найпродуктивніші машини.
Зараз з їх допомогою ми можемо проводити числові розрахунки, створюватифільми, музику, проводимо управління заводами та космічними кораблями, пишемонові корисні програми. Комп’ютери отримали широке розповсюдження, сталиуніверсальним засобом для обробки усіх видів інформації, які використовуєлюдина. Тому розробка програмних засобів для комп’ютерів стала актуальноюпроблемою сучасності. Одним із засобів створення програмного забезпечення ємова ASM — 86.
Ассемблер є мовою низького рівня програмування, тому він дуже придатнийдо роботи з операційними функціями MS-DOS, та BIOS. Користуючись цією мовоюпрограмування, програміст повинен: добре знати систему, вміти користуватисясистемними функціями, перериваннями. Щоб добре вміти програмувати на ASM-86, недостатньо застосовувати функції певного переривання. Потрібно добре знатисистему команд, потрібно чітко уявляти призначення кожної команди та роботу знею. Також необхідно удосконалити знання по регістрам, адже їх у процесорідостатньо: регістри загального призначення, регістри вказівники, індекснірегістри, регістр прапорців та інші. Потрібно вміти правильно відкомпілюватизадану програму, знайти в ній помилку, виправити її та знову запустити.
У порівнянні з іншими мовами програмування, ASM-86 є більш складним длярозуміння, адже він є мовою низького рівня. Але така мова, як ASM-86, даєвисокі знання системному програмісту.
1. Призначення та областьвикористання програми
Дана програма призначена для виводу тексту на екран. Вона здатна змінюватиматрицю, за якою будується літера, розмір літери та напрямок виводу літер. Такожвона здатна змінювати колір тексту. Гама кольорів є досить широкою і складає256 кольорів.
Ця програма може використовуватись у комп’ютерному дизайні приоформленні текстових повідомлень, об’яв тощо.1.1 Постановка задачі
Перед програмістом постала досить складна та цікава задача — написатианалог функцій OutTextXY та SetTextStyle. Перша функція виводить в довільнемісце екрану текст заданого стилю та кольору, а інша змінює шрифт, розмір літерта напрямок їх виводу. Як видно перелік функцій, які повинна виконуватипрограма, є досить широким.1.2 Обґрунтування вибору методіврозв’язання задачі
Спектр функцій, які повинна виконувати програма є досить широким. Самецей фактор спонукав до вибору стандартного відео режиму номер 13h. Він має 320пікселів по горизонталі та 200 по вертикалі і здатен виводити 256 кольоріводночасно. Саме остання обставина і зумовила його вибір. Крім того, вивідоднієї точки на екран зводиться лише до простого запису номеру кольору увідеобуфер, що суттєво спрощує вивід на екран. Загальна кількість точок наекрані складає 64000, що позбавляє необхідності перемикати банки пам’яті відеокарти (вікна). Це також є однією з причин вибору даного режиму. Крім того цейрежим є доступним майже для всіх ЕОМ, навіть для дуже старих, так як він єстандартним і підтримується навіть найдавнішими відеоадаптерами, що забезпечуєсумісність програми з великою кількістю типів ЕОМ.
Програма використовує переривання 10h для ініціалізації відеорежиму. Номерфункції — 00h.
Вхід: АН — 00h
AL — 13h (номер режиму)
Вихід: немає
Також програма використовує такі функції переривання 10h, як 02h — позиціювання курсору, 01h — задання форми курсору. Вони використовуються утекстовому режимі для забезпечення інтерфейсу програми. Ще програмавикористовує функції переривання 21h для вводу координат та номерів дій.1.3 Алгоритм програми
Програма вирішує поставлену задачу за допомогою використання підпрограм:
vvod — процедура вводу з клавіатури. Повертає у регістр AL введенуцифру;
vvodvsego — процедура виводу інструкцій для користувача та вводу даних;
vvkoor — процедура введення координати;
probeli — процедура виводу на екран заданої кількості синіх проміжків узаданому місці екрану;
vivstr — процедура виводу на екран строки у задане місце екрану;
priglash — процедура виводу запрошення до роботи на екран;
ramka — процедура виводу на екран зафарбованого прямокутника з рамкою ззаданими атрибутами символів;
Як видно з переліку, майже всі функції програми призначені длязабезпечення діалогу з користувачем. Сам вивід літер виконується у головнійпрограмі.
Для створення образів символів на екрані програма використовуєстандартні шрифти BIOS: 8*8, 8*16 та 8*14. Вибір матриці виконує користувач упроцесі діалогу з програмою.
Маштабування літер відбувається за допомогою множення матриці на розміршрифту, який вводиться користувачем.
2. Системні вимоги
Як зазначалося вище, вимоги до комп’ютеру є досить низькими:
процесор 80286
ОЗУ 640 кб.
ОС MS-DOS 4.0 і вище
3. Інструкція користувача
Для запуску програми необхідно набрати її ім’я у командній строціMS-DOS або клікнути на ній у OC Windows.
Після цього на екрані з’явиться запрошення до роботи. Спочатку требавибрати дію, яку повинна виконати програма. Якщо вибрано вивід тексту, то потімслід дотримуватись інструкцій, які будуть з’являтися на екрані. Після введеннятексту відбудеться перехід у графічний режим і на екрані з’явиться введенийтекст з заданими кольором, шрифтом, розміром та напрямком. Після переглядунеобхідно натиснути будь-яку клавішу. В результаті виконання цієї діївідбудеться перехід у текстовий режим і на екрані з’явиться запрошення дороботи.
4. Висновок
Дана програма має досить широке коло використання завдяки широкомуспектру дій, які вона виконує. Вона здатна змінювати матрицю, за якою будуєтьсялітера, розмір літери та напрямок виводу літер. Також вона здатна змінюватиколір тексту. Гама кольорів є досить широкою і складає 256 кольорів.
Ця програма може використовуватись у комп’ютерному дизайні приоформленні текстових повідомлень, об’яв тощо.
5. Використана література
1.Том Сван «Освоение Turbo Assembler»
2.Роберт Журден «Справочник программиста на персональном компьютере фирмыIBM»
3.Бредлі Д. «Програмування на мові Асемблер».
4.Абель П. «Мова Асемблера для IBM PC та програмування»
5.Зубков С.В. “Assembler для DOS, Windows и Unix”
Додатки
а). Лістинг програми
dseg segment
hor dw 0
ver dw 0
y dw 0
x dw 0
razm db 0
sdvig dw 0
stroka db 9
buf db 5 dup (0)
koord dw 5 dup (0)
buftxt db 22 dup (?)
mes1 db 'Введите номер действия: $'
mes3 db '1 — Вывод текста$'
mes4 db '2 — Выход в DOS$'
mes5 db 'Введите координату X $'
mes6 db 'Введите координату Y $'
mes7 db 'Введите рaзмер матрицы: $'
mes8 db '1 — 8 X 14$'
mes9 db '2 — 8 X 8$'
mes10 db '3 — 8 X 16$'
mes11 db ' Введите текст $'
mes12 db ' Введите номер цвета$'
mes13 db ' Введите размер шрифта$'
mes14 db 'Введите направление вывода: $'
mes15 db '1 — Cлева — напрво (_) $'
mes16 db '2 — Cверху — вниз (_) $'
r1 db 'г=======================================¬$'
r2 db '¦ ¦$'
r3 db '¦ ¦$'
r4 db '¦ ¦$'
r5 db '¦ ¦$'
r6 db '¦ ¦$'
r7 db 'L=======================================-$'
indeks dw 0
dseg ends
sseg segment stack
db 256 dup (?)
sseg ends
cseg segment stack
assume cs: cseg,ds: dseg,ss: sseg
vvod proc
lea dx,buf
mov ah,3fh
mov cx,3
mov bx,0
int 21h
mov al,buf
sub al,'0'
ret
vvod endp
vvodvsego proc
call ramka
mov dx,0b1eh
lea cx,mes5
call vivstr
call vvkoor
mov dx,0b1eh
lea cx,mes6
call vivstr
call vvkoor
call ramka
mov dx,0a1ch
lea cx,mes7
call vivstr
mov dx,0c23h; поз. курсора
mov cx,1
call probeli; вывод синего пробела
lea cx,mes8
call vivstr
mov dx,0d23h; поз. курсора
mov cx,1
call probeli; вывод синего пробела
lea cx,mes9
call vivstr
mov dx,0e23h; поз. курсора
mov cx,1
call probeli; вывод синего пробела
lea cx,mes10
call vivstr
mov dx,0a35h; поз. курсора
mov cx,1
call probeli; вывод синего пробела
call vvod
rcl al,1
mov byte ptr koord+4,al
rcr al,1
cmp al,1
je dal2
cmp al,2
je dal3
mov razm,16
jmp kon1
dal3:
mov razm,8
mov byte ptr koord+4,3
jmp kon1
dal2:
mov razm,14
kon1:
inc indeks
inc indeks
call ramka
mov dx,0b1ch
lea cx,mes12
call vivstr
call vvkoor; ввод цвета
call ramka
mov dx,0b1dh
lea cx,mes13
call vivstr
call vvkoor; ввод размера шрифта
call ramka
mov dx,0b1ah
lea cx,mes14
call vivstr
mov dx,0c1eh; поз. курсора
mov cx,1
call probeli; вывод синего пробела
lea cx,mes15
call vivstr
mov dx,0d1eh; поз. курсора
mov cx,1
call probeli; вывод синего пробела
lea cx,mes16
call vivstr
mov dx,0b37h; поз. курсора
mov cx,1
call probeli; вывод синего пробела
call vvod
cmp al,1
je dal
mov hor,0
mov al,razm
add al,2
mov byte ptr ver,al
jmp kon2
dal:
mov hor,10
mov ver,0
kon2:
ret
vvodvsego endp
vvkoor proc
mov dx,0d26h
mov cx,3
call probeli
mov ah,3fh
mov bx,0
mov cx,6
lea dx,buf
int 21h
mov dx,ax
XOR AX, AX
MOV AL, buf; AL — ASCII-код старшой цифры числа
SUB AL, '0'; выделение старшой цифры числа
cmp dx,3; введено 3 символа?
je vse; если да, то прыжок
cmp dx,4
je dva
jmp tri
dva:
mov bx,10; занесение 10 в DX
mul bx; умножение стар. цифры на 10
xor bx,bx; обнуление BX
mov bl,buf+1; BL — ASCII-код младшой цифры
sub bx,'0'; выделение младшей цифры числа
add ax,bx; получение введеного числа
jmp vse
tri:
mov bx,100; занесение 100 в DX
mul bx; умножение стар. цифры на 10
mov cx,ax; сохранение промеж. результата
xor ax,ax; обнуление AX
mov al,buf+1; AL — ASCII-код 2-й цифры
sub ax,'0'; получение цифры десятков
mov bx,10
mul bx; умножение кол-ва 10 — в на 10
add cx,ax; получение сотни+десятки
xor ax,ax
mov al,buf+2; AL — ASCII-код 2-й цифры
sub ax,'0'; получение цифер единиц
add cx,ax; получение сотни+десятки+единицы
mov ax,cx
vse:
xor bx,bx
mov bx, indeks
mov koord+bx,ax; сохранеие координаты
inc indeks
inc indeks
ret
vvkoor endp
probeli proc
mov ah,02
int 10h
mov ax,0920h; вывод пробела с атрибутом
mov bx,009fh
int 10h
ret
probeli endp
vivstr proc
mov bh,00h
mov ah,02
int 10h
mov dx,cx
mov ah,9
int 21h
ret
endp vivstr
priglash proc
mov dx,0b1ch
lea cx,mes1
call vivstr
mov dx,0c21h
mov cx,1
call probeli
lea cx,mes3
call vivstr
mov dx,0d21h
mov cx,1
call probeli
lea cx,mes4
call vivstr
ret
endp priglash
ramka proc
mov cx,0914h; установка атрибутов области
mov dx,0f3ch
mov ax,0600h
mov bh,01fh
int 10h
mov cx,0a15h; изм. атрибутов внутри области
mov dx,0e3bh
mov ax,0600h
mov bh,01bh
int 10h
; вывод рамки
lea ax,r1; загрузка смещения
mov sdvig,ax; в пер. sdvig
mov cx,7; кол-во рядков рамки
next1:
push cx
mov cx,sdvig
mov dh,stroka
mov dl,14h
call vivstr
inc stroka; переход на след. строку
add sdvig,42; переход на адрес след. строки
pop cx
loop next1
mov stroka,9
ret
endp ramka
begin:
mov ax,dseg
mov ds,ax
mov es,ax
opyat:
mov ax,03h; очистка экрана
int 10h
mov ax,1003h; выкл. бита мерцания
mov bl,0
int 10h
mov cx, 2000h; выкл. курсор
mov ah,01h
int 10h
call ramka; вывод рамки
call priglash; вывод приглашения
mov dx,0b35h; поз. курсора
mov cx,1
call probeli; вывод синего пробела
mov ah,3fh; ввод номера действия
mov bx,0
mov cx,3
lea dx,buf
int 21h
mov al,buf; определение номера действия
cmp al,'1'
je text
jmp kon
text:
call vvodvsego; ввод координат и цвета
call ramka
mov dx,0b1fh
lea cx,mes11
call vivstr; вывод приглашения о вводе строки
mov dx,0d1fh
mov cx, 20
call probeli; вывод синих пробелов
mov ah,3fh
mov bx,0
mov cx,22
lea dx,buftxt
int 21h; ввод строки символов
dec ax
dec ax
push ax
mov dx,koord+8
mov ax,hor
mul dx
mov hor,ax
mov dx,koord+8
mov ax,ver
mul dx
mov ver,ax
mov ax,13h
int 10h
mov ax,1130h; \
mov bh,byte ptr koord+4; — получение адреса матрицы символов; /
int 10h; /
mov di,0
pop cx
vivodvs:; цикл вывода символов
push cx; сохранение параметра цикла
mov al,buftxt+di; загрузка символа
push di; сохранение номера символа в; введённом массиве
mov cl,razm; \
mul cl; — получение величины сдвига в массиве матриц
mov si,ax; /
mov ah,0
mov bx,koord
mov x,bx
mov bx,koord+2
mov y,bx
mov cl,razm
glavn:; цикл вывода линии образа символа
push cx; параметра цикла
mov cx,koord+8
cikl:
push cx
push es; сохранение регистра
mov bx,x; загрузка координаты Х
mov ax,y; загрузка координаты Y
mov dx,320
mul dx
add ax,bx
mov di,ax; загрузка абс. адреса
dec di
mov dx,koord+4; загрузка цвета
mov al,es: [bp+si]; загрузка байта образа символа
mov cx,0a000h; — загрузка адреса видеобуфера
mov es,cx; /
mov cx,8; загрузка параметра цикла
zdvig:
rol al,1; сдвиг влево на 1 бит
jnc n4; если CF=0, то прыжок
push cx
mov cx,koord+8
n7:; цикл вывода точки
add bx,1; — определение признака выхода за экран
cmp bx,317; /
ja n8; если есть, то прыжок
inc di; приращение координаты
mov es: [di],dl; вывод точки
loop n7
n8:
pop cx
jmp n6
n4:
add di,koord+8
n6:
loop zdvig
pop es; восстановление сегмента образов символов
pop cx
inc word ptr y; увеличение коорд. Y
loop cikl
inc si; переход на след. байт образа символа
pop cx
loop glavn
pop di; восстановление номера символа в массиве
inc di; переход на след. символ
mov ax,koord
add ax,hor
mov koord,ax
mov ax,koord+2
add ax,ver
mov koord+2,ax
cmp koord,319; определение признака выхода за экран
ja zaderg; если есть, то прыжок
cmp koord+2, 199; определение признака выхода за экран
ja zaderg; если есть, то прыжок
pop cx; восстановление параметра цикла
loop vivodvseh
jmp zaderg
vivodvseh:
jmp vivodvs
zaderg:
mov ah,00
int 16h
mov indeks,0
jmp opyat
kon:
mov ax,4c00h
int 21h
cseg ends
end begin
б).Блок – схема алгоритму.
/>
зістор. до стор.
28. 28
зістор. до стор.
28 28
зістор. до стор.
28 28
достор. 27
/>зістор.26
ні
так
до стор.
28
ні
так
зістор. зі стор.
/> 27 26
достор.
26
зістор.
26
достор.
26
зістор.
26
так
так
достор. 26
/>
/>
так
ні
ні
так
/>
/>зістор. достор. 32
31
/> достор. 33
зістор.
32