将 char 与用户输入的 char MASM 进行比较
Compare char to user input char MASM
我正在尝试使用 (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
进行比较时,它总是 returns 无效。我显然没有正确比较这些字符,我只是不知道我做错了什么。
你的程序有几个问题:
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" 和 [=44= 的值) ]).
以下代码将起作用:
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
我正在尝试使用 (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
进行比较时,它总是 returns 无效。我显然没有正确比较这些字符,我只是不知道我做错了什么。
你的程序有几个问题:
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" 和 [=44= 的值) ]).
以下代码将起作用:
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