如何拼接两个字符串?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
关键修改说明
- 扩容Outputstr:原100字节容量不足以容纳两个输入字符串,改为200字节避免溢出
- 拆分两次复制流程:先完成第一个字符串的复制,再处理第二个字符串,确保
edi始终指向输出字符串的当前末尾 - 移除冗余栈操作:原代码的
push/pop无实际作用,直接操作寄存器即可 - 替换loop指令:改用
jmp配合条件判断实现循环,避免依赖未初始化的ecx寄存器 - 修正终止符逻辑:复制完第二个字符串后手动添加null终止符,保证输出字符串格式合法
内容的提问来源于stack exchange,提问作者gonedrac
相关产品推荐
相关产品推荐

