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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    112,48 Кб
  • Опубликовано:
    2012-11-10
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Содержание

. Задание

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

3. Блок схемы

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

Список использованной литературы

1. Задание

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

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

Используемые прерывания, функция 09h int 21h Запись строки на стандартный вывод

Вход:

АН-09Н:DX - адрес строки, заканчивающейся символом "$" (ASCII 24h)

Описание.

Строка, исключая завершающий ее символ "$", посылается на стандартный вывод., функция 3Ch Создать файл через описатель

Вход:

АН-ЗСh:DX - адрес строки ASCIZ с именем файла

СХ - атрибут файла

Выход:=0, если функция выполнена успешно

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

АХ - код ошибки, функция 40h Писать в файл через описатель

Вход:=40h

ВХ - описатель файла:DX - адрес буфера, содержащего записываемые данные

СХ - число записываемых байт

Выход:=0, если функция выполнена успешно- число действительно записанных байт CF°1, если при выполнении функции возникли ошибки- код ошибки

Описание.

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

Вход:

АН-ЗЕh ВХ - описатель файла

Выход:=0, если функция выполнилась успешно

АХ не сохранен CF=1, если при выполнении функции возникли ошибки

АХ - код ошибки

Описание.

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

Вход:h AL - номер прерывания (OOh до FFh)

Выход::BX - адрес обработчика прерывания

Описание.

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

Вход:=25h- номер прерывания:DX - вектор прерывания - адрес программы обработки прерывания

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

Вход:=31h- код выхода- объем памяти, оставляемой резидентной (в параграфах)

Описание.

Выходит в родительский процесс, сохраняя код выхода в 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 бит.

. Блок схемы

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

.model small_key EQU 3fh; скан-код F5

.stack 100h

.datadw 0; флаг записи экрана 1-идет записьold dd ?; хранит адрес перехваченного прерывания Int 09h'scrgrb.bmp',0; имя файла

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

; файловый заголовок_file_headerdb"BM"; сигнатура; размер файла,0; 0; адрес начала BMP_data

; информационный заголовок_info_headerddbi_size; размер BMP_info_header; ширина; высота; число цветовых плоскостей; число битов на пиксель; метод сжатия данных*200; размер данныхB13h; разрешение по X (пиксель на метр)72ppiB13h; разрешение по Y (пиксель на метр)72ppi; число используемых цветов (0 - все); число важных цветов (0 - все)

bi_size = $-BMP_info_header; размер BMP_info_header_header_length = $-BMP_header; размер обоих заголовков= $-BMP_file_header+256*4 ; размер заголовков + размер

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

; размер палитры + размер данныхdb 3*256-1 dup(0) ;для палитрыdb 0;указ. на конец строки палитры полученой ф-й биос255 dup(0)db 0;указ. на конец сформированной палитры для записи в файл

.codenew PROCdsax

mov ax, @data; установить в DS сегмент данных программыds, axal,60h; получить сан-код нажатой клавишиal, F5_key; нажата клавиша F5copy_file; если да, то начать запись экранаint09old; вызвать перехваченный обработчик Int 09h

pop axds_file:

pushfint09old; вызвать перехваченный обработчик Int 09hdin,1; проверить флаг записи в файлdo_file; начать записывать файл

pop axds_file:

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

push dxsidi

push esdin,1ax, 40h; установить ES на сег. окружение DOS (сег. с параметрами ОС)es, axah, byte ptr es:[49h]; номер текущего режима

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

cmp ah,13hgr_mode_good ; = если режим 13hexit_mode_good:

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

xor cx, cxdx, BMPFile

int 21hferr; если произошла ошибка при работе с файломbx,ax ;дескриптор файлаax, 4000h ; записать в файл заголовок

mov cx, BMP_header_lengthdx, BMP_file_header

int 21hferr; если произошла ошибка при работе с файлом

push bxdses

movax,1017h ; Функция 1017h - чтение палитры VGA,0 ; начиная с регистра палитры 0,,256 ; все 256 регистров,offset Palette; начало палитры в BMPh ; видеосервис BIOS

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

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

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

; (4 байта на цвет, в каждом байте 8 значимых битов); движение от конца к началу,offset ePalette3; SI - конец 3-байтной палитры, offset ePalette4; DI - конец 4-байтной палитры

movcx,256; CX - число цветов_pal: moval,0cx

mov cx,2; записать четвертый байт (0); прочитать третий байт,cl; масштабировать до 8 битов; прочитать второй байт,cl; масштабировать до 8 битов; прочитать третий байт,cl; масштабировать до 8 битов; и записать эти три байта; в обратном порядке

popaxcx_pal

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

mov cx, 256*4dx, offset Palette

int 21hferr; если произошла ошибка при работе с файломdsax, 0a000h; загрузить сегмент начала видеопамятиds, axdx,320*199; указывает на последную строку экранаdi,200; количество строк экрана_copy:ax, 4000h ; записать в файл строку экранаcx, 32021hferr; если произошла ошибка при работе с файломdx,320; вычислить адрес следующей строки для записиdi; уменьшить счетчик строк для записи

jnz str_copyds_file:ax,3e00h; закрыть файл21hferr::din,0;флаг занятости обнулитьesdisidxcxbxaxdsnew endp

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

lea dx, info_mes21h

mov ax,3509h ; получить адрес обработчика Int 09h21hword ptr int09old, bx; сохранить адрес ES:BX в переменной int09old

mov word ptr int09old+2, esdsax,@codeds, ax

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

mov dx, offset int09new21h

pop dsdx, offset info_mes; размер сегмента данных для резидентной частиdx, offset end_cs; размер сегмента кодаdx,120h; для выравнивания на параграфы+PSPcx,4dx,cl; выразить размер программы в параграфах DX/16ax,3100h ; оставим часть резидентной

int 21h_cs label byte

end

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

Список использованной литературы

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

2.       Юров А. Н. Введение в ассемблер

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

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

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


Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!