assembly - Int 21h/ah=39h 在创建目录时返回 AX=3

标签 assembly masm x86-16 dosbox create-directory

我正在尝试在 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

最佳答案

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

mov ax, @data 
mov ds, ax

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

您的程序无法工作的原因是因为没有正确初始化,您的 int 21h/ah=39hDS:DX 组合指向了错误的内存,并且因此走错了路。

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

关于assembly - Int 21h/ah=39h 在创建目录时返回 AX=3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33872531/

相关文章:

assembly - MASM shellcode 和 NASM shellcode 之间有区别吗

c - 如何在 MASM 中使用 pop 和 ret

assembly - 两个数组的总和,每个数组 n 个字节

x86-16 - RCR 和 ROR 有什么区别?

assembly - 减数较大时如何设置进位标志?

assembly - 有没有办法用 int 13h 读取放在 head = 1 上的内核?

assembly - 使用 MIPS 汇编中的逻辑移位乘以 2 的幂

c - 有没有办法将汇编代码插入到 C 中?

c - 如何告诉 GCC 为实模式生成 16 位代码

linux - 使用 pop ecx 在屏幕上进行 assembly 打印