我正在尝试使用(y / n)用户输入,但我无法将用户输入与相应字符(y或n)进行比较。
我定义了y
和n
,以及我的用户输入:
cnt = 80
.data
tryResponse BYTE cnt+1 DUP(?)
yesCmp BYTE "y",0
noCmp BYTE "n",0
tryAnother proc
try:
mov edx, OFFSET prompt_3
call WriteString
mov edx, OFFSET tryResponse
mov ecx, cnt
call ReadString
mov eax, OFFSET tryResponse
movzx ebx, yesCmp
mov edx, ebx
call WriteString
movzx ecx, noCmp
cmp eax, ebx
je yes
cmp eax, ecx
je no
invalid:
mov edx, OFFSET invalid_msg
call WriteString
call CrLf
loop try
yes:
jmp main
no:
jmp goodbye
tryAnother endp
当我尝试将用户输入与yCmp
或nCmp
进行比较时,它始终返回为无效。我显然没有正确地比较这些角色,我只是不知道我做错了什么。
答案 0 :(得分:1)
您的计划有几个问题:
movzx ebx, yesCmp mov edx, ebx call WriteString
WriteString 需要EDX
寄存器中的地址,但您只需输入一个简单的数字121(“y”的值)。
cmp eax, ebx je yes cmp eax, ecx je no
在这些cmp
中,您正在比较无法比较的事情!
EAX
寄存器保存从mov eax, OFFSET tryResponse
获得的地址,而EBX
和ECX
寄存器保存简单数字121和110(值“y”和“n”)。<登记/>
以下代码可以使用:
mov bl, yesCmp
mov cl, noCmp
cmp [eax], bl
je yes
cmp [eax], cl
je no
正如您所看到的,不需要任何movzx
或movsx
。比较是在用户输入的仅第一个字符上完成的。
编写代码时,程序会将大写字母“Y”和“N”视为无效。这可能会让您的用户失望! 以下解决方案不区分大小写:
mov al, [eax] ;1st character from user
or al, 20h ;make LCase
cmp al, yesCmp ;compare to "y"
je yes
cmp al, noCmp ;compare to "n"
je no