You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,提问作者郑瑜晨

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:47:37