使用3Dh会导致中断仅返回"已拒绝访问"

Snu*_*ies 5 assembly dos tasm dosbox x86-16

配置:

MS-DOS 16 BIT(在.asm文件中写入,然后用TASM和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
Run Code Online (Sandbox Code Playgroud)

我用TurboDebugger看看会发生什么.奇怪的是,它总是具有AX价值0005意义Access Denied

我在互联网上可以找到的所有东西都是ASSEMBLY access denied open file关于它DLL的,但这并没有帮助.

我已经尝试了任何东西,从重新启动程序到打开dosbox"作为管理员".可悲的是,没有任何效果,我没有想法.
同样奇怪的是,我的一位朋友说,在激活他的窗户10之后,一切都运转正常.

只获得"拒绝访问"的原因是什么?我提到我能够创建,删除和关闭文件,但我无法打开它们.

Sep*_*and 3

为了正确操作,您的writeToFile过程需要

  • 使用允许后续写入的访问模式打开文件
  • 检查 DOS 返回的 CF,看看是否一切正常

我注意到,您将在该文件中写入的文本以“$”结束。我想知道您是否知道实际写入文件的 DOS 函数仅适用于指定的长度CX,而不适用于任何类型的分隔符。对于这个“$”字符,您可能还有其他正当理由 -;

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
Run Code Online (Sandbox Code Playgroud)

将NOK标签放在哪里以及在那里做什么完全取决于您想花多少精力来处理 DOS 返回的错误。在这个非常简单的程序中,您可能只是从 中返回call并让程序终止。