Меню
  Список тем
  Поиск
Полезная информация
  Краткие содержания
  Словари и энциклопедии
  Классическая литература
Заказ книг и дисков по обучению
  Учебники, словари (labirint.ru)
  Учебная литература (Читай-город.ru)
  Учебная литература (book24.ru)
  Учебная литература (Буквоед.ru)
  Технические и естественные науки (labirint.ru)
  Технические и естественные науки (Читай-город.ru)
  Общественные и гуманитарные науки (labirint.ru)
  Общественные и гуманитарные науки (Читай-город.ru)
  Медицина (labirint.ru)
  Медицина (Читай-город.ru)
  Иностранные языки (labirint.ru)
  Иностранные языки (Читай-город.ru)
  Иностранные языки (Буквоед.ru)
  Искусство. Культура (labirint.ru)
  Искусство. Культура (Читай-город.ru)
  Экономика. Бизнес. Право (labirint.ru)
  Экономика. Бизнес. Право (Читай-город.ru)
  Экономика. Бизнес. Право (book24.ru)
  Экономика. Бизнес. Право (Буквоед.ru)
  Эзотерика и религия (labirint.ru)
  Эзотерика и религия (Читай-город.ru)
  Наука, увлечения, домоводство (book24.ru)
  Наука, увлечения, домоводство (Буквоед.ru)
  Для дома, увлечения (labirint.ru)
  Для дома, увлечения (Читай-город.ru)
  Для детей (labirint.ru)
  Для детей (Читай-город.ru)
  Для детей (book24.ru)
  Компакт-диски (labirint.ru)
  Художественная литература (labirint.ru)
  Художественная литература (Читай-город.ru)
  Художественная литература (Book24.ru)
  Художественная литература (Буквоед)
Реклама
Разное
  Отправить сообщение администрации сайта
  Соглашение на обработку персональных данных
Другие наши сайты
Приглашаем посетить
  Дружинин (druzhinin.lit-info.ru)

   

Вирізання картинок з екрану та запис їх в BMP форматі (для графіки) і TXT форматі (для тексту)

Вир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