Запись в графический файл формата 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. Электронные информационные ресурсы сети Интернет