检查字符串是否为回文 - 汇编语言

时间:2017-10-09 15:44:06

标签: assembly x86 dos

我正在尝试解决一个要求用户输入用户名的问题。如果该用户名是回文(即,字符串的反向与原始字符串相同),则它应该打印“重新输入用户名”并再次输入。如果没有,它应该打印'OK'并终止。我写了以下代码,但无法找到谬误。如果有人能够指出我的错误,这将是很大的帮助。提前谢谢。

data segment
str0 db 'Enter username: $'
str db '$'
str1 db 'OK$'
str2 db 'Retype Username$'
data ends

code segment
assume cs:code, ds:data
start: mov bx, data
mov ds, bx
mov es, bx
mov bl, '$'     ;terminating point of all strings
mov cl, 00h     ;counter value in case of loop use

lea dx, str0    ;to display 'Enter username: '
mov ah, 09h
int 21h

lab0: lea si, str   ;to read the username
lab: mov ah, 01h
int 21h
mov [si], al    ;the input is read character by character. To avoid termination after just one character, the characters are read till the end is determined
inc si
inc cl
cmp al, bl
jne lab



lea si, str     ;loading string for front end
dec si
lea di, str     ;loading string for rear end
dec di
lab1: inc di
cmp [di], bl    ;comparing to find '$'
jne lab1


lab2: inc si
mov bh, [si]
dec di      
cmp [di], bh    ;comparing letters from front and rear end
jne lab3        ;if not equal then not a palindrome
loop lab2

lea dx, str2    ;to display 'Retype username' when username is a palindrome
mov ah, 09h
int 21h
jmp lab0


lab3: lea dx, str1  ;to display 'OK' when the username is not a palindrome
mov ah, 09h
int 21h

mov ah, 4ch
int 21h
code ends
end start

1 个答案:

答案 0 :(得分:2)

str db '$'

这应该是您存储输入的用户名的地方 这个db指令所做的是保留一个单字节的内存。当然不足以存储完整的名称。在你的程序中发生的事情是输入例程(几乎写得很好)开始覆盖其余的程序数据,更糟糕的是程序代码。

用于存储输入的合适缓冲区由以下内容定义:

str db 255 dup (0)

要结束输入,通常按 Enter 。从逻辑上讲,这意味着您的代码需要检查它。 DOS给你的价值是13,所以绝对不是' $'你曾经使用过!

  mov bl, '$'     ;terminating point of all strings
  mov cx, 0       ;counter value in case of loop use
lab0:
  lea di, str     ;to read the username
lab:
  mov ah, 01h
  int 21h
  cmp al, 13      ;13 is code for carriage return
  je  OK
  mov [di], al    ;the input is read character by character.
  inc di
  inc cx
  jmp lab
OK:
  mov [di], bl
lea si, str     ;loading string for front end
dec si
lea di, str     ;loading string for rear end
dec di
lab1: inc di
cmp [di], bl    ;comparing to find '$'
jne lab1

为什么需要搜索字符串的结尾?在输入结束时,indexregister DI已经方便地指向它。

lea si, str     ; -> SI=first character
dec di          ; -> DI=last character

第一条提示:由于您使用了loop,因此您应该已清除CX,而不仅仅是CL! 第二个提示:如果CX中的计数器为零,则不要开始比较字符! 第三个提示:您只需进行CX / 2次迭代!

黄金提示:你根本不需要任何反击。当后指数低于或等于前指数时,结束(或不开始)循环!