将 char 与用户输入的 char MASM 进行比较

Compare char to user input char MASM

我正在尝试使用 (y/n) 用户输入,但我无法将用户输入与相应的字符(y 或 n)进行比较。

我定义了 yn,以及我的用户输入:

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

当我尝试将用户输入与 yCmpnCmp 进行比较时,它总是 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 获得的地址,而 EBXECX 寄存器保存简单数字 121 和 110("y" 和 [=44= 的值) ]).
以下代码将起作用:

mov     bl, yesCmp
mov     cl, noCmp
cmp     [eax], bl
je      yes
cmp     [eax], cl
je      no

如您所见,不需要任何 movzxmovsx。比较是在您从用户那里得到的输入的第一个字符上完成的。


正如所写,您的程序会将大写字符 "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