8086汇编程序问题:替换'E'/'e'为'Egg'/'egg'时输出空白
8086汇编:替换字符串中的'E'/'e'为'Egg'/'egg'
原代码核心问题分析
- 硬编码循环长度错误:测试字符串
"In English$"有效长度(不含结束符)仅10,却设置CX=19,导致循环越界。 - 输出逻辑混乱:
bige/smalle分支中直接打印未填充完整的result缓冲区,且分支内循环因CX初始值为0直接跳过;后续change段的CX计算错误,最终导致无输出。 - 未处理字符串结束符:结果字符串未添加
$,无法通过int 21h ah=09h正确输出。
修正后的代码
.MODEL SMALL .STACK 100H .DATA english DB "In English$" result DB 100 dup(?) ; 预留足够大的缓冲区存储处理结果 newline DB 10,13,'$' bigegg DB "Egg$" smallegg DB "egg$" .CODE MAIN PROC MOV AX, @DATA MOV DS, AX ; 打印原字符串 mov ah, 09h lea dx, english int 21h ; 打印换行分隔 mov ah, 09h lea dx, newline int 21h lea si, english ; SI指向原字符串起始地址 lea di, result ; DI指向结果缓冲区起始地址 process_char: mov al, [si] cmp al, '$' ; 检测到字符串结束符,终止处理 je end_process cmp al, 'E' ; 匹配大写'E' je replace_bigE cmp al, 'e' ; 匹配小写'e' je replace_smalle ; 普通字符直接复制到结果缓冲区 mov [di], al inc si inc di jmp process_char replace_bigE: ; 将"Egg"复制到结果缓冲区 mov cx, 3 ; "Egg"的字符长度 lea bx, bigegg copy_big_loop: mov al, [bx] mov [di], al inc bx inc di loop copy_big_loop inc si ; 跳过原字符串中的'E' jmp process_char replace_smalle: ; 将"egg"复制到结果缓冲区 mov cx, 3 ; "egg"的字符长度 lea bx, smallegg copy_small_loop: mov al, [bx] mov [di], al inc bx inc di loop copy_small_loop inc si ; 跳过原字符串中的'e' jmp process_char end_process: mov [di], '$' ; 为结果字符串添加DOS结束符 ; 打印最终处理后的字符串 mov ah, 09h lea dx, result int 21h ; 程序正常退出 MOV AX, 4C00H INT 21H MAIN ENDP END MAIN
关键修改说明
- 动态遍历字符串:通过检测结束符
$终止循环,适配任意长度的输入字符串,避免硬编码长度的错误。 - 先构建后输出:所有字符(包括替换后的
Egg/egg)先存入result缓冲区,最后添加$后统一输出,逻辑清晰且符合DOS字符串输出规范。 - 简化替换逻辑:遇到目标字符时,直接将替换字符串复制到缓冲区,跳过原字符,流程简洁易维护。
- 可读性优化:使用字符常量
'E'/'e'替代十六进制值,代码更直观。
内容的提问来源于stack exchange,提问作者LIM WENG NI
相关产品推荐
相关产品推荐

