汇编调用INT 21,43设置文件只读属性不生效问题求助
问题根因
你遇到的现象本质是原版DOSBox对宿主Windows系统目录的文件属性映射支持不完整导致的,你的汇编代码本身逻辑没有错误。
具体原因说明
- DOS的文件属性位定义如下:
- 只读:
01h - 隐藏:
02h - 系统:
04h - 卷标:
08h - 子目录:
10h - 归档:
20h
你调用读取属性功能返回CX=20h是归档属性,对应Windows下新建文件的默认属性,说明你读操作本身是成功的,只是DOSBox没有把Windows侧手动设置的只读属性同步到模拟的DOS环境中。
- 只读:
- 原版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
相关产品推荐
相关产品推荐

