【问题标题】:Int 21h/ah=39h returns with AX=3 upon directory creationInt 21h/ah=39h 在创建目录时返回 AX=3
【发布时间】:2015-11-23 13:40:50
【问题描述】:

我正在尝试在 DOSBOX 中创建一个新目录。我在 Debian 上,通过 DOSBOX 使用 MASM。代码很简单,但是不行。

我已经通过调试执行了它,它返回错误 3(执行后 AX=0003h)。根据this,错误是因为路径不存在。我的 DOSBOX 将 C: 驱动器安装在 .asm 代码所在的目录中。

我不明白为什么会出现此错误。如果我从 DOSBOX 命令行运行mkdir C:\nuevo,它将毫无问题地创建目录nuevo

.model small
.stack
.code
  mov dx, offset filepath
  mov ah, 39h
  int 21h
  mov ah, 4ch
  int 21h

  ret
  filepath db "C:\nuevo", 0
end

【问题讨论】:

  • 您确定 MASM 不会将字符组合 \n 视为换行符转义序列吗?
  • 这是一个不错的选择...但它不会将 \n 视为换行符转义序列...我刚刚检查了调试,并且 "C:\nuevo" 字符串按原样存储读取...我只是将文件夹的名称更改为C:\asdf,只是为了确定,但错误是相同的:((AX 上的错误 3)
  • 并且没有权限问题(即 DOSBox 是否以有权写入您挂载为 C: 的文件夹的用户身份运行)?
  • 是的,我仔细检查了它...当我从 dosbox 创建一个文件夹时,它工作得很好,但我无法从我的 asm 程序创建它,我不知道为什么:' (。它在 AX 寄存器上返回的错误表示我尝试创建文件夹的目录不存在
  • 看来您正在创建一个 DOS EXE。您需要用您的数据段初始化 DS 寄存器。在您的代码顶部,您应该有类似 mov ax, @data mov ds, ax 的内容。

标签: assembly masm x86-16 dosbox create-directory


【解决方案1】:

在创建 DOS EXE 程序时,DSES 指向 DOS PSP 段,而不是您的实际数据段。使用 EXE 您需要初始化 DS 以便它指向您自己的数据段。要使用 TASM/MASM 执行此操作,请在程序开头使用如下代码:

mov ax, @data 
mov ds, ax

这会将 data 段值移动到 AX 中,然后设置 DS

您的程序无法运行的原因是因为没有正确初始化您的 DS:DX 组合 int 21h/ah=39h 指向了错误的内存,因此指向了错误的路径。

如果您正在创建一个 COM 程序 CS=DS=ES 所以没有设置 DS必需的。这是因为当您的 COM 程序启动时,所有的段寄存器都被初始化为同一个 64k 段。

【讨论】:

    猜你喜欢
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2016-08-15
    • 2011-09-09
    相关资源
    最近更新 更多