使用 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 看看会发生什么。奇怪的是,它总是输入 AX0005 意思是 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 并让程序终止。