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

求助:使用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,提问作者נדב אשד

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:00:26