求助:使用int 21h实现文本文件读写的程序无法运行
关于DOS中断21h文本文件读写程序的调试问题
我实在搞不懂为什么我的汇编程序没法正常运行。我正在尝试编写一段用中断21h实现文本文件读写的代码,下面是我的代码片段:
IDEAL MODEL small STACK 100h DATASEG filename db 'testfile.txt',0 filehandle dw? Message db 'Hello world!' ErrorMsg db 'Error', 10, 13,'$' CODESEG proc OpenFile ; Open file for reading and writing mov ah, 3Dh mov al, 2 mov dx, offset filename int 21h jc openerror mov [filehandle], ax ret openerror: mov dx, offset ErrorMsg mov ah, 9h int 21h ret endp OpenFile proc WriteToFile ; Write message to file mo... ; 这里代码没写完
从你给出的代码片段来看,我能找出几个大概率导致程序跑不起来的问题,给你逐一分析:
1. 未完成的WriteToFile过程
你只写了mo...就断了,这肯定会触发语法错误或者执行时的异常。完整的DOS写文件逻辑需要严格遵循中断21h的调用规范:
proc WriteToFile mov ah, 40h ; 指定DOS功能号:写文件 mov bx, [filehandle]; 传入之前打开文件得到的句柄 mov cx, 12 ; 要写入的字节数("Hello world!"刚好是12个字符) mov dx, offset Message ; 要写入的数据偏移地址 int 21h ; 调用DOS中断 jc writeerror ; 检查进位标志,判断是否写入失败 ret writeerror: mov dx, offset ErrorMsg mov ah, 9h int 21h ret endp WriteToFile
2. 数据段寄存器未初始化
在small内存模型下,程序启动时ds寄存器并不会自动指向你的数据段。如果不手动初始化,访问filename、Message这些变量时会读取到错误的内存区域,直接导致文件打开失败或者数据写入错误。你需要在程序入口处加上这段初始化代码:
start: mov ax, @data mov ds, ax ; 让ds指向我们定义的数据段
3. 缺少文件关闭操作
写完文件后如果不调用关闭文件的DOS功能(ah=3Eh),操作系统可能不会把缓存里的数据刷到磁盘上,导致文件内容为空或者不完整。建议加一个关闭文件的过程:
proc CloseFile mov ah, 3Eh ; 指定DOS功能号:关闭文件 mov bx, [filehandle]; 传入文件句柄 int 21h jc closeerror ; 检查关闭是否失败 ret closeerror: mov dx, offset ErrorMsg mov ah, 9h int 21h ret endp CloseFile
4. 完整的程序入口流程
最后,把各个过程串联起来,加上程序退出的调用,完整的入口应该是这样:
start: mov ax, @data mov ds, ax call OpenFile call WriteToFile call CloseFile mov ah, 4Ch int 21h ; 调用DOS功能退出程序
你可以把这些补充完整后再试试,应该就能解决大部分问题了。
内容的提问来源于stack exchange,提问作者נדב אשד
相关产品推荐
相关产品推荐

