Міністерство освіти та науки України
Кіровоградський Національний Технічний Університет
Факультет автоматики, енергетики та програмування
Кафедра програмного забезпечення
Дисципліна: “Програмування на мові ASM-86”
Курсова робота
на тему: “Реалізація функцій бібліотеки графіки для виводу тексту у графічному режимі (OutTextXY, SetTextStyle)”
Виконав: ст. гр. ПЗ 02 - 1
Антипенко П.С.
Перевірив: викладач
Приходькін Н.А.
Кіровоград 2004 р.
Зміст
1. Призначення та область використання програми
1.2 Обґрунтування вибору методів розв’язання задачі
Вступ
Становлення високоефективної світової економіки, неможливо без розвиненого ринку програмних засобів і засобів зв’язку. Тепер комп’ютери відіграють у житті людини велику роль, бо в ті часи коли ще не було комп’ютерів, людина витрачала свій час на ручну роботу, в той час щоб робити щось інше. На сучасному етапі комп’ютери, комп’ютерні засоби є найбільш розвиненні та найпродуктивніші машини.
Зараз з їх допомогою ми можемо проводити числові розрахунки, створювати фільми, музику, проводимо управління заводами та космічними кораблями, пишемо нові корисні програми. Комп’ютери отримали широке розповсюдження, стали універсальним засобом для обробки усіх видів інформації, які використовує людина. Тому розробка програмних засобів для комп’ютерів стала актуальною проблемою сучасності. Одним із засобів створення програмного забезпечення є мова 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