0

私はこのコードを持っています

restart:
            mov edx, OFFSET prompt5
            call WriteString
            mov edx, 0  
            mov edx , OFFSET buffer
            call ReadString
            cmp edx, 'n'  or 'N'
            JE exit
            cmp edx, 'Y'  or 'y'
            JE ReadInput
            JNE restart

このコードは、ユーザーに「はい」または「はい」のいずれYかを入力するように求めるものyです。入力しない場合、Yまたはプログラムが最初から開始されます。ユーザーがまたはおよびまたはy以外の何かを入力した場合。ユーザーが入力するか、プログラムが終了した場合。yYnNnN

JE exitオンラインで呼び出しエラーが発生するのはなぜですか

助けてくれてありがとう

4

2 に答える 2

1

2 つの値を同時に比較することはできません。これを行うと、アセンブラはとcmp al, 'Y' or 'y'のビットごとの OR を計算します。したがって、その命令は と同等になります。'Y''y''y'cmp al, 'y'

これらの値の両方と比較する場合は、それぞれの比較を個別に行う必要があります。

cmp al,'Y'
je L1
cmp al,'y'
je L1

L1ユーザーが Y または y を入力した場合にジャンプしたいラベルが であると仮定します。これは、質問の元のコードではなく、回答の変更されたコードに基づいています。

次に、「再起動」の場合、使用する必要はありません。jne無条件で使用できますjmp。コードのそのポイントに到達した場合は、すでに他の条件のいずれにも一致していないため、文字が Y、y、N、または n と等しくないことがわかります。これ以上のテストは必要ありません。

アップデート

私は機能を想定していて、レジスタWriteCharCrlf保持していることを付け加えておきます。alifReadCharは で読み取った文字を返しますが、alそれを別のもので上書きしWriteCharCrlfしまうため、このコードは決して機能しません。

が保存されていない場合alは、次のようにして一時的にスタックに保存できます。

call ReadChar
push eax
call WriteChar
call Crlf
pop  eax
cmp  al,'N'
...etc
于 2013-05-21T08:50:15.633 に答える
0
restart:
            mov eax, 0
            mov edx, OFFSET prompt5
            call WriteString
            mov edx, 0  
            call ReadChar
            call WriteChar
            call Crlf
            cmp al, 'N' 
            JE L
            cmp al, 'n'
            JE L
            cmp al, 'Y' or 'y'
            JE L1
            JNE restart

    L:
            exit
于 2013-05-21T06:58:25.683 に答える