【发布时间】: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_SIZE、AMOUNT_OF_COLORS等,所以我们无法判断您为BMPPalette之类的东西保留的空间是否是与您正在阅读的大小相同。Edit您的问题包括它们。如果COLOR_SIZE为 3,那么您将破坏后面的数据,破坏第二个文件名。当第二个文件打开失败时会出现什么错误? -
@1201ProgramAlarm 哦,是的,对不起,我是个哑巴哑巴;P
标签: assembly dos x86-16 tasm dosbox