使用int 21h 3Dh调用无法打开文件的emu8086技术求助
解决emu8086中
int 21h ah=3Dh无法打开文件的问题 首先,你的问题核心在于没有正确初始化数据段寄存器(DS),导致程序无法从正确的内存区域读取文件名,进而出现乱码路径和打开失败的错误。
问题分析
乱码文件名的原因:
你的代码启动后没有将DS寄存器指向定义了filename的data段。默认情况下,DS可能指向其他内存区域(比如栈段或程序的其他部分),此时lea dx, filename取出的并不是你定义的"file.txt",而是随机的内存字节,也就是你看到的乱码Í。创建文件夹后仍报错的原因:
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
相关产品推荐
相关产品推荐

