Запись в графический файл формата BMP
Описание работы программы, осуществляющей запись команд графического экрана в файл формата BMP. Изучение функции чтения 18-битовых значений из нескольких последовательно расположенных регистров таблицы цветов. Составление блок-схемы и текста программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 20.11.2012 |
Размер файла | 198,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Содержание
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-файл (для изображения 320x200x256)
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+00100010b; 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. Электронные информационные ресурсы сети Интернет
Размещено на Allbest.ru
Подобные документы
Функции формирования массива времени. Формирование массива входного напряжения, массива выходного напряжения. Функция вывода таблицы, расчета заданной точности, вывода титульного листа. Запись в файл массива времени. Блок–схема и текст программы.
курсовая работа [155,6 K], добавлен 22.04.2012Описание типизированных файлов. Принципы работы с файлами, создание и открытие на запись нового файла. Чтение из файла, открытие существующего файла на чтение. Определение имени файла. Запись в текстовый файл. Описание множества и операции над ними.
реферат [86,4 K], добавлен 07.02.2011Блок-схема программы, подсчитывающей количество слов последовательности, начинающихся с большой буквы и оканчивающихся цифрой. Символьный квадратный массив и его заполнение. Создание программы, которая формирует файл записей заданной структуры.
курсовая работа [529,7 K], добавлен 19.12.2010Принцип работы транслятора. Исследование формата данных объектного файла шестнадцатиразрядной системы DOS для последующего преобразования его в файл программы. Используемые директивы и команды ассемблера. Алгоритмы программы и таблицы компилятора.
контрольная работа [35,9 K], добавлен 07.07.2012Основы проверки и расчета входных данных и вывода выходных данных программы, их блок-схемы. Реализация функции считывания числовых данных из файла, управление (создание, уничтожение и редактирование) визуальными компонентами во время выполнения программы.
контрольная работа [1,3 M], добавлен 12.06.2009Запись в файл и чтение в С++. Общее понятие о структуре. Многомерные и двумерные массивы. Логика работы программы. Схема алгоритма функции Main. Определение суммарного заработка, сотрудника с наибольшей зарплатой. Создание новой базы, листинг программы.
курсовая работа [275,7 K], добавлен 07.10.2012Проектирование пользовательского интерфейса программы, осуществляющей шифрование и дешифрование файлов. Выбор формата представления данных. Список процедур, макросов и их назначение. Описание используемых в программе функций, ее тестирование и отладка.
курсовая работа [29,3 K], добавлен 17.05.2013Реализация программы-конвертера для создания на основе передаваемых dbf файлов файла формата XML (по заданному пользователем шаблону). Создание шаблонов при помощи кода и при помощи конструктора. Проектирование архитектуры программного продукта.
дипломная работа [1,6 M], добавлен 27.06.2013Описание используемых в программе операторов, процедур, функций. Директива include. Правила объявления и определения функций в СИ++. Блок-схема алгоритма программы. Подпрограммы чтения из файла и записи в файл. Использование заголовочных файлов.
курсовая работа [346,8 K], добавлен 26.04.2012Разработка различных программ для вычисления X и Y по формуле, для вычисления интеграла, для вычисления таблицы значений функции и для вычисления элементов вектора. Составление блок-схемы программы. Ввод значений, описание переменных и условия расчета.
контрольная работа [148,1 K], добавлен 08.11.2013