8086汇编执行INT 21H 3CH创建文件后无法删除问题求助
问题原因分析
- 寄存器未完整初始化:你仅向
BL寄存器写入了输入文件名长度,未清零BH寄存器,导致BX整体值不确定,MOV NMF[BX + 2], ' '操作会写入错误的内存地址,直接破坏文件名结构。 - 文件名终止符错误:DOS下的文件名字符串要求以ASCII 0(
\0)结尾,你将输入结束位置的字符设为了空格,会导致文件名尾部多出无效字符,创建的文件和后续要删除的文件名称不匹配。 - 无接口调用错误校验:你调用创建文件、关闭文件的中断时都没有校验
CF标志位判断调用结果。如果创建文件失败,HND中存储的是错误码而非有效句柄,后续关闭无效句柄的操作会失败,文件处于打开状态时操作系统会持有文件锁,禁止删除操作。
你观察到删除时
CF=0且AX=0003属于正常现象:INT 21H的41H删除功能调用成功时CF会置0,此时AX的值属于未定义的历史调用残留值,不是错误码,不需要参考。
修复方案
修正文件名处理逻辑,增加BX清零、终止符改为0,同时补充必要的错误检查即可:
; 若原有代码未初始化数据段,需补充本段保证DS指向数据段 MOV AX, @DATA MOV DS, AX ;Enter the file name MOV AH, 0AH LEA DX, NMF INT 21H ; 完整初始化BX,避免高8位残留值 XOR BX, BX MOV BL, NMF[1] ; 文件名末尾补0而非空格 MOV NMF[BX + 2], 0 ;Create the file MOV AH, 3CH MOV CX, 0H LEA DX, NMF + 2 INT 21H ; 校验创建是否成功 JC CREATE_FAILED MOV HND, AX ;Close the file MOV AH, 3EH MOV BX, HND INT 21H ; 校验关闭是否成功 JC CLOSE_FAILED ;Delete the file MOV AH, 41H LEA DX, NMF + 2 INT 21H JC DELETE_FAILED CREATE_FAILED: CLOSE_FAILED: DELETE_FAILED: ; 可在上述分支自行添加错误处理逻辑,比如打印错误提示
原有变量定义无需修改:
NMF DB 100 DUP(' '), 0 HND DW 0
内容的提问来源于stack exchange,提问作者Sebastian Zarate
相关产品推荐
相关产品推荐

