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

8086汇编:如何将字符串缓冲区插入另一缓冲区并完整输出?

8086汇编实现字符串替换插入(将"1bc"转为"ONEbc")

原代码的核心问题

  1. 循环计数器错误:你修改了cx的值(ADD ax,3后赋值给cx),打乱了原字符串的剩余字符循环次数,导致只处理到"ONE"就提前结束,后续的"bc"未被处理。
  2. 硬编码字符,未复用定义的one变量:手动赋值'O'、'N'、'E'既不灵活,也不符合代码复用原则。
  3. 未处理字符串结束符:原字符串没有明确的结束标记,容易引发长度计算错误或越界读取。

优化实现方案(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:45:41