这个程序应该把两个输入的字符串连接起来,然后打印出来。这是我现在的代码,我不知道该怎么做。我还是个新手,所以请耐心等待。提前谢谢。
.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。它应该同时打印 Inputstr 和 Inputstr2。
2条答案
按热度按时间ux6nzvsh1#
我不是汇编Maven,但看起来您在寄存器esi和edi上推送了两次数据,第一次是InputStr,然后是InputStr 2--所以当代码执行While时,
pop esi
和pop edi
中不是只有InputStr 2吗?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寄存器!