1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

BMP em assembly

Discussão em 'Programação' iniciada por Van, 19 de Maio de 2005. (Respostas: 5; Visualizações: 1213)

  1. Van

    Van

    Boas!

    Alguém me podia dar uma ajuda: tenho um projecto em assembly do 8086 em que queria que aparecesse no ecrã uma imagem bmp. Quem me pode dar umas luzes disto? É que mesmo os meus profs não me sabem dizer...

    Obrigado
     
  2. inginheiiro

    inginheiiro Power Member

    Asm loadBmp 16 bits

    Bute lá...

    qual a vantagem de fazeres isso em ASM ?
    As linguagens de alto nivel foram inventadas por alguma razão...
    E caso não saibas, existem rotinas de código em alto nivel , que depois de
    compiladas para assembly práticamente não perdem nada em velocidade/tamanho.
    enfim...

    vamos por partes ...
    Isto funca para bitmaps de 16 bits
    Para compilar usa o TASM /ml ...


    ;----------------------------------------------------------------------
    ;Inicialização
    ;----------------------------------------------------------------------


    .model small
    .stack 100h
    _DATA segment word public 'DATA'
    filename db 'C:\bmp\UNITS.BMP',0 ; Nome do bmp
    NICK db 'inginheiiro... ;
    db '$'

    handle dw ? ; handle é o file pointer
    X dw ? ; Posição X e Y
    Y dw ?
    col db 640 dup(?) ; Buffer ...
    ;
    buff dw 0
    dw 0
    dw 0
    dw 0
    multi dw 6
    dw 4
    dw 0
    dw 0
    num dw 0
    y dw 409
    dw 408
    dw 307
    dw 306
    dw 204
    dw 203
    dw 102
    dw 101

    BMPHEAD struc ; Estrurura de um BITMAP
    id db 2 dup(?)
    filesize dw 2 dup(?)
    reserved dw 2 dup(?)
    headersize dw 2 dup(?)
    infosize dw 2 dup(?)
    width dw 2 dup(?)
    depth dw 2 dup(?)
    biplanes dw ?
    bits dw ?
    bicomp dw 2 dup(?)
    bisizeim dw 2 dup(?)
    bixpels dw 2 dup(?)
    biypels dw 2 dup(?)
    biclrused dw 2 dup(?)
    biclrimp dw 2 dup(?)
    BMPHEAD ends

    RGBQUAD struc ; Cores do BITMAP
    blue db ?
    green db ?
    red db ?
    fill db ?
    RGBQUAD ends

    params BMPHEAD <>
    param RGBQUAD <>
    _DATA ends



    ;----------------------------------------------------------------------
    ;MAIN
    ;----------------------------------------------------------------------


    .code
    start:
    mov ax,@data ; Mover toda a info para a posição de memoria
    mov ds,ax

    call loadbmp ; Chama o procedimento loadbmp

    mov ah,00h ; Espera que seja primida uma tecla.
    int 16h

    mov ah,00h ; Muda o modo de video
    mov al,02h
    int 10h

    mov ah,09h ; Imprime no ecran a msg
    mov dx,offset NICK
    int 21h

    mov ah,4ch ; EOP
    mov al,0
    int 21h



    ;----------------------------------------------------------------------
    ;Procedimentos
    ;----------------------------------------------------------------------


    putpixel proc near ; Este procedimento coloca um pixel no ecran.

    ; O endereço é=y*640+x
    mov ax,Y ; (em 16 bits...)
    mul multi
    mov buff,ax
    mov ax,100
    mul buff
    mov buff,ax
    mov buff+2,dx

    mov ax,Y
    mul multi+2
    mov buff+4,ax
    mov ax,10
    mul buff+4
    mov buff+4,ax
    mov buff+6,dx

    mov ax,buff
    add ax,buff+4
    mov buff,ax
    mov ax,buff+2
    adc ax,buff+6
    mov buff+2,ax

    mov ax,X ; Adicionar x à expressão
    add buff,ax
    adc buff+2,0 ; resiltado lin=y*640+x

    mov ax,buff
    mov dx,buff+2

    mov cx,16
    F1: sar dx,1
    rcr ax,1
    loop F1
    mov num,ax

    mov ax,y
    cmp ax,Y
    je pass

    mov ax,y+2
    cmp ax,Y
    je pass

    mov ax,y+4
    cmp ax,Y
    je pass

    mov ax,y+6
    cmp ax,Y
    je pass

    mov ax,y+8
    cmp ax,Y
    je pass

    mov ax,y+10
    cmp ax,Y
    je pass

    mov ax,y+12
    cmp ax,Y
    je pass

    mov ax,y+14
    cmp ax,Y

    jne bypass
    pass:
    mov ah,4fh
    mov al,05h
    mov bh,00h
    mov bl,00h
    mov dx,num
    int 10h

    bypass:

    mov ax,0A000h ;escrever um pixel no ecran
    mov es,ax
    mov ax,buff
    mov di,ax
    mov al,[si]
    stosb ; ends.
    inc si
    ret
    endp



    ; ------------------------------------------------------------
    ;LOAD DO BMP
    ; ------------------------------------------------------------


    loadbmp proc near ;FAZ O LOAD DO BITMAP.
    mov ah,4fh ; SVGA (101h i.e 640X480 em 256 colours)
    mov al,02h
    mov bx,101h
    int 10h

    mov ah,4fh
    mov al,05h
    mov bh,00h
    mov bl,00h
    mov dx,4
    int 10h

    mov ah,3dh ; Abre ficheiro
    mov al,00
    mov dx,offset filename
    int 21h ; End ...

    mov handle,ax

    mov ah,3fh ; Lê ficheiro
    mov bx,handle
    mov cx,54
    mov dx,offset params
    int 21h ; End...

    mov col,0 ; Lê a palette
    G1:
    mov ah,3fh
    mov bx,handle
    mov cx,4
    mov dx,offset param
    int 21h
    mov al,col
    mov dx,3c8h
    out dx,al
    mov al,param.red
    shr al,2
    mov dx,3c9h
    out dx,al
    mov al,param.green
    shr al,2
    out dx,al
    mov al,param.blue
    shr al,2
    out dx,al
    cmp col,255
    inc col
    jne G1 ; End...

    mov Y,479
    mov X,0
    A1:
    mov ah,3fh ; Lê dados
    mov bx,handle
    mov cx,640
    mov dx,offset col
    int 21h ; End...

    ; Escreve um pixel no ecran.
    mov si,offset col
    A2:
    call putpixel
    inc X
    cmp X,640
    jne A2
    mov X,0
    dec Y
    cmp Y,-1
    jne A1

    mov ah,3eh
    mov bx,handle
    int 21h
    ret
    loadbmp endp
    end start
     
  3. NoMercy

    NoMercy Power Member

    @ inginheiiro, para postar código, se quiseres podes usar as tags "code" ou "php", exemplos:

    Código:
     tag de code: [.code] [./code] (remover os pontos) 
    PHP:
     tag de php: [.php] [./php] (remover os pontos
     
  4. inginheiiro

    inginheiiro Power Member

    tags

    :D

    Tanks, tens toda a razão.
     
  5. NoMercy

    NoMercy Power Member

    Não é obrigatório, éra só para informar que existe essa funcionalidade.
     
  6. Van

    Van

    Primeiro de tudo, obrigado ingiinheiro. Isto é para um projecto da cadeira de micro.

    Já compilei o asm. Consegui resolver alguns erros, mas estes estou mesmo à nora:
    K:\Micro\micro2>tasm teste /ml
    Turbo Assembler Version 1.0 Copyright (c) 1988 by Borland International

    Assembling file: TESTE.ASM
    **Error** TESTE.ASM(141) Undefined symbol: y
    **Error** TESTE.ASM(145) Undefined symbol: y
    **Error** TESTE.ASM(149) Undefined symbol: y
    **Error** TESTE.ASM(153) Undefined symbol: y
    **Error** TESTE.ASM(157) Undefined symbol: y
    **Error** TESTE.ASM(161) Undefined symbol: y
    **Error** TESTE.ASM(165) Undefined symbol: y
    **Error** TESTE.ASM(169) Undefined symbol: y
    **Error** TESTE.ASM(237) Rotate count out of range
    **Error** TESTE.ASM(241) Rotate count out of range
    **Error** TESTE.ASM(244) Rotate count out of range
    Error messages: 11
    Warning messages: None
    Remaining memory: 441k

    se fizer tasm /zi só se queixa das linhas 237,241,244
     

Partilhar esta Página