如何连接两个字符串?

问题描述 投票:0回答:2

程序应该接受两个输入的字符串,将它们连接起来,然后打印。这是我现在拥有的代码,我想知道如何解决这个问题。我还是个新人,所以请耐心等待。预先感谢。

.586
.MODEL FLAT
.STACK 4096

INCLUDE io.h

.DATA
Inputstr BYTE 100 DUP (?)
Inputstr2 BYTE 100 DUP (?)
Outputstr BYTE 100 DUP (?)
prompt BYTE "Enter a string", 0
displayLbl BYTE "Concatinated string", 0

.CODE
_MainProc PROC

input prompt, Inputstr, 100
lea esi, Inputstr
lea edi, Outputstr
push esi
push edi
cld

input prompt, Inputstr2, 100
lea esi, Inputstr2
lea edi, Outputstr
push esi
push edi
cld


whileNoNul:
cmp BYTE PTR [esi], 0
je endWhileNoNul
movsb
loop whileNoNul

endWhileNoNul:
mov BYTE PTR [edi], 0
pop esi
pop edi
output displayLbl, Outputstr

mov eax, 0
ret

_MainProc ENDP
END

我的代码仅打印我的第二个输入,即 Inputstr2。它应该同时打印出 InputstrInputstr2

assembly x86 masm string-concatenation
2个回答
0
投票

我不是汇编专家,但看起来您在寄存器 esi 和 edi 上推送数据两次,首先是 InputStr,然后是 InputStr2 - 所以

pop esi
pop edi
中不会只有 InputStr2当代码执行 While 时?


0
投票

一些要点

如果您要允许用户输入 2 个字符串,每个字符串最多 99 个字符,那么您的程序应该定义一个大于 100 的 Outputstr

对于 string1string2 之间的串联,您通常会将 string1 放在 string2 之前。您的代码当前从复制 string2 开始(并且忘记处理 string1)。

堆栈需要平衡:你

push

也需要脱落!同样重要的是,您需要以相反的顺序 
pop
 寄存器。

loop

中的
loop whileNoNul
指令取决于ECX寄存器。您的代码没有事先准备该寄存器,因此结果将不正确。

解决方案

这里没有什么需要推送或弹出的。首先复制

Inputstr1 without 其终止零,然后复制 Inputstr2 with 其终止零。当然,在此期间您不能篡改 EDI 寄存器!

Inputstr1 BYTE 100 DUP (?) Inputstr2 BYTE 100 DUP (?) Outputstr BYTE 200 DUP (?) ... input prompt, Inputstr1, 100 input prompt, Inputstr2, 100 mov esi, OFFSET Inputstr1 mov edi, OFFSET Outputstr cld jmp while contWhile: stosb while: lodsb cmp al, 0 jne contWhile mov esi, OFFSET Inputstr2 until: lodsb stosb cmp al, 0 jne until output displayLbl, Outputstr
另一种解决方案

这里不需要复制。

    输入第一个字符串。
  • 找到其终止零。如果“io.h”返回 EAX 中
  • input
     的长度,那么 
    add eax, OFFSET Buffer
     就足够了。
  • 将第二个字符串输入到该地址(覆盖零)。
  • 显示组合的 ASCIIZ 字符串。
Buffer BYTE 199 DUP (?) ... input prompt, Buffer, 100 mov edi, OFFSET Buffer \ xor eax, eax | cld | add eax, OFFSET Buffer repne scasb | dec edi / input prompt, edi, 100 | input prompt, eax, 100 output displayLbl, Buffer
    
© www.soinside.com 2019 - 2024. All rights reserved.