2017-04-23 40 views
-1

所以我試着複製代碼以在學校中從我的學習書籍中打印一個bmp文件,完成了上述所有操作,並且它只顯示錯誤消息。 任何人都可以幫我調試嗎?如何在組裝圖形模式下打印BMP照片文件

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 

這是所有的代碼。

+0

爲什麼你需要幫助調試?有什麼問題你的調試器? –

+0

你無法提供錯誤信息? –

回答

0

你需要一個合適的.bmp文件:(!由我免費版權爲所有使用!)

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

藉此:

Copyright by me! Free for all use!

右鍵點擊圖片並保存圖片。用類似Irfanview的工具將其重新格式化爲BMP,並將其重命名爲「test.bmp」。把它放在你啓動程序的目錄中。

如果你使用DOSBox,因爲DOSBox將320 * 200視頻模式Int 10h AH=00h AL=13h「翻譯」爲其默認的4/3模式(我猜640 * 480)的屏幕分辨率,所以圖片失真。在dosbox-0.74.conf中更改windowresolution的值對此沒有影響。 :-(

+0

我沒有你所說的話,才加載圖像,但失真。 你有什麼解決方案? – TacTurtleMM

+0

@YahelTTRosen:至少沒有錯誤:-)我也有失真 - 有時。看看屬性(寬度,高度,顏色)。玩這些屬性。嘗試多個圖像處理程序來保存.bmp。您的TASM程序是舊的,只能使用老式的.bmp文件。 – rkhb