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

汇编读取文本文件遇异常:缓冲区存随机字节且程序提前结束求解答

问题分析与解决方法

先拆解你代码里的几个关键问题,这正是导致缓冲区出现随机字节的核心原因:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:57:55