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

时间:2016-05-20 16:32:06

标签: assembly x86 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进行比较时,它始终返回为无效。我显然没有正确地比较这些角色,我只是不知道我做错了什么。

1 个答案:

答案 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获得的地址,而EBXECX寄存器保存简单数字121和110(值“y”和“n”)。<登记/> 以下代码可以使用:

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