Курсовая работа: Вирізання картинок з екрану та запис їх в BMP форматі (для графіки) і TXT форматі (для тексту)
Курсовая работа: Вирізання картинок з екрану та запис їх в BMP форматі (для графіки) і TXT форматі (для тексту)
Міністерство
освіти та науки України
Кіровоградський
Державний Технічний університет
Кафедра
програмного забезпечення
КУРСОВА
РОБОТА
з
дисципліни
“Програмування
мовою ASM-86”
на
тему:
“Вирізання
картинок з екрану та запис їх в BMP форматі (для графіки) і TXT форматі (для тексту)”
Зміст
1.
Вступ
2.
Постановка
задачі
3.
Обґрунтування
методу розв’язку
4.
Алгоритм
програми
5.
Реалізація
програми
6.
Системні
вимоги
7.
Інструкція
користувача
8.
Висновок
9.
Використана
література
Лістинг програми
1.
Вступ
При роботі буває
необхідно “перехопити” текстову або графічну інформацію, яку виводять на екран
різні програми, в текстовий або графічний файл для подальшої обробки. Для такої
мети використовують резидентні програми.
Для роботи нам
знадобиться опис заголовку ВМР-файла. Його можна знайти в додатку (в лістингу
файла grabber.inc).
2.
Постановка задачі
Розробити
резидентну програму на асемблері, яка дозволить перехопити зміст текстового та
графічного екрану у файл (відповідно TXT і BMP).
3.
Обґрунтування вибору методів розв’язку задачі
Для того, щоб
записувати зміст екрану, будемо читати його з відеопам’яті. Для роботи з
файлами можна використовувати функції ОС (з переривання 21h). Але при використанні функцій ДОС з
обробника переривань виникає проблема нереентерабельності ДОС (тобто не можна
викликати сервіс ДОС під час роботи будь-якої її функції). Тому
використовується перехоплення не документованого переривання ДОС 28h, яке викликається в той момент, коли
система вільна. В цей час можна викликати функції.
Графічних режимів
дуже багато. Для реалізації виберемо режим 3 (текстовий ) і 13h (графічний – режим 320х200х256
кольорів).
4.
Алгоритм програми
1. Встановити
обробники переривань 5 і 28h.
2. Залишити
резидент в пам'яті.
Обробка
переривання 5.
1. Встановити змінну,
яка сигналізує про натиснення клавіші, в 1.
Обробка
переривання 28.
1. Визначити
режим екрану.
2. Відкрити файл
на запис.
3. У разі
текстового файлу записати побайтно зміст відеопам’яті у файл і перейти на п. 5.
4. У разі графіки
заповнити структуру заголовка ВМР-файла, записати палітру і всі графічні дані у
файл. Графіка записується, починаючи з лівого нижнього кута екрану.
5. Закрити файл.
6. Стоп
5.
Реалізація програми
Після
запуску програма встановлює обробник на переривання 5 (клавіша Print Screen) та 28h (переривання при якому відбувається збереження екрану).
Потім вона залишається резидентною в пам’яті.
При натисканні клавіші
Print Screen встановлюється ознака про її
натиснення. Коли ДОС звільняється і виконує переривання 28, то при встановленій
ознаці відбувається збереження екрану. Створюється або обнуляється файл,
визначається поточний режим екрану і спосіб запису, з разі текстового режиму у
файл записується зміст відеопам’яті у вигляді рядків, а у разі графічного –
заповнюється структура BMP файла, визначається палітра, і все це разом зі змістом графічної області
відеопам’яті записується у файл. Після цього файл закривається і обробка
завершується.
6.
Системні вимоги
Процесор:
80286 або старший.
Пам’ять: 640 К
або більше
Екран: CGA або вище для тексту, VGA і вище для графіки
ОС: MS-DOS 4.0 або вище
7. Інструкція
користувача
Для початку роботи програми треба
запустити файл GRABBER.COM. Програма встановить свою резидентну
частину і завершиться. Для зберігання текстового або графічного екрану треба
натиснути клавішу Print Screen. У разі текстового режиму у поточному
каталозі з’явиться файл dump.txt зі змістом екрану, а у разі
графічного режиму 320х200х256 – файл dump.bmp. Для вивантаження програми з пам’яті
можна використати функції оболонки VC.
8.
Висновок
Отже, завдяки
виконанню роботи продемонстровано методи створення резидент них програм,
використання функцій MS-DOS в обробнику переривань
завдяки недокументованому перериванню 28, розглянута структура графічних файлів
формату ВМР.
9.
Використана література
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