Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Int 21h/ah=39h在创建目录时返回AX=3_Assembly_Masm_X86 16_Dosbox_Create Directory - Fatal编程技术网

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

Assembly Int 21h/ah=39h在创建目录时返回AX=3,assembly,masm,x86-16,dosbox,create-directory,Assembly,Masm,X86 16,Dosbox,Create Directory,我正在尝试在DOSBOX中创建一个新目录。我在Debian上,通过DOSBOX使用MASM。代码非常简单,但不起作用 我用调试执行了它,它返回错误3(执行后AX=0003h)。根据,错误是因为路径不存在。My DOSBOX将C:驱动器安装在.asm代码所在的目录中 我不明白为什么我会犯这个错误。如果我从DOSBOX命令行运行mkdir C:\nuevo,它将毫无问题地创建目录nuevo .model small .stack .code mov dx, offset filepath m

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

我用调试执行了它,它返回错误3(执行后AX=0003h)。根据,错误是因为路径不存在。My 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程序时,DS和ES指向段,而不是实际的数据段。使用EXE,您需要初始化DS,使其指向您自己的数据段。要使用TASM/MASM执行此操作,请在程序开始时使用如下代码:

mov ax, @data 
mov ds, ax
这将
数据
段值移动到AX中,然后设置DS

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


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

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