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

如何在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

关键说明

  1. 数据段定义:补充了文件名、单字节缓冲区、文件句柄和错误提示信息,确保变量合法
  2. 错误检查:文件打开后通过CF标志判断是否失败,读取后通过AX值判断是否到文件末尾
  3. 停止逻辑:直接对比读取到的字符与'|',符合需求
  4. 简化缓冲区:使用单个字节的缓冲区,避免不必要的偏移计算

内容的提问来源于stack exchange,提问作者Loo Ren Hao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:01:26