Вирiзання картинок з екрану та запис їх в BMP форматi (для графiки) i TXT форматi (для тексту)
Мiнiстерство освiти та науки України
Кафедра програмного забезпечення
КУРСОВА РОБОТА
з дисциплiни
“Програмування мовою ASM-86”
на тему:
“Вирiзання картинок з екрану та запис їх в BMPформатi (для графiки) i TXT форматi (для тексту)”
Змiст
2. Постановка задачi
3. Обґрунтування методу розв’язку
4. Алгоритм програми
5. Реалiзацiя програми
7. Інструкцiя користувача
9. Використана лiтература
Лiстинг програми
1. Вступ
При роботi буває необхiдно “перехопити” текстову або графiчну iнформацiю, яку виводять на екран рiзнi програми, в текстовий або графiчний файл для подальшої обробки. Для такої мети використовують резидентнi програми.
Для роботи нам знадобиться опис заголовку ВМР-файла. Його можна знайти в додатку (в лiстингу файла grabber. inc).
Розробити резидентну програму на асемблерi, яка дозволить перехопити змiст текстового та графiчного екрану у файл (вiдповiдно TXT i BMP).
Для того, щоб записувати змiст екрану, будемо читати його з вiдеопам’ятi. Для роботи з файлами можна використовувати функцiї ОС (з переривання 21h). Але при використаннi функцiй ДОС з обробника переривань виникає проблема нереентерабельностi ДОС (тобто не можна викликати сервiс ДОС пiд час роботи будь-якої її функцiї). Тому використовується перехоплення не документованого переривання ДОС 28h, яке викликається в той момент, коли система вiльна. В цей час можна викликати функцiї.
Графiчних режимiв дуже багато. Для реалiзацiї виберемо режим 3 (текстовий ) i 13h (графiчний – режим 320х200х256 кольорiв).
4. Алгоритм програми
1. Встановити обробники переривань 5 i 28h.
2. Залишити резидент в пам'ятi.
Обробка переривання 5.
1. Встановити змiнну, яка сигналiзує про натиснення клавiшi, в 1.
Обробка переривання 28.
1. Визначити режим екрану.
2. Вiдкрити файл на запис.
3. У разi текстового файлу записати побайтно змiст вiдеопам’ятi у файл i перейти на п. 5.
5. Закрити файл.
5. Реалiзацiя програми
Пiсля запуску програма встановлює обробник на переривання 5 (клавiша PrintScreen) та 28h (переривання при якому вiдбувається збереження екрану). Потiм вона залишається резидентною в пам’ятi.
При натисканнi клавiшi PrintScreen встановлюється ознака про її натиснення. Коли ДОС звiльняється i виконує переривання 28, то при встановленiй ознацi вiдбувається збереження екрану. Створюється або обнуляється файл, визначається поточний режим екрану i спосiб запису, з разi текстового режиму у файл записується змiст вiдеопам’ятi у виглядi рядкiв, а у разi графiчного – заповнюється структура BMP файла, визначається палiтра, i все це разом зi змiстом графiчної областi вiдеопам’ятi записується у файл. Пiсля цього файл закривається i обробка завершується.
6. Системнi вимоги
Процесор: 80286 або старший.
Пам’ять: 640 К або бiльше
Екран: CGA або вище для тексту, VGA i вище для графiки
Для початку роботи програми треба запустити файл GRABBER.COM. Програма встановить свою резидентну частину i завершиться. Для зберiгання текстового або графiчного екрану треба натиснути клавiшу PrintScreen. У разi текстового режиму у поточному каталозi з’явиться файл dump.txtзi змiстом екрану, а у разi графiчного режиму 320х200х256 – файл dump.bmp. Для вивантаження програми з пам’ятi можна використати функцiї оболонки VC.
Отже, завдяки виконанню роботи продемонстровано методи створення резидент них програм, використання функцiй MS-DOS в обробнику переривань завдяки недокументованому перериванню 28, розглянута структура графiчних файлiв формату ВМР.
9. Використана лiтература
1. Том Сван "Освоение Turbo Assembler"
2. Роберт Журден "Справочник программиста на персональном компьютере фирмы IBM"
3. Абель П. "Мова Асемблера для IBM PC та програмування"
ЛІСТИНГ ПРОГРАМИ
grabber. asm
. model tiny
. 286
. code
oldint28treater dd 0
readytowrite db 0
filenamebmp db 'dump.bmp',0
col dw 0
<>
bmpinfo BITMAPINFOHEADER <>
bmprgb RGBQUAD <>
;-------------------------------------------------------
; створення BMP файлу
createfilebmp proc
;створити файл
mov ah,3ch
xor cx,cx
mov dx,offset filenamebmp
push cs
pop ds
int 21h
pop ds
mov word ptr cs:[handle],ax ;хендл на файл
ret
; створення файлу
createfile proc
;створити файл
mov ah,3ch
xor cx,cx
push ds
push cs
pop ds
int 21h
pop ds
ret
createfile endp
;--------------------------------------------------------
;закриття файлу
mov ah,3eh
int 21h
ret
;перехопити режим 320x200x256 (13h)
;запис таблицi заголовка bmp
mov word ptr cs:[bmpheader. bfType],4d42h
mov word ptr cs:[bmpheader. bfReserved1],0
mov word ptr cs:[bmpheader. bfReserved2],0
mov word ptr cs:[bmpheader. bfSize+2],0
mov word ptr cs:[bmpheader. bfOffbits],0436h
;запис таблицi iнформацiї
mov word ptr cs:[bmpinfo. biSize],28h
mov word ptr cs:[bmpinfo. biHeight],0c8h
mov word ptr cs:[bmpinfo. biSize+2],0
mov word ptr cs:[bmpinfo. biWidth+2],0
mov word ptr cs:[bmpinfo. biHeight+2],0
mov word ptr cs:[bmpinfo. biPlanes],1
mov word ptr cs:[bmpinfo. biBitCount],8
mov word ptr cs:[bmpinfo. biSizeImage],0
mov word ptr cs:[bmpinfo. biClrImportant],0
mov word ptr cs:[bmpinfo. biCompression+2],0
mov word ptr cs:[bmpinfo. biSizeImage+2],0
mov word ptr cs:[bmpinfo. biXPelsPerMeter+2],0
mov word ptr cs:[bmpinfo. biYPelPerMeter+2],0
mov word ptr cs:[bmpinfo. biClrUsed+2],0
mov word ptr cs:[bmpinfo. biClrImportant+2],0
;запис BITMAPFILEHEADER
mov cx,size bmpheader
mov ah,40h
mov bx,word ptr cs:[handle]
push ds
pop ds
mov dx,offset bmpheader
int 21h
pop ds
;======================================================
;запис BITMAPINFOHEADER
mov cx,size bmpinfo
mov ah,40h
mov bx,word ptr cs:[handle]
push ds
push cs
pop ds
mov dx,offset bmpinfo
int 21h
pop ds
;======================================================
;отримання i запис палiтри
SAVEP:
push cx
;дiстаємо палiтру
mov dx,03c8h
mov ax,si
inc si
inc dx
shl al,2
mov byte ptr cs:[bmprgb. rgbBlue],al
shl al,2
in al,dx
shl al,2
mov byte ptr cs:[bmprgb. rgbRserved],0
mov ah,40h
mov bx,word ptr cs:[handle]
push cs
pop ds
mov dx,offset bmprgb
int 21h
pop ds
;======================================================
;тепер записуємо графiчнi данi
push es
push ds
push cs
mov dx,offset data
mov cx,200
mov word ptr cs:[row],cx
mov cx,320
colsb: ;///////////
push ax
mov word ptr cs:[col],ax
push dx
push ax
push bx
mov ax,320
mul bx
add ax,word ptr cs:[col]
mov si,ax
pop bx
pop dx
mov al,es:[si]
mov byte ptr cs:[data],al
mov ah,40h
int 21h
pop cx
add si,2
loop colsb
;///////////
pop cx
;///////////
loop rowsb
pop ds
pop es
ret
mode13h endp
;--------------------------------------------------------
;перехопити текстовий режим
modetext proc
push es
pop ds
mov es,dx
xor si,si
mov bx,word ptr cs:[handle]
mov cx,25
rows:
;///////////
push cx
mov cx,80
cols: ;///////////
push cx
mov cx,1
mov byte ptr cs:[data],al
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
int 21h
pop cx
pop ds
pop es
call closefile
ret
modetext endp
int28treater: ;обробник int 28h
pusha
pushf
;перевiрка чи є виклик до роботи
cmp byte ptr cs:[readytowrite],1
jne exit28
mov byte ptr cs:[readytowrite],0
mov ah,0fh
;в al - режим
cmp al,3
jne case2
call modetext ;textmode3
case2:
cmp al,13h
call mode13h ;320x200x25613h
case3:
exit28:
popf
popa
jmp dword ptr cs:[oldint28treater]
;--------------------------------------------------------------------
int5treater: ;обробник клавiшi PrintScreen
mov byte ptr cs:[readytowrite],1
iret
rezidentend:
;-------------------------------------------------------------------
greeting db 10,10,10,10,13,'Press PRINTSCREEN to grab text screen or graphic!',10,10,10,'$'
inital:
pop ds
mov dx,offset greeting
int 21h
;посадка резидента на int 5h
mov ds,ax
cli
mov ax,offset int5treater
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:[oldint28treater],ax
mov word ptr cs:[oldint28treater+2],ax
cli
mov ax,offset int28treater
mov word ptr ds:[28h*4],ax
push cs
mov word ptr ds:[28h*4+2],ax
sti
;Залишитись резидентно
mov dx,offset rezidentend
shr dx,4
add dx,16
mov ah,31h
xor al,al
int 21h
end start
------------------------------------------------------------------------
ФАЙЛ з описом структур grabber. inc
BITMAPFILEHEADER struc
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 ;//число битовых плоскостей устройства
biCompression dd 0 ;//тип сжатия
biXPelsPerMeter dd 0 ;//горизонтальное разрешение устройства,
;//пиксел/м
biYPelPerMeter dd 0 ;//вертикальное разрешение устройства,
"важных" цветов
BITMAPINFOHEADER ends
RGBQUAD struc
rgbRed db 0 ;//интенсивность красного
rgbGreen db 0 ;//интенсивность зеленого
rgbBlue db 0 ;//интенсивность голубого
RGBQUAD ends
|