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

如何在DOSBox 8086环境下用汇编实现从文本文件打印字符串?

解决8086汇编中从文本文件读取并打印字符串的问题

嘿,我看到你正在啃8086汇编,还卡在从文本文件读取并打印字符串的环节——别慌,我来一步步帮你捋顺!结合你已经写的代码,我会补全必要的逻辑,让你能在DOSBox里顺利跑通这个功能。

首先明确整体流程:打开文件 → 读取内容到缓冲区 → 打印内容 → 关闭文件。你已经搞定了打开文件的部分,接下来我们补全读取和打印的核心逻辑,顺便完善你没写完的WriteToFile过程(如果需要测试写入的话)。

1. 先补全你未完成的WriteToFile过程

如果只是用来测试写入文件功能,这个过程可以这样补全(假设你要写入的内容存在Msg变量里):

proc WriteToFile ; 向文件写入消息
    mov ah,40h
    mov bx, [filehandle]
    mov cx, MsgLen ; 要写入的字节数,需提前定义Msg的长度
    mov dx, offset Msg ; 要写入内容的偏移地址
    int 21h
    jc writeerror ; CF置位说明写入出错
    ret
writeerror:
    mov dx, offset WriteErrMsg
    mov ah,9h
    int 21h
    ret
endp WriteToFile

2. 核心:读取文件内容并打印的过程

要从文件读取内容,我们用DOS中断int 21h的3Fh功能,然后把读取到的内容输出到屏幕。这里提供两种实用的打印方式:

方式一:逐个字符打印(通用型,无需处理$结尾)

这种方式适合文件内容没有$结束符的情况,逐个读取字符并输出,兼容性更强:

; 先定义必要的变量和缓冲区
buffer db 1 dup(?) ; 每次读取1个字符的缓冲区
filehandle dw ?
filename db "test.txt",0 ; 要打开的文件名,必须以0结尾
ReadErrMsg db "Error reading file!$"
CloseErrMsg db "Error closing file!$"

proc ReadAndPrintFile
    ; 调用你写的OpenFile打开文件
    call OpenFile
    ; 循环读取每个字符
read_loop:
    mov ah,3Fh ; DOS读取文件功能号
    mov bx, [filehandle]
    mov cx,1 ; 每次读取1个字节
    mov dx, offset buffer
    int 21h
    jc readerror ; 读取出错则跳转
    cmp ax,0 ; ax返回实际读取的字节数,为0说明文件读完
    je close_file
    
    ; 打印当前字符
    mov dl, [buffer]
    mov ah,2h ; DOS输出单个字符功能号
    int 21h
    jmp read_loop ; 继续读取下一个字符

readerror:
    mov dx, offset ReadErrMsg
    mov ah,9h
    int 21h
    ; 出错也要记得关闭文件
    jmp close_file

close_file:
    ; 关闭文件,用int21h的3Eh功能
    mov ah,3Eh
    mov bx, [filehandle]
    int 21h
    jc closeerror
    ret
closeerror:
    mov dx, offset CloseErrMsg
    mov ah,9h
    int 21h
    ret
endp ReadAndPrintFile

方式二:批量读取后添加$打印(适合已知内容长度的场景)

如果你想一次读取多个字符,再手动添加$结束符用9h功能打印,可以这样做:

buffer db 100 dup(?) ; 定义100字节的缓冲区,可按需调整大小
buffer_len equ $ - buffer ; 缓冲区长度

proc ReadAndPrintFile
    call OpenFile
    mov ah,3Fh
    mov bx, [filehandle]
    mov cx, buffer_len ; 最多读取buffer_len个字节
    mov dx, offset buffer
    int 21h
    jc readerror
    cmp ax,0
    je close_file
    
    ; 在读取到的内容末尾添加$结束符
    mov si, ax ; si存储实际读取的字节数
    mov byte ptr [buffer+si], '$' ; 手动添加$
    
    ; 打印字符串
    mov dx, offset buffer
    mov ah,9h
    int 21h

readerror:
    mov dx, offset ReadErrMsg
    mov ah,9h
    int 21h
close_file:
    mov ah,3Eh
    mov bx, [filehandle]
    int 21h
    jc closeerror
    ret
closeerror:
    mov dx, offset CloseErrMsg
    mov ah,9h
    int 21h
    ret
endp ReadAndPrintFile

3. 关键注意事项

  • 文件名必须以0结尾(比如filename db "test.txt",0),这是DOS 3Dh打开文件功能的硬性要求。
  • 每次操作文件后一定要关闭文件(用3Eh功能),避免DOS环境下的资源泄漏。
  • 如果文件内容包含换行符,DOS的2h输出字符功能会自动处理换行和回车,不用额外写逻辑。
  • 缓冲区大小可以根据你的需求调整,别太小导致读取不全。

最后把这些过程和变量整合到你的完整程序里,在主程序中调用ReadAndPrintFile,就能实现从文本文件读取并打印字符串的功能啦!

内容的提问来源于stack exchange,提问作者נדב אשד

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:18:24