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

Assembly 检查字符串是否为回文汇编语言,assembly,x86,dos,Assembly,X86,Dos,我试图解决一个问题,要求用户输入用户名。如果该用户名是回文(即字符串的反面与原始字符串相同),则应打印“重新键入用户名”并再次获取输入。如果没有,则应打印“OK”并终止。我已经编写了以下代码,但无法在其中找到谬误。如果有人能指出我的错误,那将是很大的帮助。提前谢谢 data segment str0 db 'Enter username: $' str db '$' str1 db 'OK$' str2 db 'Retype Username$' data ends code segment

我试图解决一个问题,要求用户输入用户名。如果该用户名是回文(即字符串的反面与原始字符串相同),则应打印“重新键入用户名”并再次获取输入。如果没有,则应打印“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
这应该是您存储输入用户名的地方。
这个
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

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

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

第一个提示:因为使用了
循环
,所以应该清除
CX
,而不仅仅是
CL

第二个提示:如果
CX
中的计数器为零,则不要开始比较字符
第三个提示:您只需要执行
CX/2
迭代

黄金提示:你根本不需要任何柜台。当后索引低于或等于前索引时,结束(或不开始)循环

这应该是您存储输入用户名的地方。
这个
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

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

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

第一个提示:因为使用了
循环
,所以应该清除
CX
,而不仅仅是
CL

第二个提示:如果
CX
中的计数器为零,则不要开始比较字符
第三个提示:您只需要执行
CX/2
迭代


黄金提示:你根本不需要任何柜台。当后索引低于或等于前索引时,结束(或不开始)循环

提供输入、预期和实际输出。另外,学习使用调试器。您应该使用更好的标签名称,虽然您已经写了一些注释,但它们还不够。PS:
mov-es,dx
可能是一个拼写错误,因为没有设置
dx
。我想你想要
mov-es,bx
。欢迎来到堆栈溢出!请通过您的问题向我们展示您所做的调试。我希望您已经在Valgrind或类似的检查器中运行了自己的代码,并且已经使用诸如GDB之类的调试器进行了调查。确保还启用了一整套编译器警告。这些工具告诉了你什么,它们遗漏了什么信息?读埃里克·利珀特的。@Jester谢谢你指出这一点,但我仍然在经历我以前遇到的问题。在执行时,程序除了请求输入之外什么也不做。另外,很抱歉信息不足。我是个笨蛋。你最大的错误是不使用调试器。例如,您应该打开指向
str
标签的内存视图,查看您的输入是如何一个字符一个字符地存储在内存中的,以及它将如何影响代码的其余部分和预期(它将…很多)。(顺便说一句,用户“anna”对代码的目的非常不满意(笑话))提供输入、预期和实际输出。另外,学习使用调试器。您应该使用更好的标签名称,虽然您已经写了一些注释,但它们还不够。PS:
mov-es,dx
可能是一个拼写错误,因为没有设置
dx
。我想你想要
mov-es,bx
。欢迎来到堆栈溢出!请通过您的问题向我们展示您所做的调试。我希望您已经在Valgrind或类似的检查器中运行了自己的代码,并且已经使用诸如GDB之类的调试器进行了调查。确保还启用了一整套编译器警告。这些工具告诉了你什么,它们遗漏了什么信息?读埃里克·利珀特的。@Jester谢谢你指出这一点,但我仍然在经历我以前遇到的问题。在执行时,程序除了请求输入之外什么也不做。另外,很抱歉信息不足。我是个笨蛋。你最大的错误是不使用调试器。例如,您应该打开指向
str
标签的内存视图,查看您的输入是如何一个字符一个字符地存储在内存中的,以及它将如何影响代码的其余部分和预期(它将…很多)。(顺便说一句,用户“anna”对代码的用途非常不满意(笑话))