Как загружать изображения в дос-программы - Assembler
Формулировка задачи:
как загружать изображения в дос-программы? Кроме как объявлять каждый пиксель? Возможно ли это?
Решение задачи: «Как загружать изображения в дос-программы»
textual
Листинг программы
- .286
- .model tiny
- .code
- .386
- org 100h
- start: mov ax,3D00h
- mov dx,offset filename
- int 21h ;открыть для чтения файл *.bmp
- mov bx,ax
- mov ax,4202h
- xor cx,cx ;определяем длину файла для чего
- mov dx,cx ;позиционируемся в конец файла
- int 21h
- mov filelenth,ax
- mov ax,4200h ;позиционируемся в начало файла
- int 21h
- mov ah,3Fh ;читаем файл
- mov dx,offset buffer ;указываем на буфер
- mov cx,filelenth
- int 21h
- mov ah,3Eh
- int 21h ;закрыли файл
- mov ah,0Fh
- int 10h ;запоминаем текущий видеорежим
- mov videomode,al
- mov ax,13h;устанавливаем режим 320х200 256 цветов
- int 10h
- mov si,offset buffer ;читаем файл и проверяем,
- lodsw
- cmp ax,'MB';является ли наш файл действительно
- jne exit ; bmp, если нет — в конец программы
- mov si,offset buffer+12h
- lodsw ;читаем из файла ширину рисунка
- mov picturewidth,ax ;помещаем ширину в переменную
- add ax,3 ;и делаем ширину кратной 4
- shr ax,2
- a3: mov quatrawidth,ax ;вычисляем, есть ли на краях
- shl ax,2 ;строк изображения пустые байты и сколько
- add delta,ax ; их, помещаем в переменную
- mov si,offset buffer+16h
- lodsw ;читаем из файла высоту рисунка
- mov picturehight,ax ;помещаем в переменную
- mov si,offset buffer+1Ch
- lodsb ;читаем из файла количество цветов
- cmp al,8 ;если в нашем файле не 256 цветов
- jnz exit ;завершаем программу
- mov si,offset buffer+37h;формируем таблицу цветов
- mov di,offset palette
- mov cx,256 ;в файле 8-битный формат BGRedRez, -
- a1: lodsw ;нам нужен 6-битный RedGB формат
- shr ax,2 ;преобразуем
- xchg ah,al
- stosw
- sub si,3
- lodsb
- shr al,2
- stosb
- add si,4
- loop a1
- mov ax,1012h;функция загрузки всех 256 регистров
- xor bx,bx ;в bx=0 — номер первого регистра
- mov cx,256 ;в cx число регистров
- mov dx,offset palette ;адрес таблицы цветов
- int 10h ;устанавливаем блок регистров ЦАП
- push 0A000h;es:= A000h указываем на видеоадаптер
- pop es;считаем,какое количество байтов необходимо
- mov ax,picturehight;для вывода файла на экран из
- shl ax,6 ;соотношения picturehight*320, но для
- mov di,ax; умножения на 320 используем сдвиги,
- shl ax,2 ;ax=picturehight*64,сохраним ax в di и
- add di,ax ;умножим picturehight*64 на 4 ;di=picturehight*(256+64)=picturehight*320.
- mov si,offset buffer+436h ;В bmp-файле изображение
- mov cx,picturehight;хранится в перевернутом
- a0: push cx;виде поэтому идем в конец файла. Для
- mov cx,quatrawidth;вывода используем два вложенных цикла и команду 386
- rep movsd;микропроцессора, чтобы копировать в видеоадаптер строку сразу
- sub di,delta;по 4 байта картинки и переходим на следующую строку
- pop cx
- loop a0 ;Копируем все строки.
- mov ah,0 ;Ожидаем нажатия любой клавиши для выхода
- int 16h ;из программы
- exit: mov ax,word ptr videomode;Восстанавливаем старый видеорежим и
- int 10h ;выходим из программы
- ret
- filename db '*.bmp',0 ;название файла с рисунком
- filelenth dw 0 ;длина файла
- picturewidth dw 0 ;ширина картинки
- quatrawidth dw 0 ;ширина картинки кратная 4
- picturehight dw 0 ;высота картинки
- palette db 300h dup (0);место под таблицу цветов 256*3
- videomode db 0,0 ;старый видеорежим
- delta dw 320 ;величина смещения
- buffer db 0
- end start
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д