【问题标题】:Assembly program crashes when reading second BMP file读取第二个 BMP 文件时汇编程序崩溃
【发布时间】:2019-08-14 18:10:38
【问题描述】:

我有一个从位图打印到屏幕的程序,问题是它成功打印了第一个文件,但不是第二个,即使我交换 BMP 文件,第一个总是会打印,但不会打印第二个一个

我在调试器中发现它在 readHeaderBMP 中的 int 21h 上崩溃了,但不知道为什么

主要:

        mov [BMPX],0
        mov [BMPY],0
        mov [BMPHeight], 200
        mov [BMPWidth], 320
        push offset menu
        call openFile
        push bp
        call createBMP
        pop bp

        mov [BMPX],120
        mov [BMPY],68
        mov [BMPHeight], 25
        mov [BMPWidth], 80
        push offset menuSelect
        call openFile
        push bp
        call createBMP
        pop bp

文件管理:

          proc openFile
        push bp
        mov bp, sp
        mov dx, [bp + 4]
        xor ax, ax
        mov ah, 3Dh
        int 21h
        mov [fileHandle], ax
        pop bp
        ret 2
    endp openFile

    proc readHeaderBMP
        xor ax, ax
        mov ah, 3Fh
        mov bx, [fileHandle]
        mov cx, 54
        lea dx, [BMPHeader]
        int 21h
        mov [Error], ax
        ret
    endp readHeaderBMP

    proc readPaletteBMP
        mov ah, 3Fh
        mov cx, 400h
        lea dx, [BMPPalette]
        int 21h
        ret
    endp readPaletteBMP

    proc copyPalleteVRAM
        lea si, [BMPPalette]
        mov cx, 256
        mov dx, 3C8h
        xor al, al
        out dx, al
        inc dx
        copyPalleteVRAM_convert:
            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 copyPalleteVRAM_convert
        ret
    endp copyPalleteVRAM

    proc showBMP
        push cx
        mov ax, 0A000h
        mov es, ax
        mov cx, [BMPHeight]

        mov ax, [BMPWidth] 
        xor dx, dx
        mov si, 4
        div si
        mov bp, dx

        mov dx, [BMPX]

        showBMP_nextLine:
            push cx
            push dx

            mov di, cx  
            add di, [BMPY] 



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


            mov ah, 3fh
            mov cx, [BMPWidth]  
            add cx, bp  
            mov dx, offset BMPMaxLine
            int 21h

            mov cx, [BMPWidth]  
            dec cx
            mov si, offset BMPMaxLine
            showBMP_nextLine_movsbLoop:
                push cx
                mov cx, [ds:si]
                mov [es:di], cx
                inc si
                inc di
                pop cx
            loop showBMP_nextLine_movsbLoop

            pop dx
            pop cx

        loop showBMP_nextLine

        pop cx
        ret
    endp showBMP

    proc closeFile
        mov ah, 3Eh
        mov bx, offset FileHandle
        int 21h
        ret
    endp closeFile

    proc createBMP
        call readHeaderBMP
        call readPaletteBMP
        call copyPalleteVRAM
        call showBMP
        call closeFile
        ret
    endp createBMP

还有一些数据:

RESET               equ 0
MAX_WIDTH           equ 320
AMOUNT_OF_COLORS    equ 256
HEADER_SIZE         equ 54
COLOR_SIZE          equ 4

    BMPHeader       db HEADER_SIZE dup (RESET)
    BMPPalette      db AMOUNT_OF_COLORS * COLOR_SIZE dup (RESET)
    BMPX            dw ?
    BMPY            dw ?
    BMPWidth        dw ?
    BMPHeight       dw ?
    BMPMaxLine      db MAX_WIDTH dup (RESET)

    menu            db "menu.bmp", RESET
    menuSelect      db "msl.bmp", RESET

    fileHandle      dw ?

【问题讨论】:

  • 您没有显示常量的定义,HEADER_SIZEAMOUNT_OF_COLORS 等,所以我们无法判断您为 BMPPalette 之类的东西保留的空间是否是与您正在阅读的大小相同。Edit您的问题包括它们。如果COLOR_SIZE 为 3,那么您将破坏后面的数据,破坏第二个文件名。当第二个文件打开失败时会出现什么错误?
  • @1201ProgramAlarm 哦,是的,对不起,我是个哑巴哑巴;P

标签: assembly dos x86-16 tasm dosbox


【解决方案1】:

我找到了解决办法,我在turbo debugger中检查了怎么回事,然后我在文件相关程序中看到,在关闭文件中的int 21h行,而不是设置cf = 0,ax = 0,该行set cf = 1, ax 06h,表示关闭文件出错,问题是我设置的bx不是FileHandler,而是FileHandler的地址

    proc closeFile
        mov ah, 3Eh
        mov bx, offset FileHandle ;THIS LINE IS NOT CORRECT
        int 21h                   ;THIS LINE RETURNED AN ERROR
        ret
    endp closeFile

应该是mov bx, [FileHandle]

实际上发生在我身上很多,尤其是在 C 语言中,即使我知道计算机体系结构,但我总是在编码方面遇到问题而没有注意它。

【讨论】:

    猜你喜欢
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多