Assembly Int 21h/ah=39h在创建目录时返回AX=3
我正在尝试在DOSBOX中创建一个新目录。我在Debian上,通过DOSBOX使用MASM。代码非常简单,但不起作用 我用调试执行了它,它返回错误3(执行后AX=0003h)。根据,错误是因为路径不存在。My DOSBOX将C:驱动器安装在.asm代码所在的目录中 我不明白为什么我会犯这个错误。如果我从DOSBOX命令行运行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
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
的内容。