我对大会很新(和一般的编程,说实话)。我正在尝试使用堆栈。 此代码的目的:
代码在最后一步失败。
如果输入的字符串是“帮助”,它将打印出“pleHe”。最后一个String中的最后一个字符是原始String的第二个字符。
请帮我看看我搞砸了哪里!
.data buffer WORD 81 DUP(0) byteCount WORD ? .code main PROC call Clrscr ;Clear screen RS: mov edx, OFFSET buffer ;Move String to edx mov cl, [SIZEOF buffer]-1 ;Set loop counter to (size of buffer) -1 call ReadString ;Read a User's String mov byteCount, ax ;Move the size of User's String to byteCount cmp byteCount, 80 ;Compare byteCount with 80 ja RS ;If byteCount is greater then 80, ask for another String call WriteString ;Write User's String to screen call Crlf ;New Line call reverseIt ;Reverse order of String exit reverseIt PROC movzx ecx, byteCount ;Set Loop1 Counter to size of String mov esi, 0 ;Zero out ESI L1: ;Loop1 - Pushes String into Stack one character at a time movzx eax, buffer[esi] ;Dereference buffer and place in eax call Crlf ;New Line call WriteChar ;Print current character to screen push eax ;Push current character to stack inc esi ;Move to next character loop L1 call Crlf movzx ecx, byteCount ;Set Loop2 Counter to size of String mov esi, 0 ;Zero out ESI L2: ;Loop2 - Pops Characters back into String in reverse order pop eax ;Retrieve character from top of stack call Crlf ;New Line call WriteChar ;Print current character to screen mov buffer[esi], ax ;Writes character to String inc esi ;Increase esi loop L2 call Crlf ;New Line call Crlf ;New Line mov edx, OFFSET buffer ;Move String to edx for WriteString call WriteString ;Prints String to Screen call Crlf ;New Line ret ;Return to main reverseIt ENDP main ENDP END main
答案 0 :(得分:5)
<强>问题强>
您将ASCII字符视为WORD而不是字节,因此您最终会反转两个字符:
一次将字符串反转两个字符时,最终会将这些值写入缓冲区:
esi+0: p-
esi+1: lp
esi+2: el
esi+3: He
在每次迭代期间,缓冲区如下所示:
Help--
p-lp--
plpp--
plel--
pleHe-
所以你最终将额外的e写入缓冲区。我假设e没有出现在你的WriteChar循环中。
<强>解决方案强>
我没有测试过您的代码,所以无法确定,但看起来您需要更改此行:
mov buffer[esi], ax ;Writes character to String
到
mov ptr byte buffer[esi], al ;Writes character to String
改变这一行也许是一个好主意:
buffer WORD 81 DUP(0)
所以它使用BYTE代替:
buffer BYTE 81 DUP(0)
答案 1 :(得分:0)
谢谢你!我知道我使用的是WORD而不是BYTE,因为第一部分限制了字符串的大小,而不是使用BYTE。它正在中间切断弦。
所以我没有将缓冲区更改为BYTE。
那就是说,我尝试进行另一次更改(我认为我以前也尝试过),但是仍然遇到编译错误,说明两个操作数必须大小相同。
我通过将缓冲区[esi]作为一个字节来修复它! 现在它完美无缺!谢谢!
mov byte ptr buffer[esi], al