2016-05-20 11 views
2

(y/n)ユーザー入力を使用しようとしていますが、ユーザー入力をそれぞれの文字(yまたはn)と比較する際に問題があります。文字をユーザー入力文字と比較MASM

私はynは私のユーザーの入力だけでなく、定義されている:私はyCmpまたはnCmpへのユーザー入力を比較しようとすると、それは常に無効として返します

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 

。私は明らかにこれらの文字を正しく比較していない、私はちょうど私が間違っているのか分からない。

答えて

1

あなたのプログラムは、いくつかの問題があります。

movzx ebx, yesCmp 
mov  edx, ebx 
call WriteString 

WriteStringメソッドEDXレジスタ内のアドレスを期待していますが、それだけに、単純な番号121( "Y" の値)を養います。あなたは比較できないものを比較しているこれらのcmp年代の

cmp  eax, ebx 
je  yes 
cmp  eax, ecx 
je  no 


EAXレジスタは、から得られたアドレスを保持し、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 
関連する問題