Assembly DosBox停止,但代码中没有错误

Assembly DosBox停止,但代码中没有错误,assembly,x86,dos,dosbox,Assembly,X86,Dos,Dosbox,我在汇编中编写了一个代码来上传bmp文件。当我运行程序时,调试器不会显示任何错误或警告,但DosBox会停止工作。 谢谢你的帮助 IDEAL MODEL small STACK 0f500h DATASEG filename db 'simonP.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,'$' COD

我在汇编中编写了一个代码来上传bmp文件。当我运行程序时,调试器不会显示任何错误或警告,但DosBox会停止工作。 谢谢你的帮助

IDEAL
MODEL small
STACK 0f500h
DATASEG
filename db 'simonP.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

start:
    mov ax, @data
    mov ds, ax

    ;graphic mode
    mov ax, 13h
    int 10h

    call OpenFile
    call ReadHeader
    call ReadPalette
    call CopyPalette
    call CopyBitMap



proc OpenFile
        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
    mov ah, 3fh
    mov bx, [filehandle]
    mov cx, 54
    mov dx, offset Header
    int 21h 
    ret
ENDP ReadHeader


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


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

    out dx,al

    inc dx

PalLoop:
    mov al,[si+2]
    shr al, 2

    out dx, al
    mov al, [si+1]
    shr al, 2
    out dx,al
    mov al, [si]
    shr al, 2
    out dx,al
    add si, 4

    loop PalLoop
    ret
ENDP CopyPalette


proc CopyBitMap
    mov ax, 0A000h
    mov es, ax
    mov cx, 200

PrintBMPLoop:
    push cx
    mov di, cx
    shl cx, 6
    shl di, 8
    add di, cx

;read one line
    mov ah, 3fh
    mov cx, 320
    mov si,offset ScrLine
    rep movsb   ;copy line to the screen
                ;rep movsb is the 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



exit:
    mov ax, 4c00h
    int 21h
END start
  • OpenFile程序将错过调用DOS函数的
    mov ah,3Dh
  • openError代码最好不要返回给调用者,而是通过Terminate函数退出到DOS
  • ReadHeader进程应测试是否存在错误
  • ReadPalette进程未命中mov bx、[filehandle],还应测试错误
  • CopyBitMap进程忘记实际读取文件中的数据。它只复制一个空缓冲区200次。此外,由于一次性错误,它永远不会填充屏幕的顶部扫描线
  • 调用CopyBitMap
    之后,您需要插入
    jmp exit
    。现在,您正在进入OpenFile过程
  • 我建议对CopyBitMap过程进行这些更改


    你说它停止工作是什么意思?还要注意的是,您陷入了
    OpenFile
    ,在
    调用CopyBitmap
    之后,您可能缺少一个
    jmp退出
    。您似乎没有在
    OpenFile
    中设置任何有意义的
    ah
    。。。
     ...
     cld         ;All to often forgotten!
    PrintBMPLoop:
     push cx
     dec cx      ;The famous one-off-error!
     mov di, cx
     shl cx, 6
     shl di, 8
     add di, cx
     ;read one line
     mov ah, 3fh
     mov bx, [filehandle]
     mov cx, 320
     mov dx, offset ScrLine
     int 21h
     jc ...
     mov si, dx
     rep movsb   ;copy line to the screen
     pop cx
     loop PrintBMPLoop
     ...