使用 3Dh 只会导致中断 return "Acces Denied"
Using 3Dh causes interrupt to only return "Acces Denied"
配置:
MS-DOS 16 BIT (writing in a .asm file, then compiling them with TASM and TLINK)
Windows 7 x64
我在 Assembly 中编写了一个简单的程序,它应该只打开一个文件并向其中写入文本。
这是它的代码:
assume cs:code, ds:data
data segment
fileName db "input.txt", 0 ; We assure it is an ASCIIZ(ero) file.
toWrite db "Hello World!", "$"
data ends
code segment
writeToFile:
; pentru functia 3Dh
mov AH, 3Dh
mov AL, 0h
mov dx, offset fileName
int 21h
ret
start_program:
mov ax, data
mov ds, ax
CALL writeToFile
mov ax, 4c00h
int 21h
code ends
end start_program
我用 TurboDebugger 看看会发生什么。奇怪的是,它总是输入 AX
值 0005
意思是 Access Denied
我在互联网上可以找到的用于搜索 ASSEMBLY access denied open file
的所有内容都是关于 DLL
的,但没有帮助。
我已经尝试过任何方法,从重新启动我的程序到“以管理员身份”打开 dosbox。可悲的是,没有任何效果,我没有想法。
奇怪的是,我的一个朋友说,他的windows 10激活后,一切正常。
为什么只得到“访问被拒绝”?我提到我可以创建、删除和关闭文件,但我无法打开它们。
为了正常运行,您的 writeToFile 过程需要
- 以允许后续写入的访问模式打开文件
- 检查由 DOS 编辑的 CF return 以查看是否一切正常
我注意到,您将在此文件中写入的文本以“$”结尾。我想知道您是否知道实际写入文件的 DOS 函数仅适用于 CX
中的指定长度,而不适用于任何类型的分隔符。对于这个“$”字符,您可能还有其他正当理由 -;[=13=]
writeToFile:
mov ax, 3D01h ; 01h=WriteAccess
mov dx, offset fileName
int 21h
jc NOK
mov bx, ax ; Handle
mov dx, offset toWrite
mov cx, 12 ; Length of "Hello World!"
mov ah, 40h
int 21h
jc NOK
cmp ax, cx
jne NOK
NOK:
ret
将 NOK 标签放在哪里以及在那里做什么完全取决于您要花多少精力来处理由 DOS 编辑的错误 return。在这个非常简单的程序中,您可能只是从 call
return 并让程序终止。
配置:
MS-DOS 16 BIT (writing in a .asm file, then compiling them with TASM and TLINK)
Windows 7 x64
我在 Assembly 中编写了一个简单的程序,它应该只打开一个文件并向其中写入文本。
这是它的代码:
assume cs:code, ds:data
data segment
fileName db "input.txt", 0 ; We assure it is an ASCIIZ(ero) file.
toWrite db "Hello World!", "$"
data ends
code segment
writeToFile:
; pentru functia 3Dh
mov AH, 3Dh
mov AL, 0h
mov dx, offset fileName
int 21h
ret
start_program:
mov ax, data
mov ds, ax
CALL writeToFile
mov ax, 4c00h
int 21h
code ends
end start_program
我用 TurboDebugger 看看会发生什么。奇怪的是,它总是输入 AX
值 0005
意思是 Access Denied
我在互联网上可以找到的用于搜索 ASSEMBLY access denied open file
的所有内容都是关于 DLL
的,但没有帮助。
我已经尝试过任何方法,从重新启动我的程序到“以管理员身份”打开 dosbox。可悲的是,没有任何效果,我没有想法。
奇怪的是,我的一个朋友说,他的windows 10激活后,一切正常。
为什么只得到“访问被拒绝”?我提到我可以创建、删除和关闭文件,但我无法打开它们。
为了正常运行,您的 writeToFile 过程需要
- 以允许后续写入的访问模式打开文件
- 检查由 DOS 编辑的 CF return 以查看是否一切正常
我注意到,您将在此文件中写入的文本以“$”结尾。我想知道您是否知道实际写入文件的 DOS 函数仅适用于 CX
中的指定长度,而不适用于任何类型的分隔符。对于这个“$”字符,您可能还有其他正当理由 -;[=13=]
writeToFile:
mov ax, 3D01h ; 01h=WriteAccess
mov dx, offset fileName
int 21h
jc NOK
mov bx, ax ; Handle
mov dx, offset toWrite
mov cx, 12 ; Length of "Hello World!"
mov ah, 40h
int 21h
jc NOK
cmp ax, cx
jne NOK
NOK:
ret
将 NOK 标签放在哪里以及在那里做什么完全取决于您要花多少精力来处理由 DOS 编辑的错误 return。在这个非常简单的程序中,您可能只是从 call
return 并让程序终止。