Как загружать изображения в дос-программы - 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

Оцени полезность:

8   голосов , оценка 4.125 из 5