Assembler открыть BMP
После того, как откроется bmp, надо написать на экран "Я открылось" или все-таки надо еще рисовать чо-то?
Сестренка моя маленькая горит немного. Матан переботала, а на это забила. Хочу помочь.
я так понимаю надо показать хотя-бы один файл, а то в bmp может быть много всякого внутри.
а надо не любое, а по конкретно заданному пути. "жопа", значит анус на экранчик.
короче, без флуда, берешься? (про бабло пиши) за сестренку стараюсь, попрошу учесть!
ЗЫ: у самого реально нет времени с этим возиться.
т.к. показать картинку в bmp 320x200 c палитрой 256 цветов это одно,
а показать любую картинку это совершенно другое.
за разумные деньги писать я это конечно не буду если чо =)
уточнил! пох что и как. Полет фантазии, нах. родить и забыть. не выпендриваться. Сеструха (первый курс) переботала малек, вот её и наказали чтоб помучалась.
мне кажется, имеет смысл просто вызвать какой-нить стандартный просмотрщик под dos, а чтобы не поняли, напихать кучу мертвого кода.
да, в целом можно и так сделать - bmp же простой - лень только.
проинициализировать какое-нить древний ega режим да показать картинку строк в 200-300 можно уложиться.
но вспоминать этот крэп точно влом, уже лет 8 такой фигнёй не страдал =)
у самого 7 лет как это добро в летописи кануло! а что поделать?
напиши лучше на ФДСном форуме, там возможно найдутся скучающие голодные студенты =)
Сестренка моя маленькая горит немного.это в каком же институте на первом курсе заствляют на асме писать подобное?
будет ли достаточно открытия и отображения 24х битового bmp не превосходящего по размеру 1024Х768 (в таком же режиме будет и картинка на экране)? имеется в виду масштабировать влом, а также читать палитры, и т.д. и т.п... но масштаб сделать можно если чё...
это в каком же институте на первом курсе заствляют на асме писать подобное?мисис
вроде в книге зубкова что-то похожее было
там есть всё необходимое, правда конкретного примера про бмп не помнится )
кстати, топикстартер пропал куда-то...
вспомнил. у Юрова в книге был пример на преобразование бмп из 32 битного цвета в градации серого с использованием команд ммх. если туда добавить вывод на экран и выкинуть преобразование в серый будет то что надо. хотя в целом книга мне не очень понравилась
http://zufs.net/text/wasm-faq/ASSEMBLER.html#q-ASSEMBLER-15
Q: Нет ли у кого маленького (< 120 байт) bmp (320x200x256) viewer'a?
A: См. ветку http://www.wasm.ru/forum/index.php?action=vthread&forum=...
Вот один из вариантов:
79 байт (fasm)
org 100h
mov si, 0080h
lodsb
xchg ax,bx
mov [si+bx], ah
; open file
mov dx,si
mov ah, 3Dh
int 21h
push ax
; read headers + palette
xchg bx,ax
mov cx, 436h
mov dx,cx
mov ah, 3Fh
int 21h
; switch to graphics mode
mov ax, 13h
int 10h
; initialize palette
mov cx, 256
mov si, palette+(256*4)-2
std
@@pal: mov dx, 3C8h
mov ax, cx
dec ax
out dx, al
inc dx
mov bl, 4
@@col: lodsb
shr al, 2
out dx, al
dec bx
jnz @@col
loop @@pal
; read data
pop bx
push 0A000h-14h
pop ds
mov dx, 320*200
@@line: mov ah, 3Fh
mov cx, 320
int 21h
sub dx, cx
jnz @@line
; wait for key press
xchg ax,dx
int 16h
ret
org 436h
bmfh: bfType dw ?
bfSize dd ?
bfReserved1 dw ?
bfReserved2 dw ?
bfOffBits dd ?
bmih: biSize dd ?
biWidth dd ?
biHeight dd ?
biPlanes dw ?
biBitCount dw ?
biCompression dd ?
biSizeImage dd ?
biXPelsPerMeter dd ?
biYPelsPerMeter dd ?
biClrUsed dd ?
biClrImportant dd ?
palette:
Класс! Но стоит потребовать 24-битного цвета, как понадобится VESA и так просто выкрутиться уже не получится. + в этом примере размер картинки обязан равняться 320x200.
; Отображает 24 битный BMP на экране в режиме 800X600
; masm 6.0
; описание структур BITMAPFILEHEADER и BITMAPINFOHEADER
BITMAPFILEHEADER STRUCT
bfType dw ?
bfSize dd ?
bfReserved1 dw ?
bfReserved2 dw ?
bfOffBits dd ?
BITMAPFILEHEADER ENDS
BITMAPINFOHEADER STRUCT
biSize DD ?
biWidth DD ?
biHeight DD ?
biPlanes DW ?
biBitCount DW ?
biCompression DD ?
biSizeImage DD ?
biXPelsPerMeter DD ?
biYPelsPerMeter DD ?
biClrUsed DD ?
biClrImportant DD ?
BITMAPINFOHEADER ENDS
max_width = 800
max_height = 600
g_mode = 115h
stack segment stack
db 128 dup (?)
stack ends
data segment
message db "It shows 24bit BMP on screen in 800X600 mode",0Dh,0Ah,
"Enter file name: $"
gerrmessage db "Graphic mode not supported!$"
foerrmessage db "Can not open file!$"
frerrmessage db "BMP format failed or not supported$"
fserrmessage db "Bitmap size outgoing screen size$"
file_name db 254,0,255 dup (?)
vbe_mode_buffer db 256 dup (?)
bmfh BITMAPFILEHEADER <>
bmih BITMAPINFOHEADER <>
current_bank dw 0
strlen dw ?
line_buffer db max_width*3 dup (?)
data ends
code segment
assume cs:code, ss: stack, ds:data
waitkey macro
mov ah,08h
int 21h
endm
textmode3 macro
mov ax,3
int 10h
endm
start:
mov ax,data
mov ds,ax
mov es,ax
; считать имя файла
lea dx,message
mov ah,9h
int 21h
lea dx,file_name
mov ah,0Ah
int 21h
xor bh,bh
mov bl,file_name+1
mov file_name[bx+2],0
; установить графический режим
mov ax,4F01h
mov cx,g_mode
lea di,vbe_mode_buffer
int 10h
mov al,[vbe_mode_buffer]
test al,1
jnz mode_ok
textmode3
lea dx,gerrmessage
jmp _error
mode_ok:push word ptr [vbe_mode_buffer+8]
pop es
mov ax,4F02h
mov bx,cx
int 10h
; открыть файл
mov ax,3D41h
lea dx,file_name+2
xor cl,cl
int 21h
jnc open_ok
textmode3
lea dx,foerrmessage
jmp _error
; считать информацию BMP
open_ok:mov bx,ax
mov ah,3Fh
mov cx,type BITMAPFILEHEADER
lea dx,bmfh
int 21h
jnc good1
lea dx,frerrmessage
jmp _error
good1: mov ah,3Fh
mov cx,type BITMAPINFOHEADER
lea dx,bmih
int 21h
jnc good2
lea dx,frerrmessage
jmp _error
good2: ; проверка файла на пригодность
mov ax,bmih.biBitCount
cmp ax,24
je goodS2
lea dx,fserrmessage
jmp _error
goodS1: mov cx,word ptr bmih.biHeight
cmp cx,max_height
jna goodS2
lea dx,fserrmessage
jmp _error
goodS2: mov ax,word ptr bmih.biWidth
cmp ax,max_width
jna goodS3
lea dx,fserrmessage
jmp _error
goodS3: mov bp,3
mul bp
test al,03h
jz prepare
and al,0F8h
add ax,4 ; получили ширину строки
prepare: ; подготовка цикла
mov strlen,ax
cld
xor di,di
mov cx,1
; bp - строка экрана в текущем банке; bx - идентификатор файла
main_loop:
; считать строку из файла
push cx
mov ax,strlen
mul cx
mov cx,dx
mov dx,ax
add cx,1
adc dx,0
neg cx
neg dx
mov ax,4202h
int 21h
jnc goodR1
lea dx,frerrmessage
jmp _error
goodR1: mov ah,3Fh
lea dx,line_buffer
mov cx,strlen
int 21h
jnc goodR2
lea dx,frerrmessage
jmp _error
goodR2: ; записать строку в видеопамять
mov cx,word ptr bmih.biWidth
lea si,line_buffer
cpL: movsb
movsb
movsb
inc di
jnz cpLE
call switch
cpLE: loop cpL
; перейти на следующую строку
mov dx,word ptr bmih.biWidth
shl dx,1
shl dx,1
mov cx,max_width*4
sub cx,dx
add di,cx
jnc nlC
call switch
nlC: pop cx
inc cx
cmp cx,word ptr bmih.biHeight
jae l_ext
jmp main_loop
; закрытие файла
l_ext: mov ah,3Eh
int 21h
; ожидание клавиши (задержка)
waitkey
textmode3
ext: mov ax,4C00h
int 21h
switch proc near
push bx
mov dx,current_bank
inc dx
mov current_bank,dx
xor bx,bx
mov ax,4F05h
call dword ptr [vbe_mode_buffer+0Ch]
pop bx
ret
switch endp
_error: ; вывод ошибка
textmode3
mov ah,9h
int 21h
jmp ext
code ends
end start
ну и так вот...
Оставить комментарий
kudos1955
Народ, есть кто может помочь в написании проги. За годы безпроганья эту прекрасную штуку забыл порядочно.Что дано:
Написать прогу под Dos, открывающую bmp файл по заданному пути ( на ассме)!
Оплату и прочее – в личку!