【发布时间】:2019-08-17 14:07:55
【问题描述】:
我有一个需要从数据段中的“缓冲区”写入的文件,但是当我尝试使用 DOS 中断 21h 40h 写入文件时,它会将进位标志设置为 1,并将 ax 设置为05 - 这意味着访问被拒绝,该怎么办
代码段:
proc scanScreen
push offset Buffer
call openFile
mov [fileHandle], ax
mov dx, [BMPX]
mov di, [BMPY]
mov cx, [BMPHeight]
scanScreen_toBuffer:
push cx
mov si, offset graphicBuffer
mov cx, [BMPWidth]
scanScreen_toBuffer_line:
push cx
mov bh, 0
mov cx, dx
push dx
mov dx, di
mov ah, 0Dh
int 10h
mov [si], al
inc si
pop dx
inc dx
pop cx
loop scanScreen_toBuffer_line
mov ah, 40h -
mov cx, [BMPWidth] |
mov dx, offset graphicBuffer |> HERE IS THE PROBLEM
mov bx, [fileHandle] |
int 21h -
pop cx
mov dx, [BMPX]
inc di
loop scanScreen_toBuffer
call closeFile
ret
endp scanScreen
来电者:(我扫描屏幕并立即打印,看看它是否保持不变,这意味着它可以工作)
mov [BMPX],66
mov [BMPY],38
mov [BMPHeight], 5
mov [BMPWidth], 12
call scanScreen
push offset Buffer
call openFile
mov [fileHandle], ax
mov bx, [fileHandle]
call showBMP
call closeFile
数据段:
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)
graphicBuffer db MAX_WIDTH dup (RESET)
Buffer db "buffer.buf", RESET
fileHandle dw ?
变量:
RESET equ 0
MAX_WIDTH equ 320
AMOUNT_OF_COLORS equ 256
HEADER_SIZE equ 54
COLOR_SIZE equ 4
【问题讨论】:
-
openFile的代码在哪里?你是用写权限打开文件,还是只读的? -
@1201ProgramAlarm 哇,我太笨了,我觉得它是什么,我被毁了):
标签: assembly x86 dos tasm dosbox