Помощь в написании студенческих работ
Антистрессовый сервис

Запись в графический файл формата BMP

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

CF=0, если функция выполнилась успешно АХ не сохранен CF=1, если при выполнении функции возникли ошибки АХ — код ошибки Описание. Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значащими являются только младшие 6 бит. CF=0, если функция выполнена успешно АХ — описатель файла CF=1, если при выполнении функции возникли ошибки АХ — код ошибки. Функция производит… Читать ещё >

Запись в графический файл формата BMP (реферат, курсовая, диплом, контрольная)

1. Задание

2. Описание работы программы

3. Блок схемы

4. Текст программы Список использованной литературы

1. Задание Разработать программу, осуществляющую запись команд графического экрана в файл формата BMP.

2. Описание работы программы Используемые прерывания

DOS, функция 09h int 21h Запись строки на стандартный вывод Вход:

АН-09Н

DS:DX — адрес строки, заканчивающейся символом «$» (ASCII 24h)

Описание.

Строка, исключая завершающий ее символ «$», посылается на стандартный вывод.

DOS, функция 3Ch Создать файл через описатель Вход:

АН-ЗСh

DS:DX — адрес строки ASCIZ с именем файла СХ — атрибут файла Выход:

CF=0, если функция выполнена успешно АХ — описатель файла CF=1, если при выполнении функции возникли ошибки АХ — код ошибки

DOS, функция 40h Писать в файл через описатель Вход:

AH=40h

ВХ — описатель файла

DS:DX — адрес буфера, содержащего записываемые данные СХ — число записываемых байт Выход:

CF=0, если функция выполнена успешно

AX — число действительно записанных байт CF°1, если при выполнении функции возникли ошибки

AX — код ошибки Описание.

СХ байт данных записываются в файл или на устройство с описателем, заданным в ВХ. Данные берутся из буфера, адресуемого через DS: DX, и записываются, начиная с текущей позиции указателя чтения/записи файла. Чтобы установить указатель файла, если необходимо, можно использовать функцию 42h. Обновляет указатель чтения/записи файла, чтобы подготовиться к последующим операциям чтения или записи.

DOS, функция 3Eh Закрыть описатель файла Вход:

АН-ЗЕh ВХ — описатель файла Выход:

CF=0, если функция выполнилась успешно АХ не сохранен CF=1, если при выполнении функции возникли ошибки АХ — код ошибки Описание.

ВХ содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буферы сбрасываются и оглавление обновляется корректными размером, временем и датой. Из-за недостатка описателей файлов (максимум 20, по умолчанию установлено 8), возможно, придется закрыть часть текущих описателей, как, например, описатель 3 (стандартный AUX).

DOS, функция 35h int 21h Получить вектор прерывания Вход:

AH-35h AL — номер прерывания (OOh до FFh)

Выход:

ES:BX — адрес обработчика прерывания Описание.

Возвращает значение вектора прерывания для INT (AL), то есть загружает в ВХ 0000:[AL*4], а в ES — 0000:[(AL*4)+2].

DOS, функция 25h Установить вектор прерывания Вход:

AH=25h

AL — номер прерывания

DS:DX — вектор прерывания — адрес программы обработки прерывания Описание. Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL, равным DS: DX. Это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS знает, что происходит, и гарантирует, что в момент записи прерывания будут заблокированы. DOS, функция 31h int 21h Завершиться и остаться резидентным Вход:

AH=31h

AL — код выхода

DX — объем памяти, оставляемой резидентной (в параграфах) Описание.

Выходит в родительский процесс, сохраняя код выхода в AL. Код выхода можно получить через функцию 4Dh. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную память резидентной (число байт равно DX*16). Эта функция перекрывает функцию INT 27h, которая не возвращает код выхода и не способна установить резидентную программу, размер которой превышает 64Кбайт. Int 10h Чтение нескольких регистров таблицы цветов (регистров ЦАП) — подфункция 17h

Функция производит чтение 18-битовых значений из нескольких последовательно расположенных регистров таблицы цветов:

На входе:

AH

10h

AL

17h — чтение нескольких регистров таблицы цветов

BL

Номер первого регистра таблицы цветов (0 -255)

CX

Количество регистров для чтения (1−256)

ES:DX

Адрес буфера для таблицы цветов

На выходе:

ES:DX

Данные прочитанные из таблицы цветов

Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значащими являются только младшие 6 бит.

3. Блок схемы

4. Текст программы

.model small

F5_key EQU 3fh; скан-код F5

.stack 100h

.data

din dw 0; флаг записи экрана 1-идет запись

int09old dd ?; хранит адрес перехваченного прерывания Int 09h

BMPFiledb 'scrgrb.bmp', 0; имя файла

; BMP-файл (для изображения 320×200×256)

BMP_headerlabelbyte

; файловый заголовок

BMP_file_headerdb" BM"; сигнатура

ddbfsize; размер файла

dw0,0; 0

ddbfoffbits; адрес начала BMP_data

; информационный заголовок

BMP_info_headerddbi_size; размер BMP_info_header

dd320; ширина

dd200; высота

dw1; число цветовых плоскостей

dw8; число битов на пиксель

dd0; метод сжатия данных

dd320*200; размер данных

dd0B13h; разрешение по X (пиксель на метр)72ppi

dd0B13h; разрешение по Y (пиксель на метр)72ppi

dd0; число используемых цветов (0 — все)

dd0; число важных цветов (0 — все)

