2017-02-25 5 views
-1

私は、1〜9の間にある1桁の数字を求めて保存する8086アセンブリ言語のプログラムを書いています。 1から9の間でなければ、ループバックするはずです。入力文字が1から9の間であるかどうかをテストするにはどうすればよいですか?

要件を満たすまで、テストしてループバックさせて(別の数字を入力できるようにする)良い方法はありますか?

これまでの私のコード:

section .data 
    prompt1 db "Enter a single digit digit between 1-9 --> $" 
section .text 
    ;Display prompt 
    mov ah,9  ; print prompt 
    mov dx,prompt1 ; load register with prompt1 
    int 21h   ; display it 
    ; Input character and store. 
    mov ah,1  ; reach char fcn 
    int 21h   ; read character into al 
    mov bl,al  ; store character into bl 
+0

あなたの問題を引き起こしているどの部分?比較、条件分岐、ASCIIコードについて知っていますか? – Jester

+0

私は条件分岐について知っていますが、比較には慣れていません。 – user3394363

+2

次に 'cmp'についてのリファレンスページを読んでください。 TL; DR: 'cmp bl、1 ''のようなことをして、あなたがすでに知っている条件分岐を使うことができます。 – Jester

答えて

2

私はそれをテストしていませんが、BLが31H未満または39Hよりも大きい場合、一般的には、コードを確認する必要があります。これらはASCII値19です。

だから、いくつかのサンプルコードは次のようになります。

; Input character and store. 
loop1:    ; added label 
    mov ah,1  ; read char fcn 
    int 21h   ; read character into AL 
    mov bl, al  ; store character into BL 
    ; now comes the additional code 
    cmp bl, 31h  ; compare BL to the ASCII value of '1' 
    jb loop1  ; jump back if ASCII value is less than '1' = 31h 
    cmp bl, 39h  ; compare BL to the ASCII value of '9' 
    ja loop1  ; jump back if ASCII value is greater than '9' = 39h 
    ; BL contains an ASCII value between '1' and '9' which integer value can be acquired by subtracting the value 30h 
+1

'jl'は署名され、' ja'は署名されません。これは入力から作業まで127を超える値を必要としないので動作しますが、ソースを読み込むとバグのように見えますので、毎回どのように動作するか考える必要があるので、私を大きく悩ますでしょう。 'jb'は未署名の" below "です。 – Ped7g

+1

「AL」を「BL」に移動すると、(** ALを使用して)両方の比較(ALを使用)した後、自由なコードサイズの最適化が得られます。 –

+0

@ Ped7g:ありがとう。もちろんあなたは正しい。私はエラーを修正しました。 – zx485

関連する問題