Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зеркальное отображение bmp файла, на тасме под 8086 
:(
    Опции темы
Булька98
Дата 22.4.2012, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 25.10.2011

Репутация: нет
Всего: нет



Код

.8086      ; разрешить привилегированные инструкции i286
.model     small                  ; выбор модели памяти 
.stack                              ;сегмент стека 
.data                              ;сегмент данных
name_file db '1.bmp',0                    ;задаём имя файла 0 необходим для функции 3dh
;тут всякие переменные для хранения размеров и прочие вспомогательные
x      dw         ?
x2    dw         ?              ;x/2
y    dw         ?
y2    dw         ?              ;y/2
cur_x   dw           320            ;текущие координаты. Пока что центр экрана
cur_y    dw         240 
handle  dw         ?              ;для файлового номера
_size    dw         ?              ;для размера файла
buffer    db 28 dup (?)              ;первый буффер. всё связанное с данными о файле
buffer1 db 0ffffh-1100 dup (0) 
 


.code                 ;сегмент кода

; процедура вычисления размера файла, размера по вертикали и по горизонтали
read_size proc
    mov ax,3d00h                  ;3dh- функция для открытия файла 
    lea dx,name_file              ; в dx  начало name_file
    int 21h
    mov bx,ax                     ; в bx 16-битный номер файла
    lea dx,buffer                 ; dx  на начало буфер
    mov ah,3Fh                  ;читаем
    mov cx,26                  ;прочитаем 26 байт. Пока нам больше и не надо
    int 21h
    mov ax,word ptr [buffer+2]
    mov _size,ax            ;размер
    mov ax,word ptr [buffer+18]
    mov x,ax                  ; по горизонтали
    mov ax,word ptr [buffer+22]
    mov y,ax                  ;по вертикали
ret
read_size endp

; процедура открытия файла
;думаю тут комментировать нечего
open_file proc
    mov ax,3d00h ;загрузили функцию
    lea dx,name_file
    int 21h
    or handle,ax
        ret
open_file endp

; процедура чтения файла в буфер
read_x proc                  
    mov bx,handle                           ; в handle 16 битный номер файла
    lea dx,buffer1                          ; dx
    mov ah,3Fh
    mov cx,    _size        
    int 21h
        ret
read_x endp




;собственно главная процедура - конвертирует 24-разрядный формат в палитру. Результат сохраняется в регистре al. Ниче сложного тут нет. В 24-разрядном изображении для каждого цвета (RGB) используется байт, в 16 цветном бит. Алгоритм основан на сдвигах.

convert proc near
    xor al,al
    mov ah,byte ptr [buffer1+si]             ;B
    ; читаем сколько у нас синего
    shr ah,7; сдвигаем вправо на 7 разрядов
    and ah,00000001b             ;первый бит цвета отвечает за синий остальные нам не нужны
    or al,ah                  ;выставляем синий
    inc si                      ;прибавляем счетчик (в BMP рисунке цвета располагаяся в порядке BGR                    ;поэтому сначала читаем синий потом зеленый и наконец красный)                    ;все тоже самое для зеленого, только со сдвигом на 1 разряд левее
    mov ah,byte ptr [buffer1+si]             ;G
    shr ah,6
    and ah,00000010b             ;второй бит - зеленый
    or al,ah             ;выставляем зеленый
    inc si                        ; и наконец красный. Все тоже самое что и выше только на разряд левее
    mov ah,byte ptr [buffer1+si]             ;R
    shr ah,5
    and ah,00000100b         ;третий бит - красный
    or al,ah             ;выставляем красный
    inc si
    or al,00001000b         ;четвертый бит яркости.                ;Вообще он будет выставляться процедурой bit_i но пока на вский случай включим его. Да будет свет!
    ret
convert endp

     


; все. Процедуры кончились начинается сам код.
.startup

mov ax,18
int 10h            ; устанавливаем EGA 640x480x16

;вычисляем размеры
call read_size
call open_file
call read_x

;вычисляем половины размеров по вертикали и горизонтали. Изображение выводится начиная с левого нижнего угла(именно так оно записано в BMP)

mov ax,x
shr ax,1
mov x2,ax            ;x2=x/2

mov ax,y
shr ax,1
mov y2,ax            ;y2=y/2

mov si,54            ;устанавливаем указатель на 54-й байт(само изображение начинается с 54-го байта.
            ; До этого всякая служебная информация)
            ; текущие координаты установлены на центр. установим их на левый нижний угол изображения
mov cx,cur_x
sub cx,x2
mov dx,cur_y
add dx,y2

;==============         =================
;цикл вывода изображения на экран
@l:
call convert            ;вначале конвертируем в палитру 
;call cnv
mov ah,0ch            ;функция вывода на экран точки.
            ; Очень медленная, но можно вместо нее использовать процедуру pixel которая приведена ниже.            ;Записывает прямо в видеобуфер. Получается намного быстрее
int 10h
            ;call pixel
inc cx
push bx
mov bx,320
add bx,x2
cmp cx,bx         ;дошли до конца линии?
pop bx
jb @l            ;если нет переходим к следующей точке
;===============         ==================
;все строчка кончилась двигаемся на точку вверх и все по новой
dec dx
sub cx,x
push bx
mov bx,240
sub bx,y2
cmp dx,bx            ;240-y2 смотрим не дошли еще до верха?
pop bx
ja @l             ; если не дошли продолжаем цикл

mov ah,0
int 16h              ;ждем пока кто нибудь нажмет на клавишу
mov ax,3            ;возвращаем текстовый режим
int 10h
mov ax,4c00h            ;ФСЕ. Валим отсюдова.
int 21h
end

 вот вывод 24х битного бмп файла на экран пробовал инвертнуть с помощью дополнительного буфера не фига не хватает указателей,подскажите как можно это сделать пожалуйста.
PM MAIL   Вверх
500mhz
Дата 23.4.2012, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Цитата

не фига не хватает указателей

каких еще указателей?




--------------------

PM MAIL ICQ   Вверх
Булька98
Дата 23.4.2012, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 25.10.2011

Репутация: нет
Всего: нет



ой извините в голове про другое вообще думал не указателей конечно. location counter overflow  -переполнение счетчика адреса 
PM MAIL   Вверх
iff
Дата 24.4.2012, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Т.е. появляется ошибка компиляции?
Может дело в этом:
Цитата(Булька98 @  22.4.2012,  17:55 Найти цитируемый пост)
buffer1 db 0ffffh-1100 dup (0) 

это уже 64435 байт (1100 указано в десятичной системе счисления, не написана буква h), да и вообще, лучше этот буфер объявить не заполненным нулями.

Добавлено через 50 секунд
Цитата(Булька98 @  22.4.2012,  17:55 Найти цитируемый пост)
.model     small                  ; выбор модели памяти 

и модель памяти наверно будет не small...


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0852 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.