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

如何拼接两个字符串?x86汇编代码仅输出第二个输入的问题

问题分析与修复

你的代码仅输出第二个字符串,核心问题集中在以下几点:

  • 处理第二个输入时,重新将edi指向Outputstr起始位置,直接覆盖了第一个字符串的复制目标
  • 仅执行了一次字符串复制循环,完全未处理第一个输入的字符串
  • 错误使用loop指令(未初始化ecx寄存器,而loop依赖该寄存器计数)
  • 栈操作顺序错误(push esi后push edi,pop时应先pop edi再pop esi)

修复后的代码

.586
.MODEL FLAT
.STACK 4096

INCLUDE io.h

.DATA
Inputstr BYTE 100 DUP (?)
Inputstr2 BYTE 100 DUP (?)
Outputstr BYTE 200 DUP (?)  ; 扩容,确保能容纳两个100字节字符串+终止符
prompt BYTE "Enter a string", 0
displayLbl BYTE "Concatinated string", 0

.CODE
_MainProc PROC
    ; 读取第一个字符串
    input prompt, Inputstr, 100
    
    ; 复制第一个字符串到Outputstr
    lea esi, Inputstr
    lea edi, Outputstr
    cld                     ; 方向标志位清0,让movsb按正向移动
copy_first:
    cmp BYTE PTR [esi], 0   ; 检查当前字符是否为终止符
    je end_copy_first
    movsb                   ; 复制esi指向的字节到edi,同时esi/edi自增1
    jmp copy_first
end_copy_first:
    ; 此时edi指向第一个字符串的终止符位置,直接继续复制第二个字符串

    ; 读取第二个字符串
    input prompt, Inputstr2, 100
    
    ; 复制第二个字符串到Outputstr的末尾
    lea esi, Inputstr2
copy_second:
    cmp BYTE PTR [esi], 0
    je end_copy_second
    movsb
    jmp copy_second
end_copy_second:
    mov BYTE PTR [edi], 0   ; 添加最终的终止符

    ; 输出拼接后的字符串
    output displayLbl, Outputstr

    mov eax, 0
    ret
_MainProc ENDP
END

关键修改说明

  1. 扩容Outputstr:原100字节容量不足以容纳两个输入字符串,改为200字节避免溢出
  2. 拆分两次复制流程:先完成第一个字符串的复制,再处理第二个字符串,确保edi始终指向输出字符串的当前末尾
  3. 移除冗余栈操作:原代码的push/pop无实际作用,直接操作寄存器即可
  4. 替换loop指令:改用jmp配合条件判断实现循环,避免依赖未初始化的ecx寄存器
  5. 修正终止符逻辑:复制完第二个字符串后手动添加null终止符,保证输出字符串格式合法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:00:59