Запись в графический файл формата 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. Юров А. Н. Введение в
ассемблер
. П. Нортон Справочник по
ассемблеру
. Ризаев И. С. Конспект
лекций по СПО
. Электронные информационные
ресурсы сети Интернет