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
相关产品推荐
相关产品推荐

