assembly 如何连接两个字符串?

eagi6jfj  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(228)

这个程序应该把两个输入的字符串连接起来,然后打印出来。这是我现在的代码,我不知道该怎么做。我还是个新手,所以请耐心等待。提前谢谢。

.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

ux6nzvsh

ux6nzvsh1#

我不是汇编Maven,但看起来您在寄存器esi和edi上推送了两次数据,第一次是InputStr,然后是InputStr 2--所以当代码执行While时,pop esipop edi中不是只有InputStr 2吗?

wko9yo5t

wko9yo5t2#

有些细节
如果你要允许用户输入2个字符串,每个字符串最多99个字符,那么你的程序应该定义一个大于100的 Outputstr
对于 * string 1 * 和 * string 2 * 之间的连接,通常将 * string 1***放在***string 2 * 之前。您的代码当前从复制 * string 2 * 开始(并且忘记处理 * string 1 *)。
堆栈需要平衡:你的push也需要脱落!同样重要的是,你需要以相反的顺序pop寄存器。
loop whileNoNul中的loop指令取决于ECX寄存器。您的代码未事先准备该寄存器,因此结果将不正确。

A溶液

这里没有什么需要推入或弹出的。首先复制 * Inputstr 1***,不带其终止零,然后复制 * Inputstr 2*,**带其终止零。当然,在这中间,你不要篡改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

相关问题