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