8086汇编:如何将字符串缓冲区插入另一缓冲区并完整输出?
8086汇编实现字符串替换插入(将"1bc"转为"ONEbc")
原代码的核心问题
- 循环计数器错误:你修改了
cx的值(ADD ax,3后赋值给cx),打乱了原字符串的剩余字符循环次数,导致只处理到"ONE"就提前结束,后续的"bc"未被处理。 - 硬编码字符,未复用定义的
one变量:手动赋值'O'、'N'、'E'既不灵活,也不符合代码复用原则。 - 未处理字符串结束符:原字符串没有明确的结束标记,容易引发长度计算错误或越界读取。
优化实现方案(emu8086环境)
以下是更简洁、健壮的代码,利用8086串操作指令实现批量字符插入,同时保证后续字符正常处理:
完整代码
.MODEL SMALL .STACK 100H .DATA firstBuf db "1bc$" ; 输入字符串,以'$'作为结束符(适配int 21h的09h输出功能) one db "ONE" ; 要插入的目标字符串 newBuf db 20 dup(?) ; 输出缓冲区,预留足够空间 .CODE START: MOV AX, @DATA MOV DS, AX ; 初始化数据段寄存器 MOV ES, AX ; 串操作需要ES指向目标段(这里与DS同段) MOV SI, OFFSET firstBuf ; SI指向输入字符串起始 MOV DI, OFFSET newBuf ; DI指向输出缓冲区起始 PROCESS_CHAR: MOV AL, [SI] CMP AL, '$' ; 遇到结束符,停止处理 JE FINISH_PROCESS CMP AL, '1' ; 判断当前字符是否为'1' JNE COPY_SINGLE_CHAR ; 批量复制"ONE"到输出缓冲区 PUSH SI ; 保存当前输入字符串的位置 MOV SI, OFFSET one MOV CX, 3 ; "ONE"的字符长度 REP MOVSB ; 自动复制3个字符,DI自动递增3次 POP SI ; 恢复输入字符串的位置 INC SI ; 跳过原字符串中的'1' JMP PROCESS_CHAR COPY_SINGLE_CHAR: MOVSB ; 复制单个字符到输出缓冲区,SI和DI自动各+1 JMP PROCESS_CHAR FINISH_PROCESS: MOV [DI], '$' ; 给输出字符串添加结束符,确保能正确输出 ; 调用DOS中断输出结果 MOV AH, 09H MOV DX, OFFSET newBuf INT 21H ; 退出程序 MOV AH, 4CH INT 21H END START
关键优化点说明
- 使用
REP MOVSB串操作:一次性复制one字符串的所有字符,避免手动逐个赋值,代码更简洁高效。 - 基于结束符的循环:通过判断'$'结束符处理字符串,适配任意长度的输入(只要不超过缓冲区大小)。
- 寄存器保护:用
PUSH/POP保存SI的位置,确保插入完成后能回到原输入字符串的下一个字符,继续处理后续内容。 - 正确初始化段寄存器:emu8086中必须手动将DS指向数据段,否则无法正确访问变量。
运行结果
编译运行后,会输出ONEbc,完全符合需求。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

