2016-05-20 3 views
2

Я пытаюсь использовать пользовательский ввод (y/n), но у меня возникают проблемы с сравнением ввода пользователя с соответствующим символом (y или n).Сравнить char для пользовательского ввода char MASM

У меня есть 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, он всегда возвращается как недействительные. Я явно не сравниваю этих персонажей должным образом, я просто не знаю, что я делаю неправильно.

ответ

1

Ваша программа имеет несколько проблем:

movzx ebx, yesCmp 
mov  edx, ebx 
call WriteString 

WriteString ожидает адрес в EDX регистре, но только кормить его простое число 121 (значение "у").

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. Сравнение производится на только 1-го символа ввода, полученного вами от пользователя.

Как написано, ваша программа будет обрабатывать символы верхнего регистра «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