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
相关产品推荐
相关产品推荐

