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

8086汇编(TASM)文件字符串替换问题:输出文件未生成

8086汇编:文件字符串替换问题(未生成output.txt+匹配逻辑错误)

核心问题分析

你的程序编译运行但未生成output.txt,同时字符串"word"的匹配逻辑存在多处错误,以下是具体问题和修正方案:

1. 输出文件未生成的关键原因

最可能是未正确创建/打开输出文件,或未执行文件写入操作就直接退出,也可能是文件写入后未正确关闭。需要确保:

  • 调用int 21h的ah=3Ch功能创建输出文件(或ah=3Dh以写模式打开)
  • 写入数据后调用ah=3Eh关闭文件,否则系统可能不会将缓存写入磁盘

2. CMP指令的比较值是正确的

你用的ASCII码值没问题:

  • 'w' = 77h,'o' = 6fh,'r' = 72h,'d' = 64h
  • 更直观的写法是直接用字符常量,比如cmp al, 'w',TASM完全支持这种写法,可读性更强

3. 字符串匹配逻辑的致命错误

你的reading_word段存在多处逻辑错误:

错误点1:文件读取参数错误+索引越界

  • ah=3Fh读文件时,mov al, 0是多余的,该功能的输入参数只有bx(文件句柄)、cx(读取字节数)、dx(缓冲区地址)
  • 读取3个字节到buffer2后,数据存在buffer2[0]、buffer2[1]、buffer2[2],你却访问buffer2[1]、buffer2[2]、buffer2[3],最后一个索引越界,读取的是无效内存数据

错误点2:Counter递增逻辑错误

不管字符是否匹配,你都执行inc counter,导致哪怕三个字符全错,counter也会变成3,触发误判。必须只有当字符匹配时才递增counter,否则重置为0

错误点3:未检查读取结果

调用ah=3Fh后,需要:

  • 检查CF标志位判断是否读取失败
  • 查看al寄存器的值,确认实际读取的字节数(如果文件剩余不足3个字节,就不可能组成完整的"word")

错误点4:混淆屏幕输出和文件写入

你可能误用了DOS的屏幕显示功能(比如ah=09h)来处理文件输出,正确的文件写入应该用int 21h的ah=40h功能

修正后的核心代码片段

.data
    file_name db "input.txt", 0
    output_name db "output.txt", 0
    new_word db "new_word"  ; 去掉多余的13,10和$,文件写入不需要这些
    file_hand dw 0
    output_file_hand dw 0
    buffer db 1 dup(0)
    buffer2 db 3 dup(0)  ; 只需要存3个字符,缩小缓冲区

.code
start:
    ; 打开输入文件
    mov ah, 3Dh
    mov al, 0  ; 只读模式
    lea dx, file_name
    int 21h
    jc exit_error
    mov file_hand, ax

    ; 创建输出文件
    mov ah, 3Ch
    mov cx, 0  ; 普通文件属性
    lea dx, output_name
    int 21h
    jc exit_error
    mov output_file_hand, ax

read_next_char:
    ; 读取一个字符到buffer
    mov ah, 3Fh
    mov bx, file_hand
    mov cx, 1
    lea dx, buffer
    int 21h
    cmp al, 0  ; 检查是否到文件末尾
    je close_files

    ; 检查是否是'w'
    mov al, buffer
    cmp al, 'w'
    je check_word
    ; 不是'w',直接写入输出文件
    jmp write_current_char

check_word:
    ; 读取接下来3个字符
    mov ah, 3Fh
    mov bx, file_hand
    mov cx, 3
    lea dx, buffer2
    int 21h
    jc read_fail  ; 读取失败处理
    cmp al, 3
    jne not_full_word  ; 不足3个字节,不匹配

    ; 逐一检查字符
    mov al, buffer2[0]
    cmp al, 'o'
    jne not_word
    mov al, buffer2[1]
    cmp al, 'r'
    jne not_word
    mov al, buffer2[2]
    cmp al, 'd'
    jne not_word

    ; 匹配成功,写入new_word到输出文件
    mov ah, 40h
    mov bx, output_file_hand
    mov cx, 8  ; "new_word"共8个字符
    lea dx, new_word
    int 21h
    jmp read_next_char

not_word:
    ; 匹配失败,先写入'w',再写入buffer2的内容
    mov ah, 40h
    mov bx, output_file_hand
    mov cx, 1
    lea dx, buffer
    int 21h
    mov cx, ax  ; ax是之前读取的实际字节数
    lea dx, buffer2
    int 21h
    jmp read_next_char

not_full_word:
    ; 读到不足3个字节,写入'w'和已读内容
    mov ah, 40h
    mov bx, output_file_hand
    mov cx, 1
    lea dx, buffer
    int 21h
    mov cx, ax
    lea dx, buffer2
    int 21h
    jmp close_files

write_current_char:
    ; 写入当前字符到输出文件
    mov ah, 40h
    mov bx, output_file_hand
    mov cx, 1
    lea dx, buffer
    int 21h
    jmp read_next_char

close_files:
    ; 关闭输入文件
    mov ah, 3Eh
    mov bx, file_hand
    int 21h
    ; 关闭输出文件
    mov bx, output_file_hand
    int 21h

exit_error:
    ; 退出程序
    mov ah, 4Ch
    int 21h
end start

关键注意事项

  • 所有文件操作后都要检查CF标志位,处理错误情况
  • 文件写入必须用ah=40h,不要和屏幕显示功能混淆
  • 字符串匹配时要处理文件末尾的边界情况,避免越界读取
  • 操作完成后必须关闭文件,否则数据可能不会写入磁盘

内容的提问来源于stack exchange,提问作者vabalas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:31:12