0

問題は、ユーザーに任意の数字を入力するように依頼することです。入力した数値を事前定義された定数と比較します。次に、入力された数値が定義された数値以上であるというメッセージを出力します。この例では、事前定義された番号は27です。

私のコードは次のとおりです。

   .MODEL small
   .STACK 100h
   .DATA
promptmsg DB 'Please enter a number [1..100]',13,10,'$'
greatermsg db 'You have entered a greater number', 13, 10, '$'
lessmsg db 'You have entered a lesser number', 13 , 10, '$'
correctmsg db 'You have hit the right number', 13, 10, '$'
numbr dw 27
   .CODE
   .startup
   mov  ax,@data
   mov  ds,ax                   
   lea dx, promptmsg
   mov  ah,9    
   int  21h                     
   mov ah, 0ah
   int 21h
   mov ah, 9
   int 21h
   mov bx, numbr
   cmp ax, bx
   jb lesser
   ja greater
correct:
   mov dx, offset correctmsg
   mov ah, 09h
   int 21h
   jmp endexe
greater:
   mov dx, offset greatermsg
   mov ah, 09h
   int 21h
   jmp endexe
lesser:
   mov dx, offset lessmsg
   mov ah, 09h
   int 21h
endexe:
   mov  ah,4ch                 ;DOS terminate program function
   int  21h                    ;terminate the program
   END
   

事前定義された数値以下であるかどうかに関係なく、任意の数値を入力すると、常により大きい数値にジャンプします。入力番号を認識できなかったコードに問題はありますか?

4

1 に答える 1

1

私はあなたのコードにこの行を見ます:

mov bx, ans

ただし、「ans」がどこにも定義されていません。'numbr'のことですか?

他にもいくつか問題があります。あなたのコードは、int 21h / ah=0ah演算の結果がaxレジスタを介して数値を返すと考えているようです。そうではありません。グーグル中に見つけた最初の参照によると、操作はds:dxによって参照されるバッファー内の文字列を返します。ところで、コードは明示的に確立していません。int21h / ah = 0ahが呼び出された場合でも、ds:dxはpromptmsgを指しているため、操作はプロンプトを上書きします。

したがって、コードはプロンプトを出力し、入力を要求してから、入力をユーザーに出力するように見えます。比較するまでに:

cmp ax, bx

すでに斧の上半分に9を入れているので、「より大きい」パスが常に取られることは理にかなっています。しかし、繰り返しになりますが、読み取り命令はaxを介して入力データを返すのではなく、ds:dxが指すバッファーに返すため、これは問題ではありません。

ただし、ds:dxによって参照される最初のバイトをロードした場合でも、コードは期待どおりに機能しません。ASCII文字のシーケンスを数値に変換する必要があります。つまり、「9」-> 9、「100」->100です。これにはもう少しコードが必要になります。

于 2013-03-05T17:14:20.957 に答える