2017-04-23 3 views
-1

J'ai donc essayé de copier le code pour imprimer un fichier bmp à partir de mon livre d'apprentissage à l'école, j'ai tout fait comme indiqué et affiche simplement le message d'erreur. Quelqu'un peut-il m'aider à déboguer?Comment imprimer un fichier photo BMP en mode graphique d'assemblage

CODE:

IDEAL 
MODEL small 
STACK 100h 
DATASEG 
;================================ 
filename db 'test.bmp',0 

filehandle dw ? 

Header db 54 dup (0) 

Palette db 256*4 dup (0) 

ScrLine db 320 dup (0) 

ErrorMsg db 'Error', 13, 10,'$' 
;================================ 
CODESEG 
;================================ 
proc OpenFile 

    ; Open file 

    mov ah, 3Dh 
    xor al, al 
    mov dx, offset filename 
    int 21h 

    jc openerror 
    mov [filehandle], ax 
    ret 

    openerror: 
    mov dx, offset ErrorMsg 
    mov ah, 9h 
    int 21h 
    ret 
endp OpenFile 
proc ReadHeader 

    ; Read BMP file header, 54 bytes 

    mov ah,3fh 
    mov bx, [filehandle] 
    mov cx,54 
    mov dx,offset Header 
    int 21h 
    ret 
    endp ReadHeader 
    proc ReadPalette 

    ; Read BMP file color palette, 256 colors * 4 bytes (400h) 

    mov ah,3fh 
    mov cx,400h 
    mov dx,offset Palette 
    int 21h 
    ret 
endp ReadPalette 
proc CopyPal 

    ; Copy the colors palette to the video memory 
    ; The number of the first color should be sent to port 3C8h 
    ; The palette is sent to port 3C9h 

    mov si,offset Palette 
    mov cx,256 
    mov dx,3C8h 
    mov al,0 

    ; Copy starting color to port 3C8h 

    out dx,al 

    ; Copy palette itself to port 3C9h 

    inc dx 
    PalLoop: 

    ; Note: Colors in a BMP file are saved as BGR values rather than RGB. 

    mov al,[si+2] ; Get red value. 
    shr al,2 ; Max. is 255, but video palette maximal 

    ; value is 63. Therefore dividing by 4. 

    out dx,al ; Send it. 
    mov al,[si+1] ; Get green value. 
    shr al,2 
    out dx,al ; Send it. 
    mov al,[si] ; Get blue value. 
    shr al,2 
    out dx,al ; Send it. 
    add si,4 ; Point to next color. 

    ; (There is a null chr. after every color.) 

    loop PalLoop 
    ret 
endp CopyPal 

proc CopyBitmap 

    ; BMP graphics are saved upside-down. 
    ; Read the graphic line by line (200 lines in VGA format), 
    ; displaying the lines from bottom to top. 

    mov ax, 0A000h 
    mov es, ax 
    mov cx,200 
    PrintBMPLoop: 
    push cx 

    ; di = cx*320, point to the correct screen line 

    mov di,cx 
    shl cx,6 
    shl di,8 
    add di,cx 

    ; Read one line 

    mov ah,3fh 
    mov cx,320 
    mov dx,offset ScrLine 
    int 21h 

    ; Copy one line into video memory 

    cld 

    ; Clear direction flag, for movsb 

    mov cx,320 
    mov si,offset ScrLine 
    rep movsb 

    ; Copy line to the screen 
    ;rep movsb is same as the following code: 
    ;mov es:di, ds:si 
    ;inc si 
    ;inc di 
    ;dec cx 
    ;loop until cx=0 

    pop cx 
    loop PrintBMPLoop 
    ret 
endp CopyBitmap 
;================================ 
start: 
mov ax, @data 
mov ds, ax 
;================================ 

    ; Graphic mode 
    mov ax, 13h 
    int 10h 

    ; Process BMP file 
    call OpenFile 
    call ReadHeader 
    call ReadPalette 
    call CopyPal 
    call CopyBitmap 

    ; Wait for key press 
    mov ah,1 

    int 21h 
    ; Back to text mode 
    mov ah, 0 
    mov al, 2 
    int 10h 
;================================ 
exit: 
    mov ax, 4c00h 
    int 21h 
    END start 

C'est tout le code.

+0

Pourquoi avez-vous besoin de l'aide de débogage? Quel est le problème avec votre débogueur? –

+0

Êtes-vous incapable de fournir le message d'erreur? –

Répondre

0

Vous avez besoin d'un fichier .bmp approprié: (Copyright par moi Gratuit pour toute utilisation!)

Name: test.bmp 
Location: In the current directory 
Width: 320 
Height: 200 
Colors: 256 

Prenez ceci:

Copyright by me! Free for all use!

Cliquez droit sur l'image et enregistrez-la image. Reformatez-le en BMP avec un outil tel que Irfanview et renommez-le en "test.bmp". Mettez-le dans le répertoire où vous démarrez le programme. Si vous utilisez DOSBox, l'image est déformée car DOSBox "traduit" le mode vidéo 320 * 200 Int 10h AH=00h AL=13h à sa propre résolution d'écran qui est par défaut un mode 4/3 (je suppose 640 * 480). Changer la valeur de windowresolution dans le dosbox-0.74.conf n'a eu aucun effet ici. :-(

+0

Je l'ai fait ce que vous avez dit, et il a fait charger l'image, mais déformée . Avez-vous des solution à cela? – TacTurtleMM

+0

@YahelTTRosen: Au moins pas d'erreur :-) J'ai aussi la distorsion - parfois. Regardez les propriétés (largeur, hauteur, couleurs). Jouez avec les propriétés. Essayez plusieurs programmes de traitement d'image pour enregistrer le fichier .bmp. Votre programme TASM est ancien et ne peut fonctionner qu'avec les anciens fichiers .bmp. – rkhb