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

汇编调用INT 21,43设置文件只读属性不生效问题求助

问题根因

你遇到的现象本质是原版DOSBox对宿主Windows系统目录的文件属性映射支持不完整导致的,你的汇编代码本身逻辑没有错误。

具体原因说明

  1. DOS的文件属性位定义如下:
    • 只读:01h
    • 隐藏:02h
    • 系统:04h
    • 卷标:08h
    • 子目录:10h
    • 归档:20h
      你调用读取属性功能返回CX=20h是归档属性,对应Windows下新建文件的默认属性,说明你读操作本身是成功的,只是DOSBox没有把Windows侧手动设置的只读属性同步到模拟的DOS环境中。
  2. 原版DOSBox为了简化实现,默认不会把DOS侧修改的文件属性同步到宿主Windows的文件系统中,所以你调用设置只读的中断返回成功(CF未置位),但实际Windows侧的文件属性没有变化,再次读取也读不到只读属性。

解决方法

  • 方案1:更换支持完整文件属性映射的DOSBox衍生版本,比如DOSBox-X,开启文件属性同步配置后即可正常测试该功能。
  • 方案2:在DOSBox内创建虚拟软盘/硬盘镜像,将测试程序和测试文件放入虚拟磁盘中运行,虚拟磁盘的文件属性完全由DOSBox模拟,不受宿主系统限制,可以正常测试属性读写功能。
  • 临时验证方法:你可以在代码中添加属性读取的逻辑,设置属性后立刻在同一次程序运行中读取属性,DOSBox的内存缓存中会临时保存你设置的属性值,可以验证代码逻辑本身的正确性。

验证用修改后代码示例

.model small
.stack 100h

.data
    filename db "temp.txt",0 ; 文件名

.code
start:
    mov dx, @data
    mov ds, dx
    
    ; 设置只读属性
    mov ah, 43h
    mov al, 01h
    mov cx, 01h
    lea dx, filename
    int 21h
    
    ; 立刻读取属性验证
    mov ah, 43h
    mov al, 00h
    lea dx, filename
    int 21h
    
    ; 此处断点查看CX值,正常会返回01h,说明代码逻辑正确
    mov ah, 4ch
    mov al, 0
    int 21h

end start

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:15:04