bi_size = $-BMP_info_header; размер BMP_info_header

BMP_header_length = $-BMP_header; размер обоих заголовков

bfoffbits = $-BMP_file_header+256*4; размер заголовков + размер

; палитры

bfsize = $-BMP_file_header+256*4+320*200; размер заголовков +

; размер палитры + размер данных

Palette db 3*256−1 dup (0) ;для палитры

ePalette3 db 0;указ. на конец строки палитры полученой ф-й биос

db 255 dup (0)

ePalette4 db 0;указ. на конец сформированной палитры для записи в файл

info_mes db 'Copy text screen if press F5 in file «copy» ','$'; строка о программе

.code

int09new PROC

push ds

push ax

mov ax, @data; установить в DS сегмент данных программы

mov ds, ax

in al, 60h; получить сан-код нажатой клавиши

cmp al, F5_key; нажата клавиша F5

jz copy_file; если да, то начать запись экрана

pushf

call int09old; вызвать перехваченный обработчик Int 09h

pop ax

pop ds

iret

copy_file:

pushf

call int09old; вызвать перехваченный обработчик Int 09h

cmp din, 1; проверить флаг записи в файл

jnz do_file; начать записывать файл

pop ax

pop ds

iret

do_file:

push bx; сохранить исп. регистры

push cx

push dx

push si

push di

push es

mov din, 1

mov ax, 40h; установить ES на сег. окружение DOS (сег. с параметрами ОС)

mov es, ax

mov ah, byte ptr es:[49h]; номер текущего режима

;проверяем номер режима работать только в графическом 13h

cmp ah, 13h

je gr_mode_good; = если режим 13h

jmp exit

gr_mode_good:

mov ax, 3c00h+10 0010b; 3ch создать файл

xor cx, cx

lea dx, BMPFile

int 21h

jc ferr; если произошла ошибка при работе с файлом

mov bx, ax ;дескриптор файла

mov ax, 4000h; записать в файл заголовок

mov cx, BMP_header_length

lea dx, BMP_file_header

int 21h

jc ferr; если произошла ошибка при работе с файлом

push bx

push ds

pop es

movax, 1017h; Функция 1017h — чтение палитры VGA

movbx, 0; начиная с регистра палитры 0,

movcx, 256; все 256 регистров

movdx, offset Palette; начало палитры в BMP

int10h; видеосервис BIOS

; перевести палитру из формата, в котором ее показывает функция 1017h

; (три байта на цвет, в каждом байте 6 значимых битов)

; в формат, используемый в BMP-файлах

; (4 байта на цвет, в каждом байте 8 значимых битов)

std; движение от конца к началу

movsi, offset ePalette3; SI — конец 3-байтной палитры

movdi, offset ePalette4; DI — конец 4-байтной палитры

movcx, 256; CX — число цветов

adj_pal: moval, 0

push cx

mov cx, 2

stosb; записать четвертый байт (0)

lodsb; прочитать третий байт

shlal, cl; масштабировать до 8 битов

pushax

lodsb; прочитать второй байт

shlal, cl; масштабировать до 8 битов

pushax

lodsb; прочитать третий байт

shlal, cl; масштабировать до 8 битов

stosb; и записать эти три байта

popax; в обратном порядке

stosb

popax

stosb

pop cx

loopadj_pal

pop bx; дискриптор файла восстановить из стека

mov ax, 4000h; записать в файл заголовок

mov cx, 256*4

mov dx, offset Palette

int 21h

jc ferr; если произошла ошибка при работе с файлом

push ds

mov ax, 0a000h; загрузить сегмент начала видеопамяти

mov ds, ax

mov dx, 320*199; указывает на последную строку экрана

mov di, 200; количество строк экрана

str_copy:

mov ax, 4000h; записать в файл строку экрана

mov cx, 320

int 21h

jc ferr; если произошла ошибка при работе с файлом

sub dx, 320; вычислить адрес следующей строки для записи

dec di; уменьшить счетчик строк для записи

jnz str_copy

pop ds

close_file:

mov ax, 3e00h; закрыть файл

int 21h

jc ferr

ferr:

exit:

mov din, 0;флаг занятости обнулить

pop es

pop di

pop si

pop dx

pop cx

pop bx

pop ax

pop ds

iret

int09new endp

.startup

mov ax, 0900h; вывести информацию о программе

lea dx, info_mes

int 21h

mov ax, 3509h; получить адрес обработчика Int 09h

int 21h

mov word ptr int09old, bx; сохранить адрес ES: BX в переменной int09old

mov word ptr int09old+2, es

push ds

mov ax,@code

mov ds, ax

mov ax, 2509h; установить новый обработчик Int 09h с адресом DS: DX

mov dx, offset int09new

int 21h

pop ds

mov dx, offset info_mes; размер сегмента данных для резидентной части

add dx, offset end_cs; размер сегмента кода

add dx, 120h; для выравнивания на параграфы+PSP

mov cx, 4

shr dx, cl; выразить размер программы в параграфах DX/16

mov ax, 3100h; оставим часть резидентной

int 21h

end_cs label byte

end

программа графический файл команда

1. Джордан Ассемблер

2. Юров А. Н.

Введение

в ассемблер

3. П. Нортон Справочник по ассемблеру

4. Ризаев И. С. Конспект лекций по СПО

5. Электронные информационные ресурсы сети Интернет

Показать весь текст
Заполнить форму текущей работой