Курсовая работа: Вирізання картинок з екрану та запис їх в BMP форматі (для графіки) і TXT форматі (для тексту)
Курсовая работа: Вирізання картинок з екрану та запис їх в BMP форматі (для графіки) і TXT форматі (для тексту)
Міністерство
освіти та науки України
Кіровоградський
Державний Технічний університет
Кафедра
програмного забезпечення
КУРСОВА РОБОТА
з дисципліни
«Програмування
мовою ASM-86»
на тему:
«Вирізання
картинок з екрану та запис їх в BMP форматі (для графіки) і TXT форматі (для тексту)»
Зміст
Завдання
Вступ
1. Постановка задачі
2. Обґрунтування методу
розв’язку
3. Алгоритм програми
4. Реалізація програми
5. Системні вимоги
6. Інструкція користувача
Висновок
Використана література
Лістинг програми
Вступ
При
роботі буває необхідно «перехопити» текстову або графічну інформацію, яку
виводять на екран різні програми, в текстовий або графічний файл для подальшої
обробки. Для такої мети використовують резидентні програми.
Для
роботи нам знадобиться опис заголовку ВМР-файла. Його можна знайти в додатку (в
лістингу файла grabber.inc).
1. Постановка
задачі
Розробити
резидентну програму на асемблері, яка дозволить перехопити зміст текстового та
графічного екрану у файл (відповідно TXT і BMP).
2.
Обґрунтування вибору методів розв’язку задачі
Для
того, щоб записувати зміст екрану, будемо читати його з відеопам’яті. Для
роботи з файлами можна використовувати функції ОС (з переривання 21h). Але при
використанні функцій ДОС з обробника переривань виникає проблема
нереентерабельності ДОС (тобто не можна викликати сервіс ДОС під час роботи
будь-якої її функції). Тому використовується перехоплення не документованого
переривання ДОС 28h, яке викликається в той момент, коли система вільна. В цей час
можна викликати функції.
Графічних
режимів дуже багато. Для реалізації виберемо режим 3 (текстовий) і 13h (графічний –
режим 320х200х256 кольорів).
3.
Алгоритм програми
1.
Встановити обробники переривань 5 і 28h.
2.
Залишити резидент в пам'яті.
Обробка
переривання 5.
1.
Встановити змінну, яка сигналізує про натиснення клавіші, в 1.
Обробка
переривання 28.
1.
Визначити режим екрану.
2.
Відкрити файл на запис.
3. У
разі текстового файлу записати побайтно зміст відеопам’яті у файл і перейти на
п. 5.
4. У
разі графіки заповнити структуру заголовка ВМР-файла, записати палітру і всі
графічні дані у файл. Графіка записується, починаючи з лівого нижнього кута
екрану.
5.
Закрити файл.
6.
Стоп
4.
Реалізація програми
Після запуску програма
встановлює обробник на переривання 5 (клавіша Print Screen) та 28h (переривання при якому
відбувається збереження екрану). Потім вона залишається резидентною в пам’яті.
При
натисканні клавіші Print Screen встановлюється ознака про її натиснення. Коли
ДОС звільняється і виконує переривання 28, то при встановленій ознаці
відбувається збереження екрану. Створюється або обнулюється файл, визначається
поточний режим екрану і спосіб запису, з разі текстового режиму у файл
записується зміст відеопам’яті у вигляді рядків, а у разі графічного –
заповнюється структура BMP файлу, визначається палітра, і все це разом зі
змістом графічної області відеопам’яті записується у файл. Після цього файл
закривається і обробка завершується.
5.
Системні вимоги
Процесор: 80286 або
старший.
Пам’ять:
640 К або більше
Екран:
CGA або вище для
тексту, VGA і вище для графіки
ОС: MS-DOS 4.0 або вище
6.
Інструкція користувача
Для початку роботи
програми треба запустити файл GRABBER.COM. Програма встановить свою резидентну частину і завершиться. Для зберігання
текстового або графічного екрану треба натиснути клавішу Print Screen. У разі текстового режиму у поточному каталозі з’явиться файл dump.txt зі змістом екрану, а у разі графічного режиму
320х200х256 – файл dump.bmp. Для вивантаження програми з пам’яті можна використати функції оболонки VC.
Висновок
Отже,
завдяки виконанню роботи продемонстровано методи створення резидент них
програм, використання функцій MS-DOS в обробнику переривань завдяки не
документованому перериванню 28, розглянута структура графічних файлів формату
ВМР.
Використана
література
1. Том Сван «Освоение
Turbo Assembler»
2. Роберт Журден «Справочник программиста на
персональном компьютере фирмы IBM»
3. Абель П. «Мова
Асемблера для IBM PC та програмування»
Лістинг
програми
grabber.asm
model
tiny
286
include
grabber.inc
code
org
100h
start:
jmp
inital
old_int28_treater
dd 0
ready_to_write
db 0
filename_bmp
db 'dump.bmp', 0
filename
db 'dump.txt', 0
handle
dw 0
data db
0
col dw
0
row dw
0
bmp_header
BITMAPFILEHEADER <>
bmp_info
BITMAPINFOHEADER <>
bmp_rgb
RGBQUAD <>
;–
; створення
BMP файлу
create_file_bmp
proc
; створити
файл
mov ah,
3ch
xor
cx, cx
mov
dx, offset filename_bmp
push
ds
push
cs
pop
ds
int
21h
pop
ds
mov
word ptr cs: [handle], ax; хендл на файл
ret
create_file_bmp
endp
; створення
файлу
create_file
proc
; створити
файл
mov ah,
3ch
xor
cx, cx
mov
dx, offset filename
push
ds
push
cs
pop
ds
int
21h
pop
ds
mov
word ptr cs: [handle], ax; хендл на файл
ret
create_file
endp
;–
; закриття
файлу
close_file
proc
mov ah,
3eh
mov
bx, word ptr cs: [handle]
int
21h
ret
close_file
endp
;–
; перехопити
режим 320x200x256 (13h)
mode_13h
proc
call
create_file_bmp
; запис
таблицi заголовка bmp
mov
word ptr cs: [bmp_header.bfType], 4d42h
mov
word ptr cs: [bmp_header.bfReserved1], 0
mov
word ptr cs: [bmp_header.bfReserved2], 0
mov
word ptr cs: [bmp_header.bfSize], 0fe36h
mov
word ptr cs: [bmp_header.bfSize+2], 0
mov
word ptr cs: [bmp_header.bfOffbits], 0436h
mov
word ptr cs: [bmp_header.bfOffbits+2], 0
; запис
таблицi iнформацiї
mov
word ptr cs: [bmp_info.biSize], 28h
mov
word ptr cs: [bmp_info.biWidth], 140h
mov
word ptr cs: [bmp_info.biHeight], 0c8h
mov
word ptr cs: [bmp_info.biSize+2], 0
mov
word ptr cs: [bmp_info.biWidth+2], 0
mov
word ptr cs: [bmp_info.biHeight+2], 0
mov
word ptr cs: [bmp_info.biPlanes], 1
mov
word ptr cs: [bmp_info.biBitCount], 8
mov
word ptr cs: [bmp_info.biCompression], 0
mov
word ptr cs: [bmp_info.biSizeImage], 0
mov
word ptr cs: [bmp_info.biXPelsPerMeter], 0b40h
mov
word ptr cs: [bmp_info.biYPelPerMeter], 0b40h
mov
word ptr cs: [bmp_info.biClrUsed], 100h
mov
word ptr cs: [bmp_info.biClrImportant], 0
mov
word ptr cs: [bmp_info.biCompression+2], 0
mov
word ptr cs: [bmp_info.biSizeImage+2], 0
mov
word ptr cs: [bmp_info.biXPelsPerMeter+2], 0
mov
word ptr cs: [bmp_info.biYPelPerMeter+2], 0
mov
word ptr cs: [bmp_info.biClrUsed+2], 0
mov
word ptr cs: [bmp_info.biClrImportant+2], 0
; запис
BITMAPFILEHEADER
mov
cx, size bmp_header
mov ah,
40h
mov
bx, word ptr cs: [handle]
push
ds
push
cs
pop
ds
mov
dx, offset bmp_header
int
21h
pop
ds
;======================================================
; запис
BITMAPINFOHEADER
mov
cx, size bmp_info
mov ah,
40h
mov
bx, word ptr cs: [handle]
push
ds
push
cs
pop
ds
mov
dx, offset bmp_info
int
21h
pop
ds
;======================================================
; отримання
i запис палiтри
mov cx,
256
xor
si, si
SAVE_P:
push
cx
; дiстаємо
палiтру
mov dx,
03c8h
mov
ax, si
inc
si
out
dx, al
inc
dx
in al,
dx
shl al,
2
mov
byte ptr cs: [bmp_rgb.rgbBlue], al
in al,
dx
shl al,
2
mov
byte ptr cs: [bmp_rgb.rgbGreen], al
in al,
dx
shl al,
2
mov
byte ptr cs: [bmp_rgb.rgbRed], al
mov
byte ptr cs: [bmp_rgb.rgbRserved], 0
; пишемо
палiтру – 1 колiр
mov
cx, size bmp_rgb
mov ah,
40h
mov
bx, word ptr cs: [handle]
push
ds
push
cs
pop
ds
mov
dx, offset bmp_rgb
int
21h
pop
ds
pop
cx
loop
SAVE_P
;======================================================
; тепер
записуємо графiчнi данi
push
es
push
ds
push
cs
pop
ds
mov dx,
0a000h
mov
es, dx
mov
bx, word ptr cs: [handle]
mov
dx, offset data
mov cx,
200
rows_b:
; ///////////
mov
word ptr cs: [row], cx
push
cx
mov cx,
320
cols_b:; ///////////
push
ax
mov ax,
320
sub
ax, cx
mov
word ptr cs: [col], ax
pop
ax
push
cx
mov cx,
1
; обчислення
змiщення
push
dx
push
ax
push
bx
mov ax,
320
mov
bx, word ptr cs: [row]
mul
bx
add
ax, word ptr cs: [col]
mov
si, ax
pop
bx
pop
ax
pop
dx
mov
al, es: [si]
mov
byte ptr cs: [data], al
mov ah,
40h
int
21h
pop
cx
add si,
2
loop
cols_b
; ///////////
pop
cx
; ///////////
loop
rows_b
pop
ds
pop
es
call
close_file
ret
mode_13h
endp
;–
; перехопити
текстовий режим
mode_text
proc
call
create_file
push
es
push
ds
push
cs
pop
ds
mov dx,
0b800h
mov
es, dx
xor
si, si
mov
bx, word ptr cs: [handle]
mov
dx, offset data
mov cx,
25
rows:
; ///////////
push
cx
mov cx,
80
cols:; ///////////
push
cx
mov cx,
1
mov
al, es: [si]
mov
byte ptr cs: [data], al
mov ah,
40h
int
21h
pop
cx
add si,
2
loop
cols
; ///////////
; запис
10,13
mov cx,
1
mov
byte ptr cs: [data], 10
mov ah,
40h
int
21h
mov
byte ptr cs: [data], 13
mov ah,
40h
int
21h
pop
cx
; ///////////
loop
rows
pop
ds
pop
es
call
close_file
ret
mode_text
endp
;–
int28_treater:;
обробник int 28h
pusha
pushf
; перевiрка
чи є виклик до роботи
cmp
byte ptr cs: [ready_to_write], 1
jne
exit_28
; обнулити
показник
mov
byte ptr cs: [ready_to_write], 0
; починається
обробка
mov ah,
0fh
int
10h
; в
al – режим
cmp al,
3
jne
case_2
call
mode_text; text_mode_3
jmp
exit_28
case_2:
cmp al,
13h
jne
case_3
call
mode_13h; 320x200x256_13h
jmp
exit_28
case_3:
; вихiд
exit_28:
popf
popa
jmp
dword ptr cs: [old_int28_treater]
;–
int5_treater:;
обробник клавiшi PrintScreen
mov
byte ptr cs: [ready_to_write], 1
iret
rezident_end:
;–
; ГОЛОВНА
ТОЧКА ВХОДУ У ПРОГРАМУ
greeting
db 10,10,10,10,13,'Press PRINT_SCREEN to grab text screen or graphic!', 10,10,10,'$'
inital:
push
cs
pop
ds
mov
dx, offset greeting
mov ah,
9h
int
21h
; посадка
резидента на int 5h
xor
ax, ax
mov
ds, ax
cli
mov
ax, offset int5_treater
mov
word ptr ds: [5h*4], ax
push
cs
pop
ax
mov
word ptr ds: [5h*4+2], ax
sti
; посадка
резидента на int 28h
mov
ax, word ptr ds: [28h*4]
mov
word ptr cs: [old_int28_treater], ax
mov
ax, word ptr ds: [28h*4+2]
mov
word ptr cs: [old_int28_treater+2], ax
cli
mov
ax, offset int28_treater
mov
word ptr ds: [28h*4], ax
push
cs
pop
ax
mov
word ptr ds: [28h*4+2], ax
sti
; Залишитись
резидентно
mov
dx, offset rezident_end
shr dx,
4
add dx,
16
mov ah,
31h
xor
al, al
int
21h
end
start
–
ФАЙЛ
з описом структур grabber.inc
BITMAPFILEHEADER
struc
bfType
dw 0; // тип файла (для битового образа – BM)
bfSize
dd 0; // размер файла в dword
bfReserved1
dw 0; // не используется
bfReserved2
dw 0; // не используется
bfOffbits
dd 0; // смещение данных битового образа от
; //
заголовка в байтах
BITMAPFILEHEADER
ends
;======================================================
BITMAPINFOHEADER
struc
biSize
dd 0; // число байт, занимаемых структурой
; //BITMAPINFOHEADER
biWidth
dd 0; // ширина битового образа в пикселах
biHeight
dd 0; // высота битового образа в пикселах
biPlanes
dw 1; // число битовых плоскостей устройства
biBitCount
dw 0; // число битов на пиксель
biCompression
dd 0; // тип сжатия
biSizeImage
dd 0; // размер картинки в байтах
biXPelsPerMeter
dd 0; // горизонтальное разрешение устройства,
; //
пиксел/м
biYPelPerMeter
dd 0; // вертикальное разрешение устройства,
; //
пиксел/м
biClrUsed
dd 0; // число используемых цветов
biClrImportant
dd 0; // число «важных» цветов
BITMAPINFOHEADER
ends
;======================================================
RGBQUAD
struc
rgbRed
db 0; // интенсивность красного
rgbGreen
db 0; // интенсивность зеленого
rgbBlue
db 0; // интенсивность голубого
rgbRserved
db 0; // не используется
RGBQUAD
ends