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

DOSBox 0.74调用int 21h功能3ch打开文件致数据清空的问题求助

问题根源:误用了DOS中断的文件操作功能

你遇到的文件被清空的问题,核心原因是用错了int 21h的功能号——ah=3ch根本不是用来打开已有文件的,它的作用是创建新文件,如果文件已存在则直接截断为0字节,这就是为什么你的TESTFILE每次操作后都会被清空成0字节。

具体细节解释

DOS int 21h的功能号分工很明确:

  • ah=3ch:Create/Truncate File(创建或截断文件),参数cl是文件属性(比如只读、隐藏),不是访问模式。只要文件存在,这个调用就会无条件把它的长度设为0,完全符合你看到的现象。
  • ah=3dh:Open Existing File(打开已有文件),这才是你需要用的功能,用al参数指定访问模式(比如只读是al=00h,读写是al=02h等)。

修正后的代码

把你的代码里的文件打开部分替换成以下内容,就能实现“打开并关闭文件但不修改内容”的预期功能:

mov ax, varData
mov ds, ax       ; 加载变量段到ds
; 这里定义word变量handle
; 这里定义字符串fname("TESTFILE")

mov ah, 3dh      ; 选择【打开文件】功能,替代原来的3ch
lea dx, fname    ; dx指向文件名
mov al, 00h      ; 只读模式(对应你原来想设置的cl=1的意图)
int 21h          ; 执行打开操作
mov handle, ax   ; 保存返回的文件句柄

mov ah, 3eh      ; 关闭文件功能,这部分是对的
mov bx, handle
int 21h

额外说明

你提到CF从未置位、返回句柄5,这是因为ah=3ch调用本身是成功的——它成功地截断了已有文件并返回了合法句柄,所以系统没有报错。但这显然不是你想要的行为,换成ah=3dh后,只要文件存在且权限允许,就能正常打开而不修改文件内容。

内容的提问来源于stack exchange,提问作者bad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:50