如何在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,提问作者נדב אשד
相关产品推荐
相关产品推荐

