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

使用int 21h 3Dh调用无法打开文件的emu8086技术求助

解决emu8086中int 21h ah=3Dh无法打开文件的问题

首先,你的问题核心在于没有正确初始化数据段寄存器(DS),导致程序无法从正确的内存区域读取文件名,进而出现乱码路径和打开失败的错误。

问题分析

  1. 乱码文件名的原因:
    你的代码启动后没有将DS寄存器指向定义了filename的data段。默认情况下,DS可能指向其他内存区域(比如栈段或程序的其他部分),此时lea dx, filename取出的并不是你定义的"file.txt",而是随机的内存字节,也就是你看到的乱码Í。

  2. 创建文件夹后仍报错的原因:
    int 21h ah=3Dh这个中断功能是专门用于打开文件的,它无法处理文件夹。即便你创建了同名文件夹,这个功能调用依然会返回错误,因为它期望操作的是文件而非目录。

修正后的代码

data segment
    filename db "file.txt",0   ; 文件名,以0结尾的ASCIIZ字符串
    filehandle dw ?            ; 用于存储打开后的文件句柄
ends

stack segment
    dw 128 dup(0)
ends

code segment
start:
    mov ax, data       ; 将data段的地址加载到ax寄存器
    mov ds, ax         ; 把DS寄存器设置为data段,确保能正确访问数据段变量
    
    mov ah, 3Dh        ; 设置中断功能为"打开文件"
    mov al, 01h        ; 打开模式:只读(若需读写可改为03h,只写则用02h)
    lea dx, filename   ; 加载文件名的偏移地址到dx寄存器
    int 21h            ; 调用DOS中断执行打开操作
    
    jc open_error      ; 如果CF进位标志置位,说明打开失败,跳转至错误处理
    
    mov [filehandle], ax  ; 保存成功获取的文件句柄
    
    ; 此处可添加文件读写的逻辑代码
    
    mov ax, 4c00h      ; 程序正常退出
    int 21h

open_error:
    ; 可在此处添加错误提示逻辑,比如打印错误信息
    mov ax, 4c01h      ; 携带错误码退出程序
    int 21h
ends
end start

关键修正点说明

  • 初始化DS寄存器:通过mov ax, data和mov ds, ax将数据段地址加载到DS,确保程序能正确读取data段中定义的filename变量。
  • 添加错误检查:调用int 21h后,若CF标志置位说明打开失败,通过跳转指令处理错误,让程序逻辑更健壮。
  • 明确打开模式:al=01h代表只读打开,你可以根据实际需求修改这个值,适配不同的文件操作场景。

现在将修正后的代码在emu8086中运行,确保file.txt确实位于C:\emu8086\MyBuild目录下,就能正常打开文件了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:31:34