使用DOSBox 0.74编写16位汇编调用int 21h 3Dh获取句柄失败求助
解决DOSBox中int 21h 3D02h调用返回0x05权限拒绝问题
以下是针对该问题的排查和解决步骤:
1. 确认文件路径与存在性
- DOSBox模拟DOS环境,仅支持8.3格式文件名,禁止使用长文件名或带空格的路径。比如
target.txt合法,但my target.txt或longfilename.txt会触发识别错误。 - 确保文件位于DOSBox挂载的目录下:
- 用
mount c 你的本地目录路径命令挂载后,在DOSBox中输入dir c:\或dir(当前目录),确认target.txt存在。 - 代码中文件名必须以0字节(ASCII 0)结尾(ASCIIZ字符串),比如定义为
db 'TARGET.TXT', 0,否则DOS会读取后续垃圾数据,导致路径解析错误(可能返回0x05而非预期的0x02文件未找到)。
- 用
2. 检查int 21h调用参数正确性
- 调用
int 21h的3D功能时,需确保:DX寄存器指向ASCIIZ文件名的偏移地址(需配合正确的DS段寄存器)。比如MASM中用lea dx, FILENAME或mov dx, offset FILENAME,同时要通过mov ax, @data; mov ds, ax初始化DS指向数据段。AL的访问模式参数:00h(只读)、01h(只写)、02h(读写)。注意DOS环境下的文件权限与Windows系统权限无关,无需设置Windows文件权限或管理员运行DOSBox。
3. 排查寄存器与代码逻辑问题
- 在debug中调试时,先验证
DS:DX指向的内容:输入d ds:dx,查看是否显示target.txt后跟随00字节,确认文件名正确。 - 检查是否有其他寄存器干扰调用:比如
DS未正确指向数据段,会导致DX偏移对应的内存地址错误,进而让DOS读取到错误的文件名,触发权限类错误。
示例正确代码片段
.MODEL SMALL .STACK 100H .DATA FILENAME DB 'TARGET.TXT', 0 ; 必须以0结尾的ASCIIZ字符串 .CODE MAIN PROC ; 初始化数据段 MOV AX, @DATA MOV DS, AX ; 调用int 21h 3D00h 只读打开文件 MOV AH, 3DH MOV AL, 00H LEA DX, FILENAME INT 21H JC ERR_HANDLE ; 若CF置位则跳转至错误处理 ; 成功打开后,AX为文件句柄,示例为关闭文件 MOV BX, AX MOV AH, 3EH INT 21H ; 退出程序 MOV AH, 4CH INT 21H ERR_HANDLE: ; 错误处理逻辑(此处仅退出,可扩展为显示错误码) MOV AH, 4CH INT 21H MAIN ENDP END MAIN
内容的提问来源于stack exchange,提问作者郑瑜晨
相关产品推荐
相关产品推荐

