【问题标题】:Using 3Dh causes interrupt to only return "Acces Denied"使用 3Dh 会导致中断仅返回“拒绝访问”
【发布时间】:2017-05-22 05:04:39
【问题描述】:

配置:

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

我使用 TurboDebugger 看看会发生什么。奇怪的是,它总是输入AX value 0005 意思是Access Denied

我可以在互联网上搜索 ASSEMBLY access denied open file 找到的所有内容都与 DLL 相关,但这并没有帮助。

我尝试过任何方法,从重新启动程序到以“管理员身份”打开 dosbox。可悲的是,没有任何效果,我没有想法。
还有一个奇怪的是,我的一个朋友说激活他的windows 10后,一切正常。

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

【问题讨论】:

  • AX5 并不意味着访问本身被拒绝,只有当CF 设置为指示错误时。否则它只是你的文件句柄。那么,您检查过CF 的值吗?
  • 不,因为直到现在我都在使用不需要CF 的函数并且忘记了它。嗯你是对的! CF 为 0。谢谢。我将删除此帖子。
  • 这是一个问得很好的问题(我们看到的不多),可惜答案很简单:)
  • 你也在AL寄存器中传递0,这是访问模式。 0 表示“只读”,不会帮助您写入文件!
  • 也谢谢你,科迪·格雷!我被这个问题困扰了半个小时!

标签: assembly x86-16 dos tasm dosbox


【解决方案1】:

为了正确操作您的 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

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

【讨论】:

    猜你喜欢
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2011-08-09
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多