汇编读取文本文件遇异常:缓冲区存随机字节且程序提前结束求解答
问题分析与解决方法
先拆解你代码里的几个关键问题,这正是导致缓冲区出现随机字节的核心原因:
1. 变量名不匹配(最致命的错误)
你在数据段定义的文件名变量是boolean db 'boolean.txt',0,但打开文件的代码里写的是lea dx, file_name——这个file_name根本没定义!DOS会把未定义的符号解析成随机内存地址,导致你实际打开的不是目标文件,而是内存里的随机内容,大概率文件打开直接失败。
2. 未初始化数据段寄存器(DS)
DOS程序启动时,CS会自动指向代码段,但DS不一定指向你定义的_DATI数据段!你原代码里完全没做DS的初始化操作,这会导致所有访问数据段变量的操作都指向错误的内存区域,自然读不到正确内容。
3. 缺少系统调用的错误检查
DOS中断int 21h的功能调用失败时,会置位进位标志(CF),并在AX中返回错误码。但你没有做任何检查就继续执行读取、关闭操作——如果文件打开失败,filehandle里存的就是无效的错误码,用它去读取数据只会得到随机字节。
修正后的完整代码
_DATI SEGMENT PARA PUBLIC 'DATA' USE16 Text_Buffer db 100 dup(?) ; 定义足够大的缓冲区,这里设为100字节 filehandle dw ? file_name db 'boolean.txt',0 ; 统一变量名,避免拼写错误 _DATI ENDS _CODE SEGMENT PARA PUBLIC 'CODE' USE16 ASSUME CS:_CODE, DS:_DATI, ES:_DATI ReadFile proc ; 1. 打开文件(只读模式) mov ah, 3dh mov al, 0 lea dx, file_name int 21h jc OpenFailed ; CF置位说明打开失败,跳转到错误处理 mov [filehandle], ax ; 2. 读取1字节到缓冲区 mov ah, 3fh lea dx, Text_Buffer mov cx, 1 ; 读取1字节 mov bx, [filehandle] int 21h jc ReadFailed ; 检查读取是否失败 ; 3. 关闭文件 mov bx, [filehandle] mov ah, 3eh int 21h jc CloseFailed ; 检查关闭是否失败 ret ; 错误处理分支 OpenFailed: ; 可添加错误提示逻辑,比如打印"Open file failed!" jmp ExitProgram ReadFailed: ; 读取失败后先尝试关闭文件再退出 mov bx, [filehandle] mov ah, 3eh int 21h CloseFailed: ExitProgram: ret ReadFile endp START: ; 必须初始化DS和ES,指向数据段 mov ax, _DATI mov ds, ax mov es, ax call ReadFile _end: mov ax, 4c00h int 21h _CODE ENDS END START
额外说明
- 把
Text_Buffer改成字节数组而非字变量,更符合单字节读取的场景,也方便后续扩展读取更多内容。 - 新增的错误处理分支能帮你快速定位问题环节(打开/读取/关闭),调试时更高效。
内容的提问来源于stack exchange,提问作者A.Shah
相关产品推荐
相关产品推荐

