如何在8086汇编中逐字符读取文件直至遇到'|'字符?
DOSBox下8086汇编逐字符读取文件并遇'|'停止的实现修正
需求:在DOSBox环境下使用8086汇编语言逐字符读取文件,当遇到'|'字符时停止读取。
用户原始代码
MOV AX, @DATA MOV DS, AX lea si, buffer ; Open the file for reading MOV AH, 3Dh ; Open existing file mov al,0 LEA DX, FileName ; Load address of file name XOR CX, CX ; Access mode (CX = 0, read-only) INT 21h MOV fhandle, AX ; Store file handle Read_Loop: ; Read data from the file MOV AH, 3Fh ; Read from file MOV CX, 1 ; Read 1 byte at a time LEA DX, Buffer[si+2] ; Load address of data buffer mov bx,fhandle INT 21h ;call NEW_LINE ;mov dl,[Buffer] ;mov ah,02h ;int 21h mov cl,'3' cmp cl,Buffer[si+2] je File_End inc si jmp Read_Loop File_End: ;mov ah,09h ;lea dx, data2 ;int 21h ; Close the file MOV AH, 3Eh ; Close file MOV BX, fhandle ; Use the file handle INT 21h MOV AH, 4Ch ; Exit program INT 21h
代码问题分析
- 停止条件错误:当前代码判断的是字符
'3',与需求的'|'不符 - 缓冲区使用冗余:每次仅读取1字节,无需通过
si+2偏移访问缓冲区,直接使用缓冲区首地址即可 - 未处理异常情况:未检查文件打开是否失败,也未处理读取到文件末尾(AX返回0)的场景
- 缺失变量定义:代码中用到的
FileName、fhandle、buffer等变量未在数据段中定义
修正后的完整代码
; 8086汇编:逐字符读取文件,遇'|'停止 .MODEL SMALL .STACK 100H .DATA FileName DB "test.txt", 0 ; 要读取的文件名,以0结尾 Buffer DB ? ; 存储单个读取的字符 fhandle DW ? ; 文件句柄 ErrMsg DB "File open failed!$" .CODE MAIN PROC MOV AX, @DATA MOV DS, AX ; 打开文件(只读模式) MOV AH, 3Dh MOV AL, 0 ; AL=0表示只读 LEA DX, FileName XOR CX, CX INT 21H JC Open_Error ; 若CF置位,说明打开失败 MOV fhandle, AX ; 保存文件句柄 Read_Loop: ; 读取1字节数据 MOV AH, 3Fh MOV CX, 1 LEA DX, Buffer MOV BX, fhandle INT 21H ; 检查读取结果:AX=0表示文件结束,终止循环 CMP AX, 0 JE File_End ; 检查是否遇到'|'字符 CMP Buffer, '|' JE File_End ; 可选:输出当前读取的字符(用于调试) ; MOV AH, 02h ; MOV DL, Buffer ; INT 21h JMP Read_Loop Open_Error: ; 输出错误信息 MOV AH, 09h LEA DX, ErrMsg INT 21h JMP Exit_Prog File_End: ; 关闭文件 MOV AH, 3Eh MOV BX, fhandle INT 21H Exit_Prog: ; 退出程序 MOV AH, 4Ch INT 21H MAIN ENDP END MAIN
关键说明
- 数据段定义:补充了文件名、单字节缓冲区、文件句柄和错误提示信息,确保变量合法
- 错误检查:文件打开后通过CF标志判断是否失败,读取后通过AX值判断是否到文件末尾
- 停止逻辑:直接对比读取到的字符与
'|',符合需求 - 简化缓冲区:使用单个字节的缓冲区,避免不必要的偏移计算
内容的提问来源于stack exchange,提问作者Loo Ren Hao
相关产品推荐
相关产品推荐

