2017-06-03 6 views
1
Include Irvine32.inc 

.data 
prompt1 BYTE "Bye!", 0 
prompt2 BYTE "Type an integer : ", 0 

.code 
MAIN PROC 

    mov edx, OFFSET prompt2 
    call WriteString 

    call ReadInt 

    exit 
MAIN ENDP 

end main 

私はちょうどEnterキーを押すとプログラムを終了したいと思います。 整数値(-2^15〜2^15-1)を書き込むときに値を表示します。アセンブリを入力して0を書き込むときの区別方法を教えてください。

0値を入力してEnterキーを押すとコンパイラに区別させる方法がわかりません。 0を書いてEnterキーを押すと、フラグとレジスタの値はすべて同じになります。私はコード上でそれを区別することはできません。

WriteCharを呼び出して最初の文字が入力されているかどうかをチェックすると、この問題は解決できますが、非常に複雑なコードでした。 WriteCharを呼び出す際に値を書き込んだとき、値を文字列から整数に変更する必要がありました。

この問題を解決する簡単な方法はありますか?

答えて

0

あなたはIrvineのReadInt手順を書き直さなければなりません。

元の関数はReadStringを使用し、結果をECXに格納します。ただし、のため、前の値ECXが手順の最後に復元されます。 USES edxに変更するだけで問題は解決します。 ECXには、入力された文字列のサイズが含まれています。

Include Irvine32.inc 

.data 
prompt1 BYTE "Bye!", 0 
prompt2 BYTE "Type an integer : ", 0 
promptBad BYTE "Invalid input",0 

.code 
MAIN PROC 

    mov edx, OFFSET prompt2 
    call WriteString 

    read: 
    call myReadInt 

    jo error 
    jecxz error 

    call WriteInt 
    exit 

error: 
    mov edx,OFFSET promptBad 
    call WriteString 
    exit 
MAIN ENDP 

myReadInt PROC USES edx 
LOCAL digitBuffer[50]:BYTE 

    lea edx, digitBuffer 
    mov ecx,50 
    call ReadString 
    mov ecx,eax ; save length in ECX 

    call ParseInteger32 ; returns EAX, CF 

    ret 
myReadInt ENDP 

end main 
+0

はどうもありがとうございました!!!! – uninopkn

関連する問題