Как загружать изображения в дос-программы - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д