3

我对大会相当陌生(老实说,一般来说,编程)。我正在尝试使用堆栈。 这段代码的目的:

  • 输入一个字符串,限制为 80 个字符
  • 重新打印输入的字符串
  • 打印每个字符,因为它被推入堆栈
  • 打印从堆栈中弹出的每个字符
  • 打印反转的字符串。

代码在最后一步失败。

如果输入的字符串是“帮助”,它会打印出“pleHe”。最终字符串中的最后一个字符是原始字符串的第二个字符。

请帮我看看我在哪里搞砸了!

。数据
缓冲区字 81 DUP(0)
字节数 WORD ?
。代码
主进程
    call Clrscr ;清屏         
回复:
    mov edx, OFFSET buffer ; 将字符串移动到 edx
    mov cl, [SIZEOF buffer]-1 ;将循环计数器设置为(缓冲区大小)-1
    call ReadString ;读取用户的字符串
    mov byteCount, ax ;移动用户字符串的大小到字节数
    cmp byteCount, 80 ;比较 byteCount 和 80
    ja RS ;如果 byteCount 大于 80,请求另一个字符串
    call WriteString ;将用户的字符串写入屏幕
    call Crlf ;换行
    call reverseIt ; 反转字符串的顺序
    出口

反向程序
    movzx ecx, byteCount ; 将 Loop1 计数器设置为字符串的大小
    mov esi, 0 ;将 ESI 归零

L1: ;Loop1 - 一次将字符串推入堆栈一个字符

    movzx eax, buffer[esi] ;取消引用缓冲区并放入eax
    call Crlf ;换行
    call WriteChar ;将当前字符打印到屏幕上
    push eax ;将当前字符压入堆栈
    inc esi ; 移动到下一个字符
    循环 L1

    呼叫 Crlf
    movzx ecx, byteCount ; 将 Loop2 计数器设置为字符串的大小
    mov esi, 0 ;将 ESI 归零

L2: ;Loop2 - 以相反的顺序将字符弹出回字符串

    pop eax ;从栈顶取出字符
    call Crlf ;换行
    call WriteChar ;将当前字符打印到屏幕上
    mov buffer[esi], ax ;将字符写入字符串
    inc esi ;增加esi
    循环 L2

    call Crlf ;换行
    call Crlf ;换行    
    mov edx, OFFSET buffer ; 将字符串移动到 edx 用于 WriteString
    call WriteString ;将字符串打印到屏幕上
    call Crlf ;换行
    ret ;返回主程序
    反向ENDP
主要ENDP
结束主
4

2 回答 2

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)
于 2010-02-22T07:35:32.143 回答
0

这次真是万分感谢!我知道我使用的是 WORDs 而不是 BYTEs,因为它限制字符串大小的第一部分不适用于 BYTEs。它正在切断中间的绳子。

所以我没有将缓冲区更改为 BYTE。

也就是说,我尝试进行其他更改(我想我以前也尝试过)但不断收到编译错误,说明两个操作数必须是相同的大小。

我通过将 buffer[esi] 转换为字节来解决这个问题!现在它完美地工作了!谢谢!

mov byte ptr buffer[esi], al

于 2010-02-22T11:59:55.237 回答