Как загружать изображения в дос-программы - Assembler

Узнай цену своей работы

Формулировка задачи:

как загружать изображения в дос-программы? Кроме как объявлять каждый пиксель? Возможно ли это?

Решение задачи: «Как загружать изображения в дос-программы»

textual
Листинг программы
  1. .286
  2. .model tiny
  3. .code
  4. .386
  5. org 100h
  6.  
  7. start:  mov ax,3D00h
  8.     mov dx,offset filename
  9.     int 21h     ;открыть для чтения файл *.bmp
  10.     mov bx,ax
  11.     mov ax,4202h
  12.     xor cx,cx ;определяем длину файла для чего
  13.     mov dx,cx ;позиционируемся в конец файла
  14.     int 21h    
  15.     mov filelenth,ax
  16.     mov ax,4200h    ;позиционируемся в начало файла
  17.     int 21h
  18.     mov ah,3Fh      ;читаем файл
  19.     mov dx,offset buffer    ;указываем на буфер
  20.     mov cx,filelenth
  21.     int 21h
  22.     mov ah,3Eh
  23.     int 21h     ;закрыли файл
  24.     mov ah,0Fh
  25.     int 10h     ;запоминаем текущий видеорежим
  26.     mov videomode,al
  27.     mov ax,13h;устанавливаем режим 320х200 256 цветов
  28.     int 10h
  29.     mov si,offset buffer    ;читаем файл и проверяем,
  30.     lodsw
  31.     cmp ax,'MB';является ли наш файл действительно
  32.     jne exit    ; bmp, если нет в конец программы
  33.     mov si,offset buffer+12h
  34.     lodsw       ;читаем из файла ширину рисунка
  35.     mov picturewidth,ax ;помещаем ширину в переменную
  36.     add ax,3        делаем ширину кратной 4
  37.     shr ax,2
  38. a3: mov quatrawidth,ax ;вычисляем, есть ли на краях
  39.     shl ax,2    ;строк изображения пустые байты и сколько
  40.     add delta,ax        ; их, помещаем в переменную
  41.     mov si,offset buffer+16h
  42.     lodsw       ;читаем из файла высоту рисунка
  43.     mov picturehight,ax     ;помещаем в переменную
  44.     mov si,offset buffer+1Ch
  45.     lodsb       ;читаем из файла количество цветов
  46.     cmp al,8        ;если в нашем файле не 256 цветов
  47.     jnz exit        ;завершаем программу
  48.     mov si,offset buffer+37h;формируем таблицу цветов
  49.     mov di,offset palette
  50.     mov cx,256  файле 8-битный формат BGRedRez, -
  51. a1: lodsw       ;нам нужен 6-битный RedGB формат
  52.     shr ax,2        ;преобразуем
  53.     xchg ah,al
  54.     stosw
  55.     sub si,3
  56.     lodsb
  57.     shr al,2
  58.     stosb
  59.     add si,4
  60.     loop a1
  61.     mov ax,1012h;функция загрузки всех 256 регистров
  62.     xor bx,bx   bx=0 номер первого регистра
  63.     mov cx,256  cx число регистров
  64.     mov dx,offset palette   ;адрес таблицы цветов
  65.     int 10h     ;устанавливаем блок регистров ЦАП
  66.     push 0A000h;es:= A000h указываем на видеоадаптер
  67.     pop es;считаем,какое количество байтов необходимо
  68.     mov ax,picturehight;для вывода файла на экран из
  69.     shl ax,6     ;соотношения picturehight*320, но для
  70.     mov di,ax; умножения на 320 используем сдвиги,
  71.     shl ax,2    ;ax=picturehight*64,сохраним ax в di и
  72.     add di,ax ;умножим picturehight*64 на 4     ;di=picturehight*(256+64)=picturehight*320.
  73.     mov si,offset buffer+436h   bmp-файле изображение  
  74.     mov cx,picturehight;хранится в перевернутом
  75. a0: push cx;виде поэтому идем в конец файла. Для
  76.     mov cx,quatrawidth;вывода используем два вложенных цикла и команду 386
  77.     rep movsd;микропроцессора, чтобы копировать в видеоадаптер строку сразу
  78.     sub di,delta;по 4 байта картинки и переходим на следующую строку
  79.     pop cx
  80.     loop a0     ;Копируем все строки.
  81.     mov ah,0    ;Ожидаем нажатия любой клавиши для выхода
  82.     int 16h     ;из программы
  83. exit:   mov ax,word ptr videomode;Восстанавливаем старый видеорежим и
  84.     int 10h         ;выходим из программы
  85.     ret        
  86. filename db  '*.bmp',0  ;название файла с рисунком
  87. filelenth   dw  0   ;длина файла
  88. picturewidth    dw  0   ;ширина картинки
  89. quatrawidth dw  0   ;ширина картинки кратная 4
  90. picturehight    dw  0   ;высота картинки
  91. palette     db  300h dup (0);место под таблицу цветов 256*3
  92. videomode       db  0,0 ;старый видеорежим
  93. delta       dw  320 ;величина смещения
  94. buffer      db  0
  95. end start

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